diff --git a/AUTHORS b/AUTHORS index 70ab864b2..48411a59c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -7,3 +7,4 @@ Benjamin Plain (bplainia) Jacob Hayes (tigerbird1) Milan Damen (milandamen) Daniel Schmidt (Danielxs01) +Anthony/Angelina Michalek (Codetoil) \ No newline at end of file diff --git a/README.md b/README.md index 63e719655..ebe337aa9 100644 --- a/README.md +++ b/README.md @@ -4,31 +4,4 @@ Universal Mod Core allows developers to build mods against a stable API that is In the past UMC has been packaged directly with ImmersiveRailroading as it is was the only mod using it. Now that the API is reasonably stable, it can be published as it's own mod. This mod contains the logic for each Minecraft Version / Loader that it exposes in a simplified way to child mods. -| Minecraft Version | Status | -|----------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| -| [1.7.10-forge](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.7.10-forge) | ![Universal Mod Core 1.7.10-forge](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.7.10-forge) | -| [1.10.2-forge](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.10.2-forge) | ![Universal Mod Core 1.10.2-forge](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.10.2-forge) | -| [1.11.2-forge](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.11.2-forge) | ![Universal Mod Core 1.11.2-forge](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.11.2-forge) | -| [1.12.2-forge](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.12.2-forge) | ![Universal Mod Core 1.12.2-forge](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.12.2-forge) | -| [1.14.4-forge](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.14.4-forge) | ![Universal Mod Core 1.14.4-forge](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.14.4-forge) | -| [1.14.4-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.14.4-fabric) | ![Universal Mod Core 1.14.4-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.14.4-fabric) | -| [1.15.2-forge](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.15.2-forge) | ![Universal Mod Core 1.15.2-forge](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.15.2-forge) | -| [1.15.2-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.15.2-fabric) | ![Universal Mod Core 1.15.2-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.16.2-fabric) | -| [1.16.5-forge](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.16.5-forge) | ![Universal Mod Core 1.16.5-forge](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.16.5-forge) | -| [1.16.5-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.16.5-fabric) | ![Universal Mod Core 1.16.5-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.16.5-fabric) | -| [1.17.1-forge](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.17.1-forge) | ![Universal Mod Core 1.17.1-forge](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.17.1-forge) | -| [1.17.1-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.17.1-fabric) | ![Universal Mod Core 1.17.1-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.17.1-fabric) | -| [1.18.2-forge](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.18.2-forge) | ![Universal Mod Core 1.18.2-forge](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.18.2-forge) | -| [1.18.2-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.18.2-fabric) | ![Universal Mod Core 1.18.2-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.18.2-fabric) | -| [1.19.4-forge](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.19.4-forge) | ![Universal Mod Core 1.19.4-forge](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.19.4-forge) | -| [1.19.4-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.19.4-fabric) | ![Universal Mod Core 1.19.4-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.19.4-fabric) | -| [1.20.1-forge](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.20.1-forge) | ![Universal Mod Core 1.20.1-forge](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.20.1-forge) | -| [1.20.1-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.20.1-fabric) | ![Universal Mod Core 1.20.1-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.20.1-fabric) | -| [1.20.4-neoforge](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.20.4-neoforge) | EOL | -| [1.20.4-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.20.4-fabric) | EOL | -| [1.21.1-neoforge](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.21.1-neoforge) | ![Universal Mod Core 1.21.1-neoforge](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.21.1-neoforge) | -| [1.21.1-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/tree/1.21.1-fabric) | ![Universal Mod Core 1.21.1-fabric](https://github.com/TeamOpenIndustry/UniversalModCore/actions/workflows/build.yml/badge.svg?branch=1.21.1-fabric) | - -## Developer Guide - -TODO once beta is ready +Check out the [wiki](https://github.com/TeamOpenIndustry/UniversalModCore/wiki) page for more information! \ No newline at end of file diff --git a/build.gradle b/build.gradle index 55ee450de..184e999de 100644 --- a/build.gradle +++ b/build.gradle @@ -1,29 +1,10 @@ -buildscript { - repositories { - maven { url "https://maven.neoforged.net/releases" } - maven { url "https://plugins.gradle.org/m2/" } - maven { url 'https://repo.spongepowered.org/maven' } - mavenCentral() - } - dependencies { - classpath group: 'net.neoforged.gradle', name: 'userdev', version: '7.1.11' - classpath group: 'net.neoforged.gradle', name: 'common', version: '7.1.11' - classpath "com.gradleup.shadow:shadow-gradle-plugin:9.2.2" - } -} - -apply plugin: 'net.neoforged.gradle.userdev' -apply plugin: 'net.neoforged.gradle.common' -//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: 'com.gradleup.shadow' - -configurations { - shade - implementation.extendsFrom shade - minecraftLibrary - implementation.extendsFrom minecraftLibrary +plugins { + id 'java' + id 'idea' + id 'eclipse' + id 'maven-publish' + id 'net.minecraftforge.gradle' version '[7.0.23,8.0)' + id 'net.minecraftforge.jarjar' version '0.2.3' } java { @@ -32,97 +13,105 @@ java { repositories { maven { - url "https://cursemaven.com" + url = uri("https://cursemaven.com") } } -String umcVersion = "1.2.3" +String umcVersion = "1.3.0" if (!"release".equalsIgnoreCase(System.getProperty("target"))) { try { - umcVersion += "-" + 'git rev-parse --verify --short=7 HEAD'.execute().text.trim() - } catch (Exception ex) { + umcVersion += "-${(providers.exec { commandLine("git", "rev-parse", "--verify", "--short=7", "HEAD") }.standardOutput.asText.get() as String).substring(0, 7)}" + } catch (Exception ignored) { umcVersion += "-unknown" } } -version = "1.21.1-neoforge-" + umcVersion +version = "1.21.1-forge-" + umcVersion group = "cam72cam.universalmodcore" // http://maven.apache.org/guides/mini/guide-naming-conventions.html -archivesBaseName = "UniversalModCore" +base.archivesName = "UniversalModCore" + +println("version: ${version}") java.toolchain.languageVersion = JavaLanguageVersion.of(21) -println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) - -// Default run configurations. -// These can be tweaked, removed, or duplicated as needed. -runs { - // applies to all the run configs below - configureEach { - //Enable mixin-ed dependency in deobfuscated environment - systemProperty "mixin.env.remapRefMap", "true" - systemProperty "mixin.env.refMapRemappingFile", "${projectDir}/build/createSrgToMcp/output.srg" - - systemProperty "mixin.debug.verbose", "true" - systemProperty "mixin.debug.export", "true" - // 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. - systemProperty '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 - systemProperty 'forge.logging.console.level', 'debug' - - dependencies { - runtime project.configurations.minecraftLibrary +println("Java: ${providers.systemProperty("java.version").get()}, " + + "JVM: ${providers.systemProperty("java.vm.version").get()} (${providers.systemProperty("java.vendor").get()}), " + + "Arch: ${providers.systemProperty("os.arch").get()}") + +minecraft { + mappings channel: "official", version: "1.21.1" + accessTransformer = true + + runs { + // applies to all the run configs below + configureEach { + workingDir.convention layout.projectDirectory.dir('runs') + // Mixin requires either specifying the config via command line, or in the Manifest + args "--mixin.config=mixins.feat.universalmodcore.json", "--mixin.config=mixins.fix.universalmodcore.json" + + systemProperty "mixin.debug.verbose", "true" + systemProperty "mixin.debug.export", "true" + // 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. + systemProperty '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 + systemProperty 'forge.logging.console.level', 'debug' } - modSource project.sourceSets.main - } - - client { - // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - systemProperty 'neoforge.enabledGameTestNamespaces', 'universalmodcore' - } - - server { - systemProperty 'neoforge.enabledGameTestNamespaces', 'universalmodcore' - argument '--nogui' - } + register('client') { + // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. + systemProperty 'forge.enabledGameTestNamespaces', 'universalmodcore' + } - // 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 { - systemProperty 'neoforge.enabledGameTestNamespaces', 'universalmodcore' - } + register('server') { + systemProperty 'forge.enabledGameTestNamespaces', 'universalmodcore' + args '--nogui' + } - data { - // example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it - // workingDirectory project.file('run-data') + register('data') { + // example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it + // workingDirectory project.file('run-data') - // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. - arguments.addAll '--mod', 'universalmodcore', '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() + // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. + args '--mod', 'universalmodcore', '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() + } } } -accessTransformers { - file 'src/main/resources/META-INF/accesstransformer.cfg' -} +sourceSets.main.resources { srcDir layout.projectDirectory.dir('src/generated/resources') } -repositories { - mavenCentral() +// This methods registers jarJar for the default jar task. +// The closure allows you to configure the task, instead of needing to do this: +// tasks.named('jarJar', net.minecraftforge.jarjar.gradle.JarJar) +jarJar.register() { + archiveClassifier = null } -sourceSets.main.resources { srcDir 'src/generated/resources' } - repositories { - maven { url = "https://repo.spongepowered.org/maven" } + minecraft.mavenizer(it) + maven fg.forgeMaven + maven fg.minecraftLibsMaven + exclusiveContent { + forRepository { + maven { + name = 'Sponge' + url = 'https://repo.spongepowered.org/repository/maven-public' + } + } + filter { + includeGroupAndSubgroups('org.spongepowered') + } + } + mavenCentral() + mavenLocal() } dependencies { - implementation "net.neoforged:neoforge:21.1.216" + implementation minecraft.dependency("net.minecraftforge:forge:1.21.1-52.1.14") // you may put jars on which you depend on in ./libs // or you may define them like so.. //compile "some.group:artifact:version:classifier" @@ -143,14 +132,28 @@ dependencies { // for more info... // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html // http://www.gradle.org/docs/current/userguide/dependency_management.html -// annotationProcessor('org.spongepowered:mixin:0.8.3:processor') -// annotationProcessor('io.github.llamalad7:mixinextras-common:0.5.0') + compileOnly(annotationProcessor('io.github.llamalad7:mixinextras-common:0.5.0')) + implementation(jarJar('io.github.llamalad7:mixinextras-forge:0.5.0')) { + jarJar.configure(it) { + module { + group = 'io.github.llamalad7' + name = 'mixinextras' + } + range = "[0.5.0,)" + } + } - //testImplementation ('junit:junit:4.13') - testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.2' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.2' - minecraftLibrary(shade group: 'javax.vecmath', name: 'vecmath', version: '1.5.2') -// implementation(shade group: 'at.yawk.lz4', name: 'lz4-java', version: '1.10.2') + implementation(jarJar('javax.vecmath:vecmath:1.5.2')) { + jarJar.configure(it) { + module { + group = 'javax.vecmath' + name = 'vecmath' + } + range = "[1.5.2,)" + } + } } repositories { @@ -167,31 +170,8 @@ dependencies { attributesSchema { attribute(mappingsAttribute) } - - //Iris - implementation "curse.maven:sodium-394468:6382651" - implementation "curse.maven:irisshaders-455508:6661598" - - //Lamb Dynamic Lights - compileOnly("dev.lambdaurora.lambdynamiclights:lambdynamiclights-api:4.8.7+1.21.1") { - attributes { - attribute(mappingsAttribute, "mojmap") - } - } - runtimeOnly "curse.maven:lambdynamiclights-393442:7306458" } -//mixin { -// add sourceSets.main, 'mixins.universalmodcore.refmap.json' -// -// config 'mixins.universalmodcore.json' -// -// //Dev environment setup -// debug.verbose = true -// debug.export = true -// dumpTargetOnFailure = true -//} - jar { archiveClassifier = 'slim' manifest { @@ -202,48 +182,25 @@ jar { "Implementation-Title": project.name, "Implementation-Version": umcVersion, "Implementation-Vendor" :"", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + "MixinConfigs" : "mixins.feat.universalmodcore.json,mixins.fix.universalmodcore.json" ]) } } -//No need in Neoforge -//jar.finalizedBy('reobfJar') - -shadowJar { - archiveClassifier = '' - configurations = [project.configurations.shade] - relocate 'javax.vecmath', "${project.group}.shade.javax.vecmath" - //Don't do this -// relocate 'org.spongepowered', "${project.group}.shade.org.spongepowered" - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - mergeServiceFiles() -// finalizedBy 'reobfShadowJar' -} - -assemble.dependsOn shadowJar - -//reobf { -// shadowJar {} -//} - test { useJUnit() maxHeapSize = '1G' } publishing { - publications { - mavenJava(MavenPublication) { - artifact jar - artifact shadowJar - artifact sourcesJar - artifactId archivesBaseName - } + publications.register('mavenJava', MavenPublication) { + artifact tasks.named("jar") + artifact tasks.named("jarJar") + artifact tasks.named("sourcesJar") } repositories { maven { - url "sftp://teamopenindustry.cc:22/var/www/html/maven/" + url = uri("sftp://teamopenindustry.cc:22/var/www/html/maven/") credentials { username = "mavenci" password = System.getenv("MAVENCI_PASS") @@ -264,3 +221,19 @@ tasks.register('showBuildInfo') { } publish.finalizedBy showBuildInfo + +// IntelliJ no longer downloads javadocs and sources by default, this tells Gradle to force IntelliJ to do it. +idea.module { downloadJavadoc = downloadSources = true } + +eclipse { + // Eclipse no longer downloads javadocs and sources by default, this tells Gradle to force Eclipse to do it. + classpath { downloadJavadoc = downloadSources = true } + + // NOTE: ForgeGradle 7 does not yet support Eclipse run configurations + // Run everytime eclipse builds the code + //autoBuildTasks genEclipseRuns + // Run when importing the project + //synchronizationTasks 'genEclipseRuns' +} + +// NOTE: Merging of source sets is now controlled by the property 'net.minecraftforge.gradle.merge-source-sets' diff --git a/gradle.properties b/gradle.properties index 7d9694b67..b1828365f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,9 @@ -# 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 -# Forge why you so broken??? -org.gradle.daemon=false +org.gradle.caching=true +org.gradle.parallel=true +org.gradle.configureondemand=true + +org.gradle.configuration-cache=true +org.gradle.configuration-cache.parallel=true +org.gradle.configuration-cache.problems=warn + +net.minecraftforge.gradle.merge-source-sets=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1132f38a5..b13bd40f4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip diff --git a/settings.gradle b/settings.gradle index e69de29bb..3e187fe5a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -0,0 +1,3 @@ +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' +} \ No newline at end of file diff --git a/src/main/java/cam72cam/mod/ModCore.java b/src/main/java/cam72cam/mod/ModCore.java index 5ccbdf1db..bdf2763da 100644 --- a/src/main/java/cam72cam/mod/ModCore.java +++ b/src/main/java/cam72cam/mod/ModCore.java @@ -16,21 +16,22 @@ import java.util.*; import net.minecraft.util.Unit; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.IEventBus; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; -import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; -import net.neoforged.fml.event.lifecycle.InterModEnqueueEvent; -import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.fml.loading.FMLPaths; -import net.neoforged.neoforge.common.CreativeModeTabRegistry; -import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.data.loading.DatagenModLoader; -import net.neoforged.neoforge.event.RegisterCommandsEvent; -import net.neoforged.neoforge.event.server.ServerStartedEvent; -import net.neoforged.neoforge.event.server.ServerStartingEvent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; +import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.fml.loading.FMLPaths; +import net.minecraftforge.common.CreativeModeTabRegistry; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.data.loading.DatagenModLoader; +import net.minecraftforge.event.RegisterCommandsEvent; +import net.minecraftforge.event.server.ServerStartedEvent; +import net.minecraftforge.event.server.ServerStartingEvent; import net.minecraft.resources.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -58,11 +59,11 @@ import java.io.IOException; /** UMC Mod, do not touch... */ -@net.neoforged.fml.common.Mod(ModCore.MODID) +@net.minecraftforge.fml.common.Mod(ModCore.MODID) public class ModCore { public static final String MODID = "universalmodcore"; public static final String NAME = "UniversalModCore"; - public static final String VERSION = "1.2.3"; + public static final String VERSION = "1.3.0"; public static ModCore instance; public static boolean hasResources; private static boolean isInReload; @@ -78,9 +79,10 @@ public static void register(Mod ctr) { } /** Called during Mod Construction phase */ - public ModCore(IEventBus modEventBus, Dist dist) { + public ModCore(FMLJavaModLoadingContext context) { System.out.println("Welcome to UniversalModCore!"); instance = this; + IEventBus modEventBus = context.getModEventBus(); ModCore.register(new Internal()); proxy.setup(); @@ -92,7 +94,7 @@ public ModCore(IEventBus modEventBus, Dist dist) { //FMLJavaModLoadingContext.get().getModEventBus().addListener(this::serverStarted); CommonEvents.Item.CREATIVE_TAB.register(modEventBus); - NeoForge.EVENT_BUS.register(this); + MinecraftForge.EVENT_BUS.register(this); } /** INIT Phase (Forge) */ @@ -442,13 +444,17 @@ public static synchronized File cacheFile(Identifier id) { /* Loader Utils */ public static String loaderBrand() { - return "neoforge"; + return "forge"; } public static int mcVersion() { return 12101; } + public static String semanticVersion() { + return "1.21.1-forge"; + } + public static boolean isDevelopmentEnvironment() { return !FMLLoader.isProduction(); } diff --git a/src/main/java/cam72cam/mod/UMCMixinExtrasLoader.java b/src/main/java/cam72cam/mod/UMCMixinExtrasLoader.java new file mode 100644 index 000000000..967169777 --- /dev/null +++ b/src/main/java/cam72cam/mod/UMCMixinExtrasLoader.java @@ -0,0 +1,47 @@ +package cam72cam.mod; + +import com.llamalad7.mixinextras.MixinExtrasBootstrap; +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + +public class UMCMixinExtrasLoader implements IMixinConfigPlugin { + @Override + public void onLoad(String mixinPackage) { + MixinExtrasBootstrap.init(); + } + + @Override + public String getRefMapperConfig() { + return ""; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + return true; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + + } + + @Override + public List getMixins() { + return Collections.emptyList(); + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } +} \ No newline at end of file diff --git a/src/main/java/cam72cam/mod/block/BlockEntity.java b/src/main/java/cam72cam/mod/block/BlockEntity.java index 8c3f0232f..d4786a4af 100644 --- a/src/main/java/cam72cam/mod/block/BlockEntity.java +++ b/src/main/java/cam72cam/mod/block/BlockEntity.java @@ -11,8 +11,8 @@ import cam72cam.mod.math.Vec3i; import cam72cam.mod.resource.Identifier; import cam72cam.mod.serialization.SerializationException; -import cam72cam.mod.serialization.TagCompound; import cam72cam.mod.util.Facing; +import cam72cam.mod.serialization.TagCompound; import cam72cam.mod.world.World; /** diff --git a/src/main/java/cam72cam/mod/block/BlockType.java b/src/main/java/cam72cam/mod/block/BlockType.java index cd464d430..b103dd8ed 100644 --- a/src/main/java/cam72cam/mod/block/BlockType.java +++ b/src/main/java/cam72cam/mod/block/BlockType.java @@ -33,7 +33,6 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import net.neoforged.neoforge.capabilities.Capabilities; import javax.annotation.Nullable; @@ -69,33 +68,6 @@ public BlockType(String modID, String name) { internal = getBlock(); helper.register(id.internal, internal); }); - - CommonEvents.Block.REGISTER_CAPABILITY.subscribe(event -> { - event.registerBlock(Capabilities.ItemHandler.BLOCK, - (level, pos, state, be, side) -> { - if (be instanceof TileEntity tile) { - return tile.getItemHandler(side); - } - return null; - }, - internal); - event.registerBlock(Capabilities.FluidHandler.BLOCK, - (level, pos, state, be, side) -> { - if (be instanceof TileEntity tile) { - return tile.getFluidHandler(side); - } - return null; - }, - internal); - event.registerBlock(Capabilities.EnergyStorage.BLOCK, - (level, pos, state, be, side) -> { - if (be instanceof TileEntity tile) { - return tile.getEnergyStorage(side); - } - return null; - }, - internal); - }); } /** Override to provide a custom Minecraft Block implementation (ex: support tile entities) */ diff --git a/src/main/java/cam72cam/mod/block/tile/TileEntity.java b/src/main/java/cam72cam/mod/block/tile/TileEntity.java index 950f9633f..e7f92bd74 100644 --- a/src/main/java/cam72cam/mod/block/tile/TileEntity.java +++ b/src/main/java/cam72cam/mod/block/tile/TileEntity.java @@ -20,13 +20,11 @@ import cam72cam.mod.world.World; import com.google.common.collect.HashBiMap; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.Connection; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -35,16 +33,16 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.phys.AABB; +import net.minecraftforge.client.model.data.ModelData; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import net.neoforged.neoforge.capabilities.BlockCapability; -import net.neoforged.neoforge.client.model.data.ModelData; -import net.neoforged.neoforge.client.model.data.ModelProperty; -import net.neoforged.neoforge.energy.IEnergyStorage; -import net.neoforged.neoforge.fluids.FluidStack; -import net.neoforged.neoforge.fluids.capability.IFluidHandler; -import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.items.IItemHandlerModifiable; +import net.minecraftforge.client.model.data.ModelProperty; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.energy.IEnergyStorage; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.IItemHandlerModifiable; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -64,8 +62,6 @@ * @see BlockEntity */ public class TileEntity extends net.minecraft.world.level.block.entity.BlockEntity { - public static final AABB INFINITE_EXTENT_AABB = new net.minecraft.world.phys.AABB(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY); - private static final Map> types = HashBiMap.create(); // InstanceId -> Supplier mapping private static final Map> registry = HashBiMap.create(); @@ -166,7 +162,7 @@ public static void register(Supplier instance, Identifier id, Block BlockEntity example = instance.get(); // Force legacy registration -// example.supplier(id); + //example.supplier(id); CommonEvents.Tile.REGISTER.subscribe(helper -> { BlockEntityType type = new BlockEntityType<>((pos, state) -> { @@ -328,16 +324,17 @@ public void setChanged() { public final SingleCache bbCache = new SingleCache<>(internal -> BoundingBox.from(internal).move(getBlockPos().getX(), getBlockPos().getY(), getBlockPos().getZ())); - - /* Moved to cam72cam.mod.render.BlockRender - @Override - public net.minecraft.world.phys.AABB getRenderBoundingBox() { - if (instance() != null) { - return bbCache.get(instance().getRenderBoundingBox()); - } - return INFINITE_EXTENT_AABB; - } - */ + /** + * @return Instance's bounding box + * @see BlockEntity + */ + @Override + public net.minecraft.world.phys.AABB getRenderBoundingBox() { + if (instance() != null) { + return bbCache.get(instance().getRenderBoundingBox()); + } + return INFINITE_EXTENT_AABB; + } /** * @return Instance's render distance @@ -349,160 +346,141 @@ public double getViewDistance() { return instance() != null ? instance().getRenderDistance() * instance().getRenderDistance() : Integer.MAX_VALUE; }*/ - public static final BlockCapability ITEM_HANDLER_BLOCK = - BlockCapability.create(ResourceLocation.tryBuild(ModCore.MODID, "item_handler"), - IItemHandler.class, Direction.class); - - public static final BlockCapability FLUID_HANDLER_BLOCK = - BlockCapability.create(ResourceLocation.tryBuild(ModCore.MODID, "fluid_handler"), - IFluidHandler.class, Direction.class); - - public static final BlockCapability ENERGY_HANDLER_BLOCK = - BlockCapability.create(ResourceLocation.tryBuild(ModCore.MODID, "energy_handler"), - IEnergyStorage.class, Direction.class); - - public IItemHandler getItemHandler(@Nullable Direction side) { - IInventory target = getInventory(Facing.from(side)); - if (target == null) { - return null; - } - return new IItemHandlerModifiable() { - @Override - public int getSlots() { - return target.getSlotCount(); + @Override + @Nullable + public LazyOptional getCapability(net.minecraftforge.common.capabilities.Capability capability, @Nullable net.minecraft.core.Direction facing) { + if (capability == ForgeCapabilities.FLUID_HANDLER) { + ITank target = getTank(Facing.from(facing)); + if (target == null) { + return LazyOptional.empty(); } - @Override - public void setStackInSlot(int slot, @Nonnull ItemStack stack) { - target.set(slot, new cam72cam.mod.item.ItemStack(stack)); - } + return LazyOptional.of(() -> new IFluidHandler() { + @Override + public int getTanks() { + return 1; + } - @Nonnull - @Override - public ItemStack getStackInSlot(int slot) { - return target.get(slot).internal(); - } + @Nonnull + @Override + public FluidStack getFluidInTank(int tank) { + return target.getContents().internal; + } - @Nonnull - @Override - public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { - return target.insert(slot, new cam72cam.mod.item.ItemStack(stack), simulate).internal(); - } + @Override + public int getTankCapacity(int tank) { + return target.getCapacity(); + } - @Nonnull - @Override - public ItemStack extractItem(int slot, int amount, boolean simulate) { - return target.extract(slot, amount, simulate).internal(); - } + @Override + public boolean isFluidValid(int tank, @Nonnull FluidStack stack) { + return target.allows(Fluid.getFluid(stack.getFluid())); + } - @Override - public int getSlotLimit(int slot) { - return target.getLimit(slot); - } + @Override + public int fill(FluidStack resource, FluidAction action) { + return target.fill(new cam72cam.mod.fluid.FluidStack(resource), action.simulate()); + } - @Override - public boolean isItemValid(int slot, @Nonnull ItemStack stack) { - return true; //TODO 1.14.4 - } - }; - } + @Nonnull + @Override + public FluidStack drain(FluidStack resource, FluidAction action) { + return target.drain(new cam72cam.mod.fluid.FluidStack(resource), action.simulate()).internal; + } - public IFluidHandler getFluidHandler(@Nullable Direction side) { - ITank target = getTank(Facing.from(side)); - if (target == null) { - return null; + @Nonnull + @Override + public FluidStack drain(int maxDrain, FluidAction action) { + if (target.getContents().internal.isEmpty()) { + return FluidStack.EMPTY; + } + return target.drain(new cam72cam.mod.fluid.FluidStack(new FluidStack(target.getContents().internal, maxDrain)), action.simulate()).internal; + } + }).cast(); } - return new IFluidHandler() { - @Override - public int getTanks() { - return 1; - } - - @Nonnull - @Override - public FluidStack getFluidInTank(int tank) { - return target.getContents().internal; + if (capability == ForgeCapabilities.ITEM_HANDLER) { + IInventory target = getInventory(Facing.from(facing)); + if (target == null) { + return LazyOptional.empty(); } + return LazyOptional.of(() -> new IItemHandlerModifiable() { + @Override + public int getSlots() { + return target.getSlotCount(); + } - @Override - public int getTankCapacity(int tank) { - return target.getCapacity(); - } + @Override + public void setStackInSlot(int slot, @Nonnull ItemStack stack) { + target.set(slot, new cam72cam.mod.item.ItemStack(stack)); + } - @Override - public boolean isFluidValid(int tank, @Nonnull FluidStack stack) { - return target.allows(Fluid.getFluid(stack.getFluid())); - } + @Nonnull + @Override + public ItemStack getStackInSlot(int slot) { + return target.get(slot).internal(); + } - @Override - public int fill(FluidStack resource, FluidAction action) { - return target.fill(new cam72cam.mod.fluid.FluidStack(resource), action.simulate()); - } + @Nonnull + @Override + public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { + return target.insert(slot, new cam72cam.mod.item.ItemStack(stack), simulate).internal(); + } - @Nonnull - @Override - public FluidStack drain(FluidStack resource, FluidAction action) { - return target.drain(new cam72cam.mod.fluid.FluidStack(resource), action.simulate()).internal; - } + @Nonnull + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + return target.extract(slot, amount, simulate).internal(); + } - @Nonnull - @Override - public FluidStack drain(int maxDrain, FluidAction action) { - if (target.getContents().internal.isEmpty()) { - return FluidStack.EMPTY; + @Override + public int getSlotLimit(int slot) { + return target.getLimit(slot); } - return target.drain(new cam72cam.mod.fluid.FluidStack(new FluidStack(target.getContents().internal.getFluid(), maxDrain)), action.simulate()).internal; - } - }; - } - public IEnergyStorage getEnergyStorage(@Nullable Direction side) { - IEnergy target = getEnergy(Facing.from(side)); - if (target == null) { - return null; + @Override + public boolean isItemValid(int slot, @Nonnull ItemStack stack) { + return true; //TODO 1.14.4 + } + }).cast(); } - return new IEnergyStorage() { - @Override - public int receiveEnergy(int maxReceive, boolean simulate) { - return target.receive(maxReceive, simulate); - } - - @Override - public int extractEnergy(int maxExtract, boolean simulate) { - return target.extract(maxExtract, simulate); + if (capability == ForgeCapabilities.ENERGY) { + IEnergy target = getEnergy(Facing.from(facing)); + if (target == null) { + return LazyOptional.empty(); } + return LazyOptional.of(() -> new IEnergyStorage() { + @Override + public int receiveEnergy(int maxReceive, boolean simulate) { + return target.receive(maxReceive, simulate); + } - @Override - public int getEnergyStored() { - return target.getCurrent(); - } + @Override + public int extractEnergy(int maxExtract, boolean simulate) { + return target.extract(maxExtract, simulate); + } - @Override - public int getMaxEnergyStored() { - return target.getMax(); - } + @Override + public int getEnergyStored() { + return target.getCurrent(); + } - @Override - public boolean canExtract() { - return true; - } + @Override + public int getMaxEnergyStored() { + return target.getMax(); + } - @Override - public boolean canReceive() { - return true; - } - }; - } + @Override + public boolean canExtract() { + return true; + } - public boolean hasCapacity(BlockCapability capability, Direction side) { - if (capability == ITEM_HANDLER_BLOCK) { - return getInventory(Facing.from(side)) != null; - } else if (capability == FLUID_HANDLER_BLOCK) { - return getTank(Facing.from(side)) != null; - } else if (capability == ENERGY_HANDLER_BLOCK) { - return getEnergy(Facing.from(side)) != null; + @Override + public boolean canReceive() { + return true; + } + }).cast(); } - return false; + return LazyOptional.empty(); } /* diff --git a/src/main/java/cam72cam/mod/config/ConfigFile.java b/src/main/java/cam72cam/mod/config/ConfigFile.java index 8471bd14b..ff1f8199c 100644 --- a/src/main/java/cam72cam/mod/config/ConfigFile.java +++ b/src/main/java/cam72cam/mod/config/ConfigFile.java @@ -1,7 +1,7 @@ package cam72cam.mod.config; import cam72cam.mod.ModCore; -import net.neoforged.fml.loading.FMLPaths; +import net.minecraftforge.fml.loading.FMLPaths; import org.apache.commons.lang3.StringUtils; import java.lang.annotation.Annotation; diff --git a/src/main/java/cam72cam/mod/energy/IEnergy.java b/src/main/java/cam72cam/mod/energy/IEnergy.java index ece965c44..c65e476fb 100644 --- a/src/main/java/cam72cam/mod/energy/IEnergy.java +++ b/src/main/java/cam72cam/mod/energy/IEnergy.java @@ -1,6 +1,6 @@ package cam72cam.mod.energy; -import net.neoforged.neoforge.energy.IEnergyStorage; +import net.minecraftforge.energy.IEnergyStorage; public interface IEnergy { static IEnergy from(IEnergyStorage internal) { diff --git a/src/main/java/cam72cam/mod/entity/CustomEntity.java b/src/main/java/cam72cam/mod/entity/CustomEntity.java index 616b9446c..1465355f0 100644 --- a/src/main/java/cam72cam/mod/entity/CustomEntity.java +++ b/src/main/java/cam72cam/mod/entity/CustomEntity.java @@ -1,7 +1,8 @@ package cam72cam.mod.entity; import cam72cam.mod.entity.sync.EntitySync; -import cam72cam.mod.world.World; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.util.Mth; import java.util.List; @@ -89,4 +90,33 @@ public List getPassengers() { return internal.getActualPassengers(); } + @Override + public float getRotationRoll() { + return internal.getEntityData().get(ModdedEntity.ROLL); + } + + @Override + public float getRotationRoll(float partialTicks) { + return Mth.clampedLerp(getPrevRotationRoll(), getRotationRoll(), partialTicks); + } + + @Override + public void setRotationRoll(float roll) { + SynchedEntityData dataManager = internal.getEntityData(); + float prevRoll = dataManager.get(ModdedEntity.PREV_ROLL); + while (roll - prevRoll < -180.0F) + { + prevRoll -= 360.0F; + } + while (roll - prevRoll >= 180.0F) + { + prevRoll += 360.0F; + } + dataManager.set(ModdedEntity.PREV_ROLL, prevRoll); + dataManager.set(ModdedEntity.ROLL, roll); + } + + public float getPrevRotationRoll() { + return internal.getEntityData().get(ModdedEntity.PREV_ROLL); + } } diff --git a/src/main/java/cam72cam/mod/entity/Entity.java b/src/main/java/cam72cam/mod/entity/Entity.java index f61eade67..68a2908c9 100644 --- a/src/main/java/cam72cam/mod/entity/Entity.java +++ b/src/main/java/cam72cam/mod/entity/Entity.java @@ -5,11 +5,12 @@ import cam72cam.mod.math.Vec3i; import cam72cam.mod.util.SingleCache; import cam72cam.mod.world.World; +import net.minecraft.util.Mth; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.npc.AbstractVillager; import net.minecraft.world.level.Explosion; import net.minecraft.world.phys.AABB; -import net.neoforged.neoforge.event.EventHooks; +import net.minecraftforge.event.ForgeEventFactory; import java.util.List; import java.util.UUID; @@ -17,7 +18,7 @@ /** * The base entity abstraction that wraps MC entities. - * + *

* TODO: Make sure we are setting prevRot/Loc stuff correctly. Should it only be changed on a tick processing the movement? */ public class Entity { @@ -77,29 +78,64 @@ public float getRotationYaw() { return internal.getYRot(); } + public float getRotationPitch() { + return internal.getXRot(); + } + + /** + * @see CustomEntity#getRotationRoll() + */ + public float getRotationRoll() { + return 0f; + } + + public float getRotationYaw(float partialTicks) { + return Mth.clampedLerp(internal.yRotO, internal.getYRot(), partialTicks); + } + + public float getRotationPitch(float partialTicks) { + return Mth.clampedLerp(internal.xRotO, internal.getXRot(), partialTicks); + } + + /** + * @see CustomEntity#getRotationRoll(float) + */ + public float getRotationRoll(float partialTicks) { + return 0; + } + public void setRotationYaw(float yaw) { internal.yRotO = internal.getYRot(); internal.setYRot(yaw); - double d0 = internal.yRotO - yaw; - if (d0 < -180.0D) - { - internal.yRotO += 360.0F; - } - if (d0 >= 180.0D) + while (internal.getYRot() - internal.yRotO < -180.0F) { internal.yRotO -= 360.0F; } - - } - - public float getRotationPitch() { - return internal.getXRot(); + while (internal.getYRot() - internal.yRotO >= 180.0F) + { + internal.yRotO += 360.0F; + } } public void setRotationPitch(float pitch) { internal.xRotO = internal.getXRot(); internal.setXRot(pitch); + + while (internal.getXRot() - internal.xRotO < -180.0F) + { + internal.xRotO -= 360.0F; + } + while (internal.getXRot() - internal.xRotO >= 180.0F) + { + internal.xRotO += 360.0F; + } + } + + /** + * @see CustomEntity#setRotationRoll(float) + */ + public void setRotationRoll(float roll) { } public float getPrevRotationYaw() { @@ -110,6 +146,13 @@ public float getPrevRotationPitch() { return internal.xRotO; } + /** + * @see CustomEntity#getPrevRotationRoll() + */ + public float getPrevRotationRoll() { + return 0f; + } + Vec3d eyeCache; public Vec3d getPositionEyes() { Vec3d pos = checkRidingPosition(); @@ -247,7 +290,7 @@ public void directDamage(DamageType type, double damage) { protected void createExplosion(Vec3d pos, float size, boolean damageTerrain) { Explosion explosion = new Explosion(getWorld().internal, this.internal, pos.x, pos.y, pos.z, size, false, damageTerrain ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP); - if (EventHooks.onExplosionStart(getWorld().internal, explosion)) return; + if (ForgeEventFactory.onExplosionStart(getWorld().internal, explosion)) return; explosion.explode(); explosion.finalizeExplosion(true); } diff --git a/src/main/java/cam72cam/mod/entity/EntityRegistry.java b/src/main/java/cam72cam/mod/entity/EntityRegistry.java index 322a1fca9..153915efc 100644 --- a/src/main/java/cam72cam/mod/entity/EntityRegistry.java +++ b/src/main/java/cam72cam/mod/entity/EntityRegistry.java @@ -16,8 +16,8 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.commons.lang3.tuple.Pair; import java.util.HashMap; diff --git a/src/main/java/cam72cam/mod/entity/ModdedEntity.java b/src/main/java/cam72cam/mod/entity/ModdedEntity.java index c30b280b4..7b7c6b754 100644 --- a/src/main/java/cam72cam/mod/entity/ModdedEntity.java +++ b/src/main/java/cam72cam/mod/entity/ModdedEntity.java @@ -9,12 +9,12 @@ import cam72cam.mod.net.Packet; import cam72cam.mod.serialization.*; import cam72cam.mod.util.SingleCache; -import net.minecraft.core.registries.BuiltInRegistries; -import it.unimi.dsi.fastutil.objects.ObjectArraySet; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; @@ -24,9 +24,10 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.entity.IEntityWithComplexSpawn; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.entity.IEntityAdditionalSpawnData; +import net.minecraftforge.registries.ForgeRegistries; import org.apache.commons.lang3.tuple.Pair; import java.util.*; @@ -34,7 +35,7 @@ import java.util.stream.Collectors; /** Internal class which extends MC's Entity. Do not use directly */ -public class ModdedEntity extends Entity implements IEntityWithComplexSpawn { +public class ModdedEntity extends Entity implements IEntityAdditionalSpawnData { // Reference to the entity that this is representing private CustomEntity self; @@ -42,6 +43,15 @@ public class ModdedEntity extends Entity implements IEntityWithComplexSpawn { @TagField(value = "passengers", mapper = PassengerMapper.class) private Map passengerPositions = new HashMap<>(); + //Data synchronization + static final EntityDataAccessor PREV_ROLL = SynchedEntityData.defineId(ModdedEntity.class, EntityDataSerializers.FLOAT); + static final EntityDataAccessor ROLL = SynchedEntityData.defineId(ModdedEntity.class, EntityDataSerializers.FLOAT); + //Data storage + @TagField + private float roll = 0; + @TagField + private float prevRoll = 0; + // All of the known seats attached to this entity private final List seats = new ArrayList<>(); @@ -111,6 +121,11 @@ private void load(TagCompound data) { ModCore.catching(e, "Error during entity load: %s - %s", this, data); } + if (!this.level().isClientSide()) { + getEntityData().set(ROLL, this.roll); + getEntityData().set(PREV_ROLL, this.prevRoll); + } + TagCompound selfData = data.get("selfData"); if (selfData == null) { // Old style used to save everything in one giant NBT blob. New versions save self in a sub tag. @@ -165,6 +180,9 @@ public void addAdditionalSaveData(CompoundTag compound) { * @see #load */ private void save(TagCompound data) { + this.roll = getEntityData().get(ROLL); + this.prevRoll = getEntityData().get(PREV_ROLL); + try { TagSerializer.serialize(data, this); } catch (SerializationException e) { @@ -192,7 +210,7 @@ private void save(TagCompound data) { /** @see #load */ @Override - public final void readSpawnData(RegistryFriendlyByteBuf additionalData) { + public final void readSpawnData(FriendlyByteBuf additionalData) { TagCompound data = new TagCompound(additionalData.readNbt()); if (cam72cam.mod.world.World.get(level()) == null) { // This can happen during a sudden disconnect... @@ -207,7 +225,7 @@ public final void readSpawnData(RegistryFriendlyByteBuf additionalData) { } @Override - public final void writeSpawnData(RegistryFriendlyByteBuf buffer) { + public final void writeSpawnData(FriendlyByteBuf buffer) { TagCompound data = new TagCompound(); data.set("sync", self.sync); save(data); @@ -216,7 +234,7 @@ public final void writeSpawnData(RegistryFriendlyByteBuf buffer) { @Override public EntityType getType() { - return legacyId == null ? super.getType() : BuiltInRegistries.ENTITY_TYPE.get(ResourceLocation.tryParse(legacyId)); + return legacyId == null ? super.getType() : ForgeRegistries.ENTITY_TYPES.getValue(ResourceLocation.parse(legacyId)); } /* ITickable */ @@ -228,6 +246,9 @@ public EntityType getType() { */ @Override public final void tick() { + if (!level().isClientSide()) { + this.getEntityData().set(PREV_ROLL, getEntityData().get(ROLL)); + } iTickable.onTick(); try { self.sync.send(); @@ -277,7 +298,8 @@ public final boolean hurt(DamageSource damagesource, float amount) { /** @see IKillable */ @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { - //TODO 1.21.1 + builder.define(PREV_ROLL, 0F); + builder.define(ROLL, 0F); } @Override @@ -306,6 +328,7 @@ public boolean canAddPassenger(Entity passenger) { /** Since 1.14 we can't get rider's world position simply as it returns their riding entity's position */ public Vec3d calculateRiderWorldPosition(cam72cam.mod.entity.Entity entity) { //This should work without pitch applied now + //TODO Pitch and roll if (passengerPositions.containsKey(entity.getUUID())) { return calculatePassengerPosition(passengerPositions.get(entity.getUUID())); } diff --git a/src/main/java/cam72cam/mod/entity/Player.java b/src/main/java/cam72cam/mod/entity/Player.java index 41f7aec13..72ca3a8bd 100644 --- a/src/main/java/cam72cam/mod/entity/Player.java +++ b/src/main/java/cam72cam/mod/entity/Player.java @@ -12,9 +12,9 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.phys.BlockHitResult; -import net.neoforged.neoforge.server.permission.PermissionAPI; -import net.neoforged.neoforge.server.permission.nodes.PermissionNode; -import net.neoforged.neoforge.server.permission.nodes.PermissionTypes; +import net.minecraftforge.server.permission.PermissionAPI; +import net.minecraftforge.server.permission.nodes.PermissionNode; +import net.minecraftforge.server.permission.nodes.PermissionTypes; import static net.minecraft.world.InteractionHand.MAIN_HAND; import static net.minecraft.world.InteractionHand.OFF_HAND; diff --git a/src/main/java/cam72cam/mod/entity/SeatEntity.java b/src/main/java/cam72cam/mod/entity/SeatEntity.java index 1ded1c631..bf65a6e73 100644 --- a/src/main/java/cam72cam/mod/entity/SeatEntity.java +++ b/src/main/java/cam72cam/mod/entity/SeatEntity.java @@ -6,6 +6,7 @@ import cam72cam.mod.serialization.TagCompound; import cam72cam.mod.world.World; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.syncher.SynchedEntityData; @@ -16,14 +17,14 @@ import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.neoforge.entity.IEntityWithComplexSpawn; +import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.entity.IEntityAdditionalSpawnData; import java.util.List; import java.util.UUID; /** Seat construct to make multiple riders actually work */ -public class SeatEntity extends Entity implements IEntityWithComplexSpawn { +public class SeatEntity extends Entity implements IEntityAdditionalSpawnData { static final ResourceLocation ID = ResourceLocation.tryBuild(ModCore.MODID, "seat"); public static final EntityType TYPE = makeType(); @@ -213,7 +214,7 @@ public cam72cam.mod.entity.Entity getEntityPassenger() { } @Override - public void writeSpawnData(RegistryFriendlyByteBuf buffer) { + public void writeSpawnData(FriendlyByteBuf buffer) { TagCompound data = new TagCompound(); data.setUUID("parent", parent); data.setUUID("passenger", passenger); @@ -221,7 +222,7 @@ public void writeSpawnData(RegistryFriendlyByteBuf buffer) { } @Override - public void readSpawnData(RegistryFriendlyByteBuf additionalData) { + public void readSpawnData(FriendlyByteBuf additionalData) { TagCompound data = new TagCompound(additionalData.readNbt()); parent = data.getUUID("parent"); passenger = data.getUUID("passenger"); diff --git a/src/main/java/cam72cam/mod/entity/sync/EntitySync.java b/src/main/java/cam72cam/mod/entity/sync/EntitySync.java index a2e9b0496..ba7fedb22 100644 --- a/src/main/java/cam72cam/mod/entity/sync/EntitySync.java +++ b/src/main/java/cam72cam/mod/entity/sync/EntitySync.java @@ -63,13 +63,16 @@ public void send() throws SerializationException { .collect(Object2IntOpenHashMap::new, (m, f) -> { TagSync tag = f.getAnnotation(TagSync.class); - TagField tagField = f.getAnnotation(TagField.class); + String name = f.getAnnotation(TagField.class).value(); + if("".equals(name)) { + name = f.getName(); + } Class type = f.getType(); if (type == float.class || type == Float.class) { - m.put(tagField.value(), Math.max(0, Math.min(tag.floatPrecision(), 8))); + m.put(name, Math.max(0, Math.min(tag.floatPrecision(), 8))); } else if (type == double.class || type == Double.class) { - m.put(tagField.value(), Math.max(0, Math.min(tag.doublePrecision(), 8))); + m.put(name, Math.max(0, Math.min(tag.doublePrecision(), 8))); } }, Object2IntOpenHashMap::putAll); diff --git a/src/main/java/cam72cam/mod/event/ClientEvents.java b/src/main/java/cam72cam/mod/event/ClientEvents.java index 1d86d881b..1e540c36c 100644 --- a/src/main/java/cam72cam/mod/event/ClientEvents.java +++ b/src/main/java/cam72cam/mod/event/ClientEvents.java @@ -17,13 +17,12 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.RenderType; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.ICancellableEvent; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.*; -import net.neoforged.neoforge.client.event.sound.SoundEngineLoadEvent; -import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.client.event.*; +import net.minecraftforge.client.event.sound.SoundEngineLoadEvent; import java.util.function.Consumer; import java.util.function.Function; @@ -96,14 +95,11 @@ public MouseGuiEvent(MouseAction action, int x, int y, int button, double scroll public static final Event REGISTER_ENTITY = new Event<>(); public static final Event> REGISTER_SHADER = new Event<>(); public static final Event> RENDER_DEBUG = new Event<>(); - public static final Event> RENDER_OVERLAY = new Event<>(); public static final Event> RENDER_MOUSEOVER = new Event<>(); public static final Event> SOUND_LOAD = new Event<>(); public static final Event RELOAD = new Event<>(); // public static final Event> OPTIFINE_SUCKS = new Event<>(); public static final Event> KEY_MAPPING_REGISTER = new Event<>(); - public static final Event> CLIENT_EXTENSIONS_REGISTER = new Event<>(); - public static final Event> MENU_SCREENS_REGISTER = new Event<>(); @EventBusSubscriber(modid = ModCore.MODID, value = Dist.CLIENT) public static class ClientEventBus { @@ -115,20 +111,20 @@ public static class ClientEventBus { } @SubscribeEvent - public static void onClientTick(ClientTickEvent.Pre event) { + public static void onClientTick(TickEvent.ClientTickEvent.Pre event) { TICK.execute(Runnable::run); } @SubscribeEvent - public static void onClientTick(ClientTickEvent.Post event) { + public static void onClientTick(TickEvent.ClientTickEvent.Post event) { TICK_POST.execute(Runnable::run); } private static void onGuiMouse(ScreenEvent event, int x, int y, int btn, MouseAction action) { - MouseGuiEvent mevt = new MouseGuiEvent(action, x, y, btn, action == MouseAction.SCROLL ? (int) ((ScreenEvent.MouseScrolled) event).getScrollDeltaY() : 0); + MouseGuiEvent mevt = new MouseGuiEvent(action, x, y, btn, action == MouseAction.SCROLL ? (int) ((ScreenEvent.MouseScrolled) event).getDeltaY() : 0); if (!MOUSE_GUI.executeCancellable(h -> h.apply(mevt))) { - ((ICancellableEvent)event).setCanceled(true); + event.setCanceled(true); if (action != MouseAction.SCROLL) { // Apparently cancelling this input event only cancels it for the *GUI* handlers, not all input handlers // Therefore we need to track that ourselves. Thanks for changing that from 1.12.2-forge @@ -169,7 +165,7 @@ private static void hackInputState(int event) { @SubscribeEvent public static void onScroll(InputEvent.MouseScrollingEvent event) { - if (!SCROLL.executeCancellable(x -> x.apply(event.getScrollDeltaY()))) { + if (!SCROLL.executeCancellable(x -> x.apply(event.getDeltaY()))) { event.setCanceled(true); } } @@ -205,7 +201,7 @@ public static void onClick(InputEvent.MouseButton.Pre event) { } @SubscribeEvent - public static void onFrame(RenderFrameEvent.Pre event) { + public static void onFrame(TickEvent.RenderTickEvent.Pre event) { if (dragPos != null) { //Minecraft.getMinecraft().mouseHelper.mouseXYChange(); dragPos = dragPos.add(Minecraft.getInstance().mouseHandler.getXVelocity(), Minecraft.getInstance().mouseHandler.getYVelocity(), 0); @@ -222,11 +218,6 @@ public static void onDebugRender(CustomizeGuiOverlayEvent.DebugText event) { RENDER_DEBUG.execute(x -> x.accept(event)); } - @SubscribeEvent - public static void onOverlayEvent(RenderGuiLayerEvent.Pre event) { - RENDER_OVERLAY.execute(x -> x.accept(event)); - } - @SubscribeEvent public static void onRenderMouseover(RenderHighlightEvent.Block event) { RenderType.cutout().setupRenderState(); @@ -250,7 +241,7 @@ public static void onRenderMouseover(RenderHighlightEvent.Block event) { static boolean hasHacked = false; @SubscribeEvent - public static void onHackShaders(RenderFrameEvent.Pre event) { + public static void onHackShaders(TickEvent.RenderTickEvent.Pre event) { if (!hasHacked/* && event.phase == TickEvent.Phase.START*/) { if (GameRenderer.getRendertypeCutoutShader() != null) { hasHacked = true; @@ -301,7 +292,7 @@ public static void registerVanillaShader(RegisterShadersEvent event) { REGISTER_SHADER.execute(x -> x.accept(event)); } - @SubscribeEvent + /*@SubscribeEvent public static void registerClientExtensions(RegisterClientExtensionsEvent event) { CLIENT_EXTENSIONS_REGISTER.execute(x -> x.accept(event)); } @@ -309,7 +300,7 @@ public static void registerClientExtensions(RegisterClientExtensionsEvent event) @SubscribeEvent public static void registerMenuScreen(RegisterMenuScreensEvent event) { MENU_SCREENS_REGISTER.execute(x -> x.accept(event)); - } + }*/ @SubscribeEvent public static void onSoundLoad(SoundEngineLoadEvent event) { diff --git a/src/main/java/cam72cam/mod/event/CommonEvents.java b/src/main/java/cam72cam/mod/event/CommonEvents.java index 9ec451205..bcef9ff87 100644 --- a/src/main/java/cam72cam/mod/event/CommonEvents.java +++ b/src/main/java/cam72cam/mod/event/CommonEvents.java @@ -18,21 +18,18 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.chunk.ChunkAccess; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; -import net.neoforged.neoforge.event.entity.EntityEvent; -import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent; -import net.neoforged.neoforge.event.level.BlockEvent; -import net.neoforged.neoforge.event.level.ChunkEvent; -import net.neoforged.neoforge.event.level.LevelEvent; -import net.neoforged.neoforge.event.tick.LevelTickEvent; -import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; -import net.neoforged.neoforge.network.registration.PayloadRegistrar; -import net.neoforged.neoforge.registries.DeferredRegister; -import net.neoforged.neoforge.registries.RegisterEvent; -import net.neoforged.neoforge.registries.RegisterEvent.RegisterHelper; -import net.neoforged.neoforge.server.permission.events.PermissionGatherEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.event.entity.EntityEvent; +import net.minecraftforge.event.entity.EntityJoinLevelEvent; +import net.minecraftforge.event.level.BlockEvent; +import net.minecraftforge.event.level.ChunkEvent; +import net.minecraftforge.event.level.LevelEvent; +import net.minecraftforge.event.TickEvent.LevelTickEvent; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegisterEvent; +import net.minecraftforge.registries.RegisterEvent.RegisterHelper; +import net.minecraftforge.server.permission.events.PermissionGatherEvent; import java.util.function.Consumer; @@ -54,7 +51,6 @@ public static final class World { public static final class Block { public static final Event>> REGISTER = new Event<>(); - public static final Event> REGISTER_CAPABILITY = new Event<>(); public static final Event BROKEN = new Event<>(); public static final Event> TAGS = new Event<>(); } @@ -85,10 +81,6 @@ public static final class Permissions { public static final Event> NODES = new Event<>(); } - public static final class Networking { - public static final Event> REGISTER_PACKET = new Event<>(); - } - @EventBusSubscriber(modid = ModCore.MODID) public static final class EventBusForge { // World @@ -116,8 +108,8 @@ public static void onWorldUnload(LevelEvent.Unload event) { public static void onWorldTick(LevelTickEvent.Pre event) { //Since 1.18.2 this is called both server and client //We only want server side - if (!event.getLevel().isClientSide()) { - World.TICK.execute(x -> x.accept(event.getLevel())); + if (!event.level.isClientSide()) { + World.TICK.execute(x -> x.accept(event.level)); } } @@ -161,7 +153,7 @@ public static void registerContainers(PermissionGatherEvent.Nodes event) { } - @EventBusSubscriber(modid = ModCore.MODID) + @EventBusSubscriber(modid = ModCore.MODID, bus = EventBusSubscriber.Bus.MOD) public static final class EventBusMod { static { registerEvents(); @@ -176,7 +168,7 @@ public static void registerBlocks(RegisterEvent event) { event.register(BuiltInRegistries.MENU.key(), helper -> CONTAINER_REGISTRY.execute(x -> x.accept(helper))); } - @SubscribeEvent + /*@SubscribeEvent public static void registerCapability(RegisterCapabilitiesEvent event) { Block.REGISTER_CAPABILITY.execute(x -> x.accept(event)); } @@ -187,7 +179,7 @@ public static void registerPacket(RegisterPayloadHandlersEvent event) { .versioned(Packet.VERSION) .optional(); Networking.REGISTER_PACKET.execute(x -> x.accept(registrar)); - } + }*/ @SubscribeEvent public static void registerBlockTags(RegisterBlockTagEvent event) { diff --git a/src/main/java/cam72cam/mod/event/platform/LoadDatapackEvent.java b/src/main/java/cam72cam/mod/event/platform/LoadDatapackEvent.java index 01f659b66..163056af3 100644 --- a/src/main/java/cam72cam/mod/event/platform/LoadDatapackEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/LoadDatapackEvent.java @@ -9,8 +9,8 @@ import net.minecraft.server.packs.repository.PackRepository; import net.minecraft.server.packs.repository.PackSource; import net.minecraft.world.flag.FeatureFlagSet; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.fml.event.IModBusEvent; import java.util.List; import java.util.Optional; diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java index f6fe9e0cf..7200429f6 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java @@ -5,8 +5,8 @@ import net.minecraft.advancements.*; import net.minecraft.advancements.critereon.*; import net.minecraft.resources.ResourceLocation; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.fml.event.IModBusEvent; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java index 2fc8bc31a..586271e1f 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java @@ -6,8 +6,8 @@ import net.minecraft.tags.TagKey; import net.minecraft.tags.TagLoader; import net.minecraft.world.level.block.Block; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.fml.event.IModBusEvent; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterDamageTypeEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterDamageTypeEvent.java index 64183458d..05b711b5f 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterDamageTypeEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterDamageTypeEvent.java @@ -2,8 +2,8 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.Resource; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.fml.event.IModBusEvent; import java.util.Map; diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java index dec256b10..ca6823e5b 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java @@ -7,8 +7,8 @@ import net.minecraft.tags.TagKey; import net.minecraft.tags.TagLoader; import net.minecraft.world.item.Item; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.fml.event.IModBusEvent; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterRecipeEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterRecipeEvent.java index 251aa3af4..9bffd17d9 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterRecipeEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterRecipeEvent.java @@ -8,8 +8,8 @@ import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.ShapedRecipe; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.fml.event.IModBusEvent; /** * Fired when recipe datapacks are reloaded diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterTextureSpriteEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterTextureSpriteEvent.java index 3bc55d193..e1ab01303 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterTextureSpriteEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterTextureSpriteEvent.java @@ -3,8 +3,8 @@ import net.minecraft.client.renderer.texture.atlas.SpriteSource; import net.minecraft.client.renderer.texture.atlas.sources.SingleFile; import net.minecraft.resources.ResourceLocation; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.fml.event.IModBusEvent; import java.util.List; import java.util.Optional; diff --git a/src/main/java/cam72cam/mod/fluid/FluidStack.java b/src/main/java/cam72cam/mod/fluid/FluidStack.java index b150056e0..f3c3045e4 100644 --- a/src/main/java/cam72cam/mod/fluid/FluidStack.java +++ b/src/main/java/cam72cam/mod/fluid/FluidStack.java @@ -2,15 +2,15 @@ /** Wrapper around forge FluidStack */ public class FluidStack { - public final net.neoforged.neoforge.fluids.FluidStack internal; + public final net.minecraftforge.fluids.FluidStack internal; /** Wrapper, don't use directly */ - public FluidStack(net.neoforged.neoforge.fluids.FluidStack stack) { + public FluidStack(net.minecraftforge.fluids.FluidStack stack) { this.internal = stack; } public FluidStack(Fluid fluid, int amount) { - this.internal = fluid != null && fluid.internal != null ? new net.neoforged.neoforge.fluids.FluidStack(fluid.internal.get(0), amount) : null; + this.internal = fluid != null && fluid.internal != null ? new net.minecraftforge.fluids.FluidStack(fluid.internal.get(0), amount) : null; } public Fluid getFluid() { diff --git a/src/main/java/cam72cam/mod/fluid/FluidTank.java b/src/main/java/cam72cam/mod/fluid/FluidTank.java index 8b1a6f8d4..3ef34c2aa 100644 --- a/src/main/java/cam72cam/mod/fluid/FluidTank.java +++ b/src/main/java/cam72cam/mod/fluid/FluidTank.java @@ -5,7 +5,7 @@ import cam72cam.mod.serialization.TagMapped; import cam72cam.mod.serialization.TagMapper; import cam72cam.mod.util.RegistryUtil; -import net.neoforged.neoforge.fluids.capability.IFluidHandler.FluidAction; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import java.util.HashSet; import java.util.List; @@ -15,7 +15,7 @@ @TagMapped(FluidTank.Mapper.class) public class FluidTank implements ITank { // TODO clean up capacity crap. Probably just want to implement my own fluid handler from scratch TBH - public final net.neoforged.neoforge.fluids.capability.templates.FluidTank internal; + public final net.minecraftforge.fluids.capability.templates.FluidTank internal; private Supplier> filter; private final Set onChange = new HashSet<>(); @@ -26,7 +26,7 @@ private FluidTank() { } public FluidTank(FluidStack fluidStack, int capacity) { - internal = new net.neoforged.neoforge.fluids.capability.templates.FluidTank(capacity) { + internal = new net.minecraftforge.fluids.capability.templates.FluidTank(capacity) { public void onContentsChanged() { FluidTank.this.onChange(); } @@ -73,7 +73,7 @@ public void setFilter(Supplier> filter) { @Override public boolean allows(Fluid fluid) { return (filter == null || filter.get() == null || filter.get().contains(fluid)) && - fluid.internal.stream().anyMatch(f -> internal.isFluidValid(new net.neoforged.neoforge.fluids.FluidStack(f, 1))); + fluid.internal.stream().anyMatch(f -> internal.isFluidValid(new net.minecraftforge.fluids.FluidStack(f, 1))); } @Override @@ -87,17 +87,17 @@ public int fill(FluidStack fluidStack, boolean simulate) { @Override public FluidStack drain(FluidStack fluidStack, boolean simulate) { if (!allows(fluidStack.getFluid())) { - return new FluidStack(net.neoforged.neoforge.fluids.FluidStack.EMPTY); + return new FluidStack(net.minecraftforge.fluids.FluidStack.EMPTY); } return new FluidStack(internal.drain(fluidStack.internal, simulate ? FluidAction.SIMULATE : FluidAction.EXECUTE)); } public TagCompound write(TagCompound tag) { - return new TagCompound(internal.writeToNBT(RegistryUtil.getRegistry(), tag.internal)); + return new TagCompound(internal.writeToNBT(tag.internal)); } public void read(TagCompound tag) { - internal.readFromNBT(RegistryUtil.getRegistry(), tag.internal); + internal.readFromNBT(tag.internal); } static class Mapper implements TagMapper { diff --git a/src/main/java/cam72cam/mod/fluid/ITank.java b/src/main/java/cam72cam/mod/fluid/ITank.java index af2d98550..1fa4d4c0e 100644 --- a/src/main/java/cam72cam/mod/fluid/ITank.java +++ b/src/main/java/cam72cam/mod/fluid/ITank.java @@ -2,9 +2,9 @@ import cam72cam.mod.ModCore; import cam72cam.mod.item.ItemStack; -import net.neoforged.neoforge.fluids.FluidUtil; -import net.neoforged.neoforge.fluids.capability.IFluidHandler; -import net.neoforged.neoforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; import java.util.List; import java.util.Optional; @@ -21,7 +21,7 @@ public interface ITank { * See ImmersiveRailroading's FreightTank for an example. */ static ITank getTank(ItemStack inputCopy, Consumer onUpdate) { - Optional handler = FluidUtil.getFluidHandler(inputCopy.internal()); + Optional handler = FluidUtil.getFluidHandler(inputCopy.internal()).resolve(); if (handler.isEmpty()) { return null; } @@ -39,7 +39,7 @@ public int getCapacity() { @Override public boolean allows(Fluid fluid) { - return fluid.internal.stream().anyMatch(f -> internal.isFluidValid(0, new net.neoforged.neoforge.fluids.FluidStack(f, 1))); + return fluid.internal.stream().anyMatch(f -> internal.isFluidValid(0, new net.minecraftforge.fluids.FluidStack(f, 1))); } @Override @@ -77,7 +77,7 @@ public int getCapacity() { @Override public boolean allows(Fluid fluid) { - return fluid.internal.stream().anyMatch(f -> internal.isFluidValid(i, new net.neoforged.neoforge.fluids.FluidStack(f, 1))); + return fluid.internal.stream().anyMatch(f -> internal.isFluidValid(i, new net.minecraftforge.fluids.FluidStack(f, 1))); } @Override diff --git a/src/main/java/cam72cam/mod/gui/GuiRegistry.java b/src/main/java/cam72cam/mod/gui/GuiRegistry.java index f3b2f78bb..19a2310fe 100644 --- a/src/main/java/cam72cam/mod/gui/GuiRegistry.java +++ b/src/main/java/cam72cam/mod/gui/GuiRegistry.java @@ -15,6 +15,7 @@ import cam72cam.mod.resource.Identifier; import cam72cam.mod.world.World; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -23,10 +24,10 @@ import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.MenuType; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.neoforge.network.IContainerFactory; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.network.IContainerFactory; import javax.annotation.Nullable; import java.util.HashMap; @@ -54,7 +55,7 @@ public static void registerEvents() { /** Internal event registration, do not use */ @OnlyIn(Dist.CLIENT) public static void registerClientEvents() { - ClientEvents.MENU_SCREENS_REGISTER.subscribe(e -> e.register(TYPE, ClientContainerBuilder::new)); + ClientEvents.REGISTER_ENTITY.subscribe(() -> MenuScreens.register(TYPE, ClientContainerBuilder::new)); } public GuiRegistry() { diff --git a/src/main/java/cam72cam/mod/gui/Progress.java b/src/main/java/cam72cam/mod/gui/Progress.java index eee6d1f71..57d280b74 100644 --- a/src/main/java/cam72cam/mod/gui/Progress.java +++ b/src/main/java/cam72cam/mod/gui/Progress.java @@ -1,7 +1,7 @@ package cam72cam.mod.gui; import cam72cam.mod.ModCore; -import net.neoforged.fml.loading.progress.StartupNotificationManager; +import net.minecraftforge.fml.loading.progress.StartupNotificationManager; /** Wrapper around game loading bar, only functional on certain MC versions / loaders */ public class Progress { diff --git a/src/main/java/cam72cam/mod/gui/container/ServerContainerBuilder.java b/src/main/java/cam72cam/mod/gui/container/ServerContainerBuilder.java index 0c1876616..112548dbc 100644 --- a/src/main/java/cam72cam/mod/gui/container/ServerContainerBuilder.java +++ b/src/main/java/cam72cam/mod/gui/container/ServerContainerBuilder.java @@ -9,7 +9,7 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.Slot; -import net.neoforged.neoforge.items.SlotItemHandler; +import net.minecraftforge.items.SlotItemHandler; import java.util.function.Consumer; import java.util.function.Supplier; diff --git a/src/main/java/cam72cam/mod/gui/helpers/GUIHelpers.java b/src/main/java/cam72cam/mod/gui/helpers/GUIHelpers.java index 9c430df4e..cf966b658 100644 --- a/src/main/java/cam72cam/mod/gui/helpers/GUIHelpers.java +++ b/src/main/java/cam72cam/mod/gui/helpers/GUIHelpers.java @@ -28,7 +28,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.inventory.InventoryMenu; -import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; +import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; import org.joml.Matrix4f; import org.lwjgl.opengl.GL32; import util.Matrix4; diff --git a/src/main/java/cam72cam/mod/gui/helpers/GuiScrollBar.java b/src/main/java/cam72cam/mod/gui/helpers/GuiScrollBar.java index 161d224eb..c5a1e8629 100644 --- a/src/main/java/cam72cam/mod/gui/helpers/GuiScrollBar.java +++ b/src/main/java/cam72cam/mod/gui/helpers/GuiScrollBar.java @@ -2,13 +2,13 @@ import net.minecraft.client.gui.components.AbstractSliderButton; import net.minecraft.network.chat.Component; -import net.neoforged.neoforge.client.gui.widget.ExtendedSlider; +import net.minecraftforge.client.gui.widget.ForgeSlider; import java.util.function.Consumer; /** Internal scrollbar class */ -class GuiScrollBar extends ExtendedSlider { +class GuiScrollBar extends ForgeSlider { private final Consumer onPress; public GuiScrollBar(int id, int xPos, int yPos, int width, int height, String displayStr, diff --git a/src/main/java/cam72cam/mod/gui/screen/ScreenBuilder.java b/src/main/java/cam72cam/mod/gui/screen/ScreenBuilder.java index ab57d3a97..18efbd16b 100644 --- a/src/main/java/cam72cam/mod/gui/screen/ScreenBuilder.java +++ b/src/main/java/cam72cam/mod/gui/screen/ScreenBuilder.java @@ -11,7 +11,7 @@ import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import net.neoforged.neoforge.client.gui.widget.ExtendedSlider; +import net.minecraftforge.client.gui.widget.ForgeSlider; import java.util.*; import java.util.function.Supplier; @@ -23,7 +23,7 @@ public class ScreenBuilder extends Screen implements IScreenBuilder { private TextField active = null; private final Supplier valid; private GuiGraphics graphics; - private ExtendedSlider dragging; + private ForgeSlider dragging; public ScreenBuilder(IScreen screen, Supplier valid) { super(Component.literal("")); @@ -167,7 +167,7 @@ public boolean mouseClicked(double x, double y, int button) { for (AbstractWidget btn : this.buttonMap.keySet()) { if (btn.mouseClicked(x, y, button)) { - if (btn instanceof ExtendedSlider slider) { + if (btn instanceof ForgeSlider slider) { dragging = slider; } return true; diff --git a/src/main/java/cam72cam/mod/gui/screen/Slider.java b/src/main/java/cam72cam/mod/gui/screen/Slider.java index 6dfb9a50f..8a57a91fc 100644 --- a/src/main/java/cam72cam/mod/gui/screen/Slider.java +++ b/src/main/java/cam72cam/mod/gui/screen/Slider.java @@ -2,7 +2,7 @@ import cam72cam.mod.entity.Player; import net.minecraft.network.chat.Component; -import net.neoforged.neoforge.client.gui.widget.ExtendedSlider; +import net.minecraftforge.client.gui.widget.ForgeSlider; import java.util.function.Supplier; import java.util.function.Consumer; @@ -10,7 +10,7 @@ /** Standard slider */ public class Slider extends Button { /** Internal wrapper to add onSlider Hook */ - private static class InternalForgeSlider extends ExtendedSlider { + private static class InternalForgeSlider extends ForgeSlider { private Runnable clicker = () -> {}; private Supplier setter = () -> ""; @@ -69,11 +69,11 @@ public void setValue(double value) { } public int getValueInt() { - return ((ExtendedSlider) button).getValueInt(); + return ((ForgeSlider) button).getValueInt(); } public double getValue() { - return ((ExtendedSlider) button).getValue(); + return ((ForgeSlider) button).getValue(); } @Override diff --git a/src/main/java/cam72cam/mod/input/Keyboard.java b/src/main/java/cam72cam/mod/input/Keyboard.java index cfbd2957b..db70922d4 100644 --- a/src/main/java/cam72cam/mod/input/Keyboard.java +++ b/src/main/java/cam72cam/mod/input/Keyboard.java @@ -5,9 +5,9 @@ import net.minecraft.client.KeyMapping; import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; import net.minecraft.client.Minecraft; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.client.settings.KeyConflictContext; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.settings.KeyConflictContext; import org.lwjgl.glfw.GLFW; import javax.annotation.Nullable; diff --git a/src/main/java/cam72cam/mod/input/Mouse.java b/src/main/java/cam72cam/mod/input/Mouse.java index 608702601..affadaf48 100644 --- a/src/main/java/cam72cam/mod/input/Mouse.java +++ b/src/main/java/cam72cam/mod/input/Mouse.java @@ -11,8 +11,8 @@ import cam72cam.mod.net.Packet; import cam72cam.mod.serialization.TagField; import net.minecraft.client.Minecraft; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import java.util.function.Function; diff --git a/src/main/java/cam72cam/mod/item/CreativeTab.java b/src/main/java/cam72cam/mod/item/CreativeTab.java index a173af9d2..20a5b194c 100644 --- a/src/main/java/cam72cam/mod/item/CreativeTab.java +++ b/src/main/java/cam72cam/mod/item/CreativeTab.java @@ -6,7 +6,7 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTabs; -import net.neoforged.neoforge.registries.DeferredHolder; +import net.minecraftforge.registries.RegistryObject; import java.util.ArrayList; import java.util.List; @@ -25,7 +25,7 @@ public class CreativeTab { /** */ public CreativeTab(String label, Supplier stack) { ResourceKey key = lastTab; - DeferredHolder register = CommonEvents.Item.CREATIVE_TAB.register(label, () -> { + RegistryObject register = CommonEvents.Item.CREATIVE_TAB.register(label, () -> { CreativeModeTab.Builder builder = CreativeModeTab.builder(); builder.title(Component.translatable("itemGroup." + label)); builder.icon(() -> stack.get().internal()); diff --git a/src/main/java/cam72cam/mod/item/CustomItem.java b/src/main/java/cam72cam/mod/item/CustomItem.java index 25d2e3781..16f201620 100644 --- a/src/main/java/cam72cam/mod/item/CustomItem.java +++ b/src/main/java/cam72cam/mod/item/CustomItem.java @@ -23,13 +23,14 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.function.Consumer; /** Implement to create/register a custom item */ public abstract class CustomItem { @@ -103,14 +104,14 @@ private class ItemInternal extends Item { public ItemInternal(Properties p_i48487_1_) { super(p_i48487_1_); - ClientEvents.CLIENT_EXTENSIONS_REGISTER.subscribe(e -> { + /*ClientEvents.CLIENT_EXTENSIONS_REGISTER.subscribe(e -> { e.registerItem(new IClientItemExtensions() { @Override public BlockEntityWithoutLevelRenderer getCustomRenderer() { return ItemRender.ISTER(); } }, this); - }); + });*/ } @Override @@ -162,16 +163,16 @@ public InteractionResultHolder use(net.minec ItemStack stack = umcPlayer.getHeldItem(umcHand).copy(); return InteractionResultHolder.consume(stack.internal()); } -//See constructor -// @Override -// public void initializeClient(Consumer consumer) { -// consumer.accept(new IClientItemExtensions() { -// @Override -// public BlockEntityWithoutLevelRenderer getCustomRenderer() { -// return ItemRender.ISTER(); -// } -// }); -// } + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return ItemRender.ISTER(); + } + }); + } } /** * Helper for serializing / deserializing data on a stack diff --git a/src/main/java/cam72cam/mod/item/Fuzzy.java b/src/main/java/cam72cam/mod/item/Fuzzy.java index 91486b7be..2617d7498 100644 --- a/src/main/java/cam72cam/mod/item/Fuzzy.java +++ b/src/main/java/cam72cam/mod/item/Fuzzy.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; -import net.neoforged.neoforge.common.Tags; +import net.minecraftforge.common.Tags; import java.nio.charset.StandardCharsets; import java.util.*; @@ -30,7 +30,7 @@ public class Fuzzy { public static final Fuzzy STONE_SLAB = new Fuzzy("slabStone").add(Items.STONE_SLAB); public static final Fuzzy STONE_BRICK = new Fuzzy(ItemTags.STONE_BRICKS, "brickStone").add(Blocks.STONE_BRICKS); - public static final Fuzzy SAND = new Fuzzy(Tags.Items.SANDS, "sand").add(Blocks.SAND); + public static final Fuzzy SAND = new Fuzzy(Tags.Items.SAND, "sand").add(Blocks.SAND); public static final Fuzzy PISTON = new Fuzzy("piston").add(Items.PISTON); public static final Fuzzy GOLD_INGOT = new Fuzzy(Tags.Items.INGOTS_GOLD, "ingotGold").add(Items.GOLD_INGOT); @@ -41,7 +41,7 @@ public class Fuzzy { public static final Fuzzy IRON_BARS = new Fuzzy("barsIron").add(Blocks.IRON_BARS); public static final Fuzzy NETHER_BRICK = new Fuzzy("brickNether").add(Blocks.NETHER_BRICKS); - public static final Fuzzy GRAVEL_BLOCK = new Fuzzy(Tags.Items.GRAVELS, "gravel").add(Blocks.GRAVEL); + public static final Fuzzy GRAVEL_BLOCK = new Fuzzy(Tags.Items.GRAVEL, "gravel").add(Blocks.GRAVEL); public static final Fuzzy BRICK_BLOCK = new Fuzzy("brickBlock").add(Blocks.BRICKS); public static final Fuzzy COBBLESTONE = new Fuzzy(Tags.Items.COBBLESTONES, "cobblestone").add(Blocks.COBBLESTONE); public static final Fuzzy CONCRETE = new Fuzzy("concrete") diff --git a/src/main/java/cam72cam/mod/item/IInventory.java b/src/main/java/cam72cam/mod/item/IInventory.java index 0faf4a944..9842022a3 100644 --- a/src/main/java/cam72cam/mod/item/IInventory.java +++ b/src/main/java/cam72cam/mod/item/IInventory.java @@ -1,7 +1,7 @@ package cam72cam.mod.item; import net.minecraft.world.entity.player.Inventory; -import net.neoforged.neoforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.IItemHandlerModifiable; public interface IInventory { /** Wraps MC construct. Do not use */ diff --git a/src/main/java/cam72cam/mod/item/ItemStack.java b/src/main/java/cam72cam/mod/item/ItemStack.java index cc0e8bd08..4f46cd2de 100644 --- a/src/main/java/cam72cam/mod/item/ItemStack.java +++ b/src/main/java/cam72cam/mod/item/ItemStack.java @@ -8,9 +8,10 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.component.CustomData; import net.minecraft.world.item.crafting.RecipeType; -import net.neoforged.neoforge.fluids.FluidUtil; +import net.minecraftforge.fluids.FluidUtil; import java.util.function.Supplier; @@ -159,7 +160,7 @@ public String toString() { /** Increase the damage counter on the item by the player */ public void damageItem(int i, Player player) { - internal().hurtAndBreak(i, (ServerLevel) player.internal.level(), player.internal, (s) -> {}); + internal().hurtAndBreak(i, (ServerLevel) player.internal.level(), (ServerPlayer) player.internal, (s) -> {}); } /** Completely null out the tag compound */ diff --git a/src/main/java/cam72cam/mod/item/ItemStackHandler.java b/src/main/java/cam72cam/mod/item/ItemStackHandler.java index 5e3e8c225..a2a7a11db 100644 --- a/src/main/java/cam72cam/mod/item/ItemStackHandler.java +++ b/src/main/java/cam72cam/mod/item/ItemStackHandler.java @@ -19,14 +19,14 @@ /** Standard IInventory implementation */ @TagMapped(ItemStackHandler.TagMapper.class) public class ItemStackHandler implements IInventory { - public final net.neoforged.neoforge.items.ItemStackHandler internal; + public final net.minecraftforge.items.ItemStackHandler internal; protected BiPredicate checkSlot = (integer, itemStack) -> true; private final List> onChanged = new ArrayList<>(); private Function slotLimit = null; public ItemStackHandler(int size) { - this.internal = new net.neoforged.neoforge.items.ItemStackHandler(size) { + this.internal = new net.minecraftforge.items.ItemStackHandler(size) { @Override public void setStackInSlot(int slot, @Nonnull net.minecraft.world.item.ItemStack stack) { if (checkSlot.test(slot, new ItemStack(stack))) { diff --git a/src/main/java/cam72cam/mod/item/ToolType.java b/src/main/java/cam72cam/mod/item/ToolType.java index 6de94987e..d27d85aa1 100644 --- a/src/main/java/cam72cam/mod/item/ToolType.java +++ b/src/main/java/cam72cam/mod/item/ToolType.java @@ -1,17 +1,17 @@ package cam72cam.mod.item; -import net.neoforged.neoforge.common.ItemAbilities; -import net.neoforged.neoforge.common.ItemAbility; +import net.minecraftforge.common.ToolActions; +import net.minecraftforge.common.ToolAction; /** What class a tool fits into */ public enum ToolType { - PICKAXE(ItemAbilities.PICKAXE_DIG), - AXE(ItemAbilities.AXE_DIG), - SHOVEL(ItemAbilities.SHOVEL_DIG), + PICKAXE(ToolActions.PICKAXE_DIG), + AXE(ToolActions.AXE_DIG), + SHOVEL(ToolActions.SHOVEL_DIG), ; - public final net.neoforged.neoforge.common.ItemAbility internal; + public final ToolAction internal; - ToolType(ItemAbility internal) { + ToolType(ToolAction internal) { this.internal = internal; } diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinAdvancement.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinAdvancement.java index 1d57cd79e..7f9328a4e 100644 --- a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinAdvancement.java +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinAdvancement.java @@ -9,7 +9,7 @@ import net.minecraft.server.ServerAdvancementManager; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.util.profiling.ProfilerFiller; -import net.neoforged.fml.ModLoader; +import net.minecraftforge.fml.ModLoader; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -28,6 +28,6 @@ public class MixinAdvancement { public void postAdvancementReload(Map p_136034_, ResourceManager p_136035_, ProfilerFiller p_136036_, CallbackInfo ci, @Local ImmutableMap.Builder map) { RegisterAdvancementEvent event = new RegisterAdvancementEvent(map); - ModLoader.postEvent(event); + ModLoader.get().postEvent(event); } } diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinMinecraftServer.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinMinecraftServer.java index bacf4c899..7e45fa444 100644 --- a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinMinecraftServer.java +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinMinecraftServer.java @@ -4,7 +4,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.packs.repository.PackRepository; import net.minecraft.world.level.WorldDataConfiguration; -import net.neoforged.fml.ModLoader; +import net.minecraftforge.fml.ModLoader; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -18,6 +18,6 @@ public class MixinMinecraftServer { @Inject(method = "configurePackRepository", at = @At("HEAD")) private static void callback(PackRepository repo, WorldDataConfiguration config, boolean forceModData, boolean flags, CallbackInfoReturnable cir) { LoadDatapackEvent event = new LoadDatapackEvent(repo); - ModLoader.postEvent(event); + ModLoader.get().postEvent(event); } } diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinRecipeManager.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinRecipeManager.java index 2f97adef7..b9fc0736e 100644 --- a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinRecipeManager.java +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinRecipeManager.java @@ -7,7 +7,6 @@ import com.google.gson.Gson; import com.google.gson.JsonElement; import com.llamalad7.mixinextras.sugar.Local; -import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener; @@ -15,8 +14,11 @@ import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.item.crafting.RecipeType; -import net.neoforged.fml.ModLoader; +import net.minecraftforge.common.crafting.conditions.ICondition; +import net.minecraftforge.fml.ModLoader; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -29,19 +31,22 @@ */ @Mixin(RecipeManager.class) public abstract class MixinRecipeManager extends SimpleJsonResourceReloadListener { + @Shadow + @Final + private ICondition.IContext context; + private MixinRecipeManager(Gson p_10768_, String p_10769_) { super(p_10768_, p_10769_); } @Inject(method = "apply(Ljava/util/Map;Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)V", - at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/item/crafting/RecipeManager;makeConditionalOps()Lnet/neoforged/neoforge/common/conditions/ConditionalOps;")) + at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/resources/RegistryOps;withContext(Lnet/minecraft/resources/ResourceLocation;Ljava/lang/Object;)Ljava/lang/Object;")) public void captureBuilder(Map p_44037_, ResourceManager p_44038_, ProfilerFiller p_44039_, CallbackInfo ci, - @Local ImmutableMultimap.Builder, RecipeHolder> builder, - @Local ImmutableMap.Builder> builder1, - @Local RegistryOps ops) { - RegistryUtil.recipeBuildingContext(this.makeConditionalOps().context); + @Local(name = "builder") ImmutableMultimap.Builder, RecipeHolder> builder, + @Local(name = "builder1") ImmutableMap.Builder> builder1) { + RegistryUtil.recipeBuildingContext(context); RegisterRecipeEvent event = new RegisterRecipeEvent(builder, builder1); - ModLoader.postEvent(event); + ModLoader.get().postEvent(event); RegistryUtil.recipeBuildingContext(null); } } diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinSpriteResourceLoader.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinSpriteResourceLoader.java index 2e92a7dc7..f4b9128c5 100644 --- a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinSpriteResourceLoader.java +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinSpriteResourceLoader.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.texture.atlas.SpriteSourceList; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraftforge.fml.ModLoader; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -25,7 +26,7 @@ private static void inject(ResourceManager manager, ResourceLocation p_261709_, if(p_261709_.getPath().equals("blocks")) { //Only hack into main sprite RegisterTextureSpriteEvent event = new RegisterTextureSpriteEvent(list); - net.neoforged.fml.ModLoader.postEvent(event); + ModLoader.get().postEvent(event); } } } diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java index 752b09280..01d6df04a 100644 --- a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java @@ -7,7 +7,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.tags.TagLoader; -import net.neoforged.fml.ModLoader; +import net.minecraftforge.fml.ModLoader; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -33,11 +33,11 @@ public Map> onRegisterTag(Reso //Change me when minecraft version changes case "tags/block": RegisterBlockTagEvent blockTagEvent = new RegisterBlockTagEvent(map); - ModLoader.postEvent(blockTagEvent); + ModLoader.get().postEvent(blockTagEvent); break; case "tags/item": RegisterItemTagEvent itemTagEvent = new RegisterItemTagEvent(map); - ModLoader.postEvent(itemTagEvent); + ModLoader.get().postEvent(itemTagEvent); break; default: //Waiting for more... diff --git a/src/main/java/cam72cam/mod/mixin/feat/iris_pbr/MixinDeferredWorldRenderingPipeline.java b/src/main/java/cam72cam/mod/mixin/feat/iris_pbr/MixinDeferredWorldRenderingPipeline.java deleted file mode 100644 index c9e93b8c9..000000000 --- a/src/main/java/cam72cam/mod/mixin/feat/iris_pbr/MixinDeferredWorldRenderingPipeline.java +++ /dev/null @@ -1,20 +0,0 @@ -package cam72cam.mod.mixin.feat.iris_pbr; - -import net.irisshaders.iris.pipeline.VanillaRenderingPipeline; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -/** - * PBR handler for RenderContext (optional) - */ -@Pseudo -@Mixin(value = VanillaRenderingPipeline.class, remap = false) -public class MixinDeferredWorldRenderingPipeline { - @Inject(method = "onSetShaderTexture", at = @At(value = "HEAD")) - public void onSetPBRTex(int id, CallbackInfo ci) { - //Nothing to do with vanilla - } -} diff --git a/src/main/java/cam72cam/mod/mixin/feat/iris_pbr/MixinNewWorldRenderingPipeline.java b/src/main/java/cam72cam/mod/mixin/feat/iris_pbr/MixinNewWorldRenderingPipeline.java deleted file mode 100644 index e1dc0d668..000000000 --- a/src/main/java/cam72cam/mod/mixin/feat/iris_pbr/MixinNewWorldRenderingPipeline.java +++ /dev/null @@ -1,51 +0,0 @@ -package cam72cam.mod.mixin.feat.iris_pbr; - -import cam72cam.mod.render.opengl.RenderContext; -import cam72cam.mod.render.opengl.RenderState; -import cam72cam.mod.render.opengl.Texture; -import net.irisshaders.iris.pbr.texture.PBRTextureManager; -import net.irisshaders.iris.pipeline.IrisRenderingPipeline; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - - -/** - * PBR handler for RenderContext (optional) - */ -@Pseudo -@Mixin(value = IrisRenderingPipeline.class, remap = false) -public class MixinNewWorldRenderingPipeline { - @Shadow - private int currentNormalTexture; - - @Shadow - private int currentSpecularTexture; - - @Shadow - private boolean shouldBindPBR; - - @Shadow - private boolean isRenderingWorld; - - @Inject(method = "onSetShaderTexture", at = @At("HEAD"), cancellable = true) - public void onSetPBRTex(int id, CallbackInfo ci) { - if (this.shouldBindPBR && this.isRenderingWorld) { - if (RenderContext.currentState.get() != null) { - RenderState state = RenderContext.currentState.get(); - if (state.getNormals() != Texture.NO_TEXTURE && state.getNormals() != null && state.getNormals().getId() != -1) { - currentNormalTexture = state.getNormals().getId(); - } - if (state.getSpecular() != Texture.NO_TEXTURE && state.getSpecular() != null && state.getSpecular().getId() != -1) { - currentSpecularTexture = state.getSpecular().getId(); - } - - PBRTextureManager.notifyPBRTexturesChanged(); - ci.cancel(); - } - } - } -} diff --git a/src/main/java/cam72cam/mod/model/obj/OBJModel.java b/src/main/java/cam72cam/mod/model/obj/OBJModel.java index 9b6a252d2..1e8da6a06 100644 --- a/src/main/java/cam72cam/mod/model/obj/OBJModel.java +++ b/src/main/java/cam72cam/mod/model/obj/OBJModel.java @@ -30,8 +30,8 @@ public class OBJModel { public final int textureHeight; public final int defaultLodSize; public final Map> textures = new HashMap<>(); - public final Map normals = new HashMap<>(); - public final Map speculars = new HashMap<>(); + public final Map> normals = new HashMap<>(); + public final Map> speculars = new HashMap<>(); public final LinkedHashMap groups; //Order by vertex start/stop public final boolean isSmoothShading; @@ -112,7 +112,7 @@ public OBJModel(Identifier modelLoc, float darken, double scale, Collection k.getString("variant"))) { ModCore.debug("%s : tex %s", modelLoc, variant); - Map lodMap = new HashMap<>(); + Map baseTexLodMap = new HashMap<>(); int texSize = Math.max(textureWidth, textureHeight); Supplier texData = cache.getResource(variant + ".rgba", builder -> { @@ -128,7 +128,7 @@ public OBJModel(Identifier modelLoc, float darken, double scale, Collection lodData = cache.getResource(variant + String.format("_%s.rgba", lodValue), builder -> new GenericByteBuffer(toRGBA(scaleImage(builder.getTextures().get(variant).get(), lodValue))) ); - lodMap.put(lodValue, new OBJTextureSheet(size.getLeft(), size.getRight(), lodData, cacheSeconds)); + baseTexLodMap.put(lodValue, new OBJTextureSheet(size.getLeft(), size.getRight(), lodData, cacheSeconds)); } } - this.textures.put(variant, lodMap); + this.textures.put(variant, baseTexLodMap); if (hasNormals) { + Map normalTexLodMap = new HashMap<>(); try { - Supplier normData = cache.getResource(variant + ".norm", builder -> new GenericByteBuffer(toRGBA(builder.getNormals().get(variant).get()))); - this.normals.put(variant, new OBJTextureSheet(textureWidth, textureHeight, normData, cacheSeconds)); + Supplier normData = cache.getResource(variant + ".norm", builder -> { + BufferedImage img = builder.getNormals().get(variant).get(); + if (Config.DebugTextureSheets) { + try { + File cacheFile = ModCore.cacheFile(new Identifier(modelLoc.getDomain() + "debug", modelLoc.getPath() + "_" + variant + "_norm.png")); + ModCore.info("Writing debug normal to " + cacheFile); + ImageIO.write(img, "png", cacheFile); + } catch (IOException e) { + ModCore.catching(e); + } + } + return new GenericByteBuffer(toRGBA(img)); + }); + normalTexLodMap.put(texSize, new OBJTextureSheet(textureWidth, textureHeight, normData, cacheSeconds)); + + for (Integer lodValue : lodValues) { + if (lodValue < texSize) { + Pair size = scaleSize(textureWidth, textureHeight, lodValue); + Supplier lodNormData = cache.getResource(variant + "_" + lodValue + ".norm", + builder -> new GenericByteBuffer(toRGBA(scaleImage(builder.getNormals().get(variant).get(), lodValue)))); + normalTexLodMap.put(lodValue, new OBJTextureSheet(size.getLeft(), size.getRight(), lodNormData, cacheSeconds)); + } + } + this.normals.put(variant, normalTexLodMap); } catch (Exception ex) { ModCore.warn("Unable to load normal map for %s, %s", modelLoc, ex); } } if (hasSpeculars) { + Map specularTexLodMap = new HashMap<>(); try { - Supplier specData = cache.getResource(variant + ".spec", builder -> new GenericByteBuffer(toRGBA(builder.getSpeculars().get(variant).get()))); - this.speculars.put(variant, new OBJTextureSheet(textureWidth, textureHeight, specData, cacheSeconds)); + Supplier specData = cache.getResource(variant + ".spec", builder -> { + BufferedImage img = builder.getSpeculars().get(variant).get(); + if (Config.DebugTextureSheets) { + try { + File cacheFile = ModCore.cacheFile(new Identifier(modelLoc.getDomain() + "debug", modelLoc.getPath() + "_" + variant + "_spec.png")); + ModCore.info("Writing debug specular to " + cacheFile); + ImageIO.write(img, "png", cacheFile); + } catch (IOException e) { + ModCore.catching(e); + } + } + return new GenericByteBuffer(toRGBA(img)); + }); + specularTexLodMap.put(texSize, new OBJTextureSheet(textureWidth, textureHeight, specData, cacheSeconds)); + + for (Integer lodValue : lodValues) { + if (lodValue < texSize) { + Pair size = scaleSize(textureWidth, textureHeight, lodValue); + Supplier lodSpecData = cache.getResource(variant + "_" + lodValue + ".spec", + builder -> new GenericByteBuffer(toRGBA(scaleImage(builder.getSpeculars().get(variant).get(), lodValue)))); + specularTexLodMap.put(lodValue, new OBJTextureSheet(size.getLeft(), size.getRight(), lodSpecData, cacheSeconds)); + } + } + this.speculars.put(variant, specularTexLodMap); } catch (Exception ex) { ModCore.warn("Unable to load specular map for %s, %s", modelLoc, ex); } @@ -302,22 +348,67 @@ public void apply(RenderState state) { } } - if (lodSize == -1) { //A fallback for auto detect lodSize = defaultLodSize; } - if (lodSize == defaultLodSize && OBJModel.this.normals.containsKey(texName)) { - state.normals(OBJModel.this.normals.get(texName).synchronous(wait)); + OBJTextureSheet normTex = null; + if (OBJModel.this.normals.containsKey(texName)) { + Map normLodMap = OBJModel.this.normals.get(texName); + normTex = normLodMap.get(lodSize); + if (normTex == null) { + normTex = normLodMap.get(defaultLodSize); + } + } + if (normTex != null) { + if (wait) { + state.normals(normTex.synchronous(true)); + } else { + normTex.getId(); + if (!normTex.isLoaded()) { + normTex = OBJModel.this.normals.get(texName).values().stream() + .filter(CustomTexture::isLoaded) + .findAny().orElse(null); + } + if (normTex != null) { + state.normals(normTex); + } else { + state.normals(defTex); + } + } } else { state.normals(defTex); } - if (lodSize == defaultLodSize && OBJModel.this.speculars.containsKey(texName)) { - state.specular(OBJModel.this.speculars.get(texName).synchronous(wait)); + + OBJTextureSheet specTex = null; + if (OBJModel.this.speculars.containsKey(texName)) { + Map specLodMap = OBJModel.this.speculars.get(texName); + specTex = specLodMap.get(lodSize); + if (specTex == null) { + specTex = specLodMap.get(defaultLodSize); + } + } + if (specTex != null) { + if (wait) { + state.specular(specTex.synchronous(true)); + } else { + specTex.getId(); + if (!specTex.isLoaded()) { + specTex = OBJModel.this.speculars.get(texName).values().stream() + .filter(CustomTexture::isLoaded) + .findAny().orElse(null); + } + if (specTex != null) { + state.specular(specTex); + } else { + state.specular(defTex); + } + } } else { state.specular(defTex); } + state.smooth_shading(OBJModel.this.isSmoothShading); } diff --git a/src/main/java/cam72cam/mod/net/Packet.java b/src/main/java/cam72cam/mod/net/Packet.java index 9e57eaaa0..d5cbd5920 100644 --- a/src/main/java/cam72cam/mod/net/Packet.java +++ b/src/main/java/cam72cam/mod/net/Packet.java @@ -11,29 +11,37 @@ import cam72cam.mod.serialization.TagField; import cam72cam.mod.serialization.TagSerializer; import cam72cam.mod.world.World; +import io.netty.util.AttributeKey; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.PacketFlow; +import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket; +import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.neoforged.neoforge.network.PacketDistributor; -import net.neoforged.neoforge.network.handling.IPayloadContext; +import net.minecraftforge.event.network.CustomPayloadEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.network.*; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Locale; import java.util.Map; +import java.util.function.BiConsumer; import java.util.function.Supplier; /** * Packet abstraction and registration * @see TagSerializer */ +@Mod.EventBusSubscriber(modid = ModCore.MODID) public abstract class Packet { public static final String VERSION = "1.0"; // Packet class name -> Packet Constructor @@ -61,82 +69,32 @@ public static void register(Supplier sup, PacketDirection dir) { return; } types.put(pktClass, sup); - ResourceLocation name = ResourceLocation.tryBuild(ModCore.MODID, sup.get().getClass().getName().toLowerCase(Locale.ROOT).replace("$", ".")); - CustomPacketPayload.Type type = new CustomPacketPayload.Type<>(name); - CommonEvents.Networking.REGISTER_PACKET.subscribe(reg -> { - reg.commonBidirectional(type, Message.codec, (msg, context) -> { - context.enqueueWork(() -> { - msg.packet.ctx = context; - Packet newPacket = copyFreshPacket(msg); - World world = (context.protocol().isPlay() && context.flow() == PacketFlow.CLIENTBOUND) - ? MinecraftClient.getPlayer().getWorld() : World.get(context.player().level()); - try { - TagSerializer.deserialize(msg.packet.data, newPacket, world); - } catch (SerializationException e) { - ModCore.catching(e); - return; - } - newPacket.ctx = context; - if (newPacket.getPlayer() == null) { - try { - throw new Exception( - String.format("Invalid Packet %s: missing player", newPacket.getClass())); - } catch (Exception e) { - ModCore.catching(e); - return; - } - } - newPacket.handle(); - }); - }); - }); } - //Since 1.20.4 NeoForge will use the identical packet object for networking in singleplayer - //Good optimization but bad for UMC - //Create a new copy to avoid modifying original packet object - private static Packet copyFreshPacket(Message msg) { - Packet newPacket; - try { - Constructor constructor = - msg.packet.getClass().getDeclaredConstructor(); - constructor.setAccessible(true); - newPacket = constructor.newInstance(); - } catch (InstantiationException | IllegalAccessException | - InvocationTargetException | NoSuchMethodException e) { - throw new RuntimeException(e); - } - return newPacket; - } - - IPayloadContext ctx; + CustomPayloadEvent.Context ctx; /** Called after deserialization */ protected abstract void handle(); /** Only valid during handle */ protected final World getWorld() { - if (ctx.protocol().isPlay() && ctx.flow() == PacketFlow.CLIENTBOUND) { - return getPlayer().getWorld(); - } return world; } /** Only valid during handle */ protected final Player getPlayer() { - return (ctx.protocol().isPlay() && ctx.flow() == PacketFlow.CLIENTBOUND) - ? MinecraftClient.getPlayer() - : player; + return player; } /** Send from server to all players around this pos */ public void sendToAllAround(World world, Vec3d pos, double distance) { - PacketDistributor.sendToPlayersNear((ServerLevel) world.internal, null, pos.x, pos.y, pos.z, distance, new Message(this)); + PacketDistributor.NEAR + .with(new PacketDistributor.TargetPoint(pos.x, pos.y, pos.z, distance, world.internal.dimension())) + .send(new ClientboundCustomPayloadPacket(new Message(this))); } /** Send from server to any player who is within viewing (entity tracker update) distance of the entity */ public void sendToObserving(Entity entity) { - net.minecraft.world.entity.Entity internal = entity.internal; int syncDist = entity.internal.getType().clientTrackingRange(); this.sendToAllAround(entity.getWorld(), entity.getPosition(), syncDist); } @@ -145,17 +103,20 @@ public void sendToObserving(Entity entity) { public void sendToServer() { this.player = MinecraftClient.getPlayer(); this.world = MinecraftClient.getPlayer().getWorld(); - PacketDistributor.sendToServer(new Message(this)); + PacketDistributor.SERVER.noArg() + .send(new ServerboundCustomPayloadPacket(new Message(this))); } /** Broadcast to all players from server */ public void sendToAll() { - PacketDistributor.sendToAllPlayers(new Message(this)); + PacketDistributor.ALL.noArg() + .send(new ClientboundCustomPayloadPacket(new Message(this))); } /** Send from server to player */ public void sendToPlayer(Player player) { - PacketDistributor.sendToPlayer((ServerPlayer) player.internal, new Message(this)); + PacketDistributor.PLAYER.with((ServerPlayer) player.internal) + .send(new ClientboundCustomPayloadPacket(new Message(this))); } /** Forge message construct. Do not use directly */ @@ -209,4 +170,32 @@ public CustomPacketPayload.Type type() { return type; } } + + /** + * Internal + */ + @SubscribeEvent + public static void onCustomPacket(CustomPayloadEvent event) { + if (event.getPayloadObject() instanceof Message message) { + event.getSource().enqueueWork(() -> { + World world = World.get(event.getSource().getSender().level()); + try { + TagSerializer.deserialize(message.packet.data, message.packet, world); + } catch (SerializationException e) { + ModCore.catching(e); + return; + } + if (message.packet.getPlayer() == null) { + try { + throw new Exception( + String.format("Invalid Packet %s: missing player", message.packet.getClass())); + } catch (Exception e) { + ModCore.catching(e); + return; + } + } + message.packet.handle(); + }); + } + } } diff --git a/src/main/java/cam72cam/mod/render/BakedScaledModel.java b/src/main/java/cam72cam/mod/render/BakedScaledModel.java index 99b7ba400..ebccab937 100644 --- a/src/main/java/cam72cam/mod/render/BakedScaledModel.java +++ b/src/main/java/cam72cam/mod/render/BakedScaledModel.java @@ -9,8 +9,8 @@ import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.client.model.IQuadTransformer; -import net.neoforged.neoforge.client.model.QuadTransformers; +import net.minecraftforge.client.model.IQuadTransformer; +import net.minecraftforge.client.model.QuadTransformers; import org.joml.Matrix4f; import util.Matrix4; diff --git a/src/main/java/cam72cam/mod/render/BlockRender.java b/src/main/java/cam72cam/mod/render/BlockRender.java index 80c1f14ad..577622f33 100644 --- a/src/main/java/cam72cam/mod/render/BlockRender.java +++ b/src/main/java/cam72cam/mod/render/BlockRender.java @@ -32,7 +32,7 @@ import net.minecraft.world.level.material.MapColor; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.client.model.data.ModelData; +import net.minecraftforge.client.model.data.ModelData; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -123,14 +123,6 @@ public void render(TileEntity te, float partialTicks, PoseStack var3, MultiBuffe public boolean shouldRenderOffScreen(TileEntity te) { return true; } - - @Override - public AABB getRenderBoundingBox(TileEntity blockEntity) { - if (blockEntity.instance() != null) { - return blockEntity.bbCache.get(blockEntity.instance().getRenderBoundingBox()); - } - return TileEntity.INFINITE_EXTENT_AABB; - } }); }); } diff --git a/src/main/java/cam72cam/mod/render/EntityRenderer.java b/src/main/java/cam72cam/mod/render/EntityRenderer.java index 957249053..9c70e13bd 100644 --- a/src/main/java/cam72cam/mod/render/EntityRenderer.java +++ b/src/main/java/cam72cam/mod/render/EntityRenderer.java @@ -136,7 +136,8 @@ public void render(T stock, float entityYaw, float partialTicks, PoseStack p_225 int k = (i >> 20) & 0xF; RenderState state = new RenderState(p_225623_4_).lightmap(j / 15f, k / 15f); state.rotate(180 - entityYaw, 0, 1, 0); - state.rotate(self.getRotationPitch(), 1, 0, 0); + state.rotate(self.getRotationPitch(partialTicks), 1, 0, 0); + state.rotate(self.getRotationRoll(partialTicks), 0, 0, 1); state.rotate(-90, 0, 1, 0); state.stage(RenderContext.Stage.ENTITY); //Set up our own light state diff --git a/src/main/java/cam72cam/mod/render/GlobalRender.java b/src/main/java/cam72cam/mod/render/GlobalRender.java index 7e36c2c98..c75bd7fa6 100644 --- a/src/main/java/cam72cam/mod/render/GlobalRender.java +++ b/src/main/java/cam72cam/mod/render/GlobalRender.java @@ -15,7 +15,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.neoforged.neoforge.client.gui.VanillaGuiLayers; +import net.minecraftforge.client.event.CustomizeGuiOverlayEvent; import org.joml.Matrix4f; import java.util.ArrayList; @@ -30,15 +30,16 @@ public class GlobalRender { public static void registerClientEvents() { // Nice to have GPU info in F3 ClientEvents.RENDER_DEBUG.subscribe(event -> { - if (Minecraft.getInstance().getDebugOverlay().showDebugScreen() && GPUInfo.hasGPUInfo()) { + if (Minecraft.getInstance().getDebugOverlay().showDebugScreen() + && event.getSide() == CustomizeGuiOverlayEvent.DebugText.Side.Right && GPUInfo.hasGPUInfo()) { int i; - for (i = 0; i < event.getRight().size(); i++) { - if (event.getRight().get(i).startsWith("Display: ")) { + for (i = 0; i < event.getText().size(); i++) { + if (event.getText().get(i).startsWith("Display: ")) { i++; break; } } - event.getRight().add(i, GPUInfo.debug()); + event.getText().add(i, GPUInfo.debug()); } }); } @@ -49,12 +50,12 @@ public static void registerRender(RenderFunction func) { } /** Register a function that is called (with partial ticks) during the UI render phase */ - public static void registerOverlay(RenderFunction func) { - ClientEvents.RENDER_OVERLAY.subscribe(event -> { - if (event.getName().equals(VanillaGuiLayers.HOTBAR) && !Minecraft.getInstance().options.hideGui) { - func.render(new RenderState(event.getGuiGraphics().pose()).stage(RenderContext.Stage.GUI), event.getPartialTick().getRealtimeDeltaTicks()); - } - }); + public static void registerOverlay(RenderFunction func) { // TODO + //ClientEvents.RENDER_OVERLAY.subscribe(event -> { + // if (event.getName().equals(VanillaGuiLayers.HOTBAR) && !Minecraft.getInstance().options.hideGui) { + // func.render(new RenderState(event.getGuiGraphics().pose()).stage(RenderContext.Stage.GUI), event.getPartialTick().getRealtimeDeltaTicks()); + // } + //}); } /** Register a function that is called to render during the mouse over phase (only if a block is moused over) */ @@ -64,7 +65,7 @@ public static void registerItemMouseover(CustomItem item, MouseoverEvent fn) { Player player = MinecraftClient.getPlayer(); if (item.internal == player.getHeldItem(Player.Hand.PRIMARY).internal().getItem()) { fn.render(player, player.getHeldItem(Player.Hand.PRIMARY), MinecraftClient.getBlockMouseOver().down(), - MinecraftClient.getPosMouseOver(), new RenderState(event.getPoseStack()).stage(RenderContext.Stage.OVERLAY), event.getDeltaTracker().getRealtimeDeltaTicks()); + MinecraftClient.getPosMouseOver(), new RenderState(event.getPoseStack()).stage(RenderContext.Stage.OVERLAY), event.getPartialTick()); } } }); diff --git a/src/main/java/cam72cam/mod/render/ItemRender.java b/src/main/java/cam72cam/mod/render/ItemRender.java index fccba1b2b..2d7971ce2 100644 --- a/src/main/java/cam72cam/mod/render/ItemRender.java +++ b/src/main/java/cam72cam/mod/render/ItemRender.java @@ -34,10 +34,9 @@ import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.client.model.ExtraFaceData; -import net.neoforged.neoforge.client.model.ItemLayerModel; -import net.neoforged.neoforge.client.model.SimpleModelState; -import net.neoforged.neoforge.client.model.geometry.IGeometryBakingContext; +import net.minecraftforge.client.model.ItemLayerModel; +import net.minecraftforge.client.model.SimpleModelState; +import net.minecraftforge.client.model.geometry.IGeometryBakingContext; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/cam72cam/mod/render/Light.java b/src/main/java/cam72cam/mod/render/Light.java index eeca5e129..ff29e2016 100644 --- a/src/main/java/cam72cam/mod/render/Light.java +++ b/src/main/java/cam72cam/mod/render/Light.java @@ -5,9 +5,6 @@ import cam72cam.mod.event.CommonEvents; import cam72cam.mod.math.Vec3d; import cam72cam.mod.world.World; -import dev.lambdaurora.lambdynlights.api.DynamicLightsContext; -import dev.lambdaurora.lambdynlights.api.DynamicLightsInitializer; -import dev.lambdaurora.lambdynlights.api.item.ItemLightSourceManager; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.SynchedEntityData; @@ -144,29 +141,6 @@ public static boolean enabled() { } private static boolean isLDLInstalled() { - try { - Class cls = Class.forName("dev.lambdaurora.lambdynlights.LambDynLights"); - return true; - } catch (ClassNotFoundException ignored) { - return false; - } - } - - public static class UMCDynLightInitializer implements DynamicLightsInitializer { - @Override - public void onInitializeDynamicLights(DynamicLightsContext lightCtx) { - lightCtx.entityLightSourceManager().onRegisterEvent().register(context -> { - for (int i = 1; i <= 15; i++) { - EntityType et = types[i]; - context.register(et, i); - } - }); - } - - @Deprecated(forRemoval = true) - @Override - public void onInitializeDynamicLights(ItemLightSourceManager itemLightSourceManager) { - //Deprecated - } + return false; // Cannot be installed on MinecraftForge >1.20.1 } } diff --git a/src/main/java/cam72cam/mod/render/SpriteSheet.java b/src/main/java/cam72cam/mod/render/SpriteSheet.java index 960aeef37..dc5b57a3e 100644 --- a/src/main/java/cam72cam/mod/render/SpriteSheet.java +++ b/src/main/java/cam72cam/mod/render/SpriteSheet.java @@ -60,7 +60,7 @@ private void allocateSheet() { */ public void setSprite(Identifier id, ByteBuffer pixels) { if (!sprites.containsKey(id)) { - if (unallocated.size() == 0) { + if (unallocated.isEmpty()) { allocateSheet(); } sprites.put(id, unallocated.remove(0)); @@ -90,17 +90,11 @@ public void renderSprite(Identifier id, RenderState state) { .rotate(180, 1, 0, 0) .translate(0, -1, 0); DirectDraw buffer = new DirectDraw(); - - try (With ctx = RenderContext.apply(state)) { - buffer.vertex(0, 0, 0).color(1, 1, 1, 1).uv(sprite.uMin, sprite.vMin); - buffer.vertex(0, 1, 0).color(1, 1, 1, 1).uv(sprite.uMin, sprite.vMax); - buffer.vertex(1, 1, 0).color(1, 1, 1, 1).uv(sprite.uMax, sprite.vMax); - buffer.vertex(1, 0, 0).color(1, 1, 1, 1).uv(sprite.uMax, sprite.vMin); - } - ; + buffer.vertex(0, 0, 0).color(1, 1, 1, 1).uv(sprite.uMin, sprite.vMin); + buffer.vertex(0, 1, 0).color(1, 1, 1, 1).uv(sprite.uMin, sprite.vMax); + buffer.vertex(1, 1, 0).color(1, 1, 1, 1).uv(sprite.uMax, sprite.vMax); + buffer.vertex(1, 0, 0).color(1, 1, 1, 1).uv(sprite.uMax, sprite.vMin); buffer.draw(state); - - } /** diff --git a/src/main/java/cam72cam/mod/render/opengl/RenderContext.java b/src/main/java/cam72cam/mod/render/opengl/RenderContext.java index 24174ea3c..c379ee9ac 100644 --- a/src/main/java/cam72cam/mod/render/opengl/RenderContext.java +++ b/src/main/java/cam72cam/mod/render/opengl/RenderContext.java @@ -16,9 +16,13 @@ import org.joml.Vector3f; import org.joml.Vector4f; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL32; import util.Matrix4; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; import java.util.*; import static cam72cam.mod.render.opengl.Texture.NO_TEXTURE; @@ -31,6 +35,8 @@ public class RenderContext { //Modified from rendertype_entity_cutout, fix model normal public static ShaderInstance UMC_CORE; + private static IntBuffer fourIntBuffer; + public static float lastLightX; public static float lastLightY; @@ -139,19 +145,31 @@ public static With applyBaseState(RenderState state) { restore.add(state.blend.apply()); } - //Always assume scissor test is disabled - if (state.scissor_test != null && state.scissor_test && state.scissor_range != null) { - int scaleFactor = (int) Minecraft.getInstance().getWindow().getGuiScale(); - int screenHeight = GUIHelpers.getScreenHeight() * scaleFactor; - - int x = (int) state.scissor_range.getMinX() * scaleFactor; - int y = (int) state.scissor_range.getMinY() * scaleFactor; - int width = (int) state.scissor_range.getWidth() * scaleFactor; - int height = (int) state.scissor_range.getHeight() * scaleFactor; + if (state.scissor_test != null) { + boolean oldValue = GL11.glGetBoolean(GL11.GL_SCISSOR_TEST); + applyBool(GL11.GL_SCISSOR_TEST, state.scissor_test); + if (state.scissor_test && state.scissor_range != null) { + int scaleFactor = (int) Minecraft.getInstance().getWindow().getGuiScale(); + int screenHeight = GUIHelpers.getScreenHeight() * scaleFactor; + + int x = (int) state.scissor_range.getMinX() * scaleFactor; + int y = (int) state.scissor_range.getMinY() * scaleFactor; + int width = (int) state.scissor_range.getWidth() * scaleFactor; + int height = (int) state.scissor_range.getHeight() * scaleFactor; + + if (fourIntBuffer == null) { + //16 ints in case it overflows... + fourIntBuffer = ByteBuffer.allocateDirect(64).order(ByteOrder.nativeOrder()).asIntBuffer(); + } + fourIntBuffer.position(0); + GL11.glGetIntegerv(GL11.GL_SCISSOR_BOX, fourIntBuffer); + int[] oldScissor = new int[]{fourIntBuffer.get(0), fourIntBuffer.get(1), fourIntBuffer.get(2), fourIntBuffer.get(3)}; + restore.add(() -> GL11.glScissor(oldScissor[0], oldScissor[1], oldScissor[2], oldScissor[3])); - //We set origin point at Top-Left corner but OpenGL takes Bottom-Left corner, so wraps y - RenderSystem.enableScissor(x, screenHeight - y - height, width, height); - restore.add(RenderSystem::disableScissor); + //We set origin point at Top-Left corner but OpenGL takes Bottom-Left corner, so wraps y + GL11.glScissor(x, screenHeight - y - height, width, height); + } + restore.add(() -> applyBool(GL11.GL_SCISSOR_TEST, oldValue)); } RenderContext.checkError(); diff --git a/src/main/java/cam72cam/mod/render/opengl/RenderState.java b/src/main/java/cam72cam/mod/render/opengl/RenderState.java index 63f149d6e..fcec26cd3 100644 --- a/src/main/java/cam72cam/mod/render/opengl/RenderState.java +++ b/src/main/java/cam72cam/mod/render/opengl/RenderState.java @@ -4,8 +4,8 @@ import cam72cam.mod.render.OptiFine; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.neoforge.common.util.Lazy; +import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.common.util.Lazy; import org.joml.Matrix4f; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; diff --git a/src/main/java/cam72cam/mod/resource/BuiltinPack.java b/src/main/java/cam72cam/mod/resource/BuiltinPack.java index 16a88ae8e..cbb9ebe1d 100644 --- a/src/main/java/cam72cam/mod/resource/BuiltinPack.java +++ b/src/main/java/cam72cam/mod/resource/BuiltinPack.java @@ -14,10 +14,10 @@ import net.minecraft.server.packs.repository.PackSource; import net.minecraft.server.packs.resources.IoSupplier; import net.minecraft.world.flag.FeatureFlagSet; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.ModList; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.loading.FMLPaths; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fml.loading.FMLPaths; import javax.annotation.Nullable; import java.io.ByteArrayInputStream; diff --git a/src/main/java/cam72cam/mod/resource/Data.java b/src/main/java/cam72cam/mod/resource/Data.java index bb913df8f..362052a5c 100644 --- a/src/main/java/cam72cam/mod/resource/Data.java +++ b/src/main/java/cam72cam/mod/resource/Data.java @@ -2,8 +2,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.server.packs.resources.Resource; -import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.fml.loading.FMLPaths; +import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.fml.loading.FMLPaths; import org.apache.commons.io.IOUtils; import java.io.*; diff --git a/src/main/java/cam72cam/mod/text/PlayerMessage.java b/src/main/java/cam72cam/mod/text/PlayerMessage.java index 46b24d740..1a402e311 100644 --- a/src/main/java/cam72cam/mod/text/PlayerMessage.java +++ b/src/main/java/cam72cam/mod/text/PlayerMessage.java @@ -1,7 +1,7 @@ package cam72cam.mod.text; import net.minecraft.network.chat.Component; -import net.neoforged.neoforge.common.CommonHooks; +import net.minecraftforge.common.ForgeHooks; import java.util.Arrays; @@ -26,6 +26,6 @@ public static PlayerMessage translate(String msg, Object... objects) { /** URL Formatted (clickable) */ public static PlayerMessage url(String url) { - return new PlayerMessage(CommonHooks.newChatWithLinks(url)); + return new PlayerMessage(ForgeHooks.newChatWithLinks(url)); } } diff --git a/src/main/java/cam72cam/mod/util/MinecraftFiles.java b/src/main/java/cam72cam/mod/util/MinecraftFiles.java index 6444f4947..60bdc0042 100644 --- a/src/main/java/cam72cam/mod/util/MinecraftFiles.java +++ b/src/main/java/cam72cam/mod/util/MinecraftFiles.java @@ -1,7 +1,7 @@ package cam72cam.mod.util; import cam72cam.mod.world.World; -import net.neoforged.fml.loading.FMLPaths; +import net.minecraftforge.fml.loading.FMLPaths; import java.io.File; import java.nio.file.Path; diff --git a/src/main/java/cam72cam/mod/util/RegistryUtil.java b/src/main/java/cam72cam/mod/util/RegistryUtil.java index 511892a17..a18908496 100644 --- a/src/main/java/cam72cam/mod/util/RegistryUtil.java +++ b/src/main/java/cam72cam/mod/util/RegistryUtil.java @@ -5,9 +5,9 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.Holder; import net.minecraft.core.RegistryAccess; -import net.neoforged.fml.util.thread.EffectiveSide; -import net.neoforged.neoforge.common.conditions.ICondition; -import net.neoforged.neoforge.server.ServerLifecycleHooks; +import net.minecraftforge.common.crafting.conditions.ICondition; +import net.minecraftforge.fml.util.thread.EffectiveSide; +import net.minecraftforge.server.ServerLifecycleHooks; import javax.annotation.Nonnull; import java.util.ArrayList; diff --git a/src/main/java/cam72cam/mod/world/World.java b/src/main/java/cam72cam/mod/world/World.java index 13772fb43..43bab3f70 100644 --- a/src/main/java/cam72cam/mod/world/World.java +++ b/src/main/java/cam72cam/mod/world/World.java @@ -43,13 +43,14 @@ import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.shapes.VoxelShape; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.neoforge.common.SpecialPlantable; -import net.neoforged.neoforge.fluids.capability.IFluidHandler; -import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.items.IItemHandlerModifiable; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.common.IPlantable; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; import org.apache.commons.lang3.NotImplementedException; import java.util.*; @@ -639,7 +640,7 @@ public boolean isReplaceable(Vec3i pos) { if (block instanceof BushBlock) { return true; } - if (block.asItem() instanceof SpecialPlantable) { + if (block.asItem() instanceof IPlantable) { return true; } if (block instanceof LiquidBlock) { @@ -672,17 +673,12 @@ public IInventory getInventory(Vec3i offset) { /** Get the inventory at this block (accessed from given side) */ public IInventory getInventory(Vec3i offset, Facing dir) { - if (dir != null) { - IItemHandler capability = internal.getCapability(TileEntity.ITEM_HANDLER_BLOCK, offset.internal(), dir.internal); - if (capability instanceof IItemHandlerModifiable) { - return IInventory.from((IItemHandlerModifiable) capability); - } - } else { - for(Facing facing : Facing.values()){ - IItemHandler capability = internal.getCapability(TileEntity.ITEM_HANDLER_BLOCK, offset.internal(), facing.internal); - if (capability instanceof IItemHandlerModifiable) { - return IInventory.from((IItemHandlerModifiable) capability); - } + net.minecraft.world.level.block.entity.BlockEntity te = internal.getBlockEntity(offset.internal()); + Direction face = dir != null ? dir.internal : null; + if (te != null && te.getCapability(ForgeCapabilities.ITEM_HANDLER, face).isPresent()) { + IItemHandler inv = te.getCapability(ForgeCapabilities.ITEM_HANDLER, face).orElse(null); + if (inv instanceof IItemHandlerModifiable) { + return IInventory.from((IItemHandlerModifiable) inv); } } return null; @@ -701,17 +697,12 @@ public List getTank(Vec3i offset) { /** Get the tank at this block (accessed from given side) */ public List getTank(Vec3i offset, Facing dir) { - if (dir != null) { - IFluidHandler capability = internal.getCapability(TileEntity.FLUID_HANDLER_BLOCK, offset.internal(), dir.internal); - if (capability != null) { - return ITank.getTank(capability); - } - } else { - for(Facing facing : Facing.values()){ - IFluidHandler capability = internal.getCapability(TileEntity.FLUID_HANDLER_BLOCK, offset.internal(), facing.internal); - if (capability != null) { - return ITank.getTank(capability); - } + net.minecraft.world.level.block.entity.BlockEntity te = internal.getBlockEntity(offset.internal()); + Direction face = dir != null ? dir.internal : null; + if (te != null && te.getCapability(ForgeCapabilities.FLUID_HANDLER, face).isPresent()) { + IFluidHandler tank = te.getCapability(ForgeCapabilities.FLUID_HANDLER, face).orElse(null); + if (tank != null) { + return ITank.getTank(tank); } } return null; diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 4e70798ef..e3a47e231 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1,6 +1,9 @@ public net.minecraft.server.level.ServerChunkCache distanceManager # distanceManager public net.minecraft.server.level.DistanceManager tickets # tickets public net.minecraft.server.MinecraftServer storageSource # storageSource +public net.minecraft.server.packs.FilePackResources (Lnet/minecraft/server/packs/PackLocationInfo;Lnet/minecraft/server/packs/FilePackResources$SharedZipFileAccess;Ljava/lang/String;)V +public net.minecraft.server.packs.FilePackResources$SharedZipFileAccess +public net.minecraft.server.packs.FilePackResources$SharedZipFileAccess (Ljava/io/File;)V public net.minecraft.server.packs.FolderPackResources getFile(Ljava/lang/String;)Ljava/io/File; # getFile public net.minecraft.server.level.ChunkMap getChunks()Ljava/lang/Iterable; # getChunks public-f net.minecraft.world.entity.Entity getBoundingBox()Lnet/minecraft/world/phys/AABB; # net/minecraft/world/entity/Entity/getBoundingBox ()Lnet/minecraft/world/phys/AABB @@ -8,10 +11,10 @@ public net.minecraft.client.multiplayer.ClientLevel connection #connection public net.minecraft.client.renderer.GameRenderer renderBuffers #renderBuffers public net.minecraft.client.gui.components.Checkbox (IILnet/minecraft/network/chat/Component;Lnet/minecraft/client/gui/Font;ZLnet/minecraft/client/gui/components/Checkbox$OnValueChange;)V public-f net.minecraft.client.gui.components.AbstractWidget render(Lnet/minecraft/client/gui/GuiGraphics;IIF)V -public net.neoforged.neoforge.common.CreativeModeTabRegistry recalculateItemCreativeModeTabs()V +public net.minecraftforge.common.CreativeModeTabRegistry recalculateItemCreativeModeTabs()V public net.minecraft.client.gui.components.Checkbox (IIILnet/minecraft/network/chat/Component;Lnet/minecraft/client/gui/Font;ZLnet/minecraft/client/gui/components/Checkbox$OnValueChange;)V public net.minecraft.client.renderer.MultiBufferSource$BufferSource startedBuilders -public net.neoforged.neoforge.client.model.ItemLayerModel (Lcom/google/common/collect/ImmutableList;Lit/unimi/dsi/fastutil/ints/Int2ObjectMap;Lit/unimi/dsi/fastutil/ints/Int2ObjectMap;)V +public net.minecraftforge.client.model.ItemLayerModel (Lcom/google/common/collect/ImmutableList;Lit/unimi/dsi/fastutil/ints/Int2ObjectMap;Lit/unimi/dsi/fastutil/ints/Int2ObjectMap;)V public net.minecraft.client.resources.model.ModelManager atlases # atlases public net.minecraft.client.resources.model.ModelManager maxMipmapLevels # maxMipmapLevels public net.minecraft.client.multiplayer.prediction.BlockStatePredictionHandler$ServerVerifiedState @@ -24,6 +27,6 @@ public net.minecraft.world.entity.item.ItemEntity target # target public net.minecraft.world.phys.shapes.VoxelShape (Lnet/minecraft/world/phys/shapes/DiscreteVoxelShape;)V public net.minecraft.world.phys.shapes.VoxelShape shape # shape public net.minecraft.util.math.shapes.VoxelShapeCube (Lnet/minecraft/world/phys/shapes/DiscreteVoxelShape;)V -public net.neoforged.neoforge.common.conditions.ConditionalOps context +public net.minecraftforge.common.conditions.ConditionalOps context public com.mojang.blaze3d.platform.Lighting DIFFUSE_LIGHT_0 public com.mojang.blaze3d.platform.Lighting DIFFUSE_LIGHT_1 \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 000000000..4cb4bd9b6 --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,28 @@ +modLoader="javafml" +loaderVersion="[52,)" +issueTrackerURL="https://github.com/TeamOpenIndustry/UniversalModCore/issues" +license="LGPL" + +[[mods]] +modId="universalmodcore" +version="1.3.0" +displayName="Universal Mod Core" +displayURL="https://github.com/TeamOpenIndustry/UniversalModCore" +authors="cam72cam" +description=''' +Universal Mod API (Minecraft version agnostic) +''' + +[[dependencies.universalmodcore]] +modId="forge" +mandatory=true +versionRange="[52.1.14,)" +ordering="NONE" +side="BOTH" + +[[dependencies.universalmodcore]] +modId="minecraft" +mandatory=true +versionRange="[1.21.1]" +ordering="NONE" +side="BOTH" diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml deleted file mode 100644 index 7bed328e9..000000000 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ /dev/null @@ -1,36 +0,0 @@ -modLoader="javafml" -loaderVersion="[2,)" -issueTrackerURL="https://github.com/TeamOpenIndustry/UniversalModCore/issues" -license="LGPL" - -[[mods]] -modId="universalmodcore" -version="1.2.3" -displayName="Universal Mod Core" -displayURL="https://github.com/TeamOpenIndustry/UniversalModCore" -authors="cam72cam" -description=''' -Universal Mod API (Minecraft version agnostic) -''' - -[[mixins]] -config="mixins.feat.universalmodcore.json" -[[mixins]] -config="mixins.fix.universalmodcore.json" - -[modproperties.universalmodcore."yumi:entrypoints"] -"lambdynlights:initializer" = "cam72cam.mod.render.Light$UMCDynLightInitializer" - -[[dependencies.universalmodcore]] - modId="neoforge" - type='required' - versionRange="[21.1.216,)" - ordering="NONE" - side="BOTH" - -[[dependencies.universalmodcore]] - modId="minecraft" - type='required' - versionRange="[1.21.1]" - ordering="NONE" - side="BOTH" diff --git a/src/main/resources/mixins.feat.universalmodcore.json b/src/main/resources/mixins.feat.universalmodcore.json index c58697fda..f543f3eee 100644 --- a/src/main/resources/mixins.feat.universalmodcore.json +++ b/src/main/resources/mixins.feat.universalmodcore.json @@ -4,8 +4,11 @@ "refmap": "mixins.universalmodcore.refmap.json", "target": "@env(DEFAULT)", "minVersion": "0.8.2", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "mixinPriority": 1300, + "mixinextras": { + "minVersion": "0.5.0" + }, "mixins": [ "data_registry.MixinAdvancement", "data_registry.MixinMinecraftServer", @@ -15,8 +18,6 @@ ], "client": [ "data_registry.MixinSpriteResourceLoader", - "global_renderer.MixinRenderGlobal", - "iris_pbr.MixinDeferredWorldRenderingPipeline", - "iris_pbr.MixinNewWorldRenderingPipeline" + "global_renderer.MixinRenderGlobal" ] } diff --git a/src/main/resources/mixins.fix.universalmodcore.json b/src/main/resources/mixins.fix.universalmodcore.json index 73af28171..0a12048b6 100644 --- a/src/main/resources/mixins.fix.universalmodcore.json +++ b/src/main/resources/mixins.fix.universalmodcore.json @@ -6,6 +6,9 @@ "minVersion": "0.8.2", "compatibilityLevel": "JAVA_8", "mixinPriority": 1301, + "mixinextras": { + "minVersion": "0.5.0" + }, "mixins": [ "always_shown_tab.MixinCreativeModeTab", "custom_bb_collision.MixinVoxelShapes", diff --git a/src/main/resources/template/UMC.md b/src/main/resources/template/UMC.md index d60e3afd5..b0c28ce55 100644 --- a/src/main/resources/template/UMC.md +++ b/src/main/resources/template/UMC.md @@ -1 +1 @@ -You don't need to run anything manually, NeoGradle has done them for you \ No newline at end of file +You don't need to run anything manually, ForgeGradle 7 has done them for you \ No newline at end of file diff --git a/src/main/resources/template/build.gradle b/src/main/resources/template/build.gradle index 77c5816d3..ece594936 100644 --- a/src/main/resources/template/build.gradle +++ b/src/main/resources/template/build.gradle @@ -1,86 +1,112 @@ //BUILDSCRIPT// -buildscript { - repositories { - maven { - name "neoforgedReleases" - url "https://maven.neoforged.net/releases" - } - maven { url "https://plugins.gradle.org/m2/" } - mavenCentral() - } - dependencies { - classpath group: 'net.neoforged.gradle', name: 'userdev', version: '7.1.11' - classpath group: 'net.neoforged.gradle', name: 'common', version: '7.1.11' - } +plugins { + id 'java' + id 'eclipse' + //A customized fork for better support on Cleanroom + id 'xyz.wagyourtail.unimined' version "1.4.18-kappa" + id 'com.gradleup.shadow' version "9.4.1" + id "maven-publish" + id 'xyz.wagyourtail.jvmdowngrader' version '1.3.6' +} +configurations { + umcShade + modImplementation.extendsFrom umcShade } //PLUGINS// -apply plugin: 'net.neoforged.gradle.userdev' -apply plugin: 'net.neoforged.gradle.common' -apply plugin: 'eclipse' //MINECRAFT// -sourceSets { - main { - resources { - srcDirs = [ - "$rootDir/src/main/resources", - "$rootDir/src/generated/resources" - ] - } +java { + toolchain { + languageVersion = JavaLanguageVersion.of(25) } + + withSourcesJar() } -java.toolchain.languageVersion = JavaLanguageVersion.of(21) -runs { - configureEach { - systemProperty 'forge.logging.markers', 'REGISTRIES' - systemProperty 'forge.logging.console.level', 'debug' +tasks.withType(JavaCompile).configureEach { + options.release = 25 + options.encoding = 'UTF-8' +} - modSource project.sourceSets.main - } +jvmdg { + quiet = false + downgradeTo = JavaVersion.VERSION_1_8 + multiReleaseOriginal = true + shadeInlining = false + dg(configurations.umcShade, false) + //MR-JAR uses a Incremental Update-like strategy, so add versions here won't cause too much waste + multiReleaseVersions = [ + JavaVersion.VERSION_1_8, // 1.16 and below + JavaVersion.VERSION_16, // 1.17 + JavaVersion.VERSION_17, // 1.18 - 1.20 + JavaVersion.VERSION_21, // 1.21 + JavaVersion.VERSION_25 // 26.1 and beyond as well as modern 1.7.10/1.12.2 + ].toSet() +} - client { - systemProperty 'neoforge.enabledGameTestNamespaces', '#ID#' - } +unimined.minecraft { + version "1.21.1" - server { - systemProperty 'neoforge.enabledGameTestNamespaces', '#ID#' - argument '--nogui' + mappings { + intermediary() + mojmap() + parchment("1.21.1", "2024.11.17") } - gameTestServer { - systemProperty 'neoforge.enabledGameTestNamespaces', '#ID#' + mods { + modImplementation { + //In case something uses named mapping in AW + catchAWNamespaceAssertion() + } } - data {arguments.addAll '--mod', '#ID#', '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() + minecraftForge { + loader("52.1.14") } + + defaultRemapJar = true } //DEPENDENCIES// #UMC_REPO# dependencies { - implementation "net.neoforged:neoforge:21.1.216" implementation group: 'javax.vecmath', name: 'vecmath', version: '1.5.2' - implementation #UMC_DEPENDENCY# + modImplementation #UMC_DEPENDENCY# } //JAR// jar { - manifest { - attributes([ - "Specification-Title": "#ID#", - "Specification-Vendor": "#ID#", - "Specification-Version": "1", // We are version 1 of ourselves - "Implementation-Title": project.name, - "Implementation-Version": "${version}", - "Implementation-Vendor" :"#ID#", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } + enabled = false } -tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation +shadowJar { + configurations = [project.configurations.umcShade] + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + mergeServiceFiles() + archiveClassifier = 'shadow' +} + +remapJar { + inputFile = tasks.shadeDowngradedApi.archiveFile + dependsOn(tasks.named("shadowJar")) + archiveClassifier = '' +} + +tasks.named("assemble") { + dependsOn(tasks.named("remapJar")) +} + +processResources { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + inputs.property "version", project.version + inputs.property "mcversion", "#MINECRAFT#" + from(sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + expand 'version':project.version, 'mcversion':"#MINECRAFT#" + } + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } } diff --git a/src/main/resources/template/gradle/wrapper/gradle-wrapper.properties b/src/main/resources/template/gradle/wrapper/gradle-wrapper.properties index 7471fbebb..23a74e6e7 100644 --- a/src/main/resources/template/gradle/wrapper/gradle-wrapper.properties +++ b/src/main/resources/template/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip diff --git a/src/main/resources/template/settings.gradle b/src/main/resources/template/settings.gradle new file mode 100644 index 000000000..f130cc7b7 --- /dev/null +++ b/src/main/resources/template/settings.gradle @@ -0,0 +1,19 @@ +pluginManagement { + repositories { + mavenCentral() + gradlePluginPortal() + maven {url = "https://plugins.gradle.org/"} + maven {url = "https://maven.neoforged.net/releases"} + maven {url = "https://maven.minecraftforge.net/"} + maven {url = "https://maven.fabricmc.net/"} + maven {url = "https://maven.wagyourtail.xyz/releases"} + maven {url = "https://maven.wagyourtail.xyz/snapshots"} + maven {url = 'https://maven.arcseekers.com/releases'} + } +} + +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" +} + +rootProject.name = '#NAME#' \ No newline at end of file diff --git a/src/main/resources/template/src/main/java/PACKAGEPATH/Mod.java b/src/main/resources/template/src/main/java/PACKAGEPATH/Mod.java index c52a693c5..fb419a265 100644 --- a/src/main/resources/template/src/main/java/PACKAGEPATH/Mod.java +++ b/src/main/resources/template/src/main/java/PACKAGEPATH/Mod.java @@ -1,9 +1,8 @@ package #PACKAGE#; import cam72cam.mod.ModCore; -import net.neoforged.bus.api.SubscribeEvent; -@net.neoforged.fml.common.Mod(Mod.MODID) +@net.minecraftforge.fml.common.Mod(Mod.MODID) public class Mod { public static final String MODID = "#ID#"; diff --git a/src/main/resources/template/src/main/resources/META-INF/mods.toml b/src/main/resources/template/src/main/resources/META-INF/mods.toml new file mode 100644 index 000000000..09c0e4510 --- /dev/null +++ b/src/main/resources/template/src/main/resources/META-INF/mods.toml @@ -0,0 +1,24 @@ +modLoader="javafml" +loaderVersion="[52,)" +license="TODO" + +[[mods]] +modId="#ID#" +version="${file.jarVersion}" +displayName="#NAME#" + +[[dependencies.#ID#]] +modId="forge" +mandatory=true +versionRange="[52.1.14,)" +ordering="NONE" +side="BOTH" + +[[dependencies.#ID#]] +modId="minecraft" +mandatory=true +versionRange="[1.21.1]" +ordering="NONE" +side="BOTH" + +#FORGE_TOML_DEPENDENCIES# diff --git a/src/main/resources/template/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/template/src/main/resources/META-INF/neoforge.mods.toml deleted file mode 100644 index c864ff75a..000000000 --- a/src/main/resources/template/src/main/resources/META-INF/neoforge.mods.toml +++ /dev/null @@ -1,24 +0,0 @@ -modLoader="javafml" -loaderVersion="[2,)" -license="TODO" - -[[mods]] -modId="#ID#" -version="${file.jarVersion}" -displayName="#NAME#" - -[[dependencies.#ID#]] - modId="neoforge" - type='required' - versionRange="[21.1.1,)" - ordering="NONE" - side="BOTH" - -[[dependencies.#ID#]] - modId="minecraft" - type='required' - versionRange="[1.21.1]" - ordering="NONE" - side="BOTH" - -#FORGE_TOML_DEPENDENCIES# diff --git a/src/test/java/cam72cam/mod/model/obj/OBJModelTest.java b/src/test/java/cam72cam/mod/model/obj/OBJModelTest.java index b9baba6c6..ed2f22449 100644 --- a/src/test/java/cam72cam/mod/model/obj/OBJModelTest.java +++ b/src/test/java/cam72cam/mod/model/obj/OBJModelTest.java @@ -2,8 +2,8 @@ import cam72cam.mod.resource.Identifier; import cpw.mods.modlauncher.Launcher; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.fml.loading.FMLLoader; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.loading.FMLLoader; import org.codehaus.plexus.util.FileUtils; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll;