mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-04 00:45:57 +00:00
create AbstractTerraPlugin
This commit is contained in:
parent
7f3a7645bd
commit
e8ee7bc64f
@ -0,0 +1,9 @@
|
|||||||
|
package com.dfsek.terra.api.event.events.platform;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.event.events.Event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the platform is initialized.
|
||||||
|
*/
|
||||||
|
public class PlatformInitializationEvent implements Event {
|
||||||
|
}
|
@ -0,0 +1,151 @@
|
|||||||
|
package com.dfsek.terra;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.loading.TypeRegistry;
|
||||||
|
import com.dfsek.terra.api.Logger;
|
||||||
|
import com.dfsek.terra.api.TerraPlugin;
|
||||||
|
import com.dfsek.terra.api.addon.TerraAddon;
|
||||||
|
import com.dfsek.terra.api.command.CommandManager;
|
||||||
|
import com.dfsek.terra.api.command.exception.MalformedCommandException;
|
||||||
|
import com.dfsek.terra.api.config.ConfigPack;
|
||||||
|
import com.dfsek.terra.api.config.PluginConfig;
|
||||||
|
import com.dfsek.terra.api.event.EventManager;
|
||||||
|
import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent;
|
||||||
|
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
|
||||||
|
import com.dfsek.terra.api.profiler.Profiler;
|
||||||
|
import com.dfsek.terra.api.registry.CheckedRegistry;
|
||||||
|
import com.dfsek.terra.api.registry.Registry;
|
||||||
|
import com.dfsek.terra.api.util.generic.Construct;
|
||||||
|
import com.dfsek.terra.api.util.generic.Lazy;
|
||||||
|
import com.dfsek.terra.commands.CommandUtil;
|
||||||
|
import com.dfsek.terra.commands.TerraCommandManager;
|
||||||
|
import com.dfsek.terra.config.GenericLoaders;
|
||||||
|
import com.dfsek.terra.config.PluginConfigImpl;
|
||||||
|
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;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skeleton implementation of {@link TerraPlugin}
|
||||||
|
*/
|
||||||
|
public abstract class AbstractTerraPlugin implements TerraPlugin {
|
||||||
|
private final Lazy<DebugLogger> debugLogger = Lazy.of(() -> new DebugLogger(logger()));
|
||||||
|
private final EventManager eventManager = new EventManagerImpl(this);
|
||||||
|
|
||||||
|
private final ConfigRegistry configRegistry = new ConfigRegistry();
|
||||||
|
|
||||||
|
private final CheckedRegistry<ConfigPack> checkedConfigRegistry = new CheckedRegistryImpl<>(configRegistry);
|
||||||
|
|
||||||
|
private final Profiler profiler = new ProfilerImpl();
|
||||||
|
|
||||||
|
private final GenericLoaders loaders = new GenericLoaders(this);
|
||||||
|
|
||||||
|
private final PluginConfigImpl config = new PluginConfigImpl();
|
||||||
|
|
||||||
|
private final CommandManager manager = new TerraCommandManager(this);
|
||||||
|
|
||||||
|
private final AddonRegistry addonRegistry = Construct.construct(() -> {
|
||||||
|
Optional<TerraAddon> addon = getPlatformAddon();
|
||||||
|
AddonRegistry registry = addon.map(terraAddon -> new AddonRegistry(terraAddon, this)).orElseGet(() -> new AddonRegistry(this));
|
||||||
|
InternalAddon internalAddon = new InternalAddon(this);
|
||||||
|
registry.register(internalAddon);
|
||||||
|
return registry;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
public AbstractTerraPlugin() {
|
||||||
|
logger().info("Initializing Terra...");
|
||||||
|
|
||||||
|
config.load(this); // load config.yml
|
||||||
|
|
||||||
|
LangUtil.load(config.getLanguage(), this); // load language
|
||||||
|
|
||||||
|
debugLogger.value().setDebug(config.isDebugLogging()); // enable debug logger if applicable
|
||||||
|
|
||||||
|
if(config.isDebugProfiler()) { // if debug.profiler is enabled, start profiling
|
||||||
|
profiler.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!addonRegistry.loadAll(getClass().getClassLoader())) { // load all addons
|
||||||
|
throw new IllegalStateException("Failed to load addons. Please correct addon installations to continue.");
|
||||||
|
}
|
||||||
|
logger().info("Loaded addons.");
|
||||||
|
|
||||||
|
try {
|
||||||
|
CommandUtil.registerAll(manager);
|
||||||
|
} catch(MalformedCommandException e) {
|
||||||
|
e.printStackTrace(); // TODO do something here even though this should literally never happen
|
||||||
|
}
|
||||||
|
|
||||||
|
eventManager
|
||||||
|
.getHandler(FunctionalEventHandler.class);
|
||||||
|
/**/
|
||||||
|
|
||||||
|
|
||||||
|
logger().info("Finished initialization.");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Optional<TerraAddon> getPlatformAddon() {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PluginConfig getTerraConfig() {
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CheckedRegistry<ConfigPack> getConfigRegistry() {
|
||||||
|
return checkedConfigRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Registry<TerraAddon> getAddons() {
|
||||||
|
return addonRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigRegistry getRawConfigRegistry() {
|
||||||
|
return configRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveDefaultConfig() {
|
||||||
|
try(InputStream stream = getClass().getResourceAsStream("/config.yml")) {
|
||||||
|
File configFile = new File(getDataFolder(), "config.yml");
|
||||||
|
if(!configFile.exists()) {
|
||||||
|
FileUtils.copyInputStreamToFile(stream, configFile);
|
||||||
|
}
|
||||||
|
} catch(IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Logger getDebugLogger() {
|
||||||
|
return debugLogger.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EventManager getEventManager() {
|
||||||
|
return eventManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Profiler getProfiler() {
|
||||||
|
return profiler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void register(TypeRegistry registry) {
|
||||||
|
loaders.register(registry);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package com.dfsek.terra;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.TerraPlugin;
|
||||||
|
import com.dfsek.terra.api.addon.TerraAddon;
|
||||||
|
import com.dfsek.terra.api.addon.annotations.Addon;
|
||||||
|
import com.dfsek.terra.api.addon.annotations.Author;
|
||||||
|
import com.dfsek.terra.api.addon.annotations.Version;
|
||||||
|
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 AbstractTerraPlugin main;
|
||||||
|
|
||||||
|
public InternalAddon(AbstractTerraPlugin main) {
|
||||||
|
this.main = main;
|
||||||
|
}
|
||||||
|
|
||||||
|
@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();
|
||||||
|
}
|
||||||
|
}
|
@ -27,7 +27,7 @@ public class AddonRegistry extends OpenRegistryImpl<TerraAddon> {
|
|||||||
|
|
||||||
public AddonRegistry(TerraAddon addon, TerraPlugin main) {
|
public AddonRegistry(TerraAddon addon, TerraPlugin main) {
|
||||||
this.main = main;
|
this.main = main;
|
||||||
register(addon.getName(), addon);
|
register(addon);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -38,6 +38,10 @@ public class AddonRegistry extends OpenRegistryImpl<TerraAddon> {
|
|||||||
return super.register(identifier, addon);
|
return super.register(identifier, addon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean register(TerraAddon addon) {
|
||||||
|
return register(addon.getName(), addon);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clear() {
|
public void clear() {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
|
@ -36,7 +36,7 @@ import com.dfsek.terra.event.EventManagerImpl;
|
|||||||
import com.dfsek.terra.fabric.config.PostLoadCompatibilityOptions;
|
import com.dfsek.terra.fabric.config.PostLoadCompatibilityOptions;
|
||||||
import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions;
|
import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions;
|
||||||
import com.dfsek.terra.fabric.event.BiomeRegistrationEvent;
|
import com.dfsek.terra.fabric.event.BiomeRegistrationEvent;
|
||||||
import com.dfsek.terra.fabric.event.GameInitializationEvent;
|
import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent;
|
||||||
import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper;
|
import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper;
|
||||||
import com.dfsek.terra.fabric.generation.PopulatorFeature;
|
import com.dfsek.terra.fabric.generation.PopulatorFeature;
|
||||||
import com.dfsek.terra.fabric.generation.TerraBiomeSource;
|
import com.dfsek.terra.fabric.generation.TerraBiomeSource;
|
||||||
@ -315,17 +315,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
|
|||||||
logger.info("Biomes registered.");
|
logger.info("Biomes registered.");
|
||||||
})
|
})
|
||||||
.global();
|
.global();
|
||||||
|
|
||||||
eventManager
|
|
||||||
.getHandler(FunctionalEventHandler.class)
|
|
||||||
.register(this, GameInitializationEvent.class)
|
|
||||||
.then(event -> {
|
|
||||||
TerraFabricPlugin main = TerraFabricPlugin.getInstance();
|
|
||||||
main.logger().info("Loading config packs...");
|
|
||||||
configRegistry.loadAll(TerraFabricPlugin.this);
|
|
||||||
logger.info("Loaded packs.");
|
|
||||||
})
|
|
||||||
.global();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
package com.dfsek.terra.fabric.event;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.event.events.Event;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the game is initialized and packs should be registered.
|
|
||||||
*/
|
|
||||||
public class GameInitializationEvent implements Event {
|
|
||||||
}
|
|
@ -1,7 +1,7 @@
|
|||||||
package com.dfsek.terra.fabric.mixin.lifecycle.client;
|
package com.dfsek.terra.fabric.mixin.lifecycle.client;
|
||||||
|
|
||||||
import com.dfsek.terra.fabric.TerraFabricPlugin;
|
import com.dfsek.terra.fabric.TerraFabricPlugin;
|
||||||
import com.dfsek.terra.fabric.event.GameInitializationEvent;
|
import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent;
|
||||||
import com.dfsek.terra.fabric.generation.TerraGeneratorType;
|
import com.dfsek.terra.fabric.generation.TerraGeneratorType;
|
||||||
import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor;
|
import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
@ -19,7 +19,7 @@ public class MinecraftClientMixin {
|
|||||||
target = "Lnet/minecraft/client/util/WindowProvider;createWindow(Lnet/minecraft/client/WindowSettings;Ljava/lang/String;Ljava/lang/String;)Lnet/minecraft/client/util/Window;", // sorta arbitrary position, after mod init, before window opens
|
target = "Lnet/minecraft/client/util/WindowProvider;createWindow(Lnet/minecraft/client/WindowSettings;Ljava/lang/String;Ljava/lang/String;)Lnet/minecraft/client/util/Window;", // sorta arbitrary position, after mod init, before window opens
|
||||||
shift = At.Shift.BEFORE))
|
shift = At.Shift.BEFORE))
|
||||||
public void injectConstructor(RunArgs args, CallbackInfo callbackInfo) {
|
public void injectConstructor(RunArgs args, CallbackInfo callbackInfo) {
|
||||||
TerraFabricPlugin.getInstance().getEventManager().callEvent(new GameInitializationEvent());
|
TerraFabricPlugin.getInstance().getEventManager().callEvent(new PlatformInitializationEvent());
|
||||||
TerraFabricPlugin.getInstance().getConfigRegistry().forEach(pack -> {
|
TerraFabricPlugin.getInstance().getConfigRegistry().forEach(pack -> {
|
||||||
final GeneratorType generatorType = new TerraGeneratorType(pack);
|
final GeneratorType generatorType = new TerraGeneratorType(pack);
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package com.dfsek.terra.fabric.mixin.lifecycle.server;
|
package com.dfsek.terra.fabric.mixin.lifecycle.server;
|
||||||
|
|
||||||
import com.dfsek.terra.fabric.TerraFabricPlugin;
|
import com.dfsek.terra.fabric.TerraFabricPlugin;
|
||||||
import com.dfsek.terra.fabric.event.GameInitializationEvent;
|
import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent;
|
||||||
import net.minecraft.server.Main;
|
import net.minecraft.server.Main;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
@ -12,6 +12,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
public class ServerMainMixin {
|
public class ServerMainMixin {
|
||||||
@Inject(method = "main([Ljava/lang/String;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/registry/DynamicRegistryManager;create()Lnet/minecraft/util/registry/DynamicRegistryManager$Impl;"))
|
@Inject(method = "main([Ljava/lang/String;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/registry/DynamicRegistryManager;create()Lnet/minecraft/util/registry/DynamicRegistryManager$Impl;"))
|
||||||
private static void injectConstructor(String[] args, CallbackInfo ci) {
|
private static void injectConstructor(String[] args, CallbackInfo ci) {
|
||||||
TerraFabricPlugin.getInstance().getEventManager().callEvent(new GameInitializationEvent()); // Load during MinecraftServer construction, after other mods have registered blocks and stuff
|
TerraFabricPlugin.getInstance().getEventManager().callEvent(new PlatformInitializationEvent()); // Load during MinecraftServer construction, after other mods have registered blocks and stuff
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user