Skip to content

Commit

Permalink
Add listener for end of zen-data registration
Browse files Browse the repository at this point in the history
Signed-off-by: TheSilkMiner <thesilkminer@outlook.com>
  • Loading branch information
TheSilkMiner authored and jaredlll08 committed Feb 27, 2022
1 parent f50d00e commit f75dc0f
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

public interface IListenerRegistrationHandler {

void registerCraftTweakerLoadCompleteListener(final Runnable runnable);
void onZenDataRegistrationCompletion(final Runnable runnable);

void onCraftTweakerLoadCompletion(final Runnable runnable);

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,47 @@
import com.blamejared.crafttweaker.api.plugin.IListenerRegistrationHandler;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;

final class ListenerRegistrationHandler implements IListenerRegistrationHandler {

private final List<Runnable> listeners;
private final List<Runnable> endListeners;
private final List<Runnable> zenListeners;

private ListenerRegistrationHandler() {

this.listeners = new ArrayList<>();
this.endListeners = new ArrayList<>();
this.zenListeners = new ArrayList<>();
}

static List<Runnable> gather(final Consumer<IListenerRegistrationHandler> consumer) {
static ListenerRegistrationHandler of(final Consumer<IListenerRegistrationHandler> consumer) {

final ListenerRegistrationHandler handler = new ListenerRegistrationHandler();
consumer.accept(handler);
return Collections.unmodifiableList(handler.listeners);
return handler;
}

@Override
public void registerCraftTweakerLoadCompleteListener(final Runnable runnable) {
public void onZenDataRegistrationCompletion(final Runnable runnable) {

this.listeners.add(runnable);
this.zenListeners.add(runnable);
}

@Override
public void onCraftTweakerLoadCompletion(final Runnable runnable) {

this.endListeners.add(runnable);
}

List<Runnable> endListeners() {

return this.endListeners;
}

List<Runnable> zenListeners() {

return this.zenListeners;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,24 @@ private Req() {

}

private record Listeners(List<Runnable> zenListeners, List<Runnable> endListeners) {

Listeners() {

this(new ArrayList<>(), new ArrayList<>());
}

}

private final List<DecoratedCraftTweakerPlugin> plugins;
private final Req req;
private final List<Runnable> endListeners;
private final Listeners listeners;

private PluginManager(final List<DecoratedCraftTweakerPlugin> plugins) {

this.plugins = List.copyOf(plugins);
this.req = new Req();
this.endListeners = new ArrayList<>();
this.listeners = new Listeners();
}

public static PluginManager of() {
Expand Down Expand Up @@ -103,33 +112,50 @@ private static DecoratedCraftTweakerPlugin initPlugin(final Pair<ResourceLocatio
public void loadPlugins() {

final IPluginRegistryAccess pluginRegistryAccess = CraftTweakerRegistry.pluginAccess(this.req);
this.gatherListeners();

this.handleZenDataRegistration(pluginRegistryAccess);
this.handleAdditionalRegistration(pluginRegistryAccess);
}

public void broadcastEnd() {

this.listeners.endListeners().forEach(Runnable::run);
}

private void gatherListeners() {

final ListenerRegistrationHandler handler = ListenerRegistrationHandler.of(this.onEach(ICraftTweakerPlugin::registerListeners));
this.listeners.endListeners().addAll(handler.endListeners());
this.listeners.zenListeners().addAll(handler.zenListeners());
}

private void handleZenDataRegistration(final IPluginRegistryAccess access) {

final Map<String, IScriptLoader> loaders = LoaderRegistrationHandler.gather(this.onEach(ICraftTweakerPlugin::registerLoaders));
final Function<String, IScriptLoader> loaderFinder = name -> {
if(loaders.containsKey(name)) {
return loaders.get(name);
}
throw new IllegalArgumentException("Unknown loader '" + name + "' queried");
throw new IllegalArgumentException("Unknown loader '" + name + "' queried: missing registration?");
};

pluginRegistryAccess.registerLoaders(loaders.values());
pluginRegistryAccess.registerLoadSources(LoadSourceRegistrationHandler.gather(this.onEach(ICraftTweakerPlugin::registerLoadSource)));
access.registerLoaders(loaders.values());
access.registerLoadSources(LoadSourceRegistrationHandler.gather(this.onEach(ICraftTweakerPlugin::registerLoadSource)));

final JavaNativeIntegrationRegistrationHandler javaHandler = JavaNativeIntegrationRegistrationHandler.of(this.onEach(ICraftTweakerPlugin::manageJavaNativeIntegration));
this.manageZenRegistration(pluginRegistryAccess, javaHandler, loaderFinder);
this.manageZenRegistration(access, javaHandler, loaderFinder);

final BracketParserRegistrationHandler bracketHandler = BracketParserRegistrationHandler.of(this.onEach(ICraftTweakerPlugin::registerBracketParsers));
this.manageBracketRegistration(pluginRegistryAccess, bracketHandler, loaderFinder);

RecipeHandlerRegistrationHandler.gather(this.onEach(ICraftTweakerPlugin::registerRecipeHandlers))
.forEach(it -> pluginRegistryAccess.registerHandler(this.uncheck(it.recipeClass()), it.handler()));
this.manageBracketRegistration(access, bracketHandler, loaderFinder);

this.endListeners.addAll(ListenerRegistrationHandler.gather(this.onEach(ICraftTweakerPlugin::registerListeners)));
this.listeners.zenListeners().forEach(Runnable::run);
}

public void broadcastEnd() {
private void handleAdditionalRegistration(final IPluginRegistryAccess access) {

this.endListeners.forEach(Runnable::run);
this.endListeners.clear();
RecipeHandlerRegistrationHandler.gather(this.onEach(ICraftTweakerPlugin::registerRecipeHandlers))
.forEach(it -> access.registerHandler(this.uncheck(it.recipeClass()), it.handler()));
}

private <T> Consumer<T> onEach(final BiConsumer<ICraftTweakerPlugin, T> consumer) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ public void registerRecipeHandlers(final IRecipeHandlerRegistrationHandler handl
@SuppressWarnings("CodeBlock2Expr")
public void registerListeners(final IListenerRegistrationHandler handler) {

// TODO("Find a better place for this; and also per-loader API?")
handler.registerCraftTweakerLoadCompleteListener(() -> {
handler.onZenDataRegistrationCompletion(() -> {
// TODO("Per-loader API")
CraftTweakerAPI.getRegistry().getAllLoaders().forEach(loader -> {
CraftTweakerAPI.getRegistry().getZenClassRegistry().getImplementationsOf(loader, ITagManager.class)
.stream()
Expand Down

0 comments on commit f75dc0f

Please sign in to comment.