Skip to content

Commit 0c2d774

Browse files
Add support for dynamic registry creation across platforms
Introduced a mechanism to register new registries dynamically for both NeoForge and Fabric platforms. This includes implementing `registerNewRegistry` in `RegistrationHelper` and integrating registry registration logic in `common` and platform-specific code. Also added a Fabric test mod module and updated the existing configurations for consistency.
1 parent 99ec183 commit 0c2d774

File tree

14 files changed

+211
-4
lines changed

14 files changed

+211
-4
lines changed

common-testmod/src/main/java/me/pandamods/test/TestMod.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,19 @@
1212

1313
package me.pandamods.test;
1414

15+
import com.mojang.serialization.Lifecycle;
16+
import dev.architectury.event.events.client.ClientLifecycleEvent;
1517
import me.pandamods.pandalib.config.PandaLibConfig;
1618
import me.pandamods.pandalib.config.holders.ClientConfigHolder;
1719
import me.pandamods.pandalib.config.holders.CommonConfigHolder;
20+
import me.pandamods.pandalib.registry.DeferredObject;
21+
import me.pandamods.pandalib.registry.DeferredRegister;
22+
import me.pandamods.pandalib.registry.RegistryRegister;
1823
import me.pandamods.test.config.ClientTestConfig;
1924
import me.pandamods.test.config.CommonTestConfig;
25+
import net.minecraft.core.MappedRegistry;
26+
import net.minecraft.core.Registry;
27+
import net.minecraft.resources.ResourceKey;
2028
import net.minecraft.resources.ResourceLocation;
2129

2230
public class TestMod {
@@ -26,8 +34,16 @@ public class TestMod {
2634
private static final CommonConfigHolder<CommonTestConfig> COMMON_TEST_CONFIG = PandaLibConfig.registerCommon(CommonTestConfig.class);
2735
private static final ClientConfigHolder<ClientTestConfig> CLIENT_TEST_CONFIG = PandaLibConfig.registerClient(ClientTestConfig.class);
2836

37+
public static final ResourceKey<Registry<TestRegistry>> TEST_REGISTRY_KEY = ResourceKey.createRegistryKey(TestMod.resourceLocation("test_registry"));
38+
public static final Registry<TestRegistry> TEST_REGISTRY = RegistryRegister.register(new MappedRegistry<>(TEST_REGISTRY_KEY, Lifecycle.stable()));
39+
40+
public static final DeferredRegister<TestRegistry> TEST_REGISTER = DeferredRegister.create(MOD_ID, TEST_REGISTRY);
41+
public static final DeferredObject<TestRegistry> TEST1 = TEST_REGISTER.register("test1", TestRegistry::new);
42+
public static final DeferredObject<TestRegistry> TEST2 = TEST_REGISTER.register("test2", TestRegistry::new);
43+
2944
public TestMod() {
3045
instance = this;
46+
TEST_REGISTER.register();
3147
}
3248

3349
public static ResourceLocation resourceLocation(String path) {
@@ -37,4 +53,6 @@ public static ResourceLocation resourceLocation(String path) {
3753
public static TestMod getInstance() {
3854
return instance;
3955
}
56+
57+
public static class TestRegistry { }
4058
}

common/src/main/java/me/pandamods/pandalib/platform/services/RegistrationHelper.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,12 @@
1313
package me.pandamods.pandalib.platform.services;
1414

1515
import me.pandamods.pandalib.registry.DeferredObject;
16+
import net.minecraft.core.Registry;
1617

1718
import java.util.function.Supplier;
1819

1920
public interface RegistrationHelper {
2021
<T> void register(DeferredObject<? extends T> deferredObject, Supplier<? extends T> supplier);
22+
23+
<T> void registerNewRegistry(Registry<T> registry);
2124
}

common/src/main/java/me/pandamods/pandalib/registry/DeferredRegister.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.function.Function;
2323
import java.util.function.Supplier;
2424

25+
@SuppressWarnings("unused")
2526
public class DeferredRegister<T> {
2627
private final String namespace;
2728
private final ResourceKey<? extends Registry<T>> registryKey;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright (C) 2024 Oliver Froberg (The Panda Oliver)
3+
*
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU Lesser General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* any later version.
8+
*
9+
* You should have received a copy of the GNU Lesser General Public License
10+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
11+
*/
12+
13+
package me.pandamods.pandalib.registry;
14+
15+
import me.pandamods.pandalib.platform.Services;
16+
import net.minecraft.core.Registry;
17+
18+
@SuppressWarnings("unused")
19+
public class RegistryRegister<T> {
20+
@SuppressWarnings({ "unchecked", "rawtypes" })
21+
public static <T> Registry<T> register(Registry<T> registry) {
22+
Services.REGISTRATION.registerNewRegistry(registry);
23+
return registry;
24+
}
25+
}

fabric-testmod/build.gradle.kts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
2+
import net.fabricmc.loom.task.RemapJarTask
3+
4+
architectury {
5+
platformSetupLoomIde()
6+
fabric()
7+
}
8+
9+
//loom.accessWidenerPath.set(project(":common").loom.accessWidenerPath)
10+
11+
configurations {
12+
getByName("developmentFabric").extendsFrom(configurations["common"])
13+
}
14+
15+
repositories {
16+
maven("https://maven.terraformersmc.com/releases/")
17+
}
18+
19+
dependencies {
20+
modImplementation("net.fabricmc:fabric-loader:${properties["fabric_version"]}")
21+
modApi("net.fabricmc.fabric-api:fabric-api:${properties["fabric_api_version"]}")
22+
23+
modApi("dev.architectury:architectury-fabric:${properties["deps_architectury_version"]}")
24+
modApi("com.terraformersmc:modmenu:${properties["deps_modmenu_version"]}")
25+
26+
implementation(project(":fabric", "namedElements")) { isTransitive = false }
27+
common(project(":common", "namedElements")) { isTransitive = false }
28+
common(project(":common-testmod", "namedElements")) { isTransitive = false }
29+
}
30+
31+
tasks.remapJar {
32+
injectAccessWidener.set(true)
33+
}
34+
35+
tasks.withType<RemapJarTask> {
36+
val shadowJar = tasks.getByName<ShadowJar>("shadowJar")
37+
inputFile.set(shadowJar.archiveFile)
38+
}
39+
40+
publishing {
41+
publications {
42+
register("mavenJava", MavenPublication::class) {
43+
groupId = properties["maven_group"] as String
44+
artifactId = "${properties["mod_id"]}-${project.name}"
45+
version = "${project.version}-build.${project.findProperty("buildNumber") ?: "-1"}"
46+
47+
from(components["java"])
48+
}
49+
}
50+
51+
repositories {
52+
maven {
53+
name = "GitHubPackages"
54+
url = uri("https://maven.pkg.github.com/PandaMods-Dev/PandaLib")
55+
credentials {
56+
username = project.findProperty("gpr.user") as String? ?: System.getenv("USERNAME")
57+
password = project.findProperty("gpr.key") as String? ?: System.getenv("TOKEN")
58+
}
59+
}
60+
}
61+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright (C) 2024 Oliver Froberg (The Panda Oliver)
3+
*
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* any later version.
8+
*
9+
* You should have received a copy of the GNU General Public License
10+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
11+
*/
12+
13+
package me.pandamods.testmod.fabric;
14+
15+
import me.pandamods.test.TestMod;
16+
import net.fabricmc.api.ModInitializer;
17+
18+
public class TestModFabric implements ModInitializer {
19+
@Override
20+
public void onInitialize() {
21+
new TestMod();
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright (C) 2024 Oliver Froberg (The Panda Oliver)
3+
*
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* any later version.
8+
*
9+
* You should have received a copy of the GNU General Public License
10+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
11+
*/
12+
13+
package me.pandamods.testmod.fabric.client;
14+
15+
import me.pandamods.test.client.TestModClient;
16+
import net.fabricmc.api.ClientModInitializer;
17+
18+
public class TestModClientFabric implements ClientModInitializer {
19+
@Override
20+
public void onInitializeClient() {
21+
new TestModClient();
22+
}
23+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"schemaVersion": 1,
3+
"id": "testmod",
4+
"version": "${mod_version}",
5+
"name": "Test Mod",
6+
"description": "Testing environment for mod development and testing purposes",
7+
"authors": [
8+
"${mod_author}"
9+
],
10+
"contact": {},
11+
"license": "${mod_license}",
12+
"icon": "assets/${mod_id}/icon.png",
13+
"environment": "*",
14+
"entrypoints": {
15+
"main": [
16+
"me.pandamods.testmod.fabric.TestModFabric"
17+
],
18+
"client": [
19+
"me.pandamods.testmod.fabric.client.TestModClientFabric"
20+
]
21+
},
22+
"mixins": [],
23+
"depends": {
24+
"fabric": "*",
25+
"minecraft": "${fabric_version_range}"
26+
}
27+
}

fabric/src/main/java/me/pandamods/pandalib/fabric/platform/RegistrationHelperImpl.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@
1414

1515
import me.pandamods.pandalib.platform.services.RegistrationHelper;
1616
import me.pandamods.pandalib.registry.DeferredObject;
17+
import net.minecraft.core.RegistrationInfo;
1718
import net.minecraft.core.Registry;
19+
import net.minecraft.core.WritableRegistry;
20+
import net.minecraft.core.registries.BuiltInRegistries;
21+
import net.minecraft.resources.ResourceLocation;
1822

1923
import java.util.function.Supplier;
2024

@@ -24,4 +28,13 @@ public class RegistrationHelperImpl implements RegistrationHelper {
2428
public <T> void register(DeferredObject<? extends T> deferredObject, Supplier<? extends T> supplier) {
2529
Registry.register((Registry<T>) deferredObject.getRegistry(), deferredObject.getId(), supplier.get());
2630
}
31+
32+
@Override
33+
public <T> void registerNewRegistry(Registry<T> registry) {
34+
ResourceLocation registryName = registry.key().location();
35+
if (BuiltInRegistries.REGISTRY.containsKey(registryName))
36+
throw new IllegalStateException("Attempted duplicate registration of registry " + registryName);
37+
38+
((WritableRegistry) BuiltInRegistries.REGISTRY).register(registry.key(), registry, RegistrationInfo.BUILT_IN);
39+
}
2740
}

neoforge-testmod/src/main/java/me/pandamods/testmod/neoforge/TestModNeoForge.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
package me.pandamods.testmod.neoforge;
1414

15-
import me.pandamods.pandalib.PandaLib;
1615
import me.pandamods.test.TestMod;
1716
import net.neoforged.bus.api.IEventBus;
1817
import net.neoforged.fml.common.Mod;

neoforge-testmod/src/main/java/me/pandamods/testmod/neoforge/client/TestModClientNeoForge.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
package me.pandamods.testmod.neoforge.client;
1414

15-
import me.pandamods.pandalib.PandaLib;
1615
import me.pandamods.test.TestMod;
1716
import me.pandamods.test.client.TestModClient;
1817
import net.neoforged.api.distmarker.Dist;

neoforge/src/main/java/me/pandamods/pandalib/neoforge/PandaLibNeoForge.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ public PandaLibNeoForge(IEventBus eventBus) {
2525
new PandaLib();
2626

2727
eventBus.addListener(NetworkHelperImpl::registerPackets);
28-
if (Services.REGISTRATION instanceof RegistrationHelperImpl helper)
28+
if (Services.REGISTRATION instanceof RegistrationHelperImpl helper) {
2929
eventBus.addListener(helper::registerEvent);
30+
eventBus.addListener(helper::registerNewRegistryEvent);
31+
}
3032
}
3133
}

neoforge/src/main/java/me/pandamods/pandalib/neoforge/platform/RegistrationHelperImpl.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,18 @@
1616
import me.pandamods.pandalib.registry.DeferredObject;
1717
import net.minecraft.core.Registry;
1818
import net.minecraft.resources.ResourceKey;
19+
import net.neoforged.neoforge.registries.NewRegistryEvent;
1920
import net.neoforged.neoforge.registries.RegisterEvent;
2021

22+
import java.util.ArrayList;
2123
import java.util.HashMap;
24+
import java.util.List;
2225
import java.util.Map;
2326
import java.util.function.Supplier;
2427

2528
public class RegistrationHelperImpl implements RegistrationHelper {
2629
private final Map<ResourceKey<? extends Registry<?>>, PendingRegistries<?>> pendingRegistries = new HashMap<>();
30+
private final List<Registry<?>> pendingRegistryTypes = new ArrayList<>();
2731

2832
@Override
2933
@SuppressWarnings("unchecked")
@@ -34,9 +38,18 @@ public <T> void register(DeferredObject<? extends T> deferredObject, Supplier<?
3438
pending.add(deferredObject, supplier);
3539
}
3640

41+
@Override
42+
public <T> void registerNewRegistry(Registry<T> registry) {
43+
pendingRegistryTypes.add(registry);
44+
}
45+
3746
public void registerEvent(RegisterEvent event) {
3847
pendingRegistries.values().forEach(pending -> pending.register(event));
3948
}
49+
50+
public void registerNewRegistryEvent(NewRegistryEvent event) {
51+
pendingRegistryTypes.forEach(event::register);
52+
}
4053

4154
private static class PendingRegistries<T> {
4255
private final ResourceKey<? extends Registry<T>> registryKey;

settings.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ pluginManagement.repositories {
1919
}
2020

2121
include("common", "common-testmod")
22-
include("fabric")
22+
include("fabric", "fabric-testmod")
2323
include("neoforge", "neoforge-testmod")

0 commit comments

Comments
 (0)