From fcc36d9498cde1201cf4c13c5527e8491c0a03f6 Mon Sep 17 00:00:00 2001 From: Cassian Date: Wed, 22 Apr 2026 20:59:17 -0400 Subject: [PATCH 1/7] Initial porting work --- .env.template | 2 + .gitignore | 64 +++- build.fabric.gradle.kts | 134 +++++++ build.gradle | 194 ---------- build.neoforge.gradle.kts | 154 ++++++++ gradle.properties | 34 +- gradle/wrapper/gradle-wrapper.jar | Bin 48966 -> 43705 bytes gradlew | 9 +- gradlew.bat | 3 +- settings.gradle | 11 - settings.gradle.kts | 27 ++ .../28b4b53cd706bc6b6e3f6a8fda45d834ad59c7ec | 3 +- .../data/c/tags/item/firestarters.json | 6 + .../java/vectorwing/blockbox/BlockBox.java | 20 - src/main/java/vectorwing/blockbox/Config.java | 2 +- .../java/vectorwing/blockbox/Platform.java | 23 ++ .../client/event/ClientSetupEvents.java | 19 +- .../blockbox/common/block/BrazierBlock.java | 19 +- .../common/block/PackedSnowBlock.java | 8 +- .../blockbox/common/block/PalisadeBlock.java | 20 +- .../common/block/PortalFrameBlock.java | 7 +- .../blockbox/common/block/SeatBlock.java | 8 +- .../common/block/SpikedPalisadeBlock.java | 16 +- .../block/WeatheringCopperPillarBlock.java | 5 - .../blockbox/common/block/package-info.java | 4 + .../blockbox/common/entity/SeatEntity.java | 14 +- .../blockbox/common/event/CommonEvents.java | 17 +- .../blockbox/common/registry/ModBlocks.java | 360 +++++++++--------- .../common/registry/ModCreativeTabs.java | 29 +- .../common/registry/ModEntityTypes.java | 25 +- .../blockbox/common/registry/ModItems.java | 22 +- .../common/registry/ModParticleTypes.java | 18 +- .../blockbox/common/registry/ModSounds.java | 15 +- .../common/registry/RegistryAliases.java | 5 +- .../blockbox/common/tag/CommonTags.java | 20 + .../common/tag/CompatibilityTags.java | 5 +- .../blockbox/common/tag/ModTags.java | 5 +- .../blockbox/data/DataGenerators.java | 4 +- .../generator/ModBlockModelGenerators.java | 4 +- .../data/model/ModModelTemplates.java | 4 +- .../data/provider/BlockItemModels.java | 4 +- .../data/provider/BlockLootTables.java | 4 +- .../blockbox/data/provider/DataMaps.java | 4 +- .../blockbox/data/provider/LootTables.java | 4 +- .../blockbox/data/provider/ParticleTypes.java | 4 +- .../blockbox/data/provider/Recipes.java | 8 +- .../blockbox/data/provider/package-info.java | 4 + .../blockbox/data/recipe/CraftingRecipes.java | 4 +- .../blockbox/data/tag/BlockTags.java | 4 +- .../blockbox/data/tag/DamageTypeTags.java | 4 +- .../blockbox/data/tag/ItemTags.java | 7 +- .../blockbox/fabric/BlockWithItemAbility.java | 11 + .../fabric/FabricClientEntrypoint.java | 20 + .../fabric/FabricClientSetupEvents.java | 21 + .../blockbox/fabric/FabricEntrypoint.java | 59 +++ .../blockbox/fabric/FabricPlatformImpl.java | 20 + .../blockbox/fabric/ItemAbilities.java | 34 ++ .../blockbox/fabric/ItemAbility.java | 11 + .../BuildCreativeModeTabContentsEvent.java | 29 ++ .../event/client/EntityRenderersEvent.java | 17 + .../RegisterParticleProvidersEvent.java | 13 + .../blockbox/neoforge/NeoforgeEntrypoint.java | 45 +++ .../neoforge/NeoforgePlatformImpl.java | 20 + .../resources/META-INF/accesstransformer.cfg | 1 + .../META-INF/neoforge.mods.toml | 4 +- src/main/resources/blockbox.accesswidener | 6 + src/main/resources/blockbox.mixins.json | 12 + src/main/resources/fabric.mod.json | 30 ++ .../templates/META-INF/accesstransformer.cfg | 1 - stonecutter.gradle.kts | 25 ++ versions/26.1-fabric/gradle.properties | 6 + versions/26.1-neoforge/gradle.properties | 4 + 72 files changed, 1230 insertions(+), 549 deletions(-) create mode 100644 .env.template create mode 100644 build.fabric.gradle.kts delete mode 100644 build.gradle create mode 100644 build.neoforge.gradle.kts delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts create mode 100644 src/generated/resources/data/c/tags/item/firestarters.json create mode 100644 src/main/java/vectorwing/blockbox/Platform.java create mode 100644 src/main/java/vectorwing/blockbox/common/block/package-info.java create mode 100644 src/main/java/vectorwing/blockbox/common/tag/CommonTags.java create mode 100644 src/main/java/vectorwing/blockbox/data/provider/package-info.java create mode 100644 src/main/java/vectorwing/blockbox/fabric/BlockWithItemAbility.java create mode 100644 src/main/java/vectorwing/blockbox/fabric/FabricClientEntrypoint.java create mode 100644 src/main/java/vectorwing/blockbox/fabric/FabricClientSetupEvents.java create mode 100644 src/main/java/vectorwing/blockbox/fabric/FabricEntrypoint.java create mode 100644 src/main/java/vectorwing/blockbox/fabric/FabricPlatformImpl.java create mode 100644 src/main/java/vectorwing/blockbox/fabric/ItemAbilities.java create mode 100644 src/main/java/vectorwing/blockbox/fabric/ItemAbility.java create mode 100644 src/main/java/vectorwing/blockbox/fabric/event/BuildCreativeModeTabContentsEvent.java create mode 100644 src/main/java/vectorwing/blockbox/fabric/event/client/EntityRenderersEvent.java create mode 100644 src/main/java/vectorwing/blockbox/fabric/event/client/RegisterParticleProvidersEvent.java create mode 100644 src/main/java/vectorwing/blockbox/neoforge/NeoforgeEntrypoint.java create mode 100644 src/main/java/vectorwing/blockbox/neoforge/NeoforgePlatformImpl.java create mode 100644 src/main/resources/META-INF/accesstransformer.cfg rename src/main/{templates => resources}/META-INF/neoforge.mods.toml (93%) create mode 100644 src/main/resources/blockbox.accesswidener create mode 100644 src/main/resources/blockbox.mixins.json create mode 100644 src/main/resources/fabric.mod.json delete mode 100644 src/main/templates/META-INF/accesstransformer.cfg create mode 100644 stonecutter.gradle.kts create mode 100644 versions/26.1-fabric/gradle.properties create mode 100644 versions/26.1-neoforge/gradle.properties diff --git a/.env.template b/.env.template new file mode 100644 index 00000000..78313993 --- /dev/null +++ b/.env.template @@ -0,0 +1,2 @@ +MODRINTH_API_KEY= +CURSEFORGE_API_KEY= \ No newline at end of file diff --git a/.gitignore b/.gitignore index 31d25505..1a841a52 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1,50 @@ -# eclipse -bin -*.launch -.settings -.metadata -.classpath -.project +.env +.gradle +.kotlin +.cache/ +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ -# idea -out -*.ipr +run/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ *.iws *.iml -.idea +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ -# gradle -build -.gradle +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ -# other -eclipse -run -runs -run-data +### Mac OS ### +.DS_Store -repo \ No newline at end of file +### Jetbrains ### +.idea/ \ No newline at end of file diff --git a/build.fabric.gradle.kts b/build.fabric.gradle.kts new file mode 100644 index 00000000..40258dd7 --- /dev/null +++ b/build.fabric.gradle.kts @@ -0,0 +1,134 @@ +@file:Suppress("UnstableApiUsage") + +plugins { + id("net.fabricmc.fabric-loom") + id("dev.kikugie.postprocess.jsonlang") + id("me.modmuss50.mod-publish-plugin") +} + +tasks.named("processResources") { + fun prop(name: String) = project.property(name) as String + + val props = HashMap().apply { + this["version"] = prop("mod.version") + this["minecraft"] = prop("deps.minecraft") + this["mod_id"] = prop("mod.id") + this["mod_name"] = prop("mod.name") + this["mod_description"] = prop("mod.description") + this["mod_authors"] = prop("mod.authors") + this["mod_license"] = prop("mod.license") + this["minecraft_version_range"] = prop("deps.minecraft_version_range") + } + + filesMatching(listOf("fabric.mod.json", "META-INF/neoforge.mods.toml", "META-INF/mods.toml")) { + expand(props) + } +} + +version = "${property("mod.version")}+${property("deps.minecraft")}-fabric" +base.archivesName = property("mod.id") as String + +loom { + accessWidenerPath = rootProject.file("src/main/resources/${property("mod.id")}.accesswidener") +} + +sourceSets { + main { + resources { + srcDir("src/generated/resources") + } + } +} + +jsonlang { + languageDirectories = listOf("assets/${property("mod.id")}/lang") + prettyPrint = true +} + +repositories { + mavenLocal() + exclusiveContent { + forRepository { + maven { + name = "Fuzs Mod Resources" + url = uri("https://raw.githubusercontent.com/Fuzss/modresources/main/maven/") + } + } + filter { + includeGroupAndSubgroups("fuzs") + } + } + maven { + // location of the maven that hosts JEI files since January 2023 + name = "Jared's maven" + url = uri("https://maven.blamejared.com/") + content { + includeGroupAndSubgroups("mezz.jei") + } + } +} + +dependencies { + minecraft("com.mojang:minecraft:${property("deps.minecraft")}") + implementation("net.fabricmc:fabric-loader:${property("deps.fabric-loader")}") + implementation("net.fabricmc.fabric-api:fabric-api:${property("deps.fabric-api")}") + implementation("fuzs.forgeconfigapiport:forgeconfigapiport-fabric:${property("deps.forge_config_api_port")}") + compileOnly("mezz.jei:jei-${property("deps.minecraft")}-common-api:${property("deps.jei")}") + compileOnly("mezz.jei:jei-${property("deps.minecraft")}-fabric-api:${property("deps.jei")}") + // We add the full version to localRuntime, not runtimeOnly, so that we do not publish a dependency on it + localRuntime("mezz.jei:jei-${property("deps.minecraft")}-fabric:${property("deps.jei")}") +} + +tasks { + processResources { + exclude("**/neoforge.mods.toml", "**/mods.toml") + } + + register("buildAndCollect") { + group = "build" + from(jar.map { it.archiveFile }) + into(rootProject.layout.buildDirectory.file("libs/${project.property("mod.version")}")) + dependsOn("build") + } +} + +java { + withSourcesJar() + val javaCompat = JavaVersion.VERSION_25 + sourceCompatibility = javaCompat + targetCompatibility = javaCompat +} + +val additionalVersionsStr = findProperty("publish.additionalVersions") as String? +val additionalVersions: List = additionalVersionsStr + ?.split(",") + ?.map { it.trim() } + ?.filter { it.isNotEmpty() } + ?: emptyList() + +publishMods { + file = tasks.jar.map { it.archiveFile.get() } + additionalFiles.from(tasks.named("sourcesJar").map { it.archiveFile.get() }) + + type = BETA + displayName = "${property("mod.name")} ${property("mod.version")} for ${stonecutter.current.version} Fabric" + version = "${property("mod.version")}+${property("deps.minecraft")}-fabric" + changelog = provider { rootProject.file("changelog.md").readText() } + modLoaders.add("fabric") + + modrinth { + projectId = property("publish.modrinth") as String + accessToken = env.MODRINTH_API_KEY.orNull() + minecraftVersions.add(stonecutter.current.version) + minecraftVersions.addAll(additionalVersions) + requires("fabric-api") + } + + curseforge { + projectId = property("publish.curseforge") as String + accessToken = env.CURSEFORGE_API_KEY.orNull() + minecraftVersions.add(stonecutter.current.version) + minecraftVersions.addAll(additionalVersions) + requires("fabric-api") + } +} diff --git a/build.gradle b/build.gradle deleted file mode 100644 index f91ab364..00000000 --- a/build.gradle +++ /dev/null @@ -1,194 +0,0 @@ -plugins { - id 'java-library' - id 'maven-publish' - id 'net.neoforged.moddev' version '2.0.141' - id 'idea' -} - -tasks.named('wrapper', Wrapper).configure { - // Define wrapper values here so as to not have to always do so when updating gradlew.properties. - // Switching this to Wrapper.DistributionType.ALL will download the full gradle sources that comes with - // documentation attached on cursor hover of gradle classes and methods. However, this comes with increased - // file size for Gradle. If you do switch this to ALL, run the Gradle wrapper task twice afterwards. - // (Verify by checking gradle/wrapper/gradle-wrapper.properties to see if distributionUrl now points to `-all`) - distributionType = Wrapper.DistributionType.BIN -} - -version = mod_version -group = mod_group_id - -repositories { - mavenLocal() - maven { - // location of the maven that hosts JEI files since January 2023 - name = "Jared's maven" - url = "https://maven.blamejared.com/" - } - maven { - // location of a maven mirror for JEI files, as a fallback - name = "ModMaven" - url = "https://modmaven.dev" - } -} - -base { - archivesName = "BlockBox-${minecraft_version}" -} - -// Mojang ships Java 25 to end users starting in 26.1, so mods should target Java 25. -java.toolchain.languageVersion = JavaLanguageVersion.of(25) - -neoForge { - // Specify the version of NeoForge to use. - version = project.neo_version - - // This line is optional. Access Transformers are automatically detected - accessTransformers = project.files('src/main/templates/META-INF/accesstransformer.cfg') - - // Default run configurations. - // These can be tweaked, removed, or duplicated as needed. - runs { - client { - client() - - // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id - } - - server { - server() - programArgument '--nogui' - systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id - } - - // 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 { - type = "gameTestServer" - systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id - } - - data { - clientData() - - // example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it - // gameDirectory = project.file('run-data') - - // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. - programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() - } - - // applies to all the run configs above - configureEach { - // 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 - logLevel = org.slf4j.event.Level.DEBUG - } - } - - mods { - // define mod <-> source bindings - // these are used to tell the game which sources are for which mod - // multi mod projects should define one per mod - "${mod_id}" { - sourceSet(sourceSets.main) - } - } -} - -// Include resources generated by data generators. -sourceSets.main.resources { srcDir 'src/generated/resources' } - -// Sets up a dependency configuration called 'localRuntime'. -// This configuration should be used instead of 'runtimeOnly' to declare -// a dependency that will be present for runtime testing but that is -// "optional", meaning it will not be pulled by dependents of this mod. -configurations { - runtimeClasspath.extendsFrom localRuntime -} - -dependencies { - // Example optional mod dependency with JEI - // The JEI API is declared for compile time use, while the full JEI artifact is used at runtime - compileOnly "mezz.jei:jei-${jei_minecraft_version}-common-api:${jei_version}" - compileOnly "mezz.jei:jei-${jei_minecraft_version}-neoforge-api:${jei_version}" - // We add the full version to localRuntime, not runtimeOnly, so that we do not publish a dependency on it - localRuntime "mezz.jei:jei-${jei_minecraft_version}-neoforge:${jei_version}" - - // Example mod dependency using a mod jar from ./libs with a flat dir repository - // This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar - // The group id is ignored when searching -- in this case, it is "blank" - // implementation "blank:coolmod-${mc_version}:${coolmod_version}" - - // Example mod dependency using a file as dependency - // implementation files("libs/coolmod-${mc_version}-${coolmod_version}.jar") - - // Example project dependency using a sister or child project: - // implementation project(":myproject") - - // For more info: - // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html - // http://www.gradle.org/docs/current/userguide/dependency_management.html -} - -// This block of code expands all declared replace properties in the specified resource targets. -// A missing property will result in an error. Properties are expanded using ${} Groovy notation. -var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { - var replaceProperties = [ - minecraft_version : minecraft_version, - minecraft_version_range: minecraft_version_range, - neo_version : neo_version, - neo_version_range : neo_version_range, - loader_version_range : loader_version_range, - mod_id : mod_id, - mod_name : mod_name, - mod_license : mod_license, - mod_version : mod_version, - mod_authors : mod_authors, - mod_description : mod_description - ] - inputs.properties replaceProperties - expand replaceProperties - from "src/main/templates" - into "build/generated/sources/modMetadata" -} -// Include the output of "generateModMetadata" as an input directory for the build -// this works with both building through Gradle and the IDE. -sourceSets.main.resources.srcDir generateModMetadata -// To avoid having to run "generateModMetadata" manually, make it run on every project reload -neoForge.ideSyncTask generateModMetadata - -// Example configuration to allow publishing using the maven-publish plugin -publishing { - publications { - register('mavenJava', MavenPublication) { - from components.java - } - } - repositories { - maven { - url "file://${project.projectDir}/repo" - } - } -} - -tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation -} - -// IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior. -idea { - module { - downloadSources = true - downloadJavadoc = true - } -} diff --git a/build.neoforge.gradle.kts b/build.neoforge.gradle.kts new file mode 100644 index 00000000..2485a7c3 --- /dev/null +++ b/build.neoforge.gradle.kts @@ -0,0 +1,154 @@ +plugins { + id("net.neoforged.moddev") + id ("dev.kikugie.postprocess.jsonlang") + id("me.modmuss50.mod-publish-plugin") +} + +tasks.named("processResources") { + fun prop(name: String) = project.property(name) as String + + val props = HashMap().apply { + this["version"] = prop("mod.version") + this["minecraft"] = prop("deps.minecraft") + this["mod_id"] = prop("mod.id") + this["mod_name"] = prop("mod.name") + this["mod_description"] = prop("mod.description") + this["mod_authors"] = prop("mod.authors") + this["mod_license"] = prop("mod.license") + this["loader_version_range"] = "[1,)" + this["neo_version_range"] = "[26.1,26.2)" + this["minecraft_version_range"] = prop("deps.minecraft_version_range") + } + + filesMatching(listOf("fabric.mod.json", "META-INF/neoforge.mods.toml", "META-INF/mods.toml")) { + expand(props) + } +} + +version = "${property("mod.version")}+${property("deps.minecraft")}-neoforge" +base.archivesName = property("mod.id") as String + +jsonlang { + languageDirectories = listOf("assets/${property("mod.id")}/lang") + prettyPrint = true +} + +repositories { + maven("https://maven.parchmentmc.org") { name = "ParchmentMC" } +} + +neoForge { + version = property("deps.neoforge") as String + validateAccessTransformers = true + + if (hasProperty("deps.parchment")) parchment { + val (mc, ver) = (property("deps.parchment") as String).split(':') + mappingsVersion = ver + minecraftVersion = mc + } + + runs { + register("client") { + gameDirectory = file("run/") + client() + } + register("server") { + gameDirectory = file("run/") + server() + } + register("clientData") { + clientData() +// gameDirectory = file("run/") + programArguments.addAll("--mod", property("mod.id").toString(), + "--all", "--output", file("$rootDir/src/generated/resources").getAbsolutePath(), "--existing", file("$rootDir/src/generated/resources").getAbsolutePath()) + } + } + + mods { + register(property("mod.id") as String) { + sourceSet(sourceSets["main"]) + } + } + sourceSets["main"].resources.srcDir("src/generated") +} +sourceSets { + main { + resources { + srcDir("src/generated/resources") + } + } +} + +repositories { + maven { + // location of the maven that hosts JEI files since January 2023 + name = "Jared's maven" + url = uri("https://maven.blamejared.com/") + content { + includeGroupAndSubgroups("mezz.jei") + } + } +} + +dependencies { + compileOnly("mezz.jei:jei-${property("deps.minecraft")}-common-api:${property("deps.jei")}") + compileOnly("mezz.jei:jei-${property("deps.minecraft")}-neoforge-api:${property("deps.jei")}") + // We add the full version to localRuntime, not runtimeOnly, so that we do not publish a dependency on it + runtimeOnly("mezz.jei:jei-${property("deps.minecraft")}-neoforge:${property("deps.jei")}") +} + +tasks { + processResources { + exclude("**/fabric.mod.json", "**/*.accesswidener", "**/mods.toml") + } + + named("createMinecraftArtifacts") { + dependsOn("stonecutterGenerate") + } + + register("buildAndCollect") { + group = "build" + from(jar.map { it.archiveFile }) + into(rootProject.layout.buildDirectory.file("libs/${project.property("mod.version")}")) + dependsOn("build") + } +} + +java { + withSourcesJar() + val javaCompat = JavaVersion.VERSION_25 + sourceCompatibility = javaCompat + targetCompatibility = javaCompat +} + +val additionalVersionsStr = findProperty("publish.additionalVersions") as String? +val additionalVersions: List = additionalVersionsStr + ?.split(",") + ?.map { it.trim() } + ?.filter { it.isNotEmpty() } + ?: emptyList() + +publishMods { + file = tasks.jar.map { it.archiveFile.get() } + additionalFiles.from(tasks.named("sourcesJar").map { it.archiveFile.get() }) + + type = BETA + displayName = "${property("mod.name")} ${property("mod.version")} for ${stonecutter.current.version} Neoforge" + version = "${property("mod.version")}+${property("deps.minecraft")}-neoforge" + changelog = provider { rootProject.file("changelog.md").readText() } + modLoaders.add("neoforge") + + modrinth { + projectId = property("publish.modrinth") as String + accessToken = env.MODRINTH_API_KEY.orNull() + minecraftVersions.add(stonecutter.current.version) + minecraftVersions.addAll(additionalVersions) + } + + curseforge { + projectId = property("publish.curseforge") as String + accessToken = env.CURSEFORGE_API_KEY.orNull() + minecraftVersions.add(stonecutter.current.version) + minecraftVersions.addAll(additionalVersions) + } +} diff --git a/gradle.properties b/gradle.properties index 04bee837..6624522f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,28 +1,26 @@ -# Sets default memory used for gradle commands. Can be overridden by user or command line properties. -org.gradle.jvmargs=-Xmx1G -org.gradle.daemon=true +org.gradle.jvmargs=-Xmx2G org.gradle.parallel=true -org.gradle.caching=true org.gradle.configuration-cache=true # Environment Properties # You can find the latest versions here: https://projects.neoforged.net/neoforged/neoforge # The Minecraft version must agree with the Neo version to get a valid artifact -minecraft_version=26.1.2 -minecraft_version_range=[26.1.2,26.2) -neo_version=26.1.2.12-beta -neo_version_range=[26.1.2.12-beta,) -loader_version_range=[1,) +deps.minecraft=[VERSIONED] +deps.neoforge=[VERSIONED] +deps.fabric-loader=0.19.2 +deps.fabric-api=[VERSIONED] # Dependency Properties -jei_version=29.5.0.26 -jei_minecraft_version=26.1.2 +deps.jei=29.5.0.26 ## Mod Properties -mod_id=blockbox -mod_name=The Block Box -mod_license=https://github.com/vectorwing/BlockBox/blob/26.1/LICENSE -mod_version=0.1.2 -mod_group_id=vectorwing.blockbox -mod_authors=vectorwing -mod_description=A collection of building blocks, furniture and decorations! +mod.id=blockbox +mod.name=The Block Box +mod.license=https://github.com/vectorwing/BlockBox/blob/26.1/LICENSE +mod.version=0.1.2 +mod.group_id=vectorwing.blockbox +mod.authors=vectorwing +mod.description=A collection of building blocks, furniture and decorations! +publish.modrinth=UmGvBQOb +publish.curseforge= +#publish.additionalVersions= \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d997cfc60f4cff0e7451d19d49a82fa986695d07..9bbc975c742b298b441bfb90dbc124400a3751b9 100644 GIT binary patch delta 35507 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
irPMAS;~ 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 delta 40550 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 CODEC = simpleCodec(PalisadeBlock::new); @@ -50,8 +54,8 @@ public class PalisadeBlock extends CrossCollisionBlock implements SimpleWaterlog public static final EnumProperty TYPE_SOUTH = EnumProperty.create("south", PalisadeConnection.class); public static final EnumProperty TYPE_WEST = EnumProperty.create("west", PalisadeConnection.class); - public final Supplier strippedForm; - public final Supplier spikedForm; + public final @Nullable Supplier strippedForm; + public final @Nullable Supplier spikedForm; public static final Map> PROPERTY_BY_DIRECTION = ImmutableMap.copyOf(Maps.newEnumMap(Map.of( Direction.NORTH, TYPE_NORTH, diff --git a/src/main/java/vectorwing/blockbox/common/block/PortalFrameBlock.java b/src/main/java/vectorwing/blockbox/common/block/PortalFrameBlock.java index b1baa2bd..b8560f03 100644 --- a/src/main/java/vectorwing/blockbox/common/block/PortalFrameBlock.java +++ b/src/main/java/vectorwing/blockbox/common/block/PortalFrameBlock.java @@ -5,17 +5,16 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault public class PortalFrameBlock extends Block { public PortalFrameBlock(Properties properties) { super(properties); } - @Override + //? neoforge { + /*@Override public boolean isPortalFrame(BlockState state, BlockGetter level, BlockPos pos) { return true; } + *///?} } diff --git a/src/main/java/vectorwing/blockbox/common/block/SeatBlock.java b/src/main/java/vectorwing/blockbox/common/block/SeatBlock.java index d340b587..19108dbd 100644 --- a/src/main/java/vectorwing/blockbox/common/block/SeatBlock.java +++ b/src/main/java/vectorwing/blockbox/common/block/SeatBlock.java @@ -1,6 +1,5 @@ package vectorwing.blockbox.common.block; -import com.mojang.logging.annotations.MethodsReturnNonnullByDefault; import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -19,13 +18,8 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import org.jetbrains.annotations.NotNull; import vectorwing.blockbox.common.entity.SeatEntity; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class SeatBlock extends HorizontalDirectionalBlock { public static final MapCodec CODEC = simpleCodec(SeatBlock::new); @@ -80,7 +74,7 @@ protected void createBlockStateDefinition(StateDefinition.Builder codec() { + protected MapCodec codec() { return CODEC; } } diff --git a/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java b/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java index 765c833c..28e08982 100644 --- a/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java +++ b/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java @@ -1,6 +1,5 @@ package vectorwing.blockbox.common.block; -import com.mojang.logging.annotations.MethodsReturnNonnullByDefault; import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -23,18 +22,21 @@ import net.minecraft.world.phys.shapes.BooleanOp; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import net.neoforged.neoforge.common.ItemAbilities; +//? neoforge { +/*import net.neoforged.neoforge.common.ItemAbilities; import net.neoforged.neoforge.common.ItemAbility; +*///?} else { +import vectorwing.blockbox.fabric.ItemAbilities; +import vectorwing.blockbox.fabric.ItemAbility; +//?} +import vectorwing.blockbox.fabric.BlockWithItemAbility; +import org.jspecify.annotations.Nullable; import vectorwing.blockbox.common.registry.ModDamageTypes; import vectorwing.blockbox.common.tag.ModTags; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.function.Supplier; -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class SpikedPalisadeBlock extends CrossCollisionBlock implements SimpleWaterloggedBlock +public class SpikedPalisadeBlock extends CrossCollisionBlock implements SimpleWaterloggedBlock, BlockWithItemAbility { public static final MapCodec CODEC = simpleCodec(SpikedPalisadeBlock::new); diff --git a/src/main/java/vectorwing/blockbox/common/block/WeatheringCopperPillarBlock.java b/src/main/java/vectorwing/blockbox/common/block/WeatheringCopperPillarBlock.java index 132663ec..753a97e9 100644 --- a/src/main/java/vectorwing/blockbox/common/block/WeatheringCopperPillarBlock.java +++ b/src/main/java/vectorwing/blockbox/common/block/WeatheringCopperPillarBlock.java @@ -1,6 +1,5 @@ package vectorwing.blockbox.common.block; -import com.mojang.logging.annotations.MethodsReturnNonnullByDefault; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.BlockPos; @@ -11,10 +10,6 @@ import net.minecraft.world.level.block.WeatheringCopper; import net.minecraft.world.level.block.state.BlockState; -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault public class WeatheringCopperPillarBlock extends RotatedPillarBlock implements WeatheringCopper { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( diff --git a/src/main/java/vectorwing/blockbox/common/block/package-info.java b/src/main/java/vectorwing/blockbox/common/block/package-info.java new file mode 100644 index 00000000..4fd6cc41 --- /dev/null +++ b/src/main/java/vectorwing/blockbox/common/block/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package vectorwing.blockbox.common.block; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/common/entity/SeatEntity.java b/src/main/java/vectorwing/blockbox/common/entity/SeatEntity.java index 2f5e75ea..266034be 100644 --- a/src/main/java/vectorwing/blockbox/common/entity/SeatEntity.java +++ b/src/main/java/vectorwing/blockbox/common/entity/SeatEntity.java @@ -1,6 +1,8 @@ package vectorwing.blockbox.common.entity; -import com.mojang.logging.annotations.MethodsReturnNonnullByDefault; +//? fabric { +import net.fabricmc.fabric.api.entity.FakePlayer; +//?} import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; @@ -17,14 +19,14 @@ import net.minecraft.world.level.storage.ValueInput; import net.minecraft.world.level.storage.ValueOutput; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.common.util.FakePlayer; +//? neoforge { +/*import net.neoforged.neoforge.common.util.FakePlayer; +*///?} +import org.jspecify.annotations.NullMarked; import vectorwing.blockbox.common.block.SeatBlock; import vectorwing.blockbox.common.registry.ModEntityTypes; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault +@NullMarked public class SeatEntity extends Entity { public SeatEntity(EntityType entityType, Level level) { diff --git a/src/main/java/vectorwing/blockbox/common/event/CommonEvents.java b/src/main/java/vectorwing/blockbox/common/event/CommonEvents.java index ff0cca78..79b4527c 100644 --- a/src/main/java/vectorwing/blockbox/common/event/CommonEvents.java +++ b/src/main/java/vectorwing/blockbox/common/event/CommonEvents.java @@ -5,16 +5,21 @@ import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.neoforged.bus.api.SubscribeEvent; +//? neoforge { +/*import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; import net.neoforged.neoforge.registries.RegisterEvent; +*///?} else { +import vectorwing.blockbox.fabric.event.BuildCreativeModeTabContentsEvent; +//?} import vectorwing.blockbox.BlockBox; import vectorwing.blockbox.Config; -import vectorwing.blockbox.common.registry.ModBlocks; import vectorwing.blockbox.common.registry.ModItems; -@EventBusSubscriber(modid = BlockBox.MODID) + +//? neoforge +/*@EventBusSubscriber(modid = BlockBox.MODID)*/ @SuppressWarnings("unused") public class CommonEvents { @@ -22,8 +27,10 @@ public class CommonEvents // clay_tiles -> tiles // jagged_clay_tiles -> broken_tile_mosaic - @SubscribeEvent - public static void addItemsToVanillaCreativeTabs(BuildCreativeModeTabContentsEvent event) { + //? neoforge + /*@SubscribeEvent*/ + public static void addItemsToVanillaCreativeTabs(BuildCreativeModeTabContentsEvent event + ) { if (!Config.ADD_ITEMS_TO_VANILLA_TABS.get()) { return; } diff --git a/src/main/java/vectorwing/blockbox/common/registry/ModBlocks.java b/src/main/java/vectorwing/blockbox/common/registry/ModBlocks.java index 479ffb9e..02ad2ee9 100644 --- a/src/main/java/vectorwing/blockbox/common/registry/ModBlocks.java +++ b/src/main/java/vectorwing/blockbox/common/registry/ModBlocks.java @@ -1,22 +1,28 @@ package vectorwing.blockbox.common.registry; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; import net.minecraft.world.level.material.MapColor; -import net.neoforged.neoforge.registries.DeferredRegister; +import org.jspecify.annotations.Nullable; import vectorwing.blockbox.BlockBox; import vectorwing.blockbox.common.block.*; -import javax.annotation.Nullable; +import java.util.function.Function; import java.util.function.Supplier; import java.util.function.ToIntFunction; public class ModBlocks { - public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(BlockBox.MODID); public static final BlockBehaviour.Properties PROPERTIES_PACKED_SNOW = BlockBehaviour.Properties.of().mapColor(MapColor.SNOW).strength(0.6F).sound(SoundType.SNOW); public static final BlockBehaviour.Properties PROPERTIES_PACKED_ICE = BlockBehaviour.Properties.ofFullCopy(Blocks.PACKED_ICE).strength(0.4F).requiresCorrectToolForDrops(); @@ -24,186 +30,196 @@ public class ModBlocks public static final BlockBehaviour.Properties PROPERTIES_PALISADE = BlockBehaviour.Properties.of().strength(2.0F).instrument(NoteBlockInstrument.BASS).sound(SoundType.WOOD).ignitedByLava(); public static final BlockBehaviour.Properties PROPERTIES_SKY_LANTERN = BlockBehaviour.Properties.of().instrument(NoteBlockInstrument.GUITAR).noOcclusion().lightLevel((state) -> 15).ignitedByLava().sound(SoundType.WOOL); - public static final Supplier GRANITE_BRICKS = BLOCKS.registerSimpleBlock("granite_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GRANITE)); - public static final Supplier GRANITE_BRICK_STAIRS = BLOCKS.registerBlock("granite_brick_stairs", props -> stair(ModBlocks.GRANITE_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GRANITE)); - public static final Supplier GRANITE_BRICK_SLAB = BLOCKS.registerBlock("granite_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GRANITE)); - public static final Supplier GRANITE_BRICK_WALL = BLOCKS.registerBlock("granite_brick_wall", WallBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GRANITE).forceSolidOn()); - public static final Supplier DIORITE_BRICKS = BLOCKS.registerSimpleBlock("diorite_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.DIORITE)); - public static final Supplier DIORITE_BRICK_STAIRS = BLOCKS.registerBlock("diorite_brick_stairs", props -> stair(ModBlocks.DIORITE_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.DIORITE)); - public static final Supplier DIORITE_BRICK_SLAB = BLOCKS.registerBlock("diorite_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.DIORITE)); - public static final Supplier DIORITE_BRICK_WALL = BLOCKS.registerBlock("diorite_brick_wall", WallBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.DIORITE).forceSolidOn()); - public static final Supplier ANDESITE_BRICKS = BLOCKS.registerSimpleBlock("andesite_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.ANDESITE)); - public static final Supplier ANDESITE_BRICK_STAIRS = BLOCKS.registerBlock("andesite_brick_stairs", props -> stair(ModBlocks.ANDESITE_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.ANDESITE)); - public static final Supplier ANDESITE_BRICK_SLAB = BLOCKS.registerBlock("andesite_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.ANDESITE)); - public static final Supplier ANDESITE_BRICK_WALL = BLOCKS.registerBlock("andesite_brick_wall", WallBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.ANDESITE).forceSolidOn()); - - public static final Supplier SANDSTONE_BRICKS = BLOCKS.registerSimpleBlock("sandstone_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.SANDSTONE)); - public static final Supplier SANDSTONE_BRICK_STAIRS = BLOCKS.registerBlock("sandstone_brick_stairs", props -> stair(ModBlocks.SANDSTONE_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.SANDSTONE)); - public static final Supplier SANDSTONE_BRICK_SLAB = BLOCKS.registerBlock("sandstone_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(ModBlocks.SANDSTONE_BRICKS.get())); - public static final Supplier RED_SANDSTONE_BRICKS = BLOCKS.registerSimpleBlock("red_sandstone_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.RED_SANDSTONE)); - public static final Supplier RED_SANDSTONE_BRICK_STAIRS = BLOCKS.registerBlock("red_sandstone_brick_stairs", props -> stair(ModBlocks.RED_SANDSTONE_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.RED_SANDSTONE)); - public static final Supplier RED_SANDSTONE_BRICK_SLAB = BLOCKS.registerBlock("red_sandstone_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(ModBlocks.RED_SANDSTONE_BRICKS.get())); - - public static final Supplier TILES = BLOCKS.registerSimpleBlock("tiles", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)); - public static final Supplier TILE_STAIRS = BLOCKS.registerBlock("tile_stairs", props -> stair(ModBlocks.TILES.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)); - public static final Supplier TILE_SLAB = BLOCKS.registerBlock("tile_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)); - public static final Supplier BROKEN_TILE_MOSAIC = BLOCKS.registerSimpleBlock("broken_tile_mosaic", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)); - - public static final Supplier PACKED_SNOW = BLOCKS.registerBlock("packed_snow", PackedSnowBlock::new, () -> PROPERTIES_PACKED_SNOW); - public static final Supplier CARVED_SNOW = BLOCKS.registerBlock("carved_snow", CarvedSnowBlock::new, () -> PROPERTIES_PACKED_SNOW); - public static final Supplier SNOW_BRICKS = BLOCKS.registerSimpleBlock("snow_bricks", () -> PROPERTIES_PACKED_SNOW); - public static final Supplier SNOW_BRICK_STAIRS = BLOCKS.registerBlock("snow_brick_stairs", props -> stair(ModBlocks.SNOW_BRICKS.get(), props), () -> PROPERTIES_PACKED_SNOW); - public static final Supplier SNOW_BRICK_SLAB = BLOCKS.registerBlock("snow_brick_slab", SlabBlock::new, () -> PROPERTIES_PACKED_SNOW); - public static final Supplier SNOW_BRICK_WALL = BLOCKS.registerBlock("snow_brick_wall", WallBlock::new, () -> PROPERTIES_PACKED_SNOW.forceSolidOn()); - public static final Supplier POLISHED_PACKED_ICE = BLOCKS.registerSimpleBlock("polished_packed_ice", () -> PROPERTIES_PACKED_ICE); - public static final Supplier PACKED_ICE_BRICKS = BLOCKS.registerSimpleBlock("packed_ice_bricks", () -> PROPERTIES_PACKED_ICE); - public static final Supplier PACKED_ICE_BRICK_STAIRS = BLOCKS.registerBlock("packed_ice_brick_stairs", props -> stair(ModBlocks.PACKED_ICE_BRICKS.get(), props), () -> PROPERTIES_PACKED_ICE); - public static final Supplier PACKED_ICE_BRICK_SLAB = BLOCKS.registerBlock("packed_ice_brick_slab", SlabBlock::new, () -> PROPERTIES_PACKED_ICE); - public static final Supplier PACKED_ICE_BRICK_WALL = BLOCKS.registerBlock("packed_ice_brick_wall", WallBlock::new, () -> PROPERTIES_PACKED_ICE.forceSolidOn()); - - public static final Supplier POLISHED_OBSIDIAN = BLOCKS.registerBlock("polished_obsidian", PortalFrameBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.OBSIDIAN)); - - public static final Supplier ROUGH_GLASS = BLOCKS.registerBlock("rough_glass", TransparentBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GLASS)); - public static final Supplier ROUGH_GLASS_PANE = BLOCKS.registerBlock("rough_glass_pane", IronBarsBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GLASS_PANE)); - - public static final Supplier COPPER_CHAIN_LINKS = BLOCKS.registerBlock("copper_chain_links", props -> new WeatheringCopperBarsBlock(WeatheringCopper.WeatherState.UNAFFECTED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.unaffected())); - public static final Supplier EXPOSED_COPPER_CHAIN_LINKS = BLOCKS.registerBlock("exposed_copper_chain_links", props -> new WeatheringCopperBarsBlock(WeatheringCopper.WeatherState.EXPOSED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.exposed())); - public static final Supplier WEATHERED_COPPER_CHAIN_LINKS = BLOCKS.registerBlock("weathered_copper_chain_links", props -> new WeatheringCopperBarsBlock(WeatheringCopper.WeatherState.WEATHERED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.weathered())); - public static final Supplier OXIDIZED_COPPER_CHAIN_LINKS = BLOCKS.registerBlock("oxidized_copper_chain_links", props -> new WeatheringCopperBarsBlock(WeatheringCopper.WeatherState.OXIDIZED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.oxidized())); - public static final Supplier WAXED_COPPER_CHAIN_LINKS = BLOCKS.registerBlock("waxed_copper_chain_links", IronBarsBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.waxed())); - public static final Supplier WAXED_EXPOSED_COPPER_CHAIN_LINKS = BLOCKS.registerBlock("waxed_exposed_copper_chain_links", IronBarsBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.waxedExposed())); - public static final Supplier WAXED_WEATHERED_COPPER_CHAIN_LINKS = BLOCKS.registerBlock("waxed_weathered_copper_chain_links", IronBarsBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.waxedWeathered())); - public static final Supplier WAXED_OXIDIZED_COPPER_CHAIN_LINKS = BLOCKS.registerBlock("waxed_oxidized_copper_chain_links", IronBarsBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.waxedOxidized())); - - public static final Supplier COPPER_PILLAR = BLOCKS.registerBlock("copper_pillar", props -> new WeatheringCopperPillarBlock(WeatheringCopper.WeatherState.UNAFFECTED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BLOCK)); - public static final Supplier EXPOSED_COPPER_PILLAR = BLOCKS.registerBlock("exposed_copper_pillar", props -> new WeatheringCopperPillarBlock(WeatheringCopper.WeatherState.EXPOSED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.EXPOSED_COPPER)); - public static final Supplier WEATHERED_COPPER_PILLAR = BLOCKS.registerBlock("weathered_copper_pillar", props -> new WeatheringCopperPillarBlock(WeatheringCopper.WeatherState.WEATHERED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.WEATHERED_COPPER)); - public static final Supplier OXIDIZED_COPPER_PILLAR = BLOCKS.registerBlock("oxidized_copper_pillar", props -> new WeatheringCopperPillarBlock(WeatheringCopper.WeatherState.OXIDIZED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.OXIDIZED_COPPER)); - public static final Supplier WAXED_COPPER_PILLAR = BLOCKS.registerBlock("waxed_copper_pillar", RotatedPillarBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BLOCK)); - public static final Supplier WAXED_EXPOSED_COPPER_PILLAR = BLOCKS.registerBlock("waxed_exposed_copper_pillar", RotatedPillarBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.EXPOSED_COPPER)); - public static final Supplier WAXED_WEATHERED_COPPER_PILLAR = BLOCKS.registerBlock("waxed_weathered_copper_pillar", RotatedPillarBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.WEATHERED_COPPER)); - public static final Supplier WAXED_OXIDIZED_COPPER_PILLAR = BLOCKS.registerBlock("waxed_oxidized_copper_pillar", RotatedPillarBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.OXIDIZED_COPPER)); - - public static final Supplier IRON_PLATE = BLOCKS.registerSimpleBlock("iron_plate", () -> PROPERTIES_IRON_PLATE); - public static final Supplier IRON_TREAD_PLATE = BLOCKS.registerSimpleBlock("iron_tread_plate", () -> PROPERTIES_IRON_PLATE); - public static final Supplier IRON_TREAD_PLATE_STAIRS = BLOCKS.registerBlock("iron_tread_plate_stairs", props -> stair(ModBlocks.IRON_TREAD_PLATE.get(), props), () -> PROPERTIES_IRON_PLATE); - public static final Supplier IRON_TREAD_PLATE_SLAB = BLOCKS.registerBlock("iron_tread_plate_slab", SlabBlock::new, () -> PROPERTIES_IRON_PLATE); - public static final Supplier CORRUGATED_IRON_PLATE = BLOCKS.registerSimpleBlock("corrugated_iron_plate", () -> PROPERTIES_IRON_PLATE); - public static final Supplier CORRUGATED_IRON_PLATE_STAIRS = BLOCKS.registerBlock("corrugated_iron_plate_stairs", props -> stair(ModBlocks.CORRUGATED_IRON_PLATE.get(), props), () -> PROPERTIES_IRON_PLATE); - public static final Supplier CORRUGATED_IRON_PLATE_SLAB = BLOCKS.registerBlock("corrugated_iron_plate_slab", SlabBlock::new, () -> PROPERTIES_IRON_PLATE); - public static final Supplier IRON_PLATE_PILLAR = BLOCKS.registerBlock("iron_plate_pillar", RotatedPillarBlock::new, () -> PROPERTIES_IRON_PLATE); - public static final Supplier IRON_PLATE_DOOR = BLOCKS.registerBlock("iron_plate_door", + public static final Supplier GRANITE_BRICKS = registerSimpleBlock("granite_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GRANITE)); + public static final Supplier GRANITE_BRICK_STAIRS = registerBlock("granite_brick_stairs", props -> stair(ModBlocks.GRANITE_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GRANITE)); + public static final Supplier GRANITE_BRICK_SLAB = registerBlock("granite_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GRANITE)); + public static final Supplier GRANITE_BRICK_WALL = registerBlock("granite_brick_wall", WallBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GRANITE).forceSolidOn()); + public static final Supplier DIORITE_BRICKS = registerSimpleBlock("diorite_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.DIORITE)); + public static final Supplier DIORITE_BRICK_STAIRS = registerBlock("diorite_brick_stairs", props -> stair(ModBlocks.DIORITE_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.DIORITE)); + public static final Supplier DIORITE_BRICK_SLAB = registerBlock("diorite_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.DIORITE)); + public static final Supplier DIORITE_BRICK_WALL = registerBlock("diorite_brick_wall", WallBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.DIORITE).forceSolidOn()); + public static final Supplier ANDESITE_BRICKS = registerSimpleBlock("andesite_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.ANDESITE)); + public static final Supplier ANDESITE_BRICK_STAIRS = registerBlock("andesite_brick_stairs", props -> stair(ModBlocks.ANDESITE_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.ANDESITE)); + public static final Supplier ANDESITE_BRICK_SLAB = registerBlock("andesite_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.ANDESITE)); + public static final Supplier ANDESITE_BRICK_WALL = registerBlock("andesite_brick_wall", WallBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.ANDESITE).forceSolidOn()); + + public static final Supplier SANDSTONE_BRICKS = registerSimpleBlock("sandstone_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.SANDSTONE)); + public static final Supplier SANDSTONE_BRICK_STAIRS = registerBlock("sandstone_brick_stairs", props -> stair(ModBlocks.SANDSTONE_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.SANDSTONE)); + public static final Supplier SANDSTONE_BRICK_SLAB = registerBlock("sandstone_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(ModBlocks.SANDSTONE_BRICKS.get())); + public static final Supplier RED_SANDSTONE_BRICKS = registerSimpleBlock("red_sandstone_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.RED_SANDSTONE)); + public static final Supplier RED_SANDSTONE_BRICK_STAIRS = registerBlock("red_sandstone_brick_stairs", props -> stair(ModBlocks.RED_SANDSTONE_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.RED_SANDSTONE)); + public static final Supplier RED_SANDSTONE_BRICK_SLAB = registerBlock("red_sandstone_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(ModBlocks.RED_SANDSTONE_BRICKS.get())); + + public static final Supplier TILES = registerSimpleBlock("tiles", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)); + public static final Supplier TILE_STAIRS = registerBlock("tile_stairs", props -> stair(ModBlocks.TILES.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)); + public static final Supplier TILE_SLAB = registerBlock("tile_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)); + public static final Supplier BROKEN_TILE_MOSAIC = registerSimpleBlock("broken_tile_mosaic", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)); + + public static final Supplier PACKED_SNOW = registerBlock("packed_snow", PackedSnowBlock::new, () -> PROPERTIES_PACKED_SNOW); + public static final Supplier CARVED_SNOW = registerBlock("carved_snow", CarvedSnowBlock::new, () -> PROPERTIES_PACKED_SNOW); + public static final Supplier SNOW_BRICKS = registerSimpleBlock("snow_bricks", () -> PROPERTIES_PACKED_SNOW); + public static final Supplier SNOW_BRICK_STAIRS = registerBlock("snow_brick_stairs", props -> stair(ModBlocks.SNOW_BRICKS.get(), props), () -> PROPERTIES_PACKED_SNOW); + public static final Supplier SNOW_BRICK_SLAB = registerBlock("snow_brick_slab", SlabBlock::new, () -> PROPERTIES_PACKED_SNOW); + public static final Supplier SNOW_BRICK_WALL = registerBlock("snow_brick_wall", WallBlock::new, () -> PROPERTIES_PACKED_SNOW.forceSolidOn()); + public static final Supplier POLISHED_PACKED_ICE = registerSimpleBlock("polished_packed_ice", () -> PROPERTIES_PACKED_ICE); + public static final Supplier PACKED_ICE_BRICKS = registerSimpleBlock("packed_ice_bricks", () -> PROPERTIES_PACKED_ICE); + public static final Supplier PACKED_ICE_BRICK_STAIRS = registerBlock("packed_ice_brick_stairs", props -> stair(ModBlocks.PACKED_ICE_BRICKS.get(), props), () -> PROPERTIES_PACKED_ICE); + public static final Supplier PACKED_ICE_BRICK_SLAB = registerBlock("packed_ice_brick_slab", SlabBlock::new, () -> PROPERTIES_PACKED_ICE); + public static final Supplier PACKED_ICE_BRICK_WALL = registerBlock("packed_ice_brick_wall", WallBlock::new, () -> PROPERTIES_PACKED_ICE.forceSolidOn()); + + public static final Supplier POLISHED_OBSIDIAN = registerBlock("polished_obsidian", PortalFrameBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.OBSIDIAN)); + + public static final Supplier ROUGH_GLASS = registerBlock("rough_glass", TransparentBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GLASS)); + public static final Supplier ROUGH_GLASS_PANE = registerBlock("rough_glass_pane", IronBarsBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GLASS_PANE)); + + public static final Supplier COPPER_CHAIN_LINKS = registerBlock("copper_chain_links", props -> new WeatheringCopperBarsBlock(WeatheringCopper.WeatherState.UNAFFECTED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.unaffected())); + public static final Supplier EXPOSED_COPPER_CHAIN_LINKS = registerBlock("exposed_copper_chain_links", props -> new WeatheringCopperBarsBlock(WeatheringCopper.WeatherState.EXPOSED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.exposed())); + public static final Supplier WEATHERED_COPPER_CHAIN_LINKS = registerBlock("weathered_copper_chain_links", props -> new WeatheringCopperBarsBlock(WeatheringCopper.WeatherState.WEATHERED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.weathered())); + public static final Supplier OXIDIZED_COPPER_CHAIN_LINKS = registerBlock("oxidized_copper_chain_links", props -> new WeatheringCopperBarsBlock(WeatheringCopper.WeatherState.OXIDIZED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.oxidized())); + public static final Supplier WAXED_COPPER_CHAIN_LINKS = registerBlock("waxed_copper_chain_links", IronBarsBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.waxed())); + public static final Supplier WAXED_EXPOSED_COPPER_CHAIN_LINKS = registerBlock("waxed_exposed_copper_chain_links", IronBarsBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.waxedExposed())); + public static final Supplier WAXED_WEATHERED_COPPER_CHAIN_LINKS = registerBlock("waxed_weathered_copper_chain_links", IronBarsBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.waxedWeathered())); + public static final Supplier WAXED_OXIDIZED_COPPER_CHAIN_LINKS = registerBlock("waxed_oxidized_copper_chain_links", IronBarsBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BARS.waxedOxidized())); + + public static final Supplier COPPER_PILLAR = registerBlock("copper_pillar", props -> new WeatheringCopperPillarBlock(WeatheringCopper.WeatherState.UNAFFECTED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BLOCK)); + public static final Supplier EXPOSED_COPPER_PILLAR = registerBlock("exposed_copper_pillar", props -> new WeatheringCopperPillarBlock(WeatheringCopper.WeatherState.EXPOSED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.EXPOSED_COPPER)); + public static final Supplier WEATHERED_COPPER_PILLAR = registerBlock("weathered_copper_pillar", props -> new WeatheringCopperPillarBlock(WeatheringCopper.WeatherState.WEATHERED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.WEATHERED_COPPER)); + public static final Supplier OXIDIZED_COPPER_PILLAR = registerBlock("oxidized_copper_pillar", props -> new WeatheringCopperPillarBlock(WeatheringCopper.WeatherState.OXIDIZED, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.OXIDIZED_COPPER)); + public static final Supplier WAXED_COPPER_PILLAR = registerBlock("waxed_copper_pillar", RotatedPillarBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BLOCK)); + public static final Supplier WAXED_EXPOSED_COPPER_PILLAR = registerBlock("waxed_exposed_copper_pillar", RotatedPillarBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.EXPOSED_COPPER)); + public static final Supplier WAXED_WEATHERED_COPPER_PILLAR = registerBlock("waxed_weathered_copper_pillar", RotatedPillarBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.WEATHERED_COPPER)); + public static final Supplier WAXED_OXIDIZED_COPPER_PILLAR = registerBlock("waxed_oxidized_copper_pillar", RotatedPillarBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.OXIDIZED_COPPER)); + + public static final Supplier IRON_PLATE = registerSimpleBlock("iron_plate", () -> PROPERTIES_IRON_PLATE); + public static final Supplier IRON_TREAD_PLATE = registerSimpleBlock("iron_tread_plate", () -> PROPERTIES_IRON_PLATE); + public static final Supplier IRON_TREAD_PLATE_STAIRS = registerBlock("iron_tread_plate_stairs", props -> stair(ModBlocks.IRON_TREAD_PLATE.get(), props), () -> PROPERTIES_IRON_PLATE); + public static final Supplier IRON_TREAD_PLATE_SLAB = registerBlock("iron_tread_plate_slab", SlabBlock::new, () -> PROPERTIES_IRON_PLATE); + public static final Supplier CORRUGATED_IRON_PLATE = registerSimpleBlock("corrugated_iron_plate", () -> PROPERTIES_IRON_PLATE); + public static final Supplier CORRUGATED_IRON_PLATE_STAIRS = registerBlock("corrugated_iron_plate_stairs", props -> stair(ModBlocks.CORRUGATED_IRON_PLATE.get(), props), () -> PROPERTIES_IRON_PLATE); + public static final Supplier CORRUGATED_IRON_PLATE_SLAB = registerBlock("corrugated_iron_plate_slab", SlabBlock::new, () -> PROPERTIES_IRON_PLATE); + public static final Supplier IRON_PLATE_PILLAR = registerBlock("iron_plate_pillar", RotatedPillarBlock::new, () -> PROPERTIES_IRON_PLATE); + public static final Supplier IRON_PLATE_DOOR = registerBlock("iron_plate_door", props -> new DoorBlock(ModBlockSets.IRON_PLATE.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_DOOR)); - public static final Supplier IRON_PLATE_TRAPDOOR = BLOCKS.registerBlock("iron_plate_trapdoor", + public static final Supplier IRON_PLATE_TRAPDOOR = registerBlock("iron_plate_trapdoor", props -> new TrapDoorBlock(ModBlockSets.IRON_PLATE.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_TRAPDOOR)); - public static final Supplier CHISELED_GOLD = BLOCKS.registerSimpleBlock("chiseled_gold", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GOLD_BLOCK)); - public static final Supplier GOLDEN_TILES = BLOCKS.registerSimpleBlock("golden_tiles", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GOLD_BLOCK)); - public static final Supplier GOLDEN_BRICKS = BLOCKS.registerSimpleBlock("golden_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GOLD_BLOCK)); - public static final Supplier GOLDEN_BRICK_STAIRS = BLOCKS.registerBlock("golden_brick_stairs", props -> stair(ModBlocks.GOLDEN_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GOLD_BLOCK)); - public static final Supplier GOLDEN_BRICK_SLAB = BLOCKS.registerBlock("golden_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GOLD_BLOCK)); - public static final Supplier GOLDEN_PILLAR = BLOCKS.registerBlock("golden_pillar", + public static final Supplier CHISELED_GOLD = registerSimpleBlock("chiseled_gold", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GOLD_BLOCK)); + public static final Supplier GOLDEN_TILES = registerSimpleBlock("golden_tiles", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GOLD_BLOCK)); + public static final Supplier GOLDEN_BRICKS = registerSimpleBlock("golden_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GOLD_BLOCK)); + public static final Supplier GOLDEN_BRICK_STAIRS = registerBlock("golden_brick_stairs", props -> stair(ModBlocks.GOLDEN_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GOLD_BLOCK)); + public static final Supplier GOLDEN_BRICK_SLAB = registerBlock("golden_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GOLD_BLOCK)); + public static final Supplier GOLDEN_PILLAR = registerBlock("golden_pillar", RotatedPillarBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GOLD_BLOCK)); - public static final Supplier GOLDEN_DOOR = BLOCKS.registerBlock("golden_door", + public static final Supplier GOLDEN_DOOR = registerBlock("golden_door", props -> new DoorBlock(ModBlockSets.GOLD.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_DOOR)); - public static final Supplier GOLDEN_TRAPDOOR = BLOCKS.registerBlock("golden_trapdoor", + public static final Supplier GOLDEN_TRAPDOOR = registerBlock("golden_trapdoor", props -> new TrapDoorBlock(ModBlockSets.GOLD.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_TRAPDOOR)); - public static final Supplier GOLDEN_BARS = BLOCKS.registerBlock("golden_bars", + public static final Supplier GOLDEN_BARS = registerBlock("golden_bars", IronBarsBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.GOLD_BLOCK)); - public static final Supplier POLISHED_AMETHYST = BLOCKS.registerSimpleBlock("polished_amethyst", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); - public static final Supplier CUT_AMETHYST = BLOCKS.registerSimpleBlock("cut_amethyst", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); - public static final Supplier CUT_AMETHYST_STAIRS = BLOCKS.registerBlock("cut_amethyst_stairs", props -> stair(ModBlocks.CUT_AMETHYST.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); - public static final Supplier CUT_AMETHYST_SLAB = BLOCKS.registerBlock("cut_amethyst_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); - public static final Supplier AMETHYST_MOSAIC = BLOCKS.registerSimpleBlock("amethyst_mosaic", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); - public static final Supplier AMETHYST_MOSAIC_STAIRS = BLOCKS.registerBlock("amethyst_mosaic_stairs", props -> stair(ModBlocks.AMETHYST_MOSAIC.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); - public static final Supplier AMETHYST_MOSAIC_SLAB = BLOCKS.registerBlock("amethyst_mosaic_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); - - public static final Supplier LAPIS_LAZULI_BRICKS = BLOCKS.registerSimpleBlock("lapis_lazuli_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LAPIS_BLOCK)); - public static final Supplier LAPIS_LAZULI_BRICK_STAIRS = BLOCKS.registerBlock("lapis_lazuli_brick_stairs", props -> stair(ModBlocks.LAPIS_LAZULI_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LAPIS_BLOCK)); - public static final Supplier LAPIS_LAZULI_BRICK_SLAB = BLOCKS.registerBlock("lapis_lazuli_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LAPIS_BLOCK)); - public static final Supplier LAPIS_LAZULI_MOSAIC = BLOCKS.registerSimpleBlock("lapis_lazuli_mosaic", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LAPIS_BLOCK)); - public static final Supplier LAPIS_LAZULI_MOSAIC_STAIRS = BLOCKS.registerBlock("lapis_lazuli_mosaic_stairs", props -> stair(ModBlocks.LAPIS_LAZULI_MOSAIC.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LAPIS_BLOCK)); - public static final Supplier LAPIS_LAZULI_MOSAIC_SLAB = BLOCKS.registerBlock("lapis_lazuli_mosaic_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LAPIS_BLOCK)); - - public static final Supplier OAK_SEAT = BLOCKS.registerBlock("oak_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.OAK_PLANKS)); - public static final Supplier SPRUCE_SEAT = BLOCKS.registerBlock("spruce_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.SPRUCE_PLANKS)); - public static final Supplier BIRCH_SEAT = BLOCKS.registerBlock("birch_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.BIRCH_PLANKS)); - public static final Supplier JUNGLE_SEAT = BLOCKS.registerBlock("jungle_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_PLANKS)); - public static final Supplier ACACIA_SEAT = BLOCKS.registerBlock("acacia_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.ACACIA_PLANKS)); - public static final Supplier DARK_OAK_SEAT = BLOCKS.registerBlock("dark_oak_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.DARK_OAK_PLANKS)); - public static final Supplier MANGROVE_SEAT = BLOCKS.registerBlock("mangrove_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.MANGROVE_PLANKS)); - public static final Supplier CHERRY_SEAT = BLOCKS.registerBlock("cherry_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.CHERRY_PLANKS)); - public static final Supplier BAMBOO_SEAT = BLOCKS.registerBlock("bamboo_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.BAMBOO_PLANKS)); - public static final Supplier CRIMSON_SEAT = BLOCKS.registerBlock("crimson_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.CRIMSON_PLANKS)); - public static final Supplier WARPED_SEAT = BLOCKS.registerBlock("warped_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.WARPED_PLANKS)); - - public static final Supplier OAK_PALISADE = BLOCKS.registerBlock("oak_palisade", props -> palisade(ModBlocks.SPIKED_OAK_PALISADE, ModBlocks.STRIPPED_OAK_PALISADE, MapColor.WOOD, props), () -> PROPERTIES_PALISADE); - public static final Supplier SPIKED_OAK_PALISADE = BLOCKS.registerBlock("spiked_oak_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_OAK_PALISADE, MapColor.WOOD, props), () -> PROPERTIES_PALISADE); - public static final Supplier SPRUCE_PALISADE = BLOCKS.registerBlock("spruce_palisade", props -> palisade(ModBlocks.SPIKED_SPRUCE_PALISADE, ModBlocks.STRIPPED_SPRUCE_PALISADE, MapColor.PODZOL, props), () -> PROPERTIES_PALISADE); - public static final Supplier SPIKED_SPRUCE_PALISADE = BLOCKS.registerBlock("spiked_spruce_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_SPRUCE_PALISADE, MapColor.PODZOL, props), () -> PROPERTIES_PALISADE); - public static final Supplier BIRCH_PALISADE = BLOCKS.registerBlock("birch_palisade", props -> palisade(ModBlocks.SPIKED_BIRCH_PALISADE, ModBlocks.STRIPPED_BIRCH_PALISADE, MapColor.SAND, props), () -> PROPERTIES_PALISADE); - public static final Supplier SPIKED_BIRCH_PALISADE = BLOCKS.registerBlock("spiked_birch_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_BIRCH_PALISADE, MapColor.SAND, props), () -> PROPERTIES_PALISADE); - public static final Supplier JUNGLE_PALISADE = BLOCKS.registerBlock("jungle_palisade", props -> palisade(ModBlocks.SPIKED_JUNGLE_PALISADE, ModBlocks.STRIPPED_JUNGLE_PALISADE, MapColor.DIRT, props), () -> PROPERTIES_PALISADE); - public static final Supplier SPIKED_JUNGLE_PALISADE = BLOCKS.registerBlock("spiked_jungle_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_JUNGLE_PALISADE, MapColor.DIRT, props), () -> PROPERTIES_PALISADE); - public static final Supplier ACACIA_PALISADE = BLOCKS.registerBlock("acacia_palisade", props -> palisade(ModBlocks.SPIKED_ACACIA_PALISADE, ModBlocks.STRIPPED_ACACIA_PALISADE, MapColor.COLOR_ORANGE, props), () -> PROPERTIES_PALISADE); - public static final Supplier SPIKED_ACACIA_PALISADE = BLOCKS.registerBlock("spiked_acacia_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_ACACIA_PALISADE, MapColor.COLOR_ORANGE, props), () -> PROPERTIES_PALISADE); - public static final Supplier DARK_OAK_PALISADE = BLOCKS.registerBlock("dark_oak_palisade", props -> palisade(ModBlocks.SPIKED_DARK_OAK_PALISADE, ModBlocks.STRIPPED_DARK_OAK_PALISADE, MapColor.COLOR_BROWN, props), () -> PROPERTIES_PALISADE); - public static final Supplier SPIKED_DARK_OAK_PALISADE = BLOCKS.registerBlock("spiked_dark_oak_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_DARK_OAK_PALISADE, MapColor.COLOR_BROWN, props), () -> PROPERTIES_PALISADE); - public static final Supplier MANGROVE_PALISADE = BLOCKS.registerBlock("mangrove_palisade", props -> palisade(ModBlocks.SPIKED_MANGROVE_PALISADE, ModBlocks.STRIPPED_MANGROVE_PALISADE, MapColor.COLOR_RED, props), () -> PROPERTIES_PALISADE); - public static final Supplier SPIKED_MANGROVE_PALISADE = BLOCKS.registerBlock("spiked_mangrove_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_MANGROVE_PALISADE, MapColor.COLOR_RED, props), () -> PROPERTIES_PALISADE); - public static final Supplier CHERRY_PALISADE = BLOCKS.registerBlock("cherry_palisade", props -> palisade(ModBlocks.SPIKED_CHERRY_PALISADE, ModBlocks.STRIPPED_CHERRY_PALISADE, MapColor.TERRACOTTA_WHITE, SoundType.CHERRY_WOOD, props), () -> PROPERTIES_PALISADE); - public static final Supplier SPIKED_CHERRY_PALISADE = BLOCKS.registerBlock("spiked_cherry_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_CHERRY_PALISADE, MapColor.TERRACOTTA_WHITE, SoundType.CHERRY_WOOD, props), () -> PROPERTIES_PALISADE); - public static final Supplier CRIMSON_PALISADE = BLOCKS.registerBlock("crimson_palisade", props -> netherPalisade(ModBlocks.SPIKED_CRIMSON_PALISADE, ModBlocks.STRIPPED_CRIMSON_PALISADE, MapColor.CRIMSON_STEM, props), () -> PROPERTIES_PALISADE); - public static final Supplier SPIKED_CRIMSON_PALISADE = BLOCKS.registerBlock("spiked_crimson_palisade", props -> netherSpikedPalisade(ModBlocks.STRIPPED_SPIKED_CRIMSON_PALISADE, MapColor.CRIMSON_STEM, props), () -> PROPERTIES_PALISADE); - public static final Supplier WARPED_PALISADE = BLOCKS.registerBlock("warped_palisade", props -> netherPalisade(ModBlocks.SPIKED_WARPED_PALISADE, ModBlocks.STRIPPED_WARPED_PALISADE, MapColor.WARPED_STEM, props), () -> PROPERTIES_PALISADE); - public static final Supplier SPIKED_WARPED_PALISADE = BLOCKS.registerBlock("spiked_warped_palisade", props -> netherSpikedPalisade(ModBlocks.STRIPPED_SPIKED_WARPED_PALISADE, MapColor.WARPED_STEM, props), () -> PROPERTIES_PALISADE); - - public static final Supplier STRIPPED_OAK_PALISADE = BLOCKS.registerBlock("stripped_oak_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_OAK_PALISADE, null, MapColor.WOOD, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_SPIKED_OAK_PALISADE = BLOCKS.registerBlock("stripped_spiked_oak_palisade", props -> spikedPalisade(null, MapColor.WOOD, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_SPRUCE_PALISADE = BLOCKS.registerBlock("stripped_spruce_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_SPRUCE_PALISADE, null, MapColor.PODZOL, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_SPIKED_SPRUCE_PALISADE = BLOCKS.registerBlock("stripped_spiked_spruce_palisade", props -> spikedPalisade(null, MapColor.PODZOL, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_BIRCH_PALISADE = BLOCKS.registerBlock("stripped_birch_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_BIRCH_PALISADE, null, MapColor.SAND, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_SPIKED_BIRCH_PALISADE = BLOCKS.registerBlock("stripped_spiked_birch_palisade", props -> spikedPalisade(null, MapColor.SAND, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_JUNGLE_PALISADE = BLOCKS.registerBlock("stripped_jungle_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_JUNGLE_PALISADE, null, MapColor.DIRT, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_SPIKED_JUNGLE_PALISADE = BLOCKS.registerBlock("stripped_spiked_jungle_palisade", props -> spikedPalisade(null, MapColor.DIRT, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_ACACIA_PALISADE = BLOCKS.registerBlock("stripped_acacia_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_ACACIA_PALISADE, null, MapColor.COLOR_ORANGE, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_SPIKED_ACACIA_PALISADE = BLOCKS.registerBlock("stripped_spiked_acacia_palisade", props -> spikedPalisade(null, MapColor.COLOR_ORANGE, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_DARK_OAK_PALISADE = BLOCKS.registerBlock("stripped_dark_oak_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_DARK_OAK_PALISADE, null, MapColor.COLOR_BROWN, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_SPIKED_DARK_OAK_PALISADE = BLOCKS.registerBlock("stripped_spiked_dark_oak_palisade", props -> spikedPalisade(null, MapColor.COLOR_BROWN, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_MANGROVE_PALISADE = BLOCKS.registerBlock("stripped_mangrove_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_MANGROVE_PALISADE, null, MapColor.COLOR_RED, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_SPIKED_MANGROVE_PALISADE = BLOCKS.registerBlock("stripped_spiked_mangrove_palisade", props -> spikedPalisade(null, MapColor.COLOR_RED, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_CHERRY_PALISADE = BLOCKS.registerBlock("stripped_cherry_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_CHERRY_PALISADE, null, MapColor.TERRACOTTA_WHITE, SoundType.CHERRY_WOOD, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_SPIKED_CHERRY_PALISADE = BLOCKS.registerBlock("stripped_spiked_cherry_palisade", props -> spikedPalisade(null, MapColor.TERRACOTTA_WHITE, SoundType.CHERRY_WOOD, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_CRIMSON_PALISADE = BLOCKS.registerBlock("stripped_crimson_palisade", props -> netherPalisade(ModBlocks.STRIPPED_SPIKED_CRIMSON_PALISADE, null, MapColor.CRIMSON_STEM, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_SPIKED_CRIMSON_PALISADE = BLOCKS.registerBlock("stripped_spiked_crimson_palisade", props -> netherSpikedPalisade(null, MapColor.CRIMSON_STEM, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_WARPED_PALISADE = BLOCKS.registerBlock("stripped_warped_palisade", props -> netherPalisade(ModBlocks.STRIPPED_SPIKED_WARPED_PALISADE, null, MapColor.WARPED_STEM, props), () -> PROPERTIES_PALISADE); - public static final Supplier STRIPPED_SPIKED_WARPED_PALISADE = BLOCKS.registerBlock("stripped_spiked_warped_palisade", props -> netherSpikedPalisade(null, MapColor.WARPED_STEM, props), () -> PROPERTIES_PALISADE); - - - public static final Supplier BRAZIER = BLOCKS.registerBlock("brazier", props -> new BrazierBlock(1, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LANTERN) + public static final Supplier POLISHED_AMETHYST = registerSimpleBlock("polished_amethyst", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); + public static final Supplier CUT_AMETHYST = registerSimpleBlock("cut_amethyst", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); + public static final Supplier CUT_AMETHYST_STAIRS = registerBlock("cut_amethyst_stairs", props -> stair(ModBlocks.CUT_AMETHYST.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); + public static final Supplier CUT_AMETHYST_SLAB = registerBlock("cut_amethyst_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); + public static final Supplier AMETHYST_MOSAIC = registerSimpleBlock("amethyst_mosaic", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); + public static final Supplier AMETHYST_MOSAIC_STAIRS = registerBlock("amethyst_mosaic_stairs", props -> stair(ModBlocks.AMETHYST_MOSAIC.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); + public static final Supplier AMETHYST_MOSAIC_SLAB = registerBlock("amethyst_mosaic_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)); + + public static final Supplier LAPIS_LAZULI_BRICKS = registerSimpleBlock("lapis_lazuli_bricks", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LAPIS_BLOCK)); + public static final Supplier LAPIS_LAZULI_BRICK_STAIRS = registerBlock("lapis_lazuli_brick_stairs", props -> stair(ModBlocks.LAPIS_LAZULI_BRICKS.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LAPIS_BLOCK)); + public static final Supplier LAPIS_LAZULI_BRICK_SLAB = registerBlock("lapis_lazuli_brick_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LAPIS_BLOCK)); + public static final Supplier LAPIS_LAZULI_MOSAIC = registerSimpleBlock("lapis_lazuli_mosaic", () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LAPIS_BLOCK)); + public static final Supplier LAPIS_LAZULI_MOSAIC_STAIRS = registerBlock("lapis_lazuli_mosaic_stairs", props -> stair(ModBlocks.LAPIS_LAZULI_MOSAIC.get(), props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LAPIS_BLOCK)); + public static final Supplier LAPIS_LAZULI_MOSAIC_SLAB = registerBlock("lapis_lazuli_mosaic_slab", SlabBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LAPIS_BLOCK)); + + public static final Supplier OAK_SEAT = registerBlock("oak_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.OAK_PLANKS)); + public static final Supplier SPRUCE_SEAT = registerBlock("spruce_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.SPRUCE_PLANKS)); + public static final Supplier BIRCH_SEAT = registerBlock("birch_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.BIRCH_PLANKS)); + public static final Supplier JUNGLE_SEAT = registerBlock("jungle_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_PLANKS)); + public static final Supplier ACACIA_SEAT = registerBlock("acacia_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.ACACIA_PLANKS)); + public static final Supplier DARK_OAK_SEAT = registerBlock("dark_oak_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.DARK_OAK_PLANKS)); + public static final Supplier MANGROVE_SEAT = registerBlock("mangrove_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.MANGROVE_PLANKS)); + public static final Supplier CHERRY_SEAT = registerBlock("cherry_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.CHERRY_PLANKS)); + public static final Supplier BAMBOO_SEAT = registerBlock("bamboo_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.BAMBOO_PLANKS)); + public static final Supplier CRIMSON_SEAT = registerBlock("crimson_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.CRIMSON_PLANKS)); + public static final Supplier WARPED_SEAT = registerBlock("warped_seat", SeatBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.WARPED_PLANKS)); + public static final Supplier OAK_PALISADE = registerBlock("oak_palisade", props -> palisade(ModBlocks.SPIKED_OAK_PALISADE, ModBlocks.STRIPPED_OAK_PALISADE, MapColor.WOOD, props), () -> PROPERTIES_PALISADE); + public static final Supplier SPIKED_OAK_PALISADE = registerBlock("spiked_oak_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_OAK_PALISADE, MapColor.WOOD, props), () -> PROPERTIES_PALISADE); + public static final Supplier SPRUCE_PALISADE = registerBlock("spruce_palisade", props -> palisade(ModBlocks.SPIKED_SPRUCE_PALISADE, ModBlocks.STRIPPED_SPRUCE_PALISADE, MapColor.PODZOL, props), () -> PROPERTIES_PALISADE); + public static final Supplier SPIKED_SPRUCE_PALISADE = registerBlock("spiked_spruce_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_SPRUCE_PALISADE, MapColor.PODZOL, props), () -> PROPERTIES_PALISADE); + public static final Supplier BIRCH_PALISADE = registerBlock("birch_palisade", props -> palisade(ModBlocks.SPIKED_BIRCH_PALISADE, ModBlocks.STRIPPED_BIRCH_PALISADE, MapColor.SAND, props), () -> PROPERTIES_PALISADE); + public static final Supplier SPIKED_BIRCH_PALISADE = registerBlock("spiked_birch_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_BIRCH_PALISADE, MapColor.SAND, props), () -> PROPERTIES_PALISADE); + public static final Supplier JUNGLE_PALISADE = registerBlock("jungle_palisade", props -> palisade(ModBlocks.SPIKED_JUNGLE_PALISADE, ModBlocks.STRIPPED_JUNGLE_PALISADE, MapColor.DIRT, props), () -> PROPERTIES_PALISADE); + public static final Supplier SPIKED_JUNGLE_PALISADE = registerBlock("spiked_jungle_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_JUNGLE_PALISADE, MapColor.DIRT, props), () -> PROPERTIES_PALISADE); + public static final Supplier ACACIA_PALISADE = registerBlock("acacia_palisade", props -> palisade(ModBlocks.SPIKED_ACACIA_PALISADE, ModBlocks.STRIPPED_ACACIA_PALISADE, MapColor.COLOR_ORANGE, props), () -> PROPERTIES_PALISADE); + public static final Supplier SPIKED_ACACIA_PALISADE = registerBlock("spiked_acacia_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_ACACIA_PALISADE, MapColor.COLOR_ORANGE, props), () -> PROPERTIES_PALISADE); + public static final Supplier DARK_OAK_PALISADE = registerBlock("dark_oak_palisade", props -> palisade(ModBlocks.SPIKED_DARK_OAK_PALISADE, ModBlocks.STRIPPED_DARK_OAK_PALISADE, MapColor.COLOR_BROWN, props), () -> PROPERTIES_PALISADE); + public static final Supplier SPIKED_DARK_OAK_PALISADE = registerBlock("spiked_dark_oak_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_DARK_OAK_PALISADE, MapColor.COLOR_BROWN, props), () -> PROPERTIES_PALISADE); + public static final Supplier MANGROVE_PALISADE = registerBlock("mangrove_palisade", props -> palisade(ModBlocks.SPIKED_MANGROVE_PALISADE, ModBlocks.STRIPPED_MANGROVE_PALISADE, MapColor.COLOR_RED, props), () -> PROPERTIES_PALISADE); + public static final Supplier SPIKED_MANGROVE_PALISADE = registerBlock("spiked_mangrove_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_MANGROVE_PALISADE, MapColor.COLOR_RED, props), () -> PROPERTIES_PALISADE); + public static final Supplier CHERRY_PALISADE = registerBlock("cherry_palisade", props -> palisade(ModBlocks.SPIKED_CHERRY_PALISADE, ModBlocks.STRIPPED_CHERRY_PALISADE, MapColor.TERRACOTTA_WHITE, SoundType.CHERRY_WOOD, props), () -> PROPERTIES_PALISADE); + public static final Supplier SPIKED_CHERRY_PALISADE = registerBlock("spiked_cherry_palisade", props -> spikedPalisade(ModBlocks.STRIPPED_SPIKED_CHERRY_PALISADE, MapColor.TERRACOTTA_WHITE, SoundType.CHERRY_WOOD, props), () -> PROPERTIES_PALISADE); + public static final Supplier CRIMSON_PALISADE = registerBlock("crimson_palisade", props -> netherPalisade(ModBlocks.SPIKED_CRIMSON_PALISADE, ModBlocks.STRIPPED_CRIMSON_PALISADE, MapColor.CRIMSON_STEM, props), () -> PROPERTIES_PALISADE); + public static final Supplier SPIKED_CRIMSON_PALISADE = registerBlock("spiked_crimson_palisade", props -> netherSpikedPalisade(ModBlocks.STRIPPED_SPIKED_CRIMSON_PALISADE, MapColor.CRIMSON_STEM, props), () -> PROPERTIES_PALISADE); + public static final Supplier WARPED_PALISADE = registerBlock("warped_palisade", props -> netherPalisade(ModBlocks.SPIKED_WARPED_PALISADE, ModBlocks.STRIPPED_WARPED_PALISADE, MapColor.WARPED_STEM, props), () -> PROPERTIES_PALISADE); + public static final Supplier SPIKED_WARPED_PALISADE = registerBlock("spiked_warped_palisade", props -> netherSpikedPalisade(ModBlocks.STRIPPED_SPIKED_WARPED_PALISADE, MapColor.WARPED_STEM, props), () -> PROPERTIES_PALISADE); + + public static final Supplier STRIPPED_OAK_PALISADE = registerBlock("stripped_oak_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_OAK_PALISADE, null, MapColor.WOOD, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_SPIKED_OAK_PALISADE = registerBlock("stripped_spiked_oak_palisade", props -> spikedPalisade(null, MapColor.WOOD, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_SPRUCE_PALISADE = registerBlock("stripped_spruce_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_SPRUCE_PALISADE, null, MapColor.PODZOL, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_SPIKED_SPRUCE_PALISADE = registerBlock("stripped_spiked_spruce_palisade", props -> spikedPalisade(null, MapColor.PODZOL, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_BIRCH_PALISADE = registerBlock("stripped_birch_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_BIRCH_PALISADE, null, MapColor.SAND, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_SPIKED_BIRCH_PALISADE = registerBlock("stripped_spiked_birch_palisade", props -> spikedPalisade(null, MapColor.SAND, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_JUNGLE_PALISADE = registerBlock("stripped_jungle_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_JUNGLE_PALISADE, null, MapColor.DIRT, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_SPIKED_JUNGLE_PALISADE = registerBlock("stripped_spiked_jungle_palisade", props -> spikedPalisade(null, MapColor.DIRT, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_ACACIA_PALISADE = registerBlock("stripped_acacia_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_ACACIA_PALISADE, null, MapColor.COLOR_ORANGE, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_SPIKED_ACACIA_PALISADE = registerBlock("stripped_spiked_acacia_palisade", props -> spikedPalisade(null, MapColor.COLOR_ORANGE, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_DARK_OAK_PALISADE = registerBlock("stripped_dark_oak_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_DARK_OAK_PALISADE, null, MapColor.COLOR_BROWN, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_SPIKED_DARK_OAK_PALISADE = registerBlock("stripped_spiked_dark_oak_palisade", props -> spikedPalisade(null, MapColor.COLOR_BROWN, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_MANGROVE_PALISADE = registerBlock("stripped_mangrove_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_MANGROVE_PALISADE, null, MapColor.COLOR_RED, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_SPIKED_MANGROVE_PALISADE = registerBlock("stripped_spiked_mangrove_palisade", props -> spikedPalisade(null, MapColor.COLOR_RED, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_CHERRY_PALISADE = registerBlock("stripped_cherry_palisade", props -> palisade(ModBlocks.STRIPPED_SPIKED_CHERRY_PALISADE, null, MapColor.TERRACOTTA_WHITE, SoundType.CHERRY_WOOD, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_SPIKED_CHERRY_PALISADE = registerBlock("stripped_spiked_cherry_palisade", props -> spikedPalisade(null, MapColor.TERRACOTTA_WHITE, SoundType.CHERRY_WOOD, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_CRIMSON_PALISADE = registerBlock("stripped_crimson_palisade", props -> netherPalisade(ModBlocks.STRIPPED_SPIKED_CRIMSON_PALISADE, null, MapColor.CRIMSON_STEM, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_SPIKED_CRIMSON_PALISADE = registerBlock("stripped_spiked_crimson_palisade", props -> netherSpikedPalisade(null, MapColor.CRIMSON_STEM, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_WARPED_PALISADE = registerBlock("stripped_warped_palisade", props -> netherPalisade(ModBlocks.STRIPPED_SPIKED_WARPED_PALISADE, null, MapColor.WARPED_STEM, props), () -> PROPERTIES_PALISADE); + public static final Supplier STRIPPED_SPIKED_WARPED_PALISADE = registerBlock("stripped_spiked_warped_palisade", props -> netherSpikedPalisade(null, MapColor.WARPED_STEM, props), () -> PROPERTIES_PALISADE); + + + public static final Supplier BRAZIER = registerBlock("brazier", props -> new BrazierBlock(1, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.LANTERN) .lightLevel(litBlockEmission(15)) ); - public static final Supplier SOUL_BRAZIER = BLOCKS.registerBlock("soul_brazier", props -> new BrazierBlock(2, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.SOUL_LANTERN) + public static final Supplier SOUL_BRAZIER = registerBlock("soul_brazier", props -> new BrazierBlock(2, props), () -> BlockBehaviour.Properties.ofFullCopy(Blocks.SOUL_LANTERN) .lightLevel(litBlockEmission(10)) ); - public static final Supplier WHITE_SKY_LANTERN = BLOCKS.registerBlock("white_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.SNOW)); - public static final Supplier LIGHT_GRAY_SKY_LANTERN = BLOCKS.registerBlock("light_gray_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_LIGHT_GRAY)); - public static final Supplier GRAY_SKY_LANTERN = BLOCKS.registerBlock("gray_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_GRAY)); - public static final Supplier BLACK_SKY_LANTERN = BLOCKS.registerBlock("black_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_BLACK)); - public static final Supplier BROWN_SKY_LANTERN = BLOCKS.registerBlock("brown_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_BROWN)); - public static final Supplier RED_SKY_LANTERN = BLOCKS.registerBlock("red_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_RED)); - public static final Supplier ORANGE_SKY_LANTERN = BLOCKS.registerBlock("orange_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_ORANGE)); - public static final Supplier YELLOW_SKY_LANTERN = BLOCKS.registerBlock("yellow_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_YELLOW)); - public static final Supplier LIME_SKY_LANTERN = BLOCKS.registerBlock("lime_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_LIGHT_GREEN)); - public static final Supplier GREEN_SKY_LANTERN = BLOCKS.registerBlock("green_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_GREEN)); - public static final Supplier CYAN_SKY_LANTERN = BLOCKS.registerBlock("cyan_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_CYAN)); - public static final Supplier LIGHT_BLUE_SKY_LANTERN = BLOCKS.registerBlock("light_blue_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_LIGHT_BLUE)); - public static final Supplier BLUE_SKY_LANTERN = BLOCKS.registerBlock("blue_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_BLUE)); - public static final Supplier PURPLE_SKY_LANTERN = BLOCKS.registerBlock("purple_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_PURPLE)); - public static final Supplier MAGENTA_SKY_LANTERN = BLOCKS.registerBlock("magenta_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_MAGENTA)); - public static final Supplier PINK_SKY_LANTERN = BLOCKS.registerBlock("pink_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_PINK)); + public static final Supplier WHITE_SKY_LANTERN = registerBlock("white_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.SNOW)); + public static final Supplier LIGHT_GRAY_SKY_LANTERN = registerBlock("light_gray_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_LIGHT_GRAY)); + public static final Supplier GRAY_SKY_LANTERN = registerBlock("gray_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_GRAY)); + public static final Supplier BLACK_SKY_LANTERN = registerBlock("black_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_BLACK)); + public static final Supplier BROWN_SKY_LANTERN = registerBlock("brown_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_BROWN)); + public static final Supplier RED_SKY_LANTERN = registerBlock("red_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_RED)); + public static final Supplier ORANGE_SKY_LANTERN = registerBlock("orange_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_ORANGE)); + public static final Supplier YELLOW_SKY_LANTERN = registerBlock("yellow_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_YELLOW)); + public static final Supplier LIME_SKY_LANTERN = registerBlock("lime_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_LIGHT_GREEN)); + public static final Supplier GREEN_SKY_LANTERN = registerBlock("green_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_GREEN)); + public static final Supplier CYAN_SKY_LANTERN = registerBlock("cyan_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_CYAN)); + public static final Supplier LIGHT_BLUE_SKY_LANTERN = registerBlock("light_blue_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_LIGHT_BLUE)); + public static final Supplier BLUE_SKY_LANTERN = registerBlock("blue_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_BLUE)); + public static final Supplier PURPLE_SKY_LANTERN = registerBlock("purple_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_PURPLE)); + public static final Supplier MAGENTA_SKY_LANTERN = registerBlock("magenta_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_MAGENTA)); + public static final Supplier PINK_SKY_LANTERN = registerBlock("pink_sky_lantern", SkyLanternBlock::new, () -> PROPERTIES_SKY_LANTERN.mapColor(MapColor.COLOR_PINK)); + + + private static Supplier registerBlock(String name, Function blockFactory, Supplier settings) { + ResourceKey blockKey = ResourceKey.create(Registries.BLOCK, Identifier.fromNamespaceAndPath(BlockBox.MODID, name)); + Block block = Registry.register(BuiltInRegistries.BLOCK, blockKey, blockFactory.apply(settings.get().setId(blockKey))); + return ()->block; + } + + private static Supplier registerSimpleBlock(String name, Supplier propertiesSupplier) { + return registerBlock(name, Block::new, propertiesSupplier); + } private static ToIntFunction litBlockEmission(int lightValue) { return state -> state.getValue(BlockStateProperties.LIT) ? lightValue : 0; @@ -236,4 +252,8 @@ private static Block spikedPalisade(@Nullable Supplier strippedForm, MapC private static Block netherSpikedPalisade(@Nullable Supplier strippedForm, MapColor mapColor, BlockBehaviour.Properties properties) { return new SpikedPalisadeBlock(strippedForm, properties.mapColor(mapColor).sound(SoundType.STEM)); } + + public static void register() { + + } } diff --git a/src/main/java/vectorwing/blockbox/common/registry/ModCreativeTabs.java b/src/main/java/vectorwing/blockbox/common/registry/ModCreativeTabs.java index 4c7f1512..566da563 100644 --- a/src/main/java/vectorwing/blockbox/common/registry/ModCreativeTabs.java +++ b/src/main/java/vectorwing/blockbox/common/registry/ModCreativeTabs.java @@ -1,19 +1,38 @@ package vectorwing.blockbox.common.registry; +//? fabric +import net.fabricmc.fabric.api.creativetab.v1.FabricCreativeModeTab; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; import net.minecraft.world.item.CreativeModeTab; -import net.neoforged.neoforge.registries.DeferredHolder; -import net.neoforged.neoforge.registries.DeferredRegister; import vectorwing.blockbox.BlockBox; +import java.util.function.Supplier; + public class ModCreativeTabs { - public static final DeferredRegister CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, BlockBox.MODID); - public static final DeferredHolder TAB_BLOCK_BOX = CREATIVE_MODE_TABS.register("example_tab", () -> CreativeModeTab.builder() + public static final Supplier TAB_BLOCK_BOX = register("example_tab", () -> + //? fabric + FabricCreativeModeTab.builder() + //? neoforge + /*CreativeModeTab.builder()*/ .title(Component.translatable("itemGroup." + BlockBox.MODID)) .icon(() -> ModItems.CHISELED_GOLD.get().getDefaultInstance()) - .displayItems((parameters, output) -> ModItems.CREATIVE_TAB_ITEMS.forEach((item) -> output.accept(item.get()))) + .displayItems((parameters, output) -> ModItems.CREATIVE_TAB_ITEMS.forEach((item) -> { +// output.accept(item.get()); + })) .build()); + + private static Supplier register(String name, Supplier tabSupplier) { + CreativeModeTab tab = Registry.register(BuiltInRegistries.CREATIVE_MODE_TAB, Identifier.fromNamespaceAndPath(BlockBox.MODID, name), tabSupplier.get()); + return ()->tab; + } + + public static void register() { + + } } diff --git a/src/main/java/vectorwing/blockbox/common/registry/ModEntityTypes.java b/src/main/java/vectorwing/blockbox/common/registry/ModEntityTypes.java index 9d9ac072..c49803cf 100644 --- a/src/main/java/vectorwing/blockbox/common/registry/ModEntityTypes.java +++ b/src/main/java/vectorwing/blockbox/common/registry/ModEntityTypes.java @@ -1,20 +1,39 @@ package vectorwing.blockbox.common.registry; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; -import net.neoforged.neoforge.registries.DeferredRegister; import vectorwing.blockbox.BlockBox; import vectorwing.blockbox.common.entity.SeatEntity; +import java.util.function.Function; import java.util.function.Supplier; +import java.util.function.UnaryOperator; public class ModEntityTypes { - public static final DeferredRegister.Entities ENTITY_TYPES = DeferredRegister.createEntities(BlockBox.MODID); - public static final Supplier> SEAT = ENTITY_TYPES.registerEntityType("seat", + public static final Supplier> SEAT = registerEntityType("seat", SeatEntity::new, MobCategory.MISC, builder -> builder .sized(0.25f, 0.35f) .clientTrackingRange(3) .updateInterval(Integer.MAX_VALUE)); + + public static Supplier> registerEntityType(String name, EntityType.EntityFactory factory, MobCategory category, UnaryOperator> builder) { + return register(name, key -> builder.apply(EntityType.Builder.of(factory, category)).build(ResourceKey.create(Registries.ENTITY_TYPE, key))); + } + + public static > Supplier register(final String name, final Function func) { + ResourceKey> key = ResourceKey.create(Registries.ENTITY_TYPE, Identifier.fromNamespaceAndPath(BlockBox.MODID, name)); + T apply = Registry.register(BuiltInRegistries.ENTITY_TYPE, key, func.apply(key.identifier())); + return ()-> apply; + } + + public static void register() { + } } diff --git a/src/main/java/vectorwing/blockbox/common/registry/ModItems.java b/src/main/java/vectorwing/blockbox/common/registry/ModItems.java index 17498e83..3c638112 100644 --- a/src/main/java/vectorwing/blockbox/common/registry/ModItems.java +++ b/src/main/java/vectorwing/blockbox/common/registry/ModItems.java @@ -1,12 +1,16 @@ package vectorwing.blockbox.common.registry; import com.google.common.collect.Sets; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; -import net.neoforged.neoforge.registries.DeferredRegister; import vectorwing.blockbox.BlockBox; import vectorwing.blockbox.common.event.VanillaTabOrdering; import vectorwing.blockbox.common.item.SkyLanternItem; @@ -21,13 +25,13 @@ @SuppressWarnings("unused") public class ModItems { - public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(BlockBox.MODID); public static LinkedHashSet> CREATIVE_TAB_ITEMS = Sets.newLinkedHashSet(); - public static Supplier registerItem(final String name, final Function function) { - Supplier block = ITEMS.registerItem(name, function); - CREATIVE_TAB_ITEMS.add(block); - return block; + public static Supplier registerItem(final String name, final Function function) { + Identifier id = Identifier.fromNamespaceAndPath(BlockBox.MODID, name); + T block = Registry.register(BuiltInRegistries.ITEM, id, function.apply(new Item.Properties().setId(ResourceKey.create(Registries.ITEM, id)))); + CREATIVE_TAB_ITEMS.add(()->block); + return ()-> block; } public static Supplier registerItem(final String name, final Function function, final Item vanillaTabNeighbor, LinkedHashMap, ItemLike> vanillaTab) { @@ -37,7 +41,7 @@ public static Supplier registerItem(final String name, final Function registerSimpleBlockItem(final String name, final Supplier supplier) { - Supplier block = ITEMS.registerSimpleBlockItem(name, supplier); + Supplier block = registerItem(name, properties -> new BlockItem(supplier.get(), properties.useBlockDescriptionPrefix())); CREATIVE_TAB_ITEMS.add(block); return block; } @@ -222,4 +226,8 @@ public static Supplier registerSimpleBlockItem(final String name, fin private static Function skyLantern(Supplier block) { return properties -> new SkyLanternItem(block.get(), properties.useBlockDescriptionPrefix()); } + + public static void register() { + + } } diff --git a/src/main/java/vectorwing/blockbox/common/registry/ModParticleTypes.java b/src/main/java/vectorwing/blockbox/common/registry/ModParticleTypes.java index d5b87cc5..2b52703d 100644 --- a/src/main/java/vectorwing/blockbox/common/registry/ModParticleTypes.java +++ b/src/main/java/vectorwing/blockbox/common/registry/ModParticleTypes.java @@ -1,17 +1,25 @@ package vectorwing.blockbox.common.registry; -import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.Registry; import net.minecraft.core.particles.SimpleParticleType; -import net.minecraft.core.registries.Registries; -import net.neoforged.neoforge.registries.DeferredRegister; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; import vectorwing.blockbox.BlockBox; import java.util.function.Supplier; public class ModParticleTypes { - public static final DeferredRegister> PARTICLE_TYPES = DeferredRegister.create(Registries.PARTICLE_TYPE, BlockBox.MODID); - public static final Supplier SPARKLE = PARTICLE_TYPES.register("sparkle", + public static final Supplier SPARKLE = register("sparkle", () -> new SimpleParticleType(true)); + + private static Supplier register(String name, Supplier tabSupplier) { + SimpleParticleType tab = Registry.register(BuiltInRegistries.PARTICLE_TYPE, Identifier.fromNamespaceAndPath(BlockBox.MODID, name), tabSupplier.get()); + return ()->tab; + } + + public static void register() { + + } } diff --git a/src/main/java/vectorwing/blockbox/common/registry/ModSounds.java b/src/main/java/vectorwing/blockbox/common/registry/ModSounds.java index ad97857f..07a1e9b3 100644 --- a/src/main/java/vectorwing/blockbox/common/registry/ModSounds.java +++ b/src/main/java/vectorwing/blockbox/common/registry/ModSounds.java @@ -1,18 +1,27 @@ package vectorwing.blockbox.common.registry; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.resources.Identifier; import net.minecraft.sounds.SoundEvent; -import net.neoforged.neoforge.registries.DeferredRegister; import vectorwing.blockbox.BlockBox; import java.util.function.Supplier; public class ModSounds { - public static final DeferredRegister SOUNDS = DeferredRegister.create(Registries.SOUND_EVENT, BlockBox.MODID); // Stove - public static final Supplier ITEM_SWORD_CARVE = SOUNDS.register("item.sword.carve", + public static final Supplier ITEM_SWORD_CARVE = register("item.sword.carve", () -> SoundEvent.createVariableRangeEvent(Identifier.fromNamespaceAndPath(BlockBox.MODID, "item.sword.carve"))); + + private static Supplier register(String name, Supplier supplier) { + SoundEvent register = Registry.register(BuiltInRegistries.SOUND_EVENT, Identifier.fromNamespaceAndPath(BlockBox.MODID, name), supplier.get()); + return ()->register; + } + + public static void register() { + + } } diff --git a/src/main/java/vectorwing/blockbox/common/registry/RegistryAliases.java b/src/main/java/vectorwing/blockbox/common/registry/RegistryAliases.java index 885937aa..9be3c4db 100644 --- a/src/main/java/vectorwing/blockbox/common/registry/RegistryAliases.java +++ b/src/main/java/vectorwing/blockbox/common/registry/RegistryAliases.java @@ -1,5 +1,6 @@ package vectorwing.blockbox.common.registry; +import net.minecraft.core.registries.BuiltInRegistries; import vectorwing.blockbox.common.helper.RecipeHelper; public class RegistryAliases @@ -25,10 +26,10 @@ public static void addRegistryAliases() { } public static void addBlockAlias(String oldName, String newName) { - ModBlocks.BLOCKS.addAlias(RecipeHelper.modIdentifier(oldName), RecipeHelper.modIdentifier(newName)); + BuiltInRegistries.BLOCK.addAlias(RecipeHelper.modIdentifier(oldName), RecipeHelper.modIdentifier(newName)); } public static void addItemAlias(String oldName, String newName) { - ModItems.ITEMS.addAlias(RecipeHelper.modIdentifier(oldName), RecipeHelper.modIdentifier(newName)); + BuiltInRegistries.ITEM.addAlias(RecipeHelper.modIdentifier(oldName), RecipeHelper.modIdentifier(newName)); } } diff --git a/src/main/java/vectorwing/blockbox/common/tag/CommonTags.java b/src/main/java/vectorwing/blockbox/common/tag/CommonTags.java new file mode 100644 index 00000000..996a51e9 --- /dev/null +++ b/src/main/java/vectorwing/blockbox/common/tag/CommonTags.java @@ -0,0 +1,20 @@ +package vectorwing.blockbox.common.tag; + +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; + +public class CommonTags { + public static class Items { + + public static final TagKey RODS_WOODEN = commonItemTag("rods/wooden"); + public static final TagKey FIRESTARTERS = commonItemTag("firestarters"); + } + + private static TagKey commonItemTag(String path) { + return TagKey.create(Registries.ITEM, Identifier.fromNamespaceAndPath("c", path)); + } +} diff --git a/src/main/java/vectorwing/blockbox/common/tag/CompatibilityTags.java b/src/main/java/vectorwing/blockbox/common/tag/CompatibilityTags.java index dd36b06e..f947cbb5 100644 --- a/src/main/java/vectorwing/blockbox/common/tag/CompatibilityTags.java +++ b/src/main/java/vectorwing/blockbox/common/tag/CompatibilityTags.java @@ -1,5 +1,6 @@ package vectorwing.blockbox.common.tag; +import net.minecraft.core.registries.Registries; import net.minecraft.resources.Identifier; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; @@ -14,10 +15,10 @@ public class CompatibilityTags public static final TagKey FARMERS_DELIGHT_TRAY_HEAT_SOURCES = externalBlockTag(FARMERS_DELIGHT, "tray_heat_sources"); private static TagKey externalBlockTag(String modId, String path) { - return BlockTags.create(Identifier.fromNamespaceAndPath(modId, path)); + return TagKey.create(Registries.BLOCK, Identifier.fromNamespaceAndPath(modId, path)); } private static TagKey externalItemTag(String modId, String path) { - return ItemTags.create(Identifier.fromNamespaceAndPath(modId, path)); + return TagKey.create(Registries.ITEM, Identifier.fromNamespaceAndPath(modId, path)); } } diff --git a/src/main/java/vectorwing/blockbox/common/tag/ModTags.java b/src/main/java/vectorwing/blockbox/common/tag/ModTags.java index 962fc309..fe7669ac 100644 --- a/src/main/java/vectorwing/blockbox/common/tag/ModTags.java +++ b/src/main/java/vectorwing/blockbox/common/tag/ModTags.java @@ -1,5 +1,6 @@ package vectorwing.blockbox.common.tag; +import net.minecraft.core.registries.Registries; import net.minecraft.resources.Identifier; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; @@ -47,10 +48,10 @@ public class ModTags public static final TagKey SKY_LANTERNS = modItemTag("sky_lanterns"); private static TagKey modBlockTag(String path) { - return BlockTags.create(Identifier.fromNamespaceAndPath(BlockBox.MODID, path)); + return TagKey.create(Registries.BLOCK, Identifier.fromNamespaceAndPath(BlockBox.MODID, path)); } private static TagKey modItemTag(String path) { - return ItemTags.create(Identifier.fromNamespaceAndPath(BlockBox.MODID, path)); + return TagKey.create(Registries.ITEM, Identifier.fromNamespaceAndPath(BlockBox.MODID, path)); } } diff --git a/src/main/java/vectorwing/blockbox/data/DataGenerators.java b/src/main/java/vectorwing/blockbox/data/DataGenerators.java index ef42579b..d3036238 100644 --- a/src/main/java/vectorwing/blockbox/data/DataGenerators.java +++ b/src/main/java/vectorwing/blockbox/data/DataGenerators.java @@ -1,4 +1,5 @@ -package vectorwing.blockbox.data; +//? neoforge { +/*package vectorwing.blockbox.data; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; @@ -30,3 +31,4 @@ public static void gatherData(GatherDataEvent.Client event) { event.createProvider(ParticleTypes::new); } } +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/generator/ModBlockModelGenerators.java b/src/main/java/vectorwing/blockbox/data/generator/ModBlockModelGenerators.java index 50916a09..5da60971 100644 --- a/src/main/java/vectorwing/blockbox/data/generator/ModBlockModelGenerators.java +++ b/src/main/java/vectorwing/blockbox/data/generator/ModBlockModelGenerators.java @@ -1,4 +1,5 @@ -package vectorwing.blockbox.data.generator; +//? neoforge { +/*package vectorwing.blockbox.data.generator; import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.MultiVariant; @@ -333,3 +334,4 @@ public static MultiVariantGenerator createBrazier(Block block, MultiVariant stan .select(true, true, hangingLit)); } } +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/model/ModModelTemplates.java b/src/main/java/vectorwing/blockbox/data/model/ModModelTemplates.java index 0d3e228a..4235608e 100644 --- a/src/main/java/vectorwing/blockbox/data/model/ModModelTemplates.java +++ b/src/main/java/vectorwing/blockbox/data/model/ModModelTemplates.java @@ -1,4 +1,5 @@ -package vectorwing.blockbox.data.model; +//? neoforge { +/*package vectorwing.blockbox.data.model; import net.minecraft.client.data.models.model.ModelTemplate; import net.minecraft.client.data.models.model.ModelTemplates; @@ -37,3 +38,4 @@ public static ModelTemplate create(String id, String suffix, TextureSlot... slot return ModelTemplates.create(Identifier.fromNamespaceAndPath(BlockBox.MODID, id).toString(), suffix, slots); } } +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/provider/BlockItemModels.java b/src/main/java/vectorwing/blockbox/data/provider/BlockItemModels.java index 45f077a7..8694190b 100644 --- a/src/main/java/vectorwing/blockbox/data/provider/BlockItemModels.java +++ b/src/main/java/vectorwing/blockbox/data/provider/BlockItemModels.java @@ -1,4 +1,5 @@ -package vectorwing.blockbox.data.provider; +//? neoforge { +/*package vectorwing.blockbox.data.provider; import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.ItemModelGenerators; @@ -18,3 +19,4 @@ protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerat new ModBlockModelGenerators(blockModels).run(); } } +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/provider/BlockLootTables.java b/src/main/java/vectorwing/blockbox/data/provider/BlockLootTables.java index 65152e91..5e4b911a 100644 --- a/src/main/java/vectorwing/blockbox/data/provider/BlockLootTables.java +++ b/src/main/java/vectorwing/blockbox/data/provider/BlockLootTables.java @@ -1,4 +1,5 @@ -package vectorwing.blockbox.data.provider; +//? neoforge { +/*package vectorwing.blockbox.data.provider; import net.minecraft.core.HolderLookup; import net.minecraft.data.loot.BlockLootSubProvider; @@ -182,3 +183,4 @@ protected Iterable getKnownBlocks() { return generatedLootTables; } } +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/provider/DataMaps.java b/src/main/java/vectorwing/blockbox/data/provider/DataMaps.java index de69b822..19cde8ad 100644 --- a/src/main/java/vectorwing/blockbox/data/provider/DataMaps.java +++ b/src/main/java/vectorwing/blockbox/data/provider/DataMaps.java @@ -1,4 +1,5 @@ -package vectorwing.blockbox.data.provider; +//? neoforge { +/*package vectorwing.blockbox.data.provider; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; @@ -46,3 +47,4 @@ protected void gather(HolderLookup.Provider provider) { .add(ModTags.WOODEN_SEAT_ITEMS, new FurnaceFuel(200), false); } } +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/provider/LootTables.java b/src/main/java/vectorwing/blockbox/data/provider/LootTables.java index 313809d7..9dea96e0 100644 --- a/src/main/java/vectorwing/blockbox/data/provider/LootTables.java +++ b/src/main/java/vectorwing/blockbox/data/provider/LootTables.java @@ -1,4 +1,5 @@ -package vectorwing.blockbox.data.provider; +//? neoforge { +/*package vectorwing.blockbox.data.provider; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; @@ -17,3 +18,4 @@ public LootTables(PackOutput output, CompletableFuture re ), registries); } } +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/provider/ParticleTypes.java b/src/main/java/vectorwing/blockbox/data/provider/ParticleTypes.java index 1a900828..a13e1d3d 100644 --- a/src/main/java/vectorwing/blockbox/data/provider/ParticleTypes.java +++ b/src/main/java/vectorwing/blockbox/data/provider/ParticleTypes.java @@ -1,4 +1,5 @@ -package vectorwing.blockbox.data.provider; +//? neoforge { +/*package vectorwing.blockbox.data.provider; import net.minecraft.data.PackOutput; import net.minecraft.resources.Identifier; @@ -21,3 +22,4 @@ protected void addDescriptions() { ); } } +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/provider/Recipes.java b/src/main/java/vectorwing/blockbox/data/provider/Recipes.java index 7401ca83..c44ef191 100644 --- a/src/main/java/vectorwing/blockbox/data/provider/Recipes.java +++ b/src/main/java/vectorwing/blockbox/data/provider/Recipes.java @@ -1,6 +1,6 @@ -package vectorwing.blockbox.data.provider; +//? neoforge { +/*package vectorwing.blockbox.data.provider; -import com.mojang.logging.annotations.MethodsReturnNonnullByDefault; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.minecraft.data.recipes.RecipeOutput; @@ -9,11 +9,8 @@ import vectorwing.blockbox.data.recipe.SmeltingRecipes; import vectorwing.blockbox.data.recipe.StonecuttingRecipes; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.concurrent.CompletableFuture; -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class Recipes extends RecipeProvider { public Recipes(HolderLookup.Provider registries, RecipeOutput output) { @@ -44,3 +41,4 @@ public String getName() { } } } +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/provider/package-info.java b/src/main/java/vectorwing/blockbox/data/provider/package-info.java new file mode 100644 index 00000000..00d96cdd --- /dev/null +++ b/src/main/java/vectorwing/blockbox/data/provider/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package vectorwing.blockbox.data.provider; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/recipe/CraftingRecipes.java b/src/main/java/vectorwing/blockbox/data/recipe/CraftingRecipes.java index 2d249f2e..fce7a00a 100644 --- a/src/main/java/vectorwing/blockbox/data/recipe/CraftingRecipes.java +++ b/src/main/java/vectorwing/blockbox/data/recipe/CraftingRecipes.java @@ -1,4 +1,5 @@ -package vectorwing.blockbox.data.recipe; +//? neoforge { +/*package vectorwing.blockbox.data.recipe; import net.minecraft.advancements.criterion.InventoryChangeTrigger; import net.minecraft.core.HolderGetter; @@ -501,3 +502,4 @@ private static ResourceKey> nameWithSuffix(String name, String suffix) return ResourceKey.create(Registries.RECIPE, Identifier.fromNamespaceAndPath(BlockBox.MODID, name + "_" + suffix)); } } +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/tag/BlockTags.java b/src/main/java/vectorwing/blockbox/data/tag/BlockTags.java index 11d76371..5d1731d6 100644 --- a/src/main/java/vectorwing/blockbox/data/tag/BlockTags.java +++ b/src/main/java/vectorwing/blockbox/data/tag/BlockTags.java @@ -1,4 +1,5 @@ -package vectorwing.blockbox.data.tag; +//? neoforge { +/*package vectorwing.blockbox.data.tag; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; @@ -341,3 +342,4 @@ private void registerBlockMineables() { tag(net.minecraft.tags.BlockTags.NEEDS_DIAMOND_TOOL).add(ModBlocks.POLISHED_OBSIDIAN.get()); } } +*///?} diff --git a/src/main/java/vectorwing/blockbox/data/tag/DamageTypeTags.java b/src/main/java/vectorwing/blockbox/data/tag/DamageTypeTags.java index 78493523..961c114b 100644 --- a/src/main/java/vectorwing/blockbox/data/tag/DamageTypeTags.java +++ b/src/main/java/vectorwing/blockbox/data/tag/DamageTypeTags.java @@ -1,4 +1,5 @@ -package vectorwing.blockbox.data.tag; +//? neoforge { +/*package vectorwing.blockbox.data.tag; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; @@ -22,3 +23,4 @@ protected void addTags(HolderLookup.Provider provider) { tag(net.minecraft.tags.DamageTypeTags.PANIC_ENVIRONMENTAL_CAUSES).add(ModDamageTypes.PALISADE); } } +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/tag/ItemTags.java b/src/main/java/vectorwing/blockbox/data/tag/ItemTags.java index 836e0ad1..9ace1a6d 100644 --- a/src/main/java/vectorwing/blockbox/data/tag/ItemTags.java +++ b/src/main/java/vectorwing/blockbox/data/tag/ItemTags.java @@ -1,14 +1,17 @@ -package vectorwing.blockbox.data.tag; +//? neoforge { +/*package vectorwing.blockbox.data.tag; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.minecraft.data.tags.TagsProvider; +import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; import net.neoforged.neoforge.common.data.ItemTagsProvider; import org.jetbrains.annotations.NotNull; import vectorwing.blockbox.BlockBox; import vectorwing.blockbox.common.registry.ModBlocks; import vectorwing.blockbox.common.registry.ModItems; +import vectorwing.blockbox.common.tag.CommonTags; import vectorwing.blockbox.common.tag.ModTags; import java.util.concurrent.CompletableFuture; @@ -165,5 +168,7 @@ private void registerMinecraftTags() { ModItems.PACKED_ICE_BRICK_WALL.get() ); tag(net.minecraft.tags.ItemTags.PIGLIN_LOVED).addTag(ModTags.GOLDEN_BLOCK_ITEMS); + tag(CommonTags.Items.FIRESTARTERS).add(Items.FLINT_AND_STEEL).add(Items.FIRE_CHARGE); } } +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/BlockWithItemAbility.java b/src/main/java/vectorwing/blockbox/fabric/BlockWithItemAbility.java new file mode 100644 index 00000000..972e451e --- /dev/null +++ b/src/main/java/vectorwing/blockbox/fabric/BlockWithItemAbility.java @@ -0,0 +1,11 @@ +package vectorwing.blockbox.fabric; + +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; + +public interface BlockWithItemAbility { + //? fabric + BlockState getToolModifiedState(BlockState state, UseOnContext context, ItemAbility itemAbility, boolean simulate); + +} diff --git a/src/main/java/vectorwing/blockbox/fabric/FabricClientEntrypoint.java b/src/main/java/vectorwing/blockbox/fabric/FabricClientEntrypoint.java new file mode 100644 index 00000000..b49cc09b --- /dev/null +++ b/src/main/java/vectorwing/blockbox/fabric/FabricClientEntrypoint.java @@ -0,0 +1,20 @@ +package vectorwing.blockbox.fabric; + +//? fabric { +import net.fabricmc.api.ClientModInitializer; +import vectorwing.blockbox.BlockBox; +import vectorwing.blockbox.client.event.ClientSetupEvents; +import vectorwing.blockbox.fabric.event.client.EntityRenderersEvent; +import vectorwing.blockbox.fabric.event.client.RegisterParticleProvidersEvent; + +public class FabricClientEntrypoint implements ClientModInitializer { + + @Override + public void onInitializeClient() { + BlockBox.LOGGER.info("Initializing {} Client", BlockBox.MODID); + ClientSetupEvents.onRegisterRenderers(new EntityRenderersEvent.RegisterRenderers()); + ClientSetupEvents.registerParticles(new RegisterParticleProvidersEvent()); + } + +} +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/FabricClientSetupEvents.java b/src/main/java/vectorwing/blockbox/fabric/FabricClientSetupEvents.java new file mode 100644 index 00000000..2e3052e8 --- /dev/null +++ b/src/main/java/vectorwing/blockbox/fabric/FabricClientSetupEvents.java @@ -0,0 +1,21 @@ +//? fabric { +package vectorwing.blockbox.fabric; + +import net.fabricmc.fabric.api.client.particle.v1.ParticleProviderRegistry; +import net.minecraft.client.renderer.entity.EntityRenderers; +import vectorwing.blockbox.client.particle.SparkleParticle; +import vectorwing.blockbox.common.entity.SeatEntity; +import vectorwing.blockbox.common.registry.ModEntityTypes; +import vectorwing.blockbox.common.registry.ModParticleTypes; + +public class FabricClientSetupEvents +{ + public static void registerParticles() { + + } + + public static void onRegisterRenderers() { + EntityRenderers.register(ModEntityTypes.SEAT.get(), SeatEntity.Renderer::new); + } +} +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/FabricEntrypoint.java b/src/main/java/vectorwing/blockbox/fabric/FabricEntrypoint.java new file mode 100644 index 00000000..61395369 --- /dev/null +++ b/src/main/java/vectorwing/blockbox/fabric/FabricEntrypoint.java @@ -0,0 +1,59 @@ +package vectorwing.blockbox.fabric; + +//? fabric { +import fuzs.forgeconfigapiport.fabric.api.v5.ConfigRegistry; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.creativetab.v1.CreativeModeTabEvents; +import net.fabricmc.fabric.api.event.player.ItemEvents; +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.fml.config.ModConfig; +import vectorwing.blockbox.BlockBox; +import vectorwing.blockbox.Config; +import vectorwing.blockbox.fabric.event.BuildCreativeModeTabContentsEvent; +import vectorwing.blockbox.common.event.CommonEvents; +import vectorwing.blockbox.common.registry.*; + +import static vectorwing.blockbox.BlockBox.MODID; + +public class FabricEntrypoint implements ModInitializer { + + @Override + public void onInitialize() { + ConfigRegistry.INSTANCE.register(MODID, ModConfig.Type.COMMON, Config.SPEC); + + ModBlocks.register(); + ModItems.register(); + ModEntityTypes.register(); + ModSounds.register(); + ModParticleTypes.register(); + ModCreativeTabs.register(); + + RegistryAliases.addRegistryAliases(); + CreativeModeTabEvents.MODIFY_OUTPUT_ALL.register((tab, output)-> CommonEvents.addItemsToVanillaCreativeTabs(new BuildCreativeModeTabContentsEvent(tab, output))); + + ItemEvents.USE_ON.register(useOnContext -> { + BlockPos pos = useOnContext.getClickedPos(); + Level level = useOnContext.getLevel(); + BlockState state = level.getBlockState(pos); + Block block = state.getBlock(); + if (block instanceof BlockWithItemAbility blockWithItemAbility) { + ItemAbility itemAbility = ItemAbilities.get(useOnContext.getItemInHand()); + if (itemAbility != null) { + BlockState toolModifiedState = blockWithItemAbility.getToolModifiedState(state, useOnContext, itemAbility, false); + if (toolModifiedState != null) { + level.setBlockAndUpdate(pos, toolModifiedState); + return InteractionResult.SUCCESS; + } + } + } + return null; + }); + } + +} +//?} diff --git a/src/main/java/vectorwing/blockbox/fabric/FabricPlatformImpl.java b/src/main/java/vectorwing/blockbox/fabric/FabricPlatformImpl.java new file mode 100644 index 00000000..4e818838 --- /dev/null +++ b/src/main/java/vectorwing/blockbox/fabric/FabricPlatformImpl.java @@ -0,0 +1,20 @@ +package vectorwing.blockbox.fabric; + +//? fabric { +import vectorwing.blockbox.Platform; +import net.fabricmc.loader.api.FabricLoader; + +public class FabricPlatformImpl implements Platform { + + @Override + public boolean isModLoaded(String modid) { + return FabricLoader.getInstance().isModLoaded(modid); + } + + @Override + public String loader() { + return "fabric"; + } + +} +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/ItemAbilities.java b/src/main/java/vectorwing/blockbox/fabric/ItemAbilities.java new file mode 100644 index 00000000..f8beefca --- /dev/null +++ b/src/main/java/vectorwing/blockbox/fabric/ItemAbilities.java @@ -0,0 +1,34 @@ +//? fabric { +package vectorwing.blockbox.fabric; + +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.jspecify.annotations.Nullable; +import vectorwing.blockbox.common.tag.CommonTags; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; + +public class ItemAbilities { + public static final ItemAbility AXE_STRIP = new ItemAbility(ItemTags.AXES); + public static final ItemAbility FIRESTARTER_LIGHT = new ItemAbility(CommonTags.Items.FIRESTARTERS); + public static final ItemAbility SHOVEL_DOUSE = new ItemAbility(ItemTags.SHOVELS); + + public static @Nullable ItemAbility get(ItemStack itemInHand) { + if (itemInHand.is(AXE_STRIP.tagKey())) { + return AXE_STRIP; + } + else if (itemInHand.is(FIRESTARTER_LIGHT.tagKey())) { + return FIRESTARTER_LIGHT; + } + else if (itemInHand.is(SHOVEL_DOUSE.tagKey())) { + return SHOVEL_DOUSE; + } + return null; + } +} +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/ItemAbility.java b/src/main/java/vectorwing/blockbox/fabric/ItemAbility.java new file mode 100644 index 00000000..71d26609 --- /dev/null +++ b/src/main/java/vectorwing/blockbox/fabric/ItemAbility.java @@ -0,0 +1,11 @@ +//? fabric { +package vectorwing.blockbox.fabric; + +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.player.Abilities; +import net.minecraft.world.item.Item; + +public record ItemAbility(TagKey tagKey) { + +} +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/event/BuildCreativeModeTabContentsEvent.java b/src/main/java/vectorwing/blockbox/fabric/event/BuildCreativeModeTabContentsEvent.java new file mode 100644 index 00000000..c38f0808 --- /dev/null +++ b/src/main/java/vectorwing/blockbox/fabric/event/BuildCreativeModeTabContentsEvent.java @@ -0,0 +1,29 @@ +//? fabric { +package vectorwing.blockbox.fabric.event; + +import net.fabricmc.fabric.api.creativetab.v1.FabricCreativeModeTabOutput; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; + +import java.util.Collections; + +public class BuildCreativeModeTabContentsEvent { + private final ResourceKey tabKey; + private final FabricCreativeModeTabOutput output; + + public BuildCreativeModeTabContentsEvent(CreativeModeTab tab, FabricCreativeModeTabOutput output) { + this.tabKey = BuiltInRegistries.CREATIVE_MODE_TAB.getResourceKey(tab).orElse(null); + this.output = output; + } + + public ResourceKey getTabKey() { + return tabKey; + } + + public void insertAfter(ItemStack anchor, ItemStack newStack, CreativeModeTab.TabVisibility tabVisibility) { + output.insertAfter(anchor, Collections.singleton(newStack), tabVisibility); + } +} +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/event/client/EntityRenderersEvent.java b/src/main/java/vectorwing/blockbox/fabric/event/client/EntityRenderersEvent.java new file mode 100644 index 00000000..04753bf0 --- /dev/null +++ b/src/main/java/vectorwing/blockbox/fabric/event/client/EntityRenderersEvent.java @@ -0,0 +1,17 @@ +package vectorwing.blockbox.fabric.event.client; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.EntityRenderers; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import vectorwing.blockbox.common.entity.SeatEntity; + +import java.util.function.Supplier; + +public class EntityRenderersEvent { + public static class RegisterRenderers { + public void registerEntityRenderer(EntityType entityType, EntityRendererProvider provider) { + EntityRenderers.register(entityType, provider); + } + } +} diff --git a/src/main/java/vectorwing/blockbox/fabric/event/client/RegisterParticleProvidersEvent.java b/src/main/java/vectorwing/blockbox/fabric/event/client/RegisterParticleProvidersEvent.java new file mode 100644 index 00000000..de6fb20d --- /dev/null +++ b/src/main/java/vectorwing/blockbox/fabric/event/client/RegisterParticleProvidersEvent.java @@ -0,0 +1,13 @@ +//? fabric { +package vectorwing.blockbox.fabric.event.client; + +import net.fabricmc.fabric.api.client.particle.v1.ParticleProviderRegistry; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; + +public class RegisterParticleProvidersEvent { + public void registerSpriteSet(ParticleType simpleParticleType, ParticleProviderRegistry.PendingParticleProvider provider) { + ParticleProviderRegistry.getInstance().register(simpleParticleType, provider); + } +} +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/neoforge/NeoforgeEntrypoint.java b/src/main/java/vectorwing/blockbox/neoforge/NeoforgeEntrypoint.java new file mode 100644 index 00000000..f44a5eac --- /dev/null +++ b/src/main/java/vectorwing/blockbox/neoforge/NeoforgeEntrypoint.java @@ -0,0 +1,45 @@ +package vectorwing.blockbox.neoforge; + +//? neoforge { +/*import net.minecraft.core.registries.Registries; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.neoforge.registries.RegisterEvent; +import vectorwing.blockbox.BlockBox; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import vectorwing.blockbox.Config; +import vectorwing.blockbox.common.registry.*; + +@Mod(BlockBox.MODID) +@EventBusSubscriber(modid = BlockBox.MODID) +public class NeoforgeEntrypoint { + + public NeoforgeEntrypoint(IEventBus eventBus, ModContainer container) { + container.registerConfig(ModConfig.Type.COMMON, Config.SPEC); + RegistryAliases.addRegistryAliases(); + } + + @SubscribeEvent + public static void register(RegisterEvent event) { + if (event.getRegistryKey().equals(Registries.BLOCK)) { + ModBlocks.register(); + } else if (event.getRegistryKey().equals(Registries.ITEM)) { + ModItems.register(); + } else if (event.getRegistryKey().equals(Registries.ENTITY_TYPE)) { + ModEntityTypes.register(); + } else if (event.getRegistryKey().equals(Registries.SOUND_EVENT)) { + ModSounds.register(); + } else if (event.getRegistryKey().equals(Registries.CREATIVE_MODE_TAB)) { + ModCreativeTabs.register(); + } else if (event.getRegistryKey().equals(Registries.PARTICLE_TYPE)) { + ModParticleTypes.register(); + } + } + +} +*///?} diff --git a/src/main/java/vectorwing/blockbox/neoforge/NeoforgePlatformImpl.java b/src/main/java/vectorwing/blockbox/neoforge/NeoforgePlatformImpl.java new file mode 100644 index 00000000..4d022eb6 --- /dev/null +++ b/src/main/java/vectorwing/blockbox/neoforge/NeoforgePlatformImpl.java @@ -0,0 +1,20 @@ +package vectorwing.blockbox.blockbox.neoforge; + +//? neoforge { +/*import vectorwing.blockbox.Platform; +import net.neoforged.fml.ModList; + +public class NeoforgePlatformImpl implements Platform { + + @Override + public boolean isModLoaded(String modid) { + return ModList.get().isLoaded(modid); + } + + @Override + public String loader() { + return "neoforge"; + } + +} +*///?} \ No newline at end of file diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1 @@ + diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml similarity index 93% rename from src/main/templates/META-INF/neoforge.mods.toml rename to src/main/resources/META-INF/neoforge.mods.toml index d1d8dd86..dd8d15e0 100644 --- a/src/main/templates/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -4,9 +4,9 @@ license="${mod_license}" [[mods]] #mandatory modId="${mod_id}" #mandatory -version="${mod_version}" #mandatory +version="${version}" #mandatory displayName="${mod_name}" #mandatory -logoFile = "logo.png" +logoFile = "../logo.png" logoBlur = false credits="Tkain" #optional authors="${mod_authors}" #optional diff --git a/src/main/resources/blockbox.accesswidener b/src/main/resources/blockbox.accesswidener new file mode 100644 index 00000000..ec0920a0 --- /dev/null +++ b/src/main/resources/blockbox.accesswidener @@ -0,0 +1,6 @@ +accessWidener v2 official + +accessible method net/minecraft/world/level/block/state/properties/BlockSetType register (Lnet/minecraft/world/level/block/state/properties/BlockSetType;)Lnet/minecraft/world/level/block/state/properties/BlockSetType; +accessible method net/minecraft/core/particles/SimpleParticleType (Z)V + + diff --git a/src/main/resources/blockbox.mixins.json b/src/main/resources/blockbox.mixins.json new file mode 100644 index 00000000..eea4c7ae --- /dev/null +++ b/src/main/resources/blockbox.mixins.json @@ -0,0 +1,12 @@ +{ + "package": "vectorwing.blockbox.blockbox.mixin", + "required": true, + "minVersion": "0.8", + "compatibilityLevel": "JAVA_21", + "injectors": { + "defaultRequire": 1 + }, + "mixins": [ + ], + "client": [] +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..9f9f64d1 --- /dev/null +++ b/src/main/resources/fabric.mod.json @@ -0,0 +1,30 @@ +{ + "schemaVersion": 1, + "id": "${mod_id}", + "name": "${mod_name}", + "version": "${version}", + "authors": ["vectorwing"], + "contact": { + "sources": "https://github.com/vectorwing/BlockBox", + "issues": "https://github.com/vectorwing/BlockBox/issues" + }, + "description": "A collection of building blocks, furniture and decorations!", + "icon": "assets/logo.png", + "license": "MIT", + "environment": "*", + "accessWidener": "blockbox.accesswidener", + "entrypoints": { + "main": [ + "vectorwing.blockbox.fabric.FabricEntrypoint" + ], + "client": [ + "vectorwing.blockbox.fabric.FabricClientEntrypoint" + ] + }, + "mixins": [ + "blockbox.mixins.json" + ], + "depends": { + "fabric-api": "*" + } +} \ No newline at end of file diff --git a/src/main/templates/META-INF/accesstransformer.cfg b/src/main/templates/META-INF/accesstransformer.cfg deleted file mode 100644 index bbae4092..00000000 --- a/src/main/templates/META-INF/accesstransformer.cfg +++ /dev/null @@ -1 +0,0 @@ -protected-f net.minecraft.world.level.block.CrossCollisionBlock stateToIndex \ No newline at end of file diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts new file mode 100644 index 00000000..a5d3a83b --- /dev/null +++ b/stonecutter.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id("dev.kikugie.stonecutter") + id("co.uzzu.dotenv.gradle") version "4.0.0" + id("net.fabricmc.fabric-loom") version "1.15-SNAPSHOT" apply false + id("net.neoforged.moddev") version "2.0.140" apply false + id ("dev.kikugie.postprocess.jsonlang") version "2.1-beta.4" apply false + id("me.modmuss50.mod-publish-plugin") version "0.8.+" apply false +} + +stonecutter active "26.1-fabric" + +stonecutter parameters { + constants.match(node.metadata.project.substringAfterLast('-'), "fabric", "neoforge") + filters.include("**/*.fsh", "**/*.vsh") +} + +stonecutter tasks { + order("publishModrinth") + order("publishCurseforge") +} + +for (version in stonecutter.versions.map { it.version }.distinct()) tasks.register("publish$version") { + group = "publishing" + dependsOn(stonecutter.tasks.named("publishMods") { metadata.version == version }) +} diff --git a/versions/26.1-fabric/gradle.properties b/versions/26.1-fabric/gradle.properties new file mode 100644 index 00000000..c573b704 --- /dev/null +++ b/versions/26.1-fabric/gradle.properties @@ -0,0 +1,6 @@ +deps.minecraft=26.1.2 +deps.fabric-api=0.146.1+26.1.2 + +publish.additionalVersions=26.1, 26.1.1 +deps.minecraft_version_range=~26.1 +deps.forge_config_api_port=26.1.3 \ No newline at end of file diff --git a/versions/26.1-neoforge/gradle.properties b/versions/26.1-neoforge/gradle.properties new file mode 100644 index 00000000..dd576ab4 --- /dev/null +++ b/versions/26.1-neoforge/gradle.properties @@ -0,0 +1,4 @@ +deps.minecraft=26.1.2 +deps.neoforge=26.1.2.22-beta +deps.minecraft_version_range=[26.1.2,26.2) +publish.additionalVersions=26.1, 26.1.1 \ No newline at end of file From 1d759cb11a276ba832375762829cad487118584d Mon Sep 17 00:00:00 2001 From: Cassian Date: Thu, 23 Apr 2026 11:57:28 -0400 Subject: [PATCH 2/7] add data map equivalents --- .../vectorwing/blockbox/fabric/DataMaps.java | 47 +++++++++++++++++++ .../blockbox/fabric/FabricEntrypoint.java | 1 + 2 files changed, 48 insertions(+) create mode 100644 src/main/java/vectorwing/blockbox/fabric/DataMaps.java diff --git a/src/main/java/vectorwing/blockbox/fabric/DataMaps.java b/src/main/java/vectorwing/blockbox/fabric/DataMaps.java new file mode 100644 index 00000000..7dcae916 --- /dev/null +++ b/src/main/java/vectorwing/blockbox/fabric/DataMaps.java @@ -0,0 +1,47 @@ +package vectorwing.blockbox.fabric; + +import net.fabricmc.fabric.api.registry.FuelValueEvents; +import net.fabricmc.fabric.api.registry.OxidizableBlocksRegistry; +import net.minecraft.world.level.block.Block; +import vectorwing.blockbox.common.registry.ModBlocks; +import vectorwing.blockbox.common.tag.ModTags; + +import java.util.function.Supplier; + +public class DataMaps { + + // Fabric replacements for NeoForge data maps. + public static void register() { + FuelValueEvents.BUILD.register((builder, context) -> { + builder.add(ModTags.PALISADE_ITEMS, 150); + builder.add(ModTags.SPIKED_PALISADE_ITEMS, 150); + builder.add(ModTags.WOODEN_SEAT_ITEMS, 200); + }); + + oxidize(ModBlocks.COPPER_CHAIN_LINKS, ModBlocks.EXPOSED_COPPER_CHAIN_LINKS); + oxidize(ModBlocks.EXPOSED_COPPER_CHAIN_LINKS, ModBlocks.WEATHERED_COPPER_CHAIN_LINKS); + oxidize(ModBlocks.WEATHERED_COPPER_CHAIN_LINKS, ModBlocks.OXIDIZED_COPPER_CHAIN_LINKS); + + oxidize(ModBlocks.COPPER_PILLAR, ModBlocks.EXPOSED_COPPER_PILLAR); + oxidize(ModBlocks.EXPOSED_COPPER_PILLAR, ModBlocks.WEATHERED_COPPER_PILLAR); + oxidize(ModBlocks.WEATHERED_COPPER_PILLAR, ModBlocks.OXIDIZED_COPPER_PILLAR); + + wax(ModBlocks.COPPER_CHAIN_LINKS, ModBlocks.WAXED_COPPER_CHAIN_LINKS); + wax(ModBlocks.EXPOSED_COPPER_CHAIN_LINKS, ModBlocks.WAXED_EXPOSED_COPPER_CHAIN_LINKS); + wax(ModBlocks.WEATHERED_COPPER_CHAIN_LINKS, ModBlocks.WAXED_WEATHERED_COPPER_CHAIN_LINKS); + wax(ModBlocks.OXIDIZED_COPPER_CHAIN_LINKS, ModBlocks.WAXED_OXIDIZED_COPPER_CHAIN_LINKS); + + wax(ModBlocks.COPPER_PILLAR, ModBlocks.WAXED_COPPER_PILLAR); + wax(ModBlocks.EXPOSED_COPPER_PILLAR, ModBlocks.WAXED_EXPOSED_COPPER_PILLAR); + wax(ModBlocks.WEATHERED_COPPER_PILLAR, ModBlocks.WAXED_WEATHERED_COPPER_PILLAR); + wax(ModBlocks.OXIDIZED_COPPER_PILLAR, ModBlocks.WAXED_OXIDIZED_COPPER_PILLAR); + } + + private static void oxidize(Supplier less, Supplier more) { + OxidizableBlocksRegistry.registerNextStage(less.get(), more.get()); + } + + private static void wax(Supplier unwaxed, Supplier waxed) { + OxidizableBlocksRegistry.registerWaxable(unwaxed.get(), waxed.get()); + } +} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/FabricEntrypoint.java b/src/main/java/vectorwing/blockbox/fabric/FabricEntrypoint.java index 61395369..aab33598 100644 --- a/src/main/java/vectorwing/blockbox/fabric/FabricEntrypoint.java +++ b/src/main/java/vectorwing/blockbox/fabric/FabricEntrypoint.java @@ -53,6 +53,7 @@ public void onInitialize() { } return null; }); + DataMaps.register(); } } From 498633aa5ab86efa6542d7404a66ed964af27b85 Mon Sep 17 00:00:00 2001 From: Cassian Date: Thu, 23 Apr 2026 12:25:57 -0400 Subject: [PATCH 3/7] workaround block registration --- .../blockbox/common/block/PalisadeBlock.java | 44 ++++++++++--------- .../common/block/SpikedPalisadeBlock.java | 16 ++++--- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/main/java/vectorwing/blockbox/common/block/PalisadeBlock.java b/src/main/java/vectorwing/blockbox/common/block/PalisadeBlock.java index dbdae2ba..96dd1232 100644 --- a/src/main/java/vectorwing/blockbox/common/block/PalisadeBlock.java +++ b/src/main/java/vectorwing/blockbox/common/block/PalisadeBlock.java @@ -2,10 +2,11 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; -import com.mojang.logging.annotations.MethodsReturnNonnullByDefault; import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; import net.minecraft.sounds.SoundSource; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; @@ -35,7 +36,6 @@ import vectorwing.blockbox.fabric.ItemAbility; //?} import vectorwing.blockbox.fabric.BlockWithItemAbility; -import org.jetbrains.annotations.NotNull; import org.jspecify.annotations.Nullable; import vectorwing.blockbox.common.block.state.PalisadeConnection; import vectorwing.blockbox.common.registry.ModSounds; @@ -47,15 +47,14 @@ public class PalisadeBlock extends CrossCollisionBlock implements SimpleWaterloggedBlock, BlockWithItemAbility { - public static final MapCodec CODEC = simpleCodec(PalisadeBlock::new); public static final EnumProperty TYPE_NORTH = EnumProperty.create("north", PalisadeConnection.class); public static final EnumProperty TYPE_EAST = EnumProperty.create("east", PalisadeConnection.class); public static final EnumProperty TYPE_SOUTH = EnumProperty.create("south", PalisadeConnection.class); public static final EnumProperty TYPE_WEST = EnumProperty.create("west", PalisadeConnection.class); - public final @Nullable Supplier strippedForm; - public final @Nullable Supplier spikedForm; + public @Nullable Supplier strippedForm; + public @Nullable Supplier spikedForm; public static final Map> PROPERTY_BY_DIRECTION = ImmutableMap.copyOf(Maps.newEnumMap(Map.of( Direction.NORTH, TYPE_NORTH, @@ -64,22 +63,12 @@ public class PalisadeBlock extends CrossCollisionBlock implements SimpleWaterlog Direction.WEST, TYPE_WEST ))); - public PalisadeBlock(Properties properties) { - this(null, null, 8.0F, 16.0F, 8.0F, 16.0F, 16.0F, properties); - } - - public PalisadeBlock(@Nullable Supplier spikedForm, Properties properties) { - this(spikedForm, null, 8.0F, 16.0F, 8.0F, 16.0F, 16.0F, properties); - } - public PalisadeBlock(@Nullable Supplier spikedForm, @Nullable Supplier strippedForm, Properties properties) { this(spikedForm, strippedForm, 8.0F, 16.0F, 8.0F, 16.0F, 16.0F, properties); } public PalisadeBlock(@Nullable Supplier spikedForm, @Nullable Supplier strippedForm, float postWidth, float postHeight, float wallWidth, float wallHeight, float collisionHeight, Properties properties) { super(postWidth, postHeight, wallWidth, wallHeight, collisionHeight, properties); - this.spikedForm = spikedForm; - this.strippedForm = strippedForm; this.registerDefaultState(this.stateDefinition.any() .setValue(TYPE_NORTH, PalisadeConnection.NONE) .setValue(TYPE_EAST, PalisadeConnection.NONE) @@ -108,9 +97,19 @@ protected Function makeShapes(float postWidth, float pos @Override protected InteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) { if (spikedForm == null) { - return InteractionResult.PASS; + spikedForm = ()-> { + Identifier id = BuiltInRegistries.BLOCK.getKey(this); + Identifier spiked; + if (id.getPath().contains("stripped")) { + spiked = id.withPath(path -> path.replace("stripped", "stripped_spiked")); + } else { + spiked = id.withPrefix("spiked_"); + } + return BuiltInRegistries.BLOCK.getValue(spiked); + + }; } - if (stack.is(ItemTags.SWORDS) && level.getBlockState(pos.above()).isAir()) { + if (stack.is(ItemTags.SWORDS) && !spikedForm.get().equals(Blocks.AIR) && level.getBlockState(pos.above()).isAir()) { level.playSound(null, pos, ModSounds.ITEM_SWORD_CARVE.get(), SoundSource.BLOCKS, 1.0F, 0.9F); level.addDestroyBlockEffect(pos, state); stack.hurtAndBreak(2, player, hand.asEquipmentSlot()); @@ -128,10 +127,13 @@ protected InteractionResult useItemOn(ItemStack stack, BlockState state, Level l @Override public BlockState getToolModifiedState(BlockState state, UseOnContext context, ItemAbility itemAbility, boolean simulate) { if (strippedForm == null) { - return null; + strippedForm = ()-> { + Identifier stripped = BuiltInRegistries.BLOCK.getKey(this).withPrefix("stripped_"); + return BuiltInRegistries.BLOCK.getValue(stripped); + }; } - if (itemAbility == ItemAbilities.AXE_STRIP) { + if (itemAbility == ItemAbilities.AXE_STRIP && !strippedForm.get().equals(Blocks.AIR)) { return strippedForm.get().defaultBlockState() .setValue(TYPE_NORTH, state.getValue(TYPE_NORTH)) .setValue(TYPE_EAST, state.getValue(TYPE_EAST)) @@ -187,8 +189,8 @@ public PalisadeConnection getConnectionType(BlockState state, boolean isSideSoli } @Override - protected @NotNull MapCodec codec() { - return CODEC; + protected MapCodec codec() { + return null; } @Override diff --git a/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java b/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java index 28e08982..7e2d4b2a 100644 --- a/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java +++ b/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java @@ -3,6 +3,8 @@ import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; import net.minecraft.tags.BlockTags; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.Entity; @@ -10,10 +12,7 @@ import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.*; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.CrossCollisionBlock; -import net.minecraft.world.level.block.IronBarsBlock; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.material.FluidState; @@ -42,7 +41,7 @@ public class SpikedPalisadeBlock extends CrossCollisionBlock implements SimpleWa protected static final VoxelShape SPIKE_SHAPE = Block.box(4.0D, 8.0D, 4.0D, 12.0D, 16.0D, 12.0D); - public final Supplier strippedForm; + public Supplier strippedForm; public SpikedPalisadeBlock(Properties properties) { this(null, properties); @@ -62,9 +61,12 @@ public SpikedPalisadeBlock(@Nullable Supplier strippedForm, Properties pr @Override public BlockState getToolModifiedState(BlockState state, UseOnContext context, ItemAbility itemAbility, boolean simulate) { if (strippedForm == null) { - return null; + strippedForm = ()-> { + Identifier stripped = BuiltInRegistries.BLOCK.getKey(this).withPrefix("stripped_"); + return BuiltInRegistries.BLOCK.getValue(stripped); + }; } - if (itemAbility == ItemAbilities.AXE_STRIP) { + if (itemAbility == ItemAbilities.AXE_STRIP && !strippedForm.get().equals(Blocks.AIR)) { return strippedForm.get().defaultBlockState() .setValue(NORTH, state.getValue(NORTH)) .setValue(EAST, state.getValue(EAST)) From fdf54eb18dd5826b7d723d154dc3acd7b863da90 Mon Sep 17 00:00:00 2001 From: Cassian Date: Thu, 23 Apr 2026 12:47:18 -0400 Subject: [PATCH 4/7] finish port --- build.fabric.gradle.kts | 9 +++++++ .../java/vectorwing/blockbox/Platform.java | 23 ----------------- .../blockbox/common/block/BrazierBlock.java | 8 +++--- .../blockbox/common/block/PalisadeBlock.java | 6 ++--- .../common/block/SpikedPalisadeBlock.java | 6 ++--- .../common/registry/ModCreativeTabs.java | 2 +- .../blockbox/common/registry/ModItems.java | 4 +-- ...ricEntrypoint.java => BlockBoxFabric.java} | 8 +++--- ...rypoint.java => BlockBoxFabricClient.java} | 2 +- .../fabric/FabricClientSetupEvents.java | 21 --------------- .../blockbox/fabric/FabricPlatformImpl.java | 20 --------------- .../event/client/EntityRenderersEvent.java | 2 ++ .../fabric/mixin/PortalShapeMixin.java | 24 ++++++++++++++++++ .../{ => porting}/BlockWithItemAbility.java | 3 +-- .../fabric/{ => porting}/DataMaps.java | 6 +++-- .../fabric/{ => porting}/ItemAbilities.java | 9 +------ .../fabric/{ => porting}/ItemAbility.java | 3 +-- ...eEntrypoint.java => BlockBoxNeoForge.java} | 4 +-- .../neoforge/NeoforgePlatformImpl.java | 20 --------------- ...ixins.json => blockbox.fabric.mixins.json} | 3 ++- src/main/resources/fabric.mod.json | 11 ++++---- src/main/resources/icon.png | Bin 0 -> 8927 bytes versions/26.1-fabric/gradle.properties | 3 ++- 23 files changed, 71 insertions(+), 126 deletions(-) delete mode 100644 src/main/java/vectorwing/blockbox/Platform.java rename src/main/java/vectorwing/blockbox/fabric/{FabricEntrypoint.java => BlockBoxFabric.java} (88%) rename src/main/java/vectorwing/blockbox/fabric/{FabricClientEntrypoint.java => BlockBoxFabricClient.java} (90%) delete mode 100644 src/main/java/vectorwing/blockbox/fabric/FabricClientSetupEvents.java delete mode 100644 src/main/java/vectorwing/blockbox/fabric/FabricPlatformImpl.java create mode 100644 src/main/java/vectorwing/blockbox/fabric/mixin/PortalShapeMixin.java rename src/main/java/vectorwing/blockbox/fabric/{ => porting}/BlockWithItemAbility.java (71%) rename src/main/java/vectorwing/blockbox/fabric/{ => porting}/DataMaps.java (97%) rename src/main/java/vectorwing/blockbox/fabric/{ => porting}/ItemAbilities.java (78%) rename src/main/java/vectorwing/blockbox/fabric/{ => porting}/ItemAbility.java (61%) rename src/main/java/vectorwing/blockbox/neoforge/{NeoforgeEntrypoint.java => BlockBoxNeoForge.java} (93%) delete mode 100644 src/main/java/vectorwing/blockbox/neoforge/NeoforgePlatformImpl.java rename src/main/resources/{blockbox.mixins.json => blockbox.fabric.mixins.json} (69%) create mode 100644 src/main/resources/icon.png diff --git a/build.fabric.gradle.kts b/build.fabric.gradle.kts index 40258dd7..91564f1b 100644 --- a/build.fabric.gradle.kts +++ b/build.fabric.gradle.kts @@ -66,6 +66,13 @@ repositories { includeGroupAndSubgroups("mezz.jei") } } + maven { + name = "Terraformers (Mod Menu)" + url = uri("https://maven.terraformersmc.com/releases/") + content { + includeGroupAndSubgroups("com.terraformersmc") + } + } } dependencies { @@ -77,6 +84,8 @@ dependencies { compileOnly("mezz.jei:jei-${property("deps.minecraft")}-fabric-api:${property("deps.jei")}") // We add the full version to localRuntime, not runtimeOnly, so that we do not publish a dependency on it localRuntime("mezz.jei:jei-${property("deps.minecraft")}-fabric:${property("deps.jei")}") + compileOnly("com.terraformersmc:modmenu:${property("deps.modmenu")}") + runtimeOnly("com.terraformersmc:modmenu:${property("deps.modmenu")}") } tasks { diff --git a/src/main/java/vectorwing/blockbox/Platform.java b/src/main/java/vectorwing/blockbox/Platform.java deleted file mode 100644 index 67121ff7..00000000 --- a/src/main/java/vectorwing/blockbox/Platform.java +++ /dev/null @@ -1,23 +0,0 @@ -package vectorwing.blockbox; - -//? fabric { -import vectorwing.blockbox.fabric.FabricPlatformImpl; -//?} -//? neoforge { -/*import vectorwing.blockbox.blockbox.neoforge.NeoforgePlatformImpl; -*///?} - -public interface Platform { - - //? fabric { - Platform INSTANCE = new FabricPlatformImpl(); - //?} - //? neoforge { - /*Platform INSTANCE = new NeoforgePlatformImpl(); - *///?} - - - boolean isModLoaded(String modid); - String loader(); - -} diff --git a/src/main/java/vectorwing/blockbox/common/block/BrazierBlock.java b/src/main/java/vectorwing/blockbox/common/block/BrazierBlock.java index 749b4ca1..42c5391f 100644 --- a/src/main/java/vectorwing/blockbox/common/block/BrazierBlock.java +++ b/src/main/java/vectorwing/blockbox/common/block/BrazierBlock.java @@ -15,8 +15,6 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.SimpleWaterloggedBlock; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.CampfireBlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -34,10 +32,10 @@ import net.neoforged.neoforge.common.ItemAbility; *///?} else { -import vectorwing.blockbox.fabric.ItemAbilities; -import vectorwing.blockbox.fabric.ItemAbility; +import vectorwing.blockbox.fabric.porting.ItemAbilities; +import vectorwing.blockbox.fabric.porting.ItemAbility; //?} -import vectorwing.blockbox.fabric.BlockWithItemAbility; +import vectorwing.blockbox.fabric.porting.BlockWithItemAbility; import org.jspecify.annotations.Nullable; import vectorwing.blockbox.common.tag.ModTags; diff --git a/src/main/java/vectorwing/blockbox/common/block/PalisadeBlock.java b/src/main/java/vectorwing/blockbox/common/block/PalisadeBlock.java index 96dd1232..e123265f 100644 --- a/src/main/java/vectorwing/blockbox/common/block/PalisadeBlock.java +++ b/src/main/java/vectorwing/blockbox/common/block/PalisadeBlock.java @@ -32,10 +32,10 @@ import net.neoforged.neoforge.common.ItemAbility; *///?} else { -import vectorwing.blockbox.fabric.ItemAbilities; -import vectorwing.blockbox.fabric.ItemAbility; +import vectorwing.blockbox.fabric.porting.ItemAbilities; +import vectorwing.blockbox.fabric.porting.ItemAbility; //?} -import vectorwing.blockbox.fabric.BlockWithItemAbility; +import vectorwing.blockbox.fabric.porting.BlockWithItemAbility; import org.jspecify.annotations.Nullable; import vectorwing.blockbox.common.block.state.PalisadeConnection; import vectorwing.blockbox.common.registry.ModSounds; diff --git a/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java b/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java index 7e2d4b2a..7aa203c8 100644 --- a/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java +++ b/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java @@ -25,10 +25,10 @@ /*import net.neoforged.neoforge.common.ItemAbilities; import net.neoforged.neoforge.common.ItemAbility; *///?} else { -import vectorwing.blockbox.fabric.ItemAbilities; -import vectorwing.blockbox.fabric.ItemAbility; +import vectorwing.blockbox.fabric.porting.ItemAbilities; +import vectorwing.blockbox.fabric.porting.ItemAbility; //?} -import vectorwing.blockbox.fabric.BlockWithItemAbility; +import vectorwing.blockbox.fabric.porting.BlockWithItemAbility; import org.jspecify.annotations.Nullable; import vectorwing.blockbox.common.registry.ModDamageTypes; import vectorwing.blockbox.common.tag.ModTags; diff --git a/src/main/java/vectorwing/blockbox/common/registry/ModCreativeTabs.java b/src/main/java/vectorwing/blockbox/common/registry/ModCreativeTabs.java index 566da563..ef6400fe 100644 --- a/src/main/java/vectorwing/blockbox/common/registry/ModCreativeTabs.java +++ b/src/main/java/vectorwing/blockbox/common/registry/ModCreativeTabs.java @@ -23,7 +23,7 @@ public class ModCreativeTabs .title(Component.translatable("itemGroup." + BlockBox.MODID)) .icon(() -> ModItems.CHISELED_GOLD.get().getDefaultInstance()) .displayItems((parameters, output) -> ModItems.CREATIVE_TAB_ITEMS.forEach((item) -> { -// output.accept(item.get()); + output.accept(item.get()); })) .build()); diff --git a/src/main/java/vectorwing/blockbox/common/registry/ModItems.java b/src/main/java/vectorwing/blockbox/common/registry/ModItems.java index 3c638112..3ba297b3 100644 --- a/src/main/java/vectorwing/blockbox/common/registry/ModItems.java +++ b/src/main/java/vectorwing/blockbox/common/registry/ModItems.java @@ -41,9 +41,7 @@ public static Supplier registerItem(final String name, final Function registerSimpleBlockItem(final String name, final Supplier supplier) { - Supplier block = registerItem(name, properties -> new BlockItem(supplier.get(), properties.useBlockDescriptionPrefix())); - CREATIVE_TAB_ITEMS.add(block); - return block; + return registerItem(name, properties -> new BlockItem(supplier.get(), properties.useBlockDescriptionPrefix())); } public static Supplier registerSimpleBlockItem(final String name, final Supplier supplier, final Item vanillaTabNeighbor) { diff --git a/src/main/java/vectorwing/blockbox/fabric/FabricEntrypoint.java b/src/main/java/vectorwing/blockbox/fabric/BlockBoxFabric.java similarity index 88% rename from src/main/java/vectorwing/blockbox/fabric/FabricEntrypoint.java rename to src/main/java/vectorwing/blockbox/fabric/BlockBoxFabric.java index aab33598..e7498a8d 100644 --- a/src/main/java/vectorwing/blockbox/fabric/FabricEntrypoint.java +++ b/src/main/java/vectorwing/blockbox/fabric/BlockBoxFabric.java @@ -7,20 +7,22 @@ import net.fabricmc.fabric.api.event.player.ItemEvents; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.fml.config.ModConfig; -import vectorwing.blockbox.BlockBox; import vectorwing.blockbox.Config; import vectorwing.blockbox.fabric.event.BuildCreativeModeTabContentsEvent; import vectorwing.blockbox.common.event.CommonEvents; import vectorwing.blockbox.common.registry.*; +import vectorwing.blockbox.fabric.porting.BlockWithItemAbility; +import vectorwing.blockbox.fabric.porting.DataMaps; +import vectorwing.blockbox.fabric.porting.ItemAbilities; +import vectorwing.blockbox.fabric.porting.ItemAbility; import static vectorwing.blockbox.BlockBox.MODID; -public class FabricEntrypoint implements ModInitializer { +public class BlockBoxFabric implements ModInitializer { @Override public void onInitialize() { diff --git a/src/main/java/vectorwing/blockbox/fabric/FabricClientEntrypoint.java b/src/main/java/vectorwing/blockbox/fabric/BlockBoxFabricClient.java similarity index 90% rename from src/main/java/vectorwing/blockbox/fabric/FabricClientEntrypoint.java rename to src/main/java/vectorwing/blockbox/fabric/BlockBoxFabricClient.java index b49cc09b..e2f89c8f 100644 --- a/src/main/java/vectorwing/blockbox/fabric/FabricClientEntrypoint.java +++ b/src/main/java/vectorwing/blockbox/fabric/BlockBoxFabricClient.java @@ -7,7 +7,7 @@ import vectorwing.blockbox.fabric.event.client.EntityRenderersEvent; import vectorwing.blockbox.fabric.event.client.RegisterParticleProvidersEvent; -public class FabricClientEntrypoint implements ClientModInitializer { +public class BlockBoxFabricClient implements ClientModInitializer { @Override public void onInitializeClient() { diff --git a/src/main/java/vectorwing/blockbox/fabric/FabricClientSetupEvents.java b/src/main/java/vectorwing/blockbox/fabric/FabricClientSetupEvents.java deleted file mode 100644 index 2e3052e8..00000000 --- a/src/main/java/vectorwing/blockbox/fabric/FabricClientSetupEvents.java +++ /dev/null @@ -1,21 +0,0 @@ -//? fabric { -package vectorwing.blockbox.fabric; - -import net.fabricmc.fabric.api.client.particle.v1.ParticleProviderRegistry; -import net.minecraft.client.renderer.entity.EntityRenderers; -import vectorwing.blockbox.client.particle.SparkleParticle; -import vectorwing.blockbox.common.entity.SeatEntity; -import vectorwing.blockbox.common.registry.ModEntityTypes; -import vectorwing.blockbox.common.registry.ModParticleTypes; - -public class FabricClientSetupEvents -{ - public static void registerParticles() { - - } - - public static void onRegisterRenderers() { - EntityRenderers.register(ModEntityTypes.SEAT.get(), SeatEntity.Renderer::new); - } -} -//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/FabricPlatformImpl.java b/src/main/java/vectorwing/blockbox/fabric/FabricPlatformImpl.java deleted file mode 100644 index 4e818838..00000000 --- a/src/main/java/vectorwing/blockbox/fabric/FabricPlatformImpl.java +++ /dev/null @@ -1,20 +0,0 @@ -package vectorwing.blockbox.fabric; - -//? fabric { -import vectorwing.blockbox.Platform; -import net.fabricmc.loader.api.FabricLoader; - -public class FabricPlatformImpl implements Platform { - - @Override - public boolean isModLoaded(String modid) { - return FabricLoader.getInstance().isModLoaded(modid); - } - - @Override - public String loader() { - return "fabric"; - } - -} -//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/event/client/EntityRenderersEvent.java b/src/main/java/vectorwing/blockbox/fabric/event/client/EntityRenderersEvent.java index 04753bf0..65488eb1 100644 --- a/src/main/java/vectorwing/blockbox/fabric/event/client/EntityRenderersEvent.java +++ b/src/main/java/vectorwing/blockbox/fabric/event/client/EntityRenderersEvent.java @@ -1,3 +1,4 @@ +//? fabric { package vectorwing.blockbox.fabric.event.client; import net.minecraft.client.renderer.entity.EntityRendererProvider; @@ -15,3 +16,4 @@ public void registerEntityRenderer(EntityType entityType, } } } +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/mixin/PortalShapeMixin.java b/src/main/java/vectorwing/blockbox/fabric/mixin/PortalShapeMixin.java new file mode 100644 index 00000000..3c2b94e8 --- /dev/null +++ b/src/main/java/vectorwing/blockbox/fabric/mixin/PortalShapeMixin.java @@ -0,0 +1,24 @@ +//? fabric { +package vectorwing.blockbox.fabric.mixin; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.portal.PortalShape; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import vectorwing.blockbox.common.block.PortalFrameBlock; +import vectorwing.blockbox.common.registry.ModBlocks; + +@Mixin(PortalShape.class) +public class PortalShapeMixin { + @WrapOperation( + method = "lambda$static$0", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;is(Ljava/lang/Object;)Z") + ) + private static boolean addToFrame(BlockState instance, Object block, Operation original) { + return original.call(instance, block) || instance.getBlock() instanceof PortalFrameBlock; + } +} +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/BlockWithItemAbility.java b/src/main/java/vectorwing/blockbox/fabric/porting/BlockWithItemAbility.java similarity index 71% rename from src/main/java/vectorwing/blockbox/fabric/BlockWithItemAbility.java rename to src/main/java/vectorwing/blockbox/fabric/porting/BlockWithItemAbility.java index 972e451e..f728782a 100644 --- a/src/main/java/vectorwing/blockbox/fabric/BlockWithItemAbility.java +++ b/src/main/java/vectorwing/blockbox/fabric/porting/BlockWithItemAbility.java @@ -1,8 +1,7 @@ -package vectorwing.blockbox.fabric; +package vectorwing.blockbox.fabric.porting; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; public interface BlockWithItemAbility { //? fabric diff --git a/src/main/java/vectorwing/blockbox/fabric/DataMaps.java b/src/main/java/vectorwing/blockbox/fabric/porting/DataMaps.java similarity index 97% rename from src/main/java/vectorwing/blockbox/fabric/DataMaps.java rename to src/main/java/vectorwing/blockbox/fabric/porting/DataMaps.java index 7dcae916..3424f53e 100644 --- a/src/main/java/vectorwing/blockbox/fabric/DataMaps.java +++ b/src/main/java/vectorwing/blockbox/fabric/porting/DataMaps.java @@ -1,4 +1,5 @@ -package vectorwing.blockbox.fabric; +//? fabric { +package vectorwing.blockbox.fabric.porting; import net.fabricmc.fabric.api.registry.FuelValueEvents; import net.fabricmc.fabric.api.registry.OxidizableBlocksRegistry; @@ -44,4 +45,5 @@ private static void oxidize(Supplier less, Supplier more) { private static void wax(Supplier unwaxed, Supplier waxed) { OxidizableBlocksRegistry.registerWaxable(unwaxed.get(), waxed.get()); } -} \ No newline at end of file +} +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/ItemAbilities.java b/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbilities.java similarity index 78% rename from src/main/java/vectorwing/blockbox/fabric/ItemAbilities.java rename to src/main/java/vectorwing/blockbox/fabric/porting/ItemAbilities.java index f8beefca..c38f150c 100644 --- a/src/main/java/vectorwing/blockbox/fabric/ItemAbilities.java +++ b/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbilities.java @@ -1,18 +1,11 @@ //? fabric { -package vectorwing.blockbox.fabric; +package vectorwing.blockbox.fabric.porting; import net.minecraft.tags.ItemTags; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.jspecify.annotations.Nullable; import vectorwing.blockbox.common.tag.CommonTags; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; - public class ItemAbilities { public static final ItemAbility AXE_STRIP = new ItemAbility(ItemTags.AXES); public static final ItemAbility FIRESTARTER_LIGHT = new ItemAbility(CommonTags.Items.FIRESTARTERS); diff --git a/src/main/java/vectorwing/blockbox/fabric/ItemAbility.java b/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbility.java similarity index 61% rename from src/main/java/vectorwing/blockbox/fabric/ItemAbility.java rename to src/main/java/vectorwing/blockbox/fabric/porting/ItemAbility.java index 71d26609..9850ba36 100644 --- a/src/main/java/vectorwing/blockbox/fabric/ItemAbility.java +++ b/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbility.java @@ -1,8 +1,7 @@ //? fabric { -package vectorwing.blockbox.fabric; +package vectorwing.blockbox.fabric.porting; import net.minecraft.tags.TagKey; -import net.minecraft.world.entity.player.Abilities; import net.minecraft.world.item.Item; public record ItemAbility(TagKey tagKey) { diff --git a/src/main/java/vectorwing/blockbox/neoforge/NeoforgeEntrypoint.java b/src/main/java/vectorwing/blockbox/neoforge/BlockBoxNeoForge.java similarity index 93% rename from src/main/java/vectorwing/blockbox/neoforge/NeoforgeEntrypoint.java rename to src/main/java/vectorwing/blockbox/neoforge/BlockBoxNeoForge.java index f44a5eac..b17b865d 100644 --- a/src/main/java/vectorwing/blockbox/neoforge/NeoforgeEntrypoint.java +++ b/src/main/java/vectorwing/blockbox/neoforge/BlockBoxNeoForge.java @@ -17,9 +17,9 @@ @Mod(BlockBox.MODID) @EventBusSubscriber(modid = BlockBox.MODID) -public class NeoforgeEntrypoint { +public class BlockBoxNeoForge { - public NeoforgeEntrypoint(IEventBus eventBus, ModContainer container) { + public BlockBoxNeoForge(IEventBus eventBus, ModContainer container) { container.registerConfig(ModConfig.Type.COMMON, Config.SPEC); RegistryAliases.addRegistryAliases(); } diff --git a/src/main/java/vectorwing/blockbox/neoforge/NeoforgePlatformImpl.java b/src/main/java/vectorwing/blockbox/neoforge/NeoforgePlatformImpl.java deleted file mode 100644 index 4d022eb6..00000000 --- a/src/main/java/vectorwing/blockbox/neoforge/NeoforgePlatformImpl.java +++ /dev/null @@ -1,20 +0,0 @@ -package vectorwing.blockbox.blockbox.neoforge; - -//? neoforge { -/*import vectorwing.blockbox.Platform; -import net.neoforged.fml.ModList; - -public class NeoforgePlatformImpl implements Platform { - - @Override - public boolean isModLoaded(String modid) { - return ModList.get().isLoaded(modid); - } - - @Override - public String loader() { - return "neoforge"; - } - -} -*///?} \ No newline at end of file diff --git a/src/main/resources/blockbox.mixins.json b/src/main/resources/blockbox.fabric.mixins.json similarity index 69% rename from src/main/resources/blockbox.mixins.json rename to src/main/resources/blockbox.fabric.mixins.json index eea4c7ae..532f6fb7 100644 --- a/src/main/resources/blockbox.mixins.json +++ b/src/main/resources/blockbox.fabric.mixins.json @@ -1,5 +1,5 @@ { - "package": "vectorwing.blockbox.blockbox.mixin", + "package": "vectorwing.blockbox.fabric.mixin", "required": true, "minVersion": "0.8", "compatibilityLevel": "JAVA_21", @@ -7,6 +7,7 @@ "defaultRequire": 1 }, "mixins": [ + "PortalShapeMixin" ], "client": [] } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 9f9f64d1..c738dc30 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -9,22 +9,23 @@ "issues": "https://github.com/vectorwing/BlockBox/issues" }, "description": "A collection of building blocks, furniture and decorations!", - "icon": "assets/logo.png", + "icon": "icon.png", "license": "MIT", "environment": "*", "accessWidener": "blockbox.accesswidener", "entrypoints": { "main": [ - "vectorwing.blockbox.fabric.FabricEntrypoint" + "vectorwing.blockbox.fabric.BlockBoxFabric" ], "client": [ - "vectorwing.blockbox.fabric.FabricClientEntrypoint" + "vectorwing.blockbox.fabric.BlockBoxFabricClient" ] }, "mixins": [ - "blockbox.mixins.json" + "blockbox.fabric.mixins.json" ], "depends": { - "fabric-api": "*" + "fabric-api": "*", + "forgeconfigapiport": "*" } } \ No newline at end of file diff --git a/src/main/resources/icon.png b/src/main/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3e06f9cff80be357fbd114416f0d7a66712381ed GIT binary patch literal 8927 zcmV<5A|Ty~P)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy32;bRa{vGf6951U69E94oEQKA00(qQO+^Rl1Q!q;7F63Ip8x%@{Ywf+y9o|s0tGjJiyW1Vxu`}Qp2WJpYLdt}MD9MLN;3Ob{ z5D_R6LMQ=&gv19vMdAZ|Kq3-?#8CtRgEA;d1>=C@A??_14~gw~>UOugtGdQF-Fwd2 zdo4cfbMG6fx?a8RdJa))OWoC7_q}`0*=w)qzy50-c(5L<2kXIlupX=j>%n@k9;^rJ z!FsSBtUpgn?)3+~xC5Y&J=0r9&OIS00N1Zy2jJYfbCgoJeEBk6=?DRe86_8T$xJ7c zBi*38qZ&vlq8b3mB~x<2tnl!|7f{pX&xaUrcdlN&hLO=wZ~NM{YXD5A`>(H>!1w>Y zig4!aSyY6a3%ciX9iI2b^&6NNv$BJUp{}SaAO8K1psu|8$A99U_BI}AH-`H#F$#s^ zJ?=tE5!Xyi2^Am;CK-u_Gyy4Kl=@G!{U<=~exFtf5(OHNFx*BFvKW>f7h})8%5x&ux9UV)T87nJ-URDF(qYvE@kySX)~|Rk?EI3PF|BG`Kq( z8ymPgB7#|Ab!C-e#>#X`E`_e^C?zwUuIxJz-hYH3iTQj^P-QZi;OK`@5d1 zJsTEd*#B{neHu_TQgL@I7Q$F56g-0$=Xd}2CB%+H0AiRJ+56?DYE&dBB7iBPj_Yuu zT|gnooo_y7(?FCgJqWd()$toZY>bN?Z>i2tbAb{jUEUoPO z+{%7onfvVm@Oll36VO-W1CAsB-*b{Kz3*2$4O5`f{V(!tmeqX5GSY zvcW}28o&b#n<(y-?1(72cSuf9Cuc=fDV@-Zc9dGxCZRAuO?t6fEv~tD2OK9 z3^4&qSf~4J_#K_v9wDeTyWg*dAJiWAL2!Ic#Esw?#3-Wp9n{?1_npv% zk1=<2I2?=36+c?kwO0cU1_`Q)h*CzdPft!a5ZJ{F^hc? z-_=eLMeHcSb`{|M>&StFsKWt-phn*pVye%js>kO8UbuXjo{pwzD8;HXHF)BQCq{h_ ztE($d_I=)s5Okpdy6cO>dz=rqqO43paHqy!H6*deRaO>Rpm9%_j$Rw^&hKY;+~D) z6~N*%@WBx-?4}938+e!SQI;qF;D&{LX5_Fu<1QO~$InYCRl8I`h1};FRJfC3LR5wb z>^=)%v9`Cj_Jx$Usqiwa)H^=VzRe@Fam};WT~5FIn(GB{>Lx<^xK2N5B}7@d$Qv-FMk774nP}zkGk>lR^Mli z5QQE=08$2L+~x-yqt%E;g%HEdI~##Rw!rG=Cq{{`-@$E84r9)|;axR182y)< zO;$z(+=bSKq5v6jC3(UKl+Xi4vWyAz8gZ%6!rn}HFTAl=u=g5jwufaG0;eJ-*3DbCmOxXum0lSyXfUb&b{uP^m+opaOQmEL%(`4m78q5 z@DbWFj)$=W9G6- zX1uihdRGYgcr@T%LgZHz1&J!tm6aN5sbG0PDcQwq!jZ&bC{Xk)Kk}2maH&Ga|Bb$E z@WBuN*NZ!)@cr-lyO+ug*0eBh3#EC4v2XBm@BWU9Yj%YYlugd?^Y8iSr45?;oiQ@+ zA;t)16+Sp{>UTB44z>ArTPY<%bar-ThzUD8+k_*y{v(H>C1-LexH%#bk$|uV{CXK` z?KY*8wPAw_G4>?8Mbtz;U&Ff*#* zC9oyCt@NUort%xXyk!y^h*dHlP1L^zDR4PhPkv z^9g_dM^~8I7jYDer}^F=cmr)vCKtXB`YEVhjD3%ZvMCSo^S|=cr7ay{xjS&u_f)`~ zLm`jDgA*kNA;gFnJaqp2;gR1f5kSsmSy)-3j_k322f(sLynd(b#H2<+NWeTTHDDAH zqda4Up7H!EL~ocfW;K49zBra5GkGKP<`g3xqd_RT!ANd02_5(bEA}V2Z4eBKG)o_` z8zqHh{_skianOM5sgD%1C3)cf)&oQl@nt!&?|OnZLuP7Al+tCtjb932IDP86jJ3@S zQUi<_uRL@SO{CF?l^*`@rBAZbJEqwSimiZ-p=tTS zpZ*!>uENz%1CEdTi)JT~J}}pZ_}BmWgO^Mn8tSzXMM0{6a5=Kg#8q(-X7d@^8D<6R zot^FN{h`+V)_|ZoAfblXVXC{g8daf&LLrb4#%M?w!aN5ia*}y3%!@M7HA^L?58pq0nzAdW)- zi!|Ha$(9EV@H@uY%S-Hm4;)Zwh@8KuVTH63nM&j>Z~9K0F<*P}Sx(9}u20jd^Uj}o zH#C|4`e$k4lk_M$wW*mj28gKeRcO(>a^PJub@J;CR-y5RNHvvrd+-(rO+ z!5Heyx->iL)d=~0z>XGRoLRxlE3M@?oN&pd7UqX2D8>jO)!MGu5_Y$}VW>}-j$d;z zhBLhJjc=n#Q@-@2FCpqY^_dUjlF4d}Vxr9FjKc_p8mV}N9Xz+J#GcuQe-EFYAf7+R zJf3I$k?#XJ$!Pse5MJc!hkt`{nDO+}PqWsX;L5XCnZ#EOyR3-B13thiBj6=Mdkj&`&d?eR$@5C%Cl@qi_1H|K@K0uj*k7?2>Dh;9&%x4sOvd_>M&=3eo7^g&@ zR|lz@@BwV=+HGP~+S!~YG*uDf4d_Sp#QTgBY?G|zBtqzgv8>^YDFVnAV||e^Gt6H_ zk?~N2xEDnCkovSaE{=PlVD#3J{220p$z)0s^1yV?Y;SK<`fg7;F7&zI7j3v_UU>dX zxSZs~`Wes_Ui;|lAR5nq^jS1S+-qHR3bgGulko|>lYt`&q(s)l_%#ocq!wsW++pkK z-(iIE*$=&+Q?Zb{YfR%BH=a+Bg-}+Rj#!cHXk8f?38RbU{g@5rk5sB3Dw`CdL+Nd)B$h*b*CE zWLBo+oWL7mn9(#wKUf&I%Sbyxhh9TTN4r12Tt5+!@FVWDd0drK8vWzMYu%INfesX-t5kB*o4_*{mr;rhy@E5=B zJ0Kb#`@{z+YIGr@7CC?ZQC6*m@KJi;?BkC?yh&GDG`HON%JT#Qr!Tw)G}71z$_nky zDkZEk(@ctUMyod%jp1ki`Ma2hQ;Z+~ZpKXc&0jfxv29QCV}I-4T-uQnbQ`z#2nv0!aeh{EpXiF>p(jo{ zMw5nS+JKBmIvEH@iLM(X;VfO5(#I(#4cQZYSta+1>dG#URd#Tn*KFH$&mpsAC|fC- zVF*Ky4rw332TZV7*x1-0#K>eaA?kDh?<99~KL44I(dR9``1vOxY|$W`WW+mv{j;3b&vN>Vk)rYNnb*+9TAU#|Sq+f_ zIe^Z1_~A-vym476Wx{*j^J~}`{?Wg5^62&aVBCR}xTF0innbdWh?&p;L7JWa(q_2!?bwt56 z*AU+W9vWI(XOnYuoMVGAxop$QW6a7U+~^-;o5$H<8-h{#7SEBO>$n9^+b-u7d^L}*r-mseBl7H@geTM--c$io*1 zo+##o;C%e4-^ZA9{rXj4o7KtYrKGa~39i|jd%&&WBAh#S4o$mI{d_hbh%v_`fF%%D ztWt!B&0bJ64`S=PSPTRFn=x-ulwvJyw~gtD7C<6}rv9|`^rCFYm{LYu)fKk$SGio? z!c?zOY=p=r9niDFEg7-HIc@~yhP;j&@zremc`||u}5EzQTT(8ezaEq2}n@X zhuiX@ci{kTZrUz|q86*2M0x0;*OGmmXP^5Lb5kCF;&E~*y!rLtKyEuOUw)q4Z}GV= ze1e%8zxl@-L|fy%pZ)@;(^bCb&2vttTTq;>e1^|nel0iLnUCMfoC()2&v5@5+a)8i z!Z*F~FN2PG?c=YZ&pp~HO;6}bM@+15uY(0+a)ElJ^`VC*--D^n>7zbDKW0y zxIvqDNGXzYVRdblA}$pH@LgEDi3u-|G|{(( zs3SZ#H1QY*G4K1l^{TO;iHG?LdC4F9}z4xnDj<3ZWiEI|dVU<;oR$I!2>W z?VVM{dmpM>dnxHhC}_J9rJ?PV=f8THTsp>0#IteXwU0oC*L?p44Cl+wKZDygU;6yV z*w{8c@JCL`QyxD5DDx~lcXfl-ZZKJk3Vg?P_Uu`5nG-@p%ovX+kdFzB^I(J!2S$V}+l?4D zf6*Rv&($?kR%VG+9doNKNHeCL&lrsp*^KEpqV1dzMvxOBouca!LD$%6Cm?574Udw& zko7s-+u9peoVFFZ-oTY{5c<4Hkc{O`nsFd_M;a%3Yw1gm$OyB%3so;Q`|i0;E(1l! z3e8|0%#W!*z|7g++FB-J8eSPwZrUq9@YuJ3P5JF-KEZ|?M97wT`tsKp`4&I=M6jCu4mk1-l0KKIP$(IB+lHZk&~Ss*NoJ%kvOYdbJ7lYtn+grNku;IJju2O9=MEa_ zZB9xBr={)Yl+x0yon$teP$UxPJ6P8al*WEI`Q>&Z!4aYAzR$Hk?$3e%0Qv%_neZKF zzk%%&&hI?^B&PMu1u;S+o2UaH6QUCzx8?Avd*KgeFMfew_dnR?q+=XE1#pw z#|q*qQeWirp4+OAmr*2pL+(zD8VJV(1*oEU-i&oN4h zl+1Lrf|$?*rF1i*&q>{!aq8L0PZLI~OsA{NOCD9Fs`J9Kor+q&o%uDxo@65mmI2I35b9c9!v{MAR_!Hbh^e(Um+Y_iI) z{OXgegj@Xh550|)dVb<>ekZg31n>Q|&(P;oD|D`0IQIza%}ri+`YSa09Gt7k*HbTE zN19ht`m)6G+n5+%cnm8$v^TCX1)_H(S7a!K+JGv{9h$irIx$6rq>;Yg8A9Lw$QIy8 z{Q>c|{s3E2QIcglnhuQ)BpQC13l+Yy40J%CM7hwXBPhHZMC(^Ke6!L1=%LD^zz zn~dyPPKIlY<%Jqzs^V>AC!K|`iccn$D4@!Ah`2QLnow(Ne(UV-azDhB>(Cu9DnwBv zNd3Fx5I~3l3HQH0pl*m^l4(bo-}}->xVhG|nYPhjD30lb|N85Hh&E2qOy4O%PGJ;s zh@5CBJa)taJ4v5&`i0zJtZ;_P7 z7zqsh0USe%QVbD`$3r74YRpr|)@07L@fNqVhZHew*@{>2(1S#Rub|x;S|)(hflNT@ zHkfdYv3!kO5``7Aonl+hGw+SAQQDN4<-#Zm(F)O&ak)oc=u!xGI6&rz);Sm9IQs+4 z3RcRpA{IiR?_N2xY&sc}t?hKQTVRO7vOM=}hQxX9|b)C%|>(dmWOBc9h4Q=yUaz7*K zh_MG6l=)yzqG!e>SKiPopazKuO6{BvqF6Da9Ake#pL^VVsC>P$CeWQG^V`q=0i6lk zqZy+e|h`Y<=n+zIBc$k*#)>4}CFWMF^&J zz2WI3dDgNLC$yUdoxi|N-xJ?-fq8&tK~H>z{LlqGy%N=g^ADXrUJdB`-A?cY9YsB$ zEGDJcZJB@#HQ~w)4NJS4W5@N;CR=T0G9H5!k|%oKq+7YdPJ9-I$O2b#=xE0`2tJ{= z6;vZm#N#@*$_m*}5iK&(!nE6AP3Gh-&{?INm_X?>y%dBFC8KTwKWGt=*`6Ncd*BNN zt)mr0K$L7oI*tYn)c~RTf)o>d*Q1i43^nXB0CRhSFc(3@D^qXyNHkFT!i_7>Gb;^W zy?%`%4d41rZzZCnyhD?A2+|YPkh~bkp%f|*m%)R1Y!`9Kv!-eG(>4p0_sNe$Vz?)x1PCO!BR^R z&@!fJPoP`p2{s{nt~w^vjMy@3QaC4@oGv#x;X8x&^{7LNQ>2?AxucO8#amKpXvFGm z?%|IfRtKmoiDA6LD==Y47C;Q4j%0DC*ga6Z7xYEhjh#gcv5`wF=B&jAB0Tl+_g~a7 zCCtI2@~Aw{)_TLKx1FRPU8blpYFD}bu`x1RAc)dMlvqBPSBEd*7~zFeZypS6;%h1G&|?9trIjm=TI^} z&_CSj9JjF*&V(Jtvcq;9b4$hqRd&*pPOlT2mh2tbX0@-ZbfnY_QxMDklmB&Euc$x3 zyM(GPYV&tshRL1Jk1U8-ps9whr>5}|%t@0#*KP3mPyNBg4V%+_;zhFbe9N2u5^cZ6 zv_C`eh-E{Gc&?LtLvZ?jj?>Xf;Qe2{&PG}#T7qQATD&xhGbW)P0xP*rI%Gb;AbN+5 zzqivLW26)#g+NLTV#nZw7ySV?obnI?95$F}fu718aCOPUBM!rxyk@0Al&FzWOstzw z${HoZx%sQ<<`GmV){?ZTwO6aWoXnhl9Jy8|5EEBZOIbTX^hA(?rX3<(we@1V&78|D z_s;isSUteZU}#=6vpUZCScdiu{Q*#^cOeAy(1c?TW+M9^()Z6_t@w#5y%_|f8E;-n z2E{UII^~Z){r-y~on-EjCa&}NtKUQu8$y8W9WPwJ%oW?=8K2|K7{BV&rR*J=`=JN9 z8{)G#^o(_NRLGq+STf5NCW&_yf|Z(un-$FK+)?8g3NnlSfI6N=Ymx+ogZZ9I z`(TC!?UKcm#bRVvR2o28Ut76kC>kO6TYTYj@4wi$nGlo^A}1z#DJG|1P)hop>VbTi z#<*-IvD-KOAlm6V^bG8!*Kj~(t9flwLstr;(FieTb#)E(V}c@<{Q*)XEz6A0j+D~t z9@~026cd&kq!#~ymONQ7&M$*v8b-Y(Ecyes zwzmi&GM80qm^+nHZ%M-1?MZJN3YPuC zEV<;|t!eA<$vgXhKMYt{$z>SgZAg@5B36oF$4SguSzR46<7WS;ce9HC+uPemtO?&; z0E;=Hdm(UScRsYJFNN=Wx^-@kcwQnPIP7f~2b^#w)90SAKJ(SKD>EKCe}0td2700~ zpU;k`9^kT@SQ#?FuN|(L%xup$9?b;!Au4fjn6|TD8^mPaTxy{lazVWV*r0b!B==gi z7$Pw`PG5zSD?mxE+HYnR1-|d~fS@q+!ivH_`KLceSPleJQc8E6mpR+nS;qIv0?wY( ze9&TP&=yT86GiT{@&*jUP0Z1_}eZs*C-kmgSaUaF@7u>_X`zgaA*nj<; zGiT169hJT?kwnRXiA>2kvpP9(JnxWMoSp?MT12qn)g(=fnANunExIU|f{Q-9Ga%z$ zA7DXezulg58>yy{_hqfcAx5c?_DFFp#27GgWo{q%J{eB%;(80f(A;Z{A%%S=rr7Nc zbnh)?1W5v+RNj$$J^doXOD>KZj+R;v_{1N60ufjSy?M&FWh9NpiEKn*aa;DM>^@R5z~QSf0?^ z&P}m;{bHOsb9w;H3fT)K?-y9OLlCjIG+D1dyvQPhcC|&dgl^zCbw?UsdG9936c?}k zy;lEpbF8oL6tLb2Dcm-OM`C@)N-@EDCrZQ_8ar~GFtTq0lI-&b<=|V5tPqB&gsDl0 zR9s55zAWP4&{Wl0u_|TvrEm*ci50tT&a>TN29h7V{$TE!rl}JoF*FG-f@wJ(Zs;eT zd;EU^Sdr_JlOu6?3M8P8BbwsZhhhAu8 zM6k#tCdz#Gg%a+L9tZ(rO!Xx~!}rD#cVGA;knSO9i>_#{-TibBJ)t?!h%(D_1SJfR zNbU;F5i;U?_8JP`?TZc8 Date: Thu, 23 Apr 2026 12:50:11 -0400 Subject: [PATCH 5/7] Switch VCS version to NeoForge --- settings.gradle.kts | 2 +- .../client/event/ClientSetupEvents.java | 20 +++++++++---------- .../blockbox/common/block/BrazierBlock.java | 8 ++++---- .../blockbox/common/block/PalisadeBlock.java | 8 ++++---- .../common/block/PortalFrameBlock.java | 4 ++-- .../common/block/SpikedPalisadeBlock.java | 8 ++++---- .../blockbox/common/entity/SeatEntity.java | 8 ++++---- .../blockbox/common/event/CommonEvents.java | 12 +++++------ .../common/registry/ModCreativeTabs.java | 6 +++--- .../blockbox/data/DataGenerators.java | 4 ++-- .../generator/ModBlockModelGenerators.java | 4 ++-- .../data/model/ModModelTemplates.java | 4 ++-- .../data/provider/BlockItemModels.java | 4 ++-- .../data/provider/BlockLootTables.java | 4 ++-- .../blockbox/data/provider/DataMaps.java | 4 ++-- .../blockbox/data/provider/LootTables.java | 4 ++-- .../blockbox/data/provider/ParticleTypes.java | 4 ++-- .../blockbox/data/provider/Recipes.java | 4 ++-- .../blockbox/data/recipe/CraftingRecipes.java | 4 ++-- .../blockbox/data/tag/BlockTags.java | 4 ++-- .../blockbox/data/tag/DamageTypeTags.java | 4 ++-- .../blockbox/data/tag/ItemTags.java | 4 ++-- .../blockbox/fabric/BlockBoxFabric.java | 4 ++-- .../blockbox/fabric/BlockBoxFabricClient.java | 4 ++-- .../BuildCreativeModeTabContentsEvent.java | 4 ++-- .../event/client/EntityRenderersEvent.java | 4 ++-- .../RegisterParticleProvidersEvent.java | 4 ++-- .../fabric/mixin/PortalShapeMixin.java | 4 ++-- .../fabric/porting/BlockWithItemAbility.java | 2 +- .../blockbox/fabric/porting/DataMaps.java | 4 ++-- .../fabric/porting/ItemAbilities.java | 4 ++-- .../blockbox/fabric/porting/ItemAbility.java | 4 ++-- .../blockbox/neoforge/BlockBoxNeoForge.java | 4 ++-- stonecutter.gradle.kts | 2 +- 34 files changed, 86 insertions(+), 86 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 8a7dc927..db44ff07 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -22,6 +22,6 @@ stonecutter { match("26.1", "fabric", "neoforge") - vcsVersion = "26.1-fabric" + vcsVersion = "26.1-neoforge" } } \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/client/event/ClientSetupEvents.java b/src/main/java/vectorwing/blockbox/client/event/ClientSetupEvents.java index 27445781..40ef3a7a 100644 --- a/src/main/java/vectorwing/blockbox/client/event/ClientSetupEvents.java +++ b/src/main/java/vectorwing/blockbox/client/event/ClientSetupEvents.java @@ -2,16 +2,16 @@ import net.minecraft.client.Minecraft; //? neoforge { -/*import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent; -*///?} else { -import vectorwing.blockbox.fabric.event.client.EntityRenderersEvent; +//?} else { +/*import vectorwing.blockbox.fabric.event.client.EntityRenderersEvent; import vectorwing.blockbox.fabric.event.client.RegisterParticleProvidersEvent; -//?} +*///?} import vectorwing.blockbox.BlockBox; import vectorwing.blockbox.client.particle.SparkleParticle; import vectorwing.blockbox.common.entity.SeatEntity; @@ -20,20 +20,20 @@ import vectorwing.blockbox.common.registry.ModParticleTypes; //? neoforge { -/*@EventBusSubscriber(modid = BlockBox.MODID, value = Dist.CLIENT) -*///?} +@EventBusSubscriber(modid = BlockBox.MODID, value = Dist.CLIENT) +//?} public class ClientSetupEvents { //? neoforge { - /*@SubscribeEvent(priority = EventPriority.LOWEST) - *///?} + @SubscribeEvent(priority = EventPriority.LOWEST) + //?} public static void registerParticles(RegisterParticleProvidersEvent event) { event.registerSpriteSet(ModParticleTypes.SPARKLE.get(), SparkleParticle.Provider::new); } //? neoforge { - /*@SubscribeEvent - *///?} + @SubscribeEvent + //?} public static void onRegisterRenderers(EntityRenderersEvent.RegisterRenderers event) { event.registerEntityRenderer(ModEntityTypes.SEAT.get(), SeatEntity.Renderer::new); } diff --git a/src/main/java/vectorwing/blockbox/common/block/BrazierBlock.java b/src/main/java/vectorwing/blockbox/common/block/BrazierBlock.java index 42c5391f..50c1ec3c 100644 --- a/src/main/java/vectorwing/blockbox/common/block/BrazierBlock.java +++ b/src/main/java/vectorwing/blockbox/common/block/BrazierBlock.java @@ -28,13 +28,13 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; //? neoforge { -/*import net.neoforged.neoforge.common.ItemAbilities; +import net.neoforged.neoforge.common.ItemAbilities; import net.neoforged.neoforge.common.ItemAbility; -*///?} else { +//?} else { -import vectorwing.blockbox.fabric.porting.ItemAbilities; +/*import vectorwing.blockbox.fabric.porting.ItemAbilities; import vectorwing.blockbox.fabric.porting.ItemAbility; -//?} +*///?} import vectorwing.blockbox.fabric.porting.BlockWithItemAbility; import org.jspecify.annotations.Nullable; import vectorwing.blockbox.common.tag.ModTags; diff --git a/src/main/java/vectorwing/blockbox/common/block/PalisadeBlock.java b/src/main/java/vectorwing/blockbox/common/block/PalisadeBlock.java index e123265f..2103a731 100644 --- a/src/main/java/vectorwing/blockbox/common/block/PalisadeBlock.java +++ b/src/main/java/vectorwing/blockbox/common/block/PalisadeBlock.java @@ -28,13 +28,13 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; //? neoforge { -/*import net.neoforged.neoforge.common.ItemAbilities; +import net.neoforged.neoforge.common.ItemAbilities; import net.neoforged.neoforge.common.ItemAbility; -*///?} else { +//?} else { -import vectorwing.blockbox.fabric.porting.ItemAbilities; +/*import vectorwing.blockbox.fabric.porting.ItemAbilities; import vectorwing.blockbox.fabric.porting.ItemAbility; -//?} +*///?} import vectorwing.blockbox.fabric.porting.BlockWithItemAbility; import org.jspecify.annotations.Nullable; import vectorwing.blockbox.common.block.state.PalisadeConnection; diff --git a/src/main/java/vectorwing/blockbox/common/block/PortalFrameBlock.java b/src/main/java/vectorwing/blockbox/common/block/PortalFrameBlock.java index b8560f03..07fe77c1 100644 --- a/src/main/java/vectorwing/blockbox/common/block/PortalFrameBlock.java +++ b/src/main/java/vectorwing/blockbox/common/block/PortalFrameBlock.java @@ -12,9 +12,9 @@ public PortalFrameBlock(Properties properties) { } //? neoforge { - /*@Override + @Override public boolean isPortalFrame(BlockState state, BlockGetter level, BlockPos pos) { return true; } - *///?} + //?} } diff --git a/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java b/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java index 7aa203c8..5a0b794a 100644 --- a/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java +++ b/src/main/java/vectorwing/blockbox/common/block/SpikedPalisadeBlock.java @@ -22,12 +22,12 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; //? neoforge { -/*import net.neoforged.neoforge.common.ItemAbilities; +import net.neoforged.neoforge.common.ItemAbilities; import net.neoforged.neoforge.common.ItemAbility; -*///?} else { -import vectorwing.blockbox.fabric.porting.ItemAbilities; +//?} else { +/*import vectorwing.blockbox.fabric.porting.ItemAbilities; import vectorwing.blockbox.fabric.porting.ItemAbility; -//?} +*///?} import vectorwing.blockbox.fabric.porting.BlockWithItemAbility; import org.jspecify.annotations.Nullable; import vectorwing.blockbox.common.registry.ModDamageTypes; diff --git a/src/main/java/vectorwing/blockbox/common/entity/SeatEntity.java b/src/main/java/vectorwing/blockbox/common/entity/SeatEntity.java index 266034be..fe392111 100644 --- a/src/main/java/vectorwing/blockbox/common/entity/SeatEntity.java +++ b/src/main/java/vectorwing/blockbox/common/entity/SeatEntity.java @@ -1,8 +1,8 @@ package vectorwing.blockbox.common.entity; //? fabric { -import net.fabricmc.fabric.api.entity.FakePlayer; -//?} +/*import net.fabricmc.fabric.api.entity.FakePlayer; +*///?} import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; @@ -20,8 +20,8 @@ import net.minecraft.world.level.storage.ValueOutput; import net.minecraft.world.phys.Vec3; //? neoforge { -/*import net.neoforged.neoforge.common.util.FakePlayer; -*///?} +import net.neoforged.neoforge.common.util.FakePlayer; +//?} import org.jspecify.annotations.NullMarked; import vectorwing.blockbox.common.block.SeatBlock; import vectorwing.blockbox.common.registry.ModEntityTypes; diff --git a/src/main/java/vectorwing/blockbox/common/event/CommonEvents.java b/src/main/java/vectorwing/blockbox/common/event/CommonEvents.java index 79b4527c..24cc598e 100644 --- a/src/main/java/vectorwing/blockbox/common/event/CommonEvents.java +++ b/src/main/java/vectorwing/blockbox/common/event/CommonEvents.java @@ -6,20 +6,20 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; //? neoforge { -/*import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; import net.neoforged.neoforge.registries.RegisterEvent; -*///?} else { -import vectorwing.blockbox.fabric.event.BuildCreativeModeTabContentsEvent; -//?} +//?} else { +/*import vectorwing.blockbox.fabric.event.BuildCreativeModeTabContentsEvent; +*///?} import vectorwing.blockbox.BlockBox; import vectorwing.blockbox.Config; import vectorwing.blockbox.common.registry.ModItems; //? neoforge -/*@EventBusSubscriber(modid = BlockBox.MODID)*/ +@EventBusSubscriber(modid = BlockBox.MODID) @SuppressWarnings("unused") public class CommonEvents { @@ -28,7 +28,7 @@ public class CommonEvents // jagged_clay_tiles -> broken_tile_mosaic //? neoforge - /*@SubscribeEvent*/ + @SubscribeEvent public static void addItemsToVanillaCreativeTabs(BuildCreativeModeTabContentsEvent event ) { if (!Config.ADD_ITEMS_TO_VANILLA_TABS.get()) { diff --git a/src/main/java/vectorwing/blockbox/common/registry/ModCreativeTabs.java b/src/main/java/vectorwing/blockbox/common/registry/ModCreativeTabs.java index ef6400fe..88b163f5 100644 --- a/src/main/java/vectorwing/blockbox/common/registry/ModCreativeTabs.java +++ b/src/main/java/vectorwing/blockbox/common/registry/ModCreativeTabs.java @@ -1,7 +1,7 @@ package vectorwing.blockbox.common.registry; //? fabric -import net.fabricmc.fabric.api.creativetab.v1.FabricCreativeModeTab; +/*import net.fabricmc.fabric.api.creativetab.v1.FabricCreativeModeTab;*/ import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; @@ -17,9 +17,9 @@ public class ModCreativeTabs public static final Supplier TAB_BLOCK_BOX = register("example_tab", () -> //? fabric - FabricCreativeModeTab.builder() + /*FabricCreativeModeTab.builder()*/ //? neoforge - /*CreativeModeTab.builder()*/ + CreativeModeTab.builder() .title(Component.translatable("itemGroup." + BlockBox.MODID)) .icon(() -> ModItems.CHISELED_GOLD.get().getDefaultInstance()) .displayItems((parameters, output) -> ModItems.CREATIVE_TAB_ITEMS.forEach((item) -> { diff --git a/src/main/java/vectorwing/blockbox/data/DataGenerators.java b/src/main/java/vectorwing/blockbox/data/DataGenerators.java index d3036238..f544df57 100644 --- a/src/main/java/vectorwing/blockbox/data/DataGenerators.java +++ b/src/main/java/vectorwing/blockbox/data/DataGenerators.java @@ -1,5 +1,5 @@ //? neoforge { -/*package vectorwing.blockbox.data; +package vectorwing.blockbox.data; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; @@ -31,4 +31,4 @@ public static void gatherData(GatherDataEvent.Client event) { event.createProvider(ParticleTypes::new); } } -*///?} \ No newline at end of file +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/generator/ModBlockModelGenerators.java b/src/main/java/vectorwing/blockbox/data/generator/ModBlockModelGenerators.java index 5da60971..65dd64b1 100644 --- a/src/main/java/vectorwing/blockbox/data/generator/ModBlockModelGenerators.java +++ b/src/main/java/vectorwing/blockbox/data/generator/ModBlockModelGenerators.java @@ -1,5 +1,5 @@ //? neoforge { -/*package vectorwing.blockbox.data.generator; +package vectorwing.blockbox.data.generator; import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.MultiVariant; @@ -334,4 +334,4 @@ public static MultiVariantGenerator createBrazier(Block block, MultiVariant stan .select(true, true, hangingLit)); } } -*///?} \ No newline at end of file +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/model/ModModelTemplates.java b/src/main/java/vectorwing/blockbox/data/model/ModModelTemplates.java index 4235608e..9985a247 100644 --- a/src/main/java/vectorwing/blockbox/data/model/ModModelTemplates.java +++ b/src/main/java/vectorwing/blockbox/data/model/ModModelTemplates.java @@ -1,5 +1,5 @@ //? neoforge { -/*package vectorwing.blockbox.data.model; +package vectorwing.blockbox.data.model; import net.minecraft.client.data.models.model.ModelTemplate; import net.minecraft.client.data.models.model.ModelTemplates; @@ -38,4 +38,4 @@ public static ModelTemplate create(String id, String suffix, TextureSlot... slot return ModelTemplates.create(Identifier.fromNamespaceAndPath(BlockBox.MODID, id).toString(), suffix, slots); } } -*///?} \ No newline at end of file +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/provider/BlockItemModels.java b/src/main/java/vectorwing/blockbox/data/provider/BlockItemModels.java index 8694190b..0376b281 100644 --- a/src/main/java/vectorwing/blockbox/data/provider/BlockItemModels.java +++ b/src/main/java/vectorwing/blockbox/data/provider/BlockItemModels.java @@ -1,5 +1,5 @@ //? neoforge { -/*package vectorwing.blockbox.data.provider; +package vectorwing.blockbox.data.provider; import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.ItemModelGenerators; @@ -19,4 +19,4 @@ protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerat new ModBlockModelGenerators(blockModels).run(); } } -*///?} \ No newline at end of file +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/provider/BlockLootTables.java b/src/main/java/vectorwing/blockbox/data/provider/BlockLootTables.java index 5e4b911a..f7a9b24b 100644 --- a/src/main/java/vectorwing/blockbox/data/provider/BlockLootTables.java +++ b/src/main/java/vectorwing/blockbox/data/provider/BlockLootTables.java @@ -1,5 +1,5 @@ //? neoforge { -/*package vectorwing.blockbox.data.provider; +package vectorwing.blockbox.data.provider; import net.minecraft.core.HolderLookup; import net.minecraft.data.loot.BlockLootSubProvider; @@ -183,4 +183,4 @@ protected Iterable getKnownBlocks() { return generatedLootTables; } } -*///?} \ No newline at end of file +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/provider/DataMaps.java b/src/main/java/vectorwing/blockbox/data/provider/DataMaps.java index 19cde8ad..f5b7abed 100644 --- a/src/main/java/vectorwing/blockbox/data/provider/DataMaps.java +++ b/src/main/java/vectorwing/blockbox/data/provider/DataMaps.java @@ -1,5 +1,5 @@ //? neoforge { -/*package vectorwing.blockbox.data.provider; +package vectorwing.blockbox.data.provider; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; @@ -47,4 +47,4 @@ protected void gather(HolderLookup.Provider provider) { .add(ModTags.WOODEN_SEAT_ITEMS, new FurnaceFuel(200), false); } } -*///?} \ No newline at end of file +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/provider/LootTables.java b/src/main/java/vectorwing/blockbox/data/provider/LootTables.java index 9dea96e0..9363cc84 100644 --- a/src/main/java/vectorwing/blockbox/data/provider/LootTables.java +++ b/src/main/java/vectorwing/blockbox/data/provider/LootTables.java @@ -1,5 +1,5 @@ //? neoforge { -/*package vectorwing.blockbox.data.provider; +package vectorwing.blockbox.data.provider; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; @@ -18,4 +18,4 @@ public LootTables(PackOutput output, CompletableFuture re ), registries); } } -*///?} \ No newline at end of file +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/provider/ParticleTypes.java b/src/main/java/vectorwing/blockbox/data/provider/ParticleTypes.java index a13e1d3d..3e12cd74 100644 --- a/src/main/java/vectorwing/blockbox/data/provider/ParticleTypes.java +++ b/src/main/java/vectorwing/blockbox/data/provider/ParticleTypes.java @@ -1,5 +1,5 @@ //? neoforge { -/*package vectorwing.blockbox.data.provider; +package vectorwing.blockbox.data.provider; import net.minecraft.data.PackOutput; import net.minecraft.resources.Identifier; @@ -22,4 +22,4 @@ protected void addDescriptions() { ); } } -*///?} \ No newline at end of file +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/provider/Recipes.java b/src/main/java/vectorwing/blockbox/data/provider/Recipes.java index c44ef191..0fcd6d08 100644 --- a/src/main/java/vectorwing/blockbox/data/provider/Recipes.java +++ b/src/main/java/vectorwing/blockbox/data/provider/Recipes.java @@ -1,5 +1,5 @@ //? neoforge { -/*package vectorwing.blockbox.data.provider; +package vectorwing.blockbox.data.provider; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; @@ -41,4 +41,4 @@ public String getName() { } } } -*///?} \ No newline at end of file +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/recipe/CraftingRecipes.java b/src/main/java/vectorwing/blockbox/data/recipe/CraftingRecipes.java index fce7a00a..315d76a6 100644 --- a/src/main/java/vectorwing/blockbox/data/recipe/CraftingRecipes.java +++ b/src/main/java/vectorwing/blockbox/data/recipe/CraftingRecipes.java @@ -1,5 +1,5 @@ //? neoforge { -/*package vectorwing.blockbox.data.recipe; +package vectorwing.blockbox.data.recipe; import net.minecraft.advancements.criterion.InventoryChangeTrigger; import net.minecraft.core.HolderGetter; @@ -502,4 +502,4 @@ private static ResourceKey> nameWithSuffix(String name, String suffix) return ResourceKey.create(Registries.RECIPE, Identifier.fromNamespaceAndPath(BlockBox.MODID, name + "_" + suffix)); } } -*///?} \ No newline at end of file +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/tag/BlockTags.java b/src/main/java/vectorwing/blockbox/data/tag/BlockTags.java index 5d1731d6..c0dc7666 100644 --- a/src/main/java/vectorwing/blockbox/data/tag/BlockTags.java +++ b/src/main/java/vectorwing/blockbox/data/tag/BlockTags.java @@ -1,5 +1,5 @@ //? neoforge { -/*package vectorwing.blockbox.data.tag; +package vectorwing.blockbox.data.tag; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; @@ -342,4 +342,4 @@ private void registerBlockMineables() { tag(net.minecraft.tags.BlockTags.NEEDS_DIAMOND_TOOL).add(ModBlocks.POLISHED_OBSIDIAN.get()); } } -*///?} +//?} diff --git a/src/main/java/vectorwing/blockbox/data/tag/DamageTypeTags.java b/src/main/java/vectorwing/blockbox/data/tag/DamageTypeTags.java index 961c114b..104516eb 100644 --- a/src/main/java/vectorwing/blockbox/data/tag/DamageTypeTags.java +++ b/src/main/java/vectorwing/blockbox/data/tag/DamageTypeTags.java @@ -1,5 +1,5 @@ //? neoforge { -/*package vectorwing.blockbox.data.tag; +package vectorwing.blockbox.data.tag; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; @@ -23,4 +23,4 @@ protected void addTags(HolderLookup.Provider provider) { tag(net.minecraft.tags.DamageTypeTags.PANIC_ENVIRONMENTAL_CAUSES).add(ModDamageTypes.PALISADE); } } -*///?} \ No newline at end of file +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/data/tag/ItemTags.java b/src/main/java/vectorwing/blockbox/data/tag/ItemTags.java index 9ace1a6d..97ca7328 100644 --- a/src/main/java/vectorwing/blockbox/data/tag/ItemTags.java +++ b/src/main/java/vectorwing/blockbox/data/tag/ItemTags.java @@ -1,5 +1,5 @@ //? neoforge { -/*package vectorwing.blockbox.data.tag; +package vectorwing.blockbox.data.tag; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; @@ -171,4 +171,4 @@ private void registerMinecraftTags() { tag(CommonTags.Items.FIRESTARTERS).add(Items.FLINT_AND_STEEL).add(Items.FIRE_CHARGE); } } -*///?} \ No newline at end of file +//?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/BlockBoxFabric.java b/src/main/java/vectorwing/blockbox/fabric/BlockBoxFabric.java index e7498a8d..9da52f55 100644 --- a/src/main/java/vectorwing/blockbox/fabric/BlockBoxFabric.java +++ b/src/main/java/vectorwing/blockbox/fabric/BlockBoxFabric.java @@ -1,7 +1,7 @@ package vectorwing.blockbox.fabric; //? fabric { -import fuzs.forgeconfigapiport.fabric.api.v5.ConfigRegistry; +/*import fuzs.forgeconfigapiport.fabric.api.v5.ConfigRegistry; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.creativetab.v1.CreativeModeTabEvents; import net.fabricmc.fabric.api.event.player.ItemEvents; @@ -59,4 +59,4 @@ public void onInitialize() { } } -//?} +*///?} diff --git a/src/main/java/vectorwing/blockbox/fabric/BlockBoxFabricClient.java b/src/main/java/vectorwing/blockbox/fabric/BlockBoxFabricClient.java index e2f89c8f..ea8e1f1f 100644 --- a/src/main/java/vectorwing/blockbox/fabric/BlockBoxFabricClient.java +++ b/src/main/java/vectorwing/blockbox/fabric/BlockBoxFabricClient.java @@ -1,7 +1,7 @@ package vectorwing.blockbox.fabric; //? fabric { -import net.fabricmc.api.ClientModInitializer; +/*import net.fabricmc.api.ClientModInitializer; import vectorwing.blockbox.BlockBox; import vectorwing.blockbox.client.event.ClientSetupEvents; import vectorwing.blockbox.fabric.event.client.EntityRenderersEvent; @@ -17,4 +17,4 @@ public void onInitializeClient() { } } -//?} \ No newline at end of file +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/event/BuildCreativeModeTabContentsEvent.java b/src/main/java/vectorwing/blockbox/fabric/event/BuildCreativeModeTabContentsEvent.java index c38f0808..82d363a6 100644 --- a/src/main/java/vectorwing/blockbox/fabric/event/BuildCreativeModeTabContentsEvent.java +++ b/src/main/java/vectorwing/blockbox/fabric/event/BuildCreativeModeTabContentsEvent.java @@ -1,5 +1,5 @@ //? fabric { -package vectorwing.blockbox.fabric.event; +/*package vectorwing.blockbox.fabric.event; import net.fabricmc.fabric.api.creativetab.v1.FabricCreativeModeTabOutput; import net.minecraft.core.registries.BuiltInRegistries; @@ -26,4 +26,4 @@ public void insertAfter(ItemStack anchor, ItemStack newStack, CreativeModeTab.Ta output.insertAfter(anchor, Collections.singleton(newStack), tabVisibility); } } -//?} \ No newline at end of file +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/event/client/EntityRenderersEvent.java b/src/main/java/vectorwing/blockbox/fabric/event/client/EntityRenderersEvent.java index 65488eb1..f691d3d4 100644 --- a/src/main/java/vectorwing/blockbox/fabric/event/client/EntityRenderersEvent.java +++ b/src/main/java/vectorwing/blockbox/fabric/event/client/EntityRenderersEvent.java @@ -1,5 +1,5 @@ //? fabric { -package vectorwing.blockbox.fabric.event.client; +/*package vectorwing.blockbox.fabric.event.client; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.EntityRenderers; @@ -16,4 +16,4 @@ public void registerEntityRenderer(EntityType entityType, } } } -//?} \ No newline at end of file +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/event/client/RegisterParticleProvidersEvent.java b/src/main/java/vectorwing/blockbox/fabric/event/client/RegisterParticleProvidersEvent.java index de6fb20d..5638c8fa 100644 --- a/src/main/java/vectorwing/blockbox/fabric/event/client/RegisterParticleProvidersEvent.java +++ b/src/main/java/vectorwing/blockbox/fabric/event/client/RegisterParticleProvidersEvent.java @@ -1,5 +1,5 @@ //? fabric { -package vectorwing.blockbox.fabric.event.client; +/*package vectorwing.blockbox.fabric.event.client; import net.fabricmc.fabric.api.client.particle.v1.ParticleProviderRegistry; import net.minecraft.core.particles.ParticleOptions; @@ -10,4 +10,4 @@ public void registerSpriteSet(ParticleType simple ParticleProviderRegistry.getInstance().register(simpleParticleType, provider); } } -//?} \ No newline at end of file +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/mixin/PortalShapeMixin.java b/src/main/java/vectorwing/blockbox/fabric/mixin/PortalShapeMixin.java index 3c2b94e8..54f614f6 100644 --- a/src/main/java/vectorwing/blockbox/fabric/mixin/PortalShapeMixin.java +++ b/src/main/java/vectorwing/blockbox/fabric/mixin/PortalShapeMixin.java @@ -1,5 +1,5 @@ //? fabric { -package vectorwing.blockbox.fabric.mixin; +/*package vectorwing.blockbox.fabric.mixin; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; @@ -21,4 +21,4 @@ private static boolean addToFrame(BlockState instance, Object block, Operation unwaxed, Supplier waxed) { OxidizableBlocksRegistry.registerWaxable(unwaxed.get(), waxed.get()); } } -//?} \ No newline at end of file +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbilities.java b/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbilities.java index c38f150c..d3ec1716 100644 --- a/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbilities.java +++ b/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbilities.java @@ -1,5 +1,5 @@ //? fabric { -package vectorwing.blockbox.fabric.porting; +/*package vectorwing.blockbox.fabric.porting; import net.minecraft.tags.ItemTags; import net.minecraft.world.item.ItemStack; @@ -24,4 +24,4 @@ else if (itemInHand.is(SHOVEL_DOUSE.tagKey())) { return null; } } -//?} \ No newline at end of file +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbility.java b/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbility.java index 9850ba36..d700f6f9 100644 --- a/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbility.java +++ b/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbility.java @@ -1,5 +1,5 @@ //? fabric { -package vectorwing.blockbox.fabric.porting; +/*package vectorwing.blockbox.fabric.porting; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; @@ -7,4 +7,4 @@ public record ItemAbility(TagKey tagKey) { } -//?} \ No newline at end of file +*///?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/neoforge/BlockBoxNeoForge.java b/src/main/java/vectorwing/blockbox/neoforge/BlockBoxNeoForge.java index b17b865d..e67a4dd9 100644 --- a/src/main/java/vectorwing/blockbox/neoforge/BlockBoxNeoForge.java +++ b/src/main/java/vectorwing/blockbox/neoforge/BlockBoxNeoForge.java @@ -1,7 +1,7 @@ package vectorwing.blockbox.neoforge; //? neoforge { -/*import net.minecraft.core.registries.Registries; +import net.minecraft.core.registries.Registries; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; import net.neoforged.fml.config.ModConfig; @@ -42,4 +42,4 @@ public static void register(RegisterEvent event) { } } -*///?} +//?} diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts index a5d3a83b..fc285543 100644 --- a/stonecutter.gradle.kts +++ b/stonecutter.gradle.kts @@ -7,7 +7,7 @@ plugins { id("me.modmuss50.mod-publish-plugin") version "0.8.+" apply false } -stonecutter active "26.1-fabric" +stonecutter active "26.1-neoforge" stonecutter parameters { constants.match(node.metadata.project.substringAfterLast('-'), "fabric", "neoforge") From 905a53eb915997e49938c0e9b58a1397bf842d7b Mon Sep 17 00:00:00 2001 From: Cassian Date: Thu, 23 Apr 2026 12:54:00 -0400 Subject: [PATCH 6/7] Remove unnecssary mods.toml changes --- build.fabric.gradle.kts | 2 +- build.neoforge.gradle.kts | 2 +- src/main/resources/META-INF/neoforge.mods.toml | 4 ++-- src/main/resources/fabric.mod.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.fabric.gradle.kts b/build.fabric.gradle.kts index 91564f1b..ca3e4b89 100644 --- a/build.fabric.gradle.kts +++ b/build.fabric.gradle.kts @@ -10,7 +10,7 @@ tasks.named("processResources") { fun prop(name: String) = project.property(name) as String val props = HashMap().apply { - this["version"] = prop("mod.version") + this["mod_version"] = prop("mod.version") this["minecraft"] = prop("deps.minecraft") this["mod_id"] = prop("mod.id") this["mod_name"] = prop("mod.name") diff --git a/build.neoforge.gradle.kts b/build.neoforge.gradle.kts index 2485a7c3..e342b209 100644 --- a/build.neoforge.gradle.kts +++ b/build.neoforge.gradle.kts @@ -8,7 +8,7 @@ tasks.named("processResources") { fun prop(name: String) = project.property(name) as String val props = HashMap().apply { - this["version"] = prop("mod.version") + this["mod_version"] = prop("mod.version") this["minecraft"] = prop("deps.minecraft") this["mod_id"] = prop("mod.id") this["mod_name"] = prop("mod.name") diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index dd8d15e0..d1d8dd86 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -4,9 +4,9 @@ license="${mod_license}" [[mods]] #mandatory modId="${mod_id}" #mandatory -version="${version}" #mandatory +version="${mod_version}" #mandatory displayName="${mod_name}" #mandatory -logoFile = "../logo.png" +logoFile = "logo.png" logoBlur = false credits="Tkain" #optional authors="${mod_authors}" #optional diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index c738dc30..64ba8496 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "${mod_id}", "name": "${mod_name}", - "version": "${version}", + "version": "${mod_version}", "authors": ["vectorwing"], "contact": { "sources": "https://github.com/vectorwing/BlockBox", From 6ece73b5beff822648249c9c33a46e1eae74ae2f Mon Sep 17 00:00:00 2001 From: Cassian Date: Sat, 25 Apr 2026 17:31:31 -0400 Subject: [PATCH 7/7] Use correct convention tag for firestarters --- .../.cache/28b4b53cd706bc6b6e3f6a8fda45d834ad59c7ec | 3 +-- src/generated/resources/data/c/tags/item/firestarters.json | 6 ------ .../java/vectorwing/blockbox/common/tag/CommonTags.java | 4 +--- src/main/java/vectorwing/blockbox/data/tag/ItemTags.java | 1 - .../vectorwing/blockbox/fabric/porting/ItemAbilities.java | 2 +- 5 files changed, 3 insertions(+), 13 deletions(-) delete mode 100644 src/generated/resources/data/c/tags/item/firestarters.json diff --git a/src/generated/resources/.cache/28b4b53cd706bc6b6e3f6a8fda45d834ad59c7ec b/src/generated/resources/.cache/28b4b53cd706bc6b6e3f6a8fda45d834ad59c7ec index 95a916b9..28efe132 100644 --- a/src/generated/resources/.cache/28b4b53cd706bc6b6e3f6a8fda45d834ad59c7ec +++ b/src/generated/resources/.cache/28b4b53cd706bc6b6e3f6a8fda45d834ad59c7ec @@ -1,10 +1,9 @@ -// 26.1.2 2026-04-22T20:48:51.967800852 Tags for minecraft:item mod id blockbox +// 26.1.2 2026-04-25T17:30:33.08367154 Tags for minecraft:item mod id blockbox ac505c538459acba3d5cbbc8d6cef561ae253f92 data/blockbox/tags/item/golden_blocks.json 809acd4690b1fa37484b9b1dce4556313f9a4fd4 data/blockbox/tags/item/palisades.json 888158b7f20bfc6d8b528f2d3cada3de04678dd0 data/blockbox/tags/item/sky_lanterns.json edb0a368271cf9936d711ce06c7865d422d2ec6c data/blockbox/tags/item/spiked_palisades.json ab899f04e2ebd0b23edfdc84137af0f4a1abfd77 data/blockbox/tags/item/wooden_seats.json -47be456ad97366b91300f74739cd8cac544f698d data/c/tags/item/firestarters.json baae533a53a683480091c4ade29013ea2f5813ef data/minecraft/tags/item/doors.json c4500297f029dde8936912f27afdbcd675d074f7 data/minecraft/tags/item/piglin_loved.json e2a6ae6c7b2c909ff0bff584601ad2afedc99786 data/minecraft/tags/item/slabs.json diff --git a/src/generated/resources/data/c/tags/item/firestarters.json b/src/generated/resources/data/c/tags/item/firestarters.json deleted file mode 100644 index d30efcd3..00000000 --- a/src/generated/resources/data/c/tags/item/firestarters.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "minecraft:flint_and_steel", - "minecraft:fire_charge" - ] -} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/common/tag/CommonTags.java b/src/main/java/vectorwing/blockbox/common/tag/CommonTags.java index 996a51e9..766d6fe3 100644 --- a/src/main/java/vectorwing/blockbox/common/tag/CommonTags.java +++ b/src/main/java/vectorwing/blockbox/common/tag/CommonTags.java @@ -1,9 +1,7 @@ package vectorwing.blockbox.common.tag; -import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; import net.minecraft.resources.Identifier; -import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; @@ -11,7 +9,7 @@ public class CommonTags { public static class Items { public static final TagKey RODS_WOODEN = commonItemTag("rods/wooden"); - public static final TagKey FIRESTARTERS = commonItemTag("firestarters"); + public static final TagKey IGNITERS = commonItemTag("tools/igniter"); } private static TagKey commonItemTag(String path) { diff --git a/src/main/java/vectorwing/blockbox/data/tag/ItemTags.java b/src/main/java/vectorwing/blockbox/data/tag/ItemTags.java index 97ca7328..b15d88e1 100644 --- a/src/main/java/vectorwing/blockbox/data/tag/ItemTags.java +++ b/src/main/java/vectorwing/blockbox/data/tag/ItemTags.java @@ -168,7 +168,6 @@ private void registerMinecraftTags() { ModItems.PACKED_ICE_BRICK_WALL.get() ); tag(net.minecraft.tags.ItemTags.PIGLIN_LOVED).addTag(ModTags.GOLDEN_BLOCK_ITEMS); - tag(CommonTags.Items.FIRESTARTERS).add(Items.FLINT_AND_STEEL).add(Items.FIRE_CHARGE); } } //?} \ No newline at end of file diff --git a/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbilities.java b/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbilities.java index d3ec1716..a2814aa4 100644 --- a/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbilities.java +++ b/src/main/java/vectorwing/blockbox/fabric/porting/ItemAbilities.java @@ -8,7 +8,7 @@ public class ItemAbilities { public static final ItemAbility AXE_STRIP = new ItemAbility(ItemTags.AXES); - public static final ItemAbility FIRESTARTER_LIGHT = new ItemAbility(CommonTags.Items.FIRESTARTERS); + public static final ItemAbility FIRESTARTER_LIGHT = new ItemAbility(CommonTags.Items.IGNITERS); public static final ItemAbility SHOVEL_DOUSE = new ItemAbility(ItemTags.SHOVELS); public static @Nullable ItemAbility get(ItemStack itemInHand) {