diff --git a/common/api/addons/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java b/common/api/addons/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java index 6a45c2665..7a1f7e12c 100644 --- a/common/api/addons/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java +++ b/common/api/addons/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java @@ -5,12 +5,12 @@ import com.dfsek.terra.api.addon.BaseAddon; import java.nio.file.Path; -public interface BootstrapBaseAddon extends BaseAddon { +public interface BootstrapBaseAddon extends BaseAddon { /** * Load all the relevant addons in the specified path. * @param addonsFolder Path containing addons. * @param parent * @return Loaded addons */ - Iterable loadAddons(Path addonsFolder, ClassLoader parent); + Iterable loadAddons(Path addonsFolder, ClassLoader parent); } diff --git a/common/api/core/build.gradle.kts b/common/api/core/build.gradle.kts index dd0447e2c..3dd718a57 100644 --- a/common/api/core/build.gradle.kts +++ b/common/api/core/build.gradle.kts @@ -2,6 +2,7 @@ dependencies { "shadedApi"(project(":common:api:util")) "shadedApi"(project(":common:api:noise")) "shadedApi"(project(":common:api:registry")) + "shadedApi"(project(":common:api:addons")) "shadedApi"("com.dfsek:Paralithic:0.5.0") diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/Platform.java b/common/api/core/src/main/java/com/dfsek/terra/api/Platform.java index a7450b988..0a9804869 100644 --- a/common/api/core/src/main/java/com/dfsek/terra/api/Platform.java +++ b/common/api/core/src/main/java/com/dfsek/terra/api/Platform.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api; import java.io.File; +import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.PluginConfig; @@ -47,7 +48,7 @@ public interface Platform extends LoaderRegistrar { CheckedRegistry getConfigRegistry(); - Registry getAddons(); + Registry getAddons(); ItemHandle getItemHandle(); diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/addon/TerraAddon.java b/common/api/core/src/main/java/com/dfsek/terra/api/addon/TerraAddon.java index 023ffde61..0cb3e5ba9 100644 --- a/common/api/core/src/main/java/com/dfsek/terra/api/addon/TerraAddon.java +++ b/common/api/core/src/main/java/com/dfsek/terra/api/addon/TerraAddon.java @@ -11,7 +11,7 @@ import com.dfsek.terra.api.addon.annotations.Version; /** * Represents an entry point for an com.dfsek.terra.addon. Implementations must be annotated with {@link Addon}. */ -public abstract class TerraAddon { +public abstract class TerraAddon implements BaseAddon { /** * Invoked immediately after an com.dfsek.terra.addon is loaded. */ @@ -50,4 +50,9 @@ public abstract class TerraAddon { // .dfsek.terra.addon loader. return addon.value(); } + + @Override + public String getID() { + return getName(); + } } diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java b/common/api/core/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java index f666b7571..44b838880 100644 --- a/common/api/core/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java +++ b/common/api/core/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.event.functional; +import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.event.EventHandler; import com.dfsek.terra.api.event.events.Event; @@ -7,7 +8,7 @@ import com.dfsek.terra.api.util.reflection.TypeKey; public interface FunctionalEventHandler extends EventHandler { - EventContext register(TerraAddon addon, Class clazz); + EventContext register(BaseAddon addon, Class clazz); - EventContext register(TerraAddon addon, TypeKey clazz); + EventContext register(BaseAddon addon, TypeKey clazz); } diff --git a/common/implementation/src/main/java/com/dfsek/terra/AbstractPlatform.java b/common/implementation/src/main/java/com/dfsek/terra/AbstractPlatform.java index f16bae1c2..32007dd67 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/AbstractPlatform.java +++ b/common/implementation/src/main/java/com/dfsek/terra/AbstractPlatform.java @@ -2,8 +2,16 @@ package com.dfsek.terra; import com.dfsek.tectonic.loading.TypeRegistry; +import com.dfsek.terra.addon.BootstrapAddonLoader; import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.addon.BaseAddon; + +import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; +import com.dfsek.terra.api.event.functional.FunctionalEventHandler; +import com.dfsek.terra.registry.LockedRegistryImpl; +import com.dfsek.terra.registry.OpenRegistryImpl; + import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.yaml.snakeyaml.Yaml; @@ -40,7 +48,6 @@ import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.event.EventManagerImpl; import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.CheckedRegistryImpl; -import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.util.logging.DebugLogger; @@ -66,7 +73,9 @@ public abstract class AbstractPlatform implements Platform { private final CommandManager manager = new TerraCommandManager(this); - private final AddonRegistry addonRegistry = new AddonRegistry(this); + private final CheckedRegistry addonRegistry = new CheckedRegistryImpl<>(new OpenRegistryImpl<>()); + + private final Registry lockedAddonRegistry = new LockedRegistryImpl<>(addonRegistry); private final Lazy logger = Lazy.lazy(this::createLogger); private final Lazy debugLogger = Lazy.lazy(() -> new DebugLogger(logger())); @@ -97,8 +106,8 @@ public abstract class AbstractPlatform implements Platform { } @Override - public Registry getAddons() { - return addonRegistry; + public Registry getAddons() { + return lockedAddonRegistry; } @Override @@ -126,7 +135,7 @@ public abstract class AbstractPlatform implements Platform { logger().info("Initializing Terra..."); - getPlatformAddon().ifPresent(addonRegistry::register); + getPlatformAddon().ifPresent(addon -> addonRegistry.register(addon.getID(), addon)); try(InputStream stream = getClass().getResourceAsStream("/config.yml")) { File configFile = new File(getDataFolder(), "config.yml"); @@ -181,11 +190,25 @@ public abstract class AbstractPlatform implements Platform { profiler.start(); } - addonRegistry.register(new InternalAddon(this)); + InternalAddon internalAddon = new InternalAddon(); + + addonRegistry.register(internalAddon.getID(), internalAddon); - if(!addonRegistry.loadAll(getClass().getClassLoader())) { // load all addons - throw new IllegalStateException("Failed to load addons. Please correct addon installations to continue."); - } + BootstrapAddonLoader bootstrapAddonLoader = new BootstrapAddonLoader(); + + + eventManager + .getHandler(FunctionalEventHandler.class) + .register(internalAddon, PlatformInitializationEvent.class) + .then(event -> { + logger().info("Loading config packs..."); + getRawConfigRegistry().loadAll(this); + logger().info("Loaded packs."); + }) + .global(); + + + logger().info("Loaded addons."); try { @@ -200,7 +223,7 @@ public abstract class AbstractPlatform implements Platform { protected abstract Logger createLogger(); - protected Optional getPlatformAddon() { + protected Optional getPlatformAddon() { return Optional.empty(); } diff --git a/common/implementation/src/main/java/com/dfsek/terra/InternalAddon.java b/common/implementation/src/main/java/com/dfsek/terra/InternalAddon.java index f8a888c0b..ccd9b0a0b 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/InternalAddon.java +++ b/common/implementation/src/main/java/com/dfsek/terra/InternalAddon.java @@ -1,5 +1,6 @@ package com.dfsek.terra; +import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.addon.annotations.Addon; import com.dfsek.terra.api.addon.annotations.Author; @@ -8,26 +9,9 @@ import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -@Addon("terra") -@Author("Terra") -@Version("1.0.0") -public class InternalAddon extends TerraAddon { - private final AbstractPlatform main; - - public InternalAddon(AbstractPlatform main) { - this.main = main; - } - +public class InternalAddon implements BaseAddon { @Override - public void initialize() { - main.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, PlatformInitializationEvent.class) - .then(event -> { - main.logger().info("Loading config packs..."); - main.getRawConfigRegistry().loadAll(main); - main.logger().info("Loaded packs."); - }) - .global(); + public String getID() { + return "terra"; } } diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/implementation/src/main/java/com/dfsek/terra/config/GenericLoaders.java index 3099119f0..ee670eb33 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -5,6 +5,7 @@ import com.dfsek.tectonic.loading.TypeRegistry; import java.util.LinkedHashMap; import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; @@ -33,7 +34,7 @@ public class GenericLoaders implements LoaderRegistrar { .registerLoader(LinkedHashMap.class, new LinkedHashMapLoader()); if(platform != null) { - registry.registerLoader(TerraAddon.class, platform.getAddons()) + registry.registerLoader(BaseAddon.class, platform.getAddons()) .registerLoader(BlockType.class, (t, object, cf) -> platform.getWorldHandle().createBlockData((String) object).getBlockType()) .registerLoader(BlockState.class, (t, object, cf) -> platform.getWorldHandle().createBlockData((String) object)); diff --git a/common/implementation/src/main/java/com/dfsek/terra/registry/master/AddonRegistry.java b/common/implementation/src/main/java/com/dfsek/terra/registry/master/AddonRegistry.java index ca2aa3e5b..ed593712e 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/registry/master/AddonRegistry.java +++ b/common/implementation/src/main/java/com/dfsek/terra/registry/master/AddonRegistry.java @@ -48,10 +48,6 @@ public class AddonRegistry extends OpenRegistryImpl { return register(addon.getName(), addon); } - public boolean loadAll() { - return loadAll(Platform.class.getClassLoader()); - } - public boolean loadAll(ClassLoader parent) { InjectorImpl pluginInjector = new InjectorImpl<>(platform); pluginInjector.addExplicitTarget(Platform.class); diff --git a/common/loader/addon/src/main/java/com/dfsek/terra/addon/BootstrapAddonLoader.java b/common/loader/addon/src/main/java/com/dfsek/terra/addon/BootstrapAddonLoader.java index bae341577..7075a5a64 100644 --- a/common/loader/addon/src/main/java/com/dfsek/terra/addon/BootstrapAddonLoader.java +++ b/common/loader/addon/src/main/java/com/dfsek/terra/addon/BootstrapAddonLoader.java @@ -1,7 +1,6 @@ package com.dfsek.terra.addon; import com.dfsek.terra.addon.exception.AddonLoadException; -import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.bootstrap.BootstrapBaseAddon; import java.io.IOException; @@ -14,9 +13,9 @@ import java.util.jar.JarFile; import java.util.stream.Collectors; -public class BootstrapAddonLoader implements BootstrapBaseAddon { +public class BootstrapAddonLoader implements BootstrapBaseAddon> { @Override - public Iterable loadAddons(Path addonsFolder, ClassLoader parent) { + public Iterable> loadAddons(Path addonsFolder, ClassLoader parent) { Path bootstrapAddons = addonsFolder.resolve("bootstrap"); try { @@ -33,7 +32,7 @@ public class BootstrapAddonLoader implements BootstrapBaseAddon { if(!(in instanceof BootstrapBaseAddon)) { throw new AddonLoadException(in.getClass() + " does not extend " + BootstrapBaseAddon.class); } - return (BaseAddon) in; + return (BootstrapBaseAddon) in; } catch(InvocationTargetException e) { throw new AddonLoadException("Exception occurred while instantiating addon: ", e); } catch(NoSuchMethodException | IllegalAccessException | InstantiationException e) {