Skip to content

Commit

Permalink
Add support for custom reload listeners
Browse files Browse the repository at this point in the history
Introduced a ReloadListenerRegistry to simplify registering reload listeners across platforms. Updated RegistrationHelper and its implementations to handle custom preload listeners with dependencies. Minor cleanups and dependency version adjustments were also included.
  • Loading branch information
ThePandaOliver committed Dec 30, 2024
1 parent 0c2d774 commit 3bbf654
Show file tree
Hide file tree
Showing 12 changed files with 116 additions and 31 deletions.
11 changes: 4 additions & 7 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import net.fabricmc.loom.api.LoomGradleExtensionAPI
import net.fabricmc.loom.task.RemapJarTask
import org.gradle.kotlin.dsl.named

plugins {
java
Expand Down Expand Up @@ -109,12 +108,10 @@ subprojects {
"jarShadow"("org.lwjgl:lwjgl-assimp:${properties["deps_lwjgl_version"]}") {
exclude(group = "org.lwjgl", module = "lwjgl")
}

if (isMinecraftSubProject) {
for (natives in arrayOf("natives-windows", "natives-linux", "natives-macos")) {
"jarShadow"("org.lwjgl:lwjgl-assimp:${properties["deps_lwjgl_version"]}:${natives}") {
exclude(group = "org.lwjgl", module = "lwjgl")
}

for (natives in arrayOf("natives-windows", "natives-linux", "natives-macos")) {
"jarShadow"("org.lwjgl:lwjgl-assimp:${properties["deps_lwjgl_version"]}:${natives}") {
exclude(group = "org.lwjgl", module = "lwjgl")
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@

package me.pandamods.pandalib.client;

import dev.architectury.registry.ReloadListenerRegistry;
import me.pandamods.pandalib.PandaLib;
import me.pandamods.pandalib.core.client.event.EventHandlerClient;
import me.pandamods.pandalib.registry.ReloadListenerRegistry;
import me.pandamods.pandalib.resource.AssimpResources;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,16 @@

import me.pandamods.pandalib.registry.DeferredObject;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.PackType;
import net.minecraft.server.packs.resources.PreparableReloadListener;

import java.util.List;
import java.util.function.Supplier;

public interface RegistrationHelper {
<T> void register(DeferredObject<? extends T> deferredObject, Supplier<? extends T> supplier);

<T> void registerNewRegistry(Registry<T> registry);

void registerReloadListener(PackType packType, PreparableReloadListener listener, ResourceLocation id, List<ResourceLocation> dependencies);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright (C) 2024 Oliver Froberg (The Panda Oliver)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package me.pandamods.pandalib.registry;

import me.pandamods.pandalib.platform.Services;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.PackType;
import net.minecraft.server.packs.resources.PreparableReloadListener;

import java.util.List;

public class ReloadListenerRegistry {
public static void register(PackType packType, PreparableReloadListener listener) {
register(packType, listener, null);
}

public static void register(PackType packType, PreparableReloadListener listener, ResourceLocation id) {
register(packType, listener, id, List.of());
}

public static void register(PackType packType, PreparableReloadListener listener, ResourceLocation id, List<ResourceLocation> dependencies) {
Services.REGISTRATION.registerReloadListener(packType, listener, id, dependencies);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.PreparableReloadListener;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.util.profiling.ProfilerFiller;
import org.jetbrains.annotations.NotNull;
import org.lwjgl.assimp.*;

import java.io.FileNotFoundException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,21 @@

import me.pandamods.pandalib.platform.services.RegistrationHelper;
import me.pandamods.pandalib.registry.DeferredObject;
import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener;
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
import net.minecraft.core.RegistrationInfo;
import net.minecraft.core.Registry;
import net.minecraft.core.WritableRegistry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.PackType;
import net.minecraft.server.packs.resources.PreparableReloadListener;
import net.minecraft.server.packs.resources.ResourceManager;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.function.Supplier;

public class RegistrationHelperImpl implements RegistrationHelper {
Expand All @@ -30,11 +39,37 @@ public <T> void register(DeferredObject<? extends T> deferredObject, Supplier<?
}

@Override
@SuppressWarnings({"unchecked", "rawtypes"})
public <T> void registerNewRegistry(Registry<T> registry) {
ResourceLocation registryName = registry.key().location();
if (BuiltInRegistries.REGISTRY.containsKey(registryName))
throw new IllegalStateException("Attempted duplicate registration of registry " + registryName);

((WritableRegistry) BuiltInRegistries.REGISTRY).register(registry.key(), registry, RegistrationInfo.BUILT_IN);
}

@Override
public void registerReloadListener(PackType packType, PreparableReloadListener listener, ResourceLocation id, List<ResourceLocation> dependencies) {
ResourceManagerHelper.get(packType).registerReloadListener(new IdentifiableResourceReloadListener() {
@Override
public ResourceLocation getFabricId() {
return id;
}

@Override
public CompletableFuture<Void> reload(PreparationBarrier preparationBarrier, ResourceManager resourceManager, Executor executor, Executor executor2) {
return listener.reload(preparationBarrier, resourceManager, executor, executor2);
}

@Override
public Collection<ResourceLocation> getFabricDependencies() {
return dependencies;
}

@Override
public String getName() {
return listener.getName();
}
});
}
}
3 changes: 1 addition & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,5 @@ deps_modmenu_version = 12.0.0-beta.1
deps_architectury_version = 14.0.4

#### Dependencies ####
deps_lwjgl_version = 3.3.3
deps_manifold_version = 2024.1.37
deps_lwjgl_version = 3.3.1
deps_joml_version = 1.10.5
2 changes: 1 addition & 1 deletion neoforge/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ dependencies {
neoForge("net.neoforged:neoforge:${properties["neoforge_version"]}")

modApi("dev.architectury:architectury-neoforge:${properties["deps_architectury_version"]}")

common(project(":common", "namedElements")) { isTransitive = false }
shadowBundle(project(":common", "transformProductionNeoForge"))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,18 @@
import me.pandamods.pandalib.platform.Services;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.common.NeoForge;

@Mod(PandaLib.MOD_ID)
public class PandaLibNeoForge {
public PandaLibNeoForge(IEventBus eventBus) {
new PandaLib();

eventBus.addListener(NetworkHelperImpl::registerPackets);
if (Services.REGISTRATION instanceof RegistrationHelperImpl helper) {
eventBus.addListener(helper::registerEvent);
eventBus.addListener(helper::registerNewRegistryEvent);
NeoForge.EVENT_BUS.addListener(helper::addReloadListenerEvent);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,9 @@
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;


@Mod(value = PandaLib.MOD_ID, dist = Dist.CLIENT)
public class PandaLibClientNeoForge {
public PandaLibClientNeoForge(IEventBus eventBus) {
eventBus.addListener(PandaLibClientNeoForge::clientSetup);
}

public static void clientSetup(FMLClientSetupEvent event) {
new PandaLibClient();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,14 @@

import me.pandamods.pandalib.platform.services.RegistrationHelper;
import me.pandamods.pandalib.registry.DeferredObject;
import net.minecraft.client.Minecraft;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.PackType;
import net.minecraft.server.packs.resources.PreparableReloadListener;
import net.minecraft.server.packs.resources.ReloadableResourceManager;
import net.neoforged.neoforge.event.AddReloadListenerEvent;
import net.neoforged.neoforge.registries.NewRegistryEvent;
import net.neoforged.neoforge.registries.RegisterEvent;

Expand All @@ -28,6 +34,7 @@
public class RegistrationHelperImpl implements RegistrationHelper {
private final Map<ResourceKey<? extends Registry<?>>, PendingRegistries<?>> pendingRegistries = new HashMap<>();
private final List<Registry<?>> pendingRegistryTypes = new ArrayList<>();
private final List<PreparableReloadListener> serverDataReloadListeners = new ArrayList<>();

@Override
@SuppressWarnings("unchecked")
Expand All @@ -43,13 +50,26 @@ public <T> void registerNewRegistry(Registry<T> registry) {
pendingRegistryTypes.add(registry);
}

@Override
public void registerReloadListener(PackType packType, PreparableReloadListener listener, ResourceLocation id, List<ResourceLocation> dependencies) {
if (packType == PackType.SERVER_DATA) {
serverDataReloadListeners.add(listener);
} else {
((ReloadableResourceManager) Minecraft.getInstance().getResourceManager()).registerReloadListener(listener);
}
}

public void registerEvent(RegisterEvent event) {
pendingRegistries.values().forEach(pending -> pending.register(event));
}

public void registerNewRegistryEvent(NewRegistryEvent event) {
pendingRegistryTypes.forEach(event::register);
}

public void addReloadListenerEvent(AddReloadListenerEvent event) {
serverDataReloadListeners.forEach(event::addListener);
}

private static class PendingRegistries<T> {
private final ResourceKey<? extends Registry<T>> registryKey;
Expand Down
20 changes: 10 additions & 10 deletions neoforge/src/main/resources/pandalib.mixins.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{
"required": true,
"package": "me.pandamods.pandalib.neoforge.mixin",
"required": true,
"package": "me.pandamods.pandalib.neoforge.mixin",
"compatibilityLevel": "JAVA_${java_version}",
"minVersion": "0.8",
"client": [
],
"mixins": [
],
"injectors": {
"defaultRequire": 1
}
"minVersion": "0.8",
"client": [
],
"mixins": [
],
"injectors": {
"defaultRequire": 1
}
}

0 comments on commit 3bbf654

Please sign in to comment.