convert all addons to use monad initialiser

This commit is contained in:
dfsek
2022-08-16 14:36:03 -07:00
parent 45c3729392
commit 74f9c4f9b1
29 changed files with 953 additions and 855 deletions
@@ -10,58 +10,59 @@ import com.dfsek.terra.addons.biome.extrusion.config.BiomeExtrusionTemplate;
import com.dfsek.terra.addons.biome.extrusion.config.ReplaceableBiomeLoader; import com.dfsek.terra.addons.biome.extrusion.config.ReplaceableBiomeLoader;
import com.dfsek.terra.addons.biome.extrusion.config.extrusions.ReplaceExtrusionTemplate; import com.dfsek.terra.addons.biome.extrusion.config.extrusions.ReplaceExtrusionTemplate;
import com.dfsek.terra.addons.biome.extrusion.config.extrusions.SetExtrusionTemplate; import com.dfsek.terra.addons.biome.extrusion.config.extrusions.SetExtrusionTemplate;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.Registry;
import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.util.generic.Construct;
import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class BiomeExtrusionAddon implements AddonInitializer { public class BiomeExtrusionAddon implements MonadAddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<Extrusion>>> EXTRUSION_REGISTRY_KEY = new TypeKey<>() { public static final TypeKey<Supplier<ObjectTemplate<Extrusion>>> EXTRUSION_REGISTRY_KEY = new TypeKey<>() {
}; };
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() { public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
}; };
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> { Get.platform(),
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = ((functionalEventHandler, base, platform) -> Init.ofPure(Construct.construct(() -> {
event.getPack() functionalEventHandler.register(base, ConfigPackPostLoadEvent.class)
.getOrCreateRegistry(PROVIDER_REGISTRY_KEY); .then(event -> {
providerRegistry.register(addon.key("EXTRUSION"), BiomeExtrusionTemplate::new); Registry<Biome> biomeRegistry = event.getPack().getRegistry(Biome.class);
}) event.getPack().applyLoader(ReplaceableBiome.class,
.then(event -> { new ReplaceableBiomeLoader(biomeRegistry));
CheckedRegistry<Supplier<ObjectTemplate<Extrusion>>> extrusionRegistry = event.getPack().getOrCreateRegistry( });
EXTRUSION_REGISTRY_KEY); return functionalEventHandler.register(base, ConfigPackPreLoadEvent.class)
extrusionRegistry.register(addon.key("SET"), SetExtrusionTemplate::new); .then(event -> {
extrusionRegistry.register(addon.key("REPLACE"), ReplaceExtrusionTemplate::new); CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry =
}) event.getPack()
.failThrough(); .getOrCreateRegistry(PROVIDER_REGISTRY_KEY);
providerRegistry.register(base.key("EXTRUSION"), BiomeExtrusionTemplate::new);
platform.getEventManager() })
.getHandler(FunctionalEventHandler.class) .then(event -> {
.register(addon, ConfigPackPostLoadEvent.class) CheckedRegistry<Supplier<ObjectTemplate<Extrusion>>> extrusionRegistry =
.then(event -> { event.getPack().getOrCreateRegistry(
Registry<Biome> biomeRegistry = event.getPack().getRegistry(Biome.class); EXTRUSION_REGISTRY_KEY);
event.getPack().applyLoader(ReplaceableBiome.class, new ReplaceableBiomeLoader(biomeRegistry)); extrusionRegistry.register(base.key("SET"), SetExtrusionTemplate::new);
}); extrusionRegistry.register(base.key("REPLACE"), ReplaceExtrusionTemplate::new);
})
.failThrough();
}))
));
} }
} }
@@ -11,39 +11,42 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class ImageBiomeProviderAddon implements AddonInitializer { public class ImageBiomeProviderAddon implements MonadAddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() { public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
}; };
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> { Get.platform(),
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry( ((functionalEventHandler, base, platform) -> Init.ofPure(
PROVIDER_REGISTRY_KEY); functionalEventHandler.register(base, ConfigPackPreLoadEvent.class)
providerRegistry.register(addon.key("IMAGE"), .then(event -> {
() -> new ImageProviderTemplate(event.getPack().getRegistry(Biome.class))); CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(
}) PROVIDER_REGISTRY_KEY);
.failThrough(); providerRegistry.register(base.key("IMAGE"),
() -> new ImageProviderTemplate(event.getPack().getRegistry(Biome.class)));
})
.failThrough()))
);
} }
} }
@@ -23,7 +23,10 @@ import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceListMut
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceMutatorTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.ReplaceMutatorTemplate;
import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.SmoothMutatorTemplate; import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.SmoothMutatorTemplate;
import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource; import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent;
@@ -32,12 +35,14 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.Registry;
import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.util.generic.Construct;
import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class BiomePipelineAddon implements AddonInitializer { public class BiomePipelineAddon implements MonadAddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<BiomeSource>>> SOURCE_REGISTRY_KEY = new TypeKey<>() { public static final TypeKey<Supplier<ObjectTemplate<BiomeSource>>> SOURCE_REGISTRY_KEY = new TypeKey<>() {
}; };
@@ -46,44 +51,47 @@ public class BiomePipelineAddon implements AddonInitializer {
}; };
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() { public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
}; };
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> { ((functionalEventHandler, base) -> Init.ofPure(Construct.construct(() -> {
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry( functionalEventHandler.register(base, ConfigPackPreLoadEvent.class)
PROVIDER_REGISTRY_KEY); .then(event -> {
providerRegistry.register(addon.key("PIPELINE"), BiomePipelineTemplate::new); CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry =
}) event.getPack().getOrCreateRegistry(
.then(event -> { PROVIDER_REGISTRY_KEY);
CheckedRegistry<Supplier<ObjectTemplate<BiomeSource>>> sourceRegistry = event.getPack().getOrCreateRegistry( providerRegistry.register(base.key("PIPELINE"), BiomePipelineTemplate::new);
SOURCE_REGISTRY_KEY); })
sourceRegistry.register(addon.key("SAMPLER"), SamplerSourceTemplate::new); .then(event -> {
}) CheckedRegistry<Supplier<ObjectTemplate<BiomeSource>>> sourceRegistry =
.then(event -> { event.getPack().getOrCreateRegistry(
CheckedRegistry<Supplier<ObjectTemplate<Stage>>> stageRegistry = event.getPack().getOrCreateRegistry( SOURCE_REGISTRY_KEY);
STAGE_REGISTRY_KEY); sourceRegistry.register(base.key("SAMPLER"), SamplerSourceTemplate::new);
stageRegistry.register(addon.key("FRACTAL_EXPAND"), ExpanderStageTemplate::new); })
stageRegistry.register(addon.key("SMOOTH"), SmoothMutatorTemplate::new); .then(event -> {
stageRegistry.register(addon.key("REPLACE"), ReplaceMutatorTemplate::new); CheckedRegistry<Supplier<ObjectTemplate<Stage>>> stageRegistry =
stageRegistry.register(addon.key("REPLACE_LIST"), ReplaceListMutatorTemplate::new); event.getPack().getOrCreateRegistry(
stageRegistry.register(addon.key("BORDER"), BorderMutatorTemplate::new); STAGE_REGISTRY_KEY);
stageRegistry.register(addon.key("BORDER_LIST"), BorderListMutatorTemplate::new); stageRegistry.register(base.key("FRACTAL_EXPAND"), ExpanderStageTemplate::new);
}) stageRegistry.register(base.key("SMOOTH"), SmoothMutatorTemplate::new);
.failThrough(); stageRegistry.register(base.key("REPLACE"), ReplaceMutatorTemplate::new);
platform.getEventManager() stageRegistry.register(base.key("REPLACE_LIST"), ReplaceListMutatorTemplate::new);
.getHandler(FunctionalEventHandler.class) stageRegistry.register(base.key("BORDER"), BorderMutatorTemplate::new);
.register(addon, ConfigPackPostLoadEvent.class) stageRegistry.register(base.key("BORDER_LIST"), BorderListMutatorTemplate::new);
.then(event -> { })
Registry<Biome> biomeRegistry = event.getPack().getRegistry(Biome.class); .failThrough();
event.getPack().applyLoader(BiomeDelegate.class, new BiomeDelegateLoader(biomeRegistry)); return functionalEventHandler.register(base, ConfigPackPostLoadEvent.class)
}); .then(event -> {
Registry<Biome> biomeRegistry = event.getPack().getRegistry(Biome.class);
event.getPack().applyLoader(BiomeDelegate.class,
new BiomeDelegateLoader(biomeRegistry));
});
})))
);
} }
} }
@@ -11,18 +11,22 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class SingleBiomeProviderAddon implements AddonInitializer { public class SingleBiomeProviderAddon implements MonadAddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() { public static final TypeKey<Supplier<ObjectTemplate<BiomeProvider>>> PROVIDER_REGISTRY_KEY = new TypeKey<>() {
}; };
@@ -33,15 +37,19 @@ public class SingleBiomeProviderAddon implements AddonInitializer {
private BaseAddon addon; private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> { Get.platform(),
CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry( ((handler, base, platform) -> Init.ofPure(
PROVIDER_REGISTRY_KEY); handler.register(addon, ConfigPackPreLoadEvent.class)
providerRegistry.register(addon.key("SINGLE"), SingleBiomeProviderTemplate::new); .then(event -> {
}) CheckedRegistry<Supplier<ObjectTemplate<BiomeProvider>>> providerRegistry = event.getPack().getOrCreateRegistry(
.failThrough(); PROVIDER_REGISTRY_KEY);
providerRegistry.register(addon.key("SINGLE"), SingleBiomeProviderTemplate::new);
})
.failThrough()))
);
} }
} }
@@ -4,43 +4,43 @@ import java.util.Collection;
import com.dfsek.terra.addons.biome.query.impl.BiomeTagFlattener; import com.dfsek.terra.addons.biome.query.impl.BiomeTagFlattener;
import com.dfsek.terra.addons.biome.query.impl.BiomeTagHolder; import com.dfsek.terra.addons.biome.query.impl.BiomeTagHolder;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.properties.Context; import com.dfsek.terra.api.properties.Context;
import com.dfsek.terra.api.properties.PropertyKey; import com.dfsek.terra.api.properties.PropertyKey;
import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.Biome;
public class BiomeQueryAPIAddon implements AddonInitializer { public class BiomeQueryAPIAddon implements MonadAddonInitializer {
public static PropertyKey<BiomeTagHolder> BIOME_TAG_KEY = Context.create(BiomeTagHolder.class); public static PropertyKey<BiomeTagHolder> BIOME_TAG_KEY = Context.create(BiomeTagHolder.class);
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
return Do.with(
platform.getEventManager() Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.getHandler(FunctionalEventHandler.class) Get.addon(),
.register(addon, ConfigPackPostLoadEvent.class) ((functionalEventHandler, base) -> Init.ofPure(
.then(event -> { functionalEventHandler.register(base, ConfigPackPostLoadEvent.class)
Collection<Biome> biomes = event .then(event -> {
.getPack() Collection<Biome> biomes = event
.getRegistry(Biome.class) .getPack()
.entries(); .getRegistry(Biome.class)
.entries();
BiomeTagFlattener flattener = new BiomeTagFlattener(biomes
.stream() BiomeTagFlattener flattener = new BiomeTagFlattener(
.flatMap(biome -> biome.getTags().stream()) biomes.stream()
.toList()); .flatMap(biome -> biome.getTags().stream())
.toList());
biomes.forEach(biome -> biome.getContext().put(BIOME_TAG_KEY, new BiomeTagHolder(biome, flattener)));
}) biomes.forEach(biome -> biome.getContext()
.global(); .put(BIOME_TAG_KEY, new BiomeTagHolder(biome, flattener)));
})
.global()
)));
} }
} }
@@ -14,60 +14,58 @@ import com.dfsek.terra.addons.chunkgenerator.config.palette.BiomePaletteTemplate
import com.dfsek.terra.addons.chunkgenerator.config.palette.PaletteInfo; import com.dfsek.terra.addons.chunkgenerator.config.palette.PaletteInfo;
import com.dfsek.terra.addons.chunkgenerator.config.palette.SlantLayer; import com.dfsek.terra.addons.chunkgenerator.config.palette.SlantLayer;
import com.dfsek.terra.addons.chunkgenerator.generation.NoiseChunkGenerator3D; import com.dfsek.terra.addons.chunkgenerator.generation.NoiseChunkGenerator3D;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.properties.Context; import com.dfsek.terra.api.properties.Context;
import com.dfsek.terra.api.properties.PropertyKey; import com.dfsek.terra.api.properties.PropertyKey;
import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.util.generic.Construct;
import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider; import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider;
public class NoiseChunkGenerator3DAddon implements AddonInitializer { public class NoiseChunkGenerator3DAddon implements MonadAddonInitializer {
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
PropertyKey<PaletteInfo> paletteInfoPropertyKey = Context.create(PaletteInfo.class); PropertyKey<PaletteInfo> paletteInfoPropertyKey = Context.create(PaletteInfo.class);
PropertyKey<BiomeNoiseProperties> noisePropertiesPropertyKey = Context.create(BiomeNoiseProperties.class); PropertyKey<BiomeNoiseProperties> noisePropertiesPropertyKey = Context.create(BiomeNoiseProperties.class);
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.priority(1000) Get.platform(),
.then(event -> { ((handler, base, platform) -> Init.ofPure(Construct.construct(() -> {
NoiseChunkGeneratorPackConfigTemplate config = event.loadTemplate(new NoiseChunkGeneratorPackConfigTemplate()); handler.register(base, ConfigPackPreLoadEvent.class)
.priority(1000)
event.getPack() .then(event -> {
.getOrCreateRegistry(ChunkGeneratorProvider.class) NoiseChunkGeneratorPackConfigTemplate config = event.loadTemplate(new NoiseChunkGeneratorPackConfigTemplate());
.register(addon.key("NOISE_3D"),
pack -> new NoiseChunkGenerator3D(pack, platform, config.getElevationBlend(), event.getPack()
config.getHorizontalRes(), .getOrCreateRegistry(ChunkGeneratorProvider.class)
config.getVerticalRes(), noisePropertiesPropertyKey, .register(base.key("NOISE_3D"),
paletteInfoPropertyKey)); pack -> new NoiseChunkGenerator3D(pack, platform, config.getElevationBlend(),
event.getPack() config.getHorizontalRes(),
.applyLoader(SlantLayer.class, SlantLayer::new); config.getVerticalRes(), noisePropertiesPropertyKey,
}) paletteInfoPropertyKey));
.failThrough(); event.getPack()
.applyLoader(SlantLayer.class, SlantLayer::new);
platform.getEventManager() })
.getHandler(FunctionalEventHandler.class) .failThrough();
.register(addon, ConfigurationLoadEvent.class) return handler.register(base, ConfigurationLoadEvent.class)
.then(event -> { .then(event -> {
if(event.is(Biome.class)) { if(event.is(Biome.class)) {
event.getLoadedObject(Biome.class).getContext().put(paletteInfoPropertyKey, event.getLoadedObject(Biome.class).getContext().put(paletteInfoPropertyKey,
event.load(new BiomePaletteTemplate(platform)).get()); event.load(new BiomePaletteTemplate(platform)).get());
event.getLoadedObject(Biome.class).getContext().put(noisePropertiesPropertyKey, event.getLoadedObject(Biome.class).getContext().put(noisePropertiesPropertyKey,
event.load(new BiomeNoiseConfigTemplate()).get()); event.load(new BiomeNoiseConfigTemplate()).get());
} }
}) })
.failThrough(); .failThrough();
}))));
} }
} }
@@ -3,7 +3,10 @@ package com.dfsek.terra.addons.commands.addons;
import cloud.commandframework.ArgumentDescription; import cloud.commandframework.ArgumentDescription;
import cloud.commandframework.CommandManager; import cloud.commandframework.CommandManager;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.command.CommandSender;
@@ -11,59 +14,64 @@ import com.dfsek.terra.api.command.arguments.RegistryArgument;
import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.util.function.monad.Monad;
public class AddonsCommandAddon implements AddonInitializer { public class AddonsCommandAddon implements MonadAddonInitializer {
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, CommandRegistrationEvent.class) Get.addon(),
.then(event -> { Get.platform(),
CommandManager<CommandSender> manager = event.getCommandManager(); ((functionalEventHandler, base, platform) -> Init.ofPure(
functionalEventHandler
manager.command( .register(base, CommandRegistrationEvent.class)
manager.commandBuilder("addons", ArgumentDescription.of("List installed Terra addons")) .then(event -> {
.permission("terra.addons") CommandManager<CommandSender> manager = event.getCommandManager();
.handler(context -> {
StringBuilder addons = new StringBuilder("Installed addons:\n"); manager.command(
platform.getAddons() manager.commandBuilder("addons", ArgumentDescription.of(
.forEach(addon -> addons "List installed Terra addons"))
.append(" - ") .permission("terra.addons")
.append(addon.getID()) .handler(context -> {
.append('@') StringBuilder addons = new StringBuilder(
.append(addon.getVersion().getFormatted()) "Installed addons:\n");
.append('\n')); platform.getAddons()
context.getSender().sendMessage(addons.toString()); .forEach(addon -> addons
}) .append(" - ")
) .append(addon.getID())
.command( .append('@')
manager.commandBuilder("addons") .append(addon.getVersion().getFormatted())
.argument(RegistryArgument.of("addon", platform.getAddons())) .append('\n'));
.permission("terra.addons.info") context.getSender().sendMessage(addons.toString());
.handler(context -> { })
BaseAddon addon = context.get("addon"); )
StringBuilder addonInfo = new StringBuilder("Addon ").append(addon.getID()).append('\n'); .command(
manager.commandBuilder("addons")
addonInfo.append("Version: ").append(addon.getVersion().getFormatted()).append('\n'); .argument(
RegistryArgument.of("addon", platform.getAddons()))
addonInfo.append("Dependencies:\n"); .permission("terra.addons.info")
addon.getDependencies().forEach((id, versions) -> addonInfo .handler(context -> {
.append(" - ") BaseAddon addon = context.get("addon");
.append(id) StringBuilder addonInfo = new StringBuilder(
.append('@') "Addon ").append(addon.getID()).append('\n');
.append(versions.getFormatted())
.append('\n')); addonInfo.append("Version: ").append(
context.getSender().sendMessage(addonInfo.toString()); addon.getVersion().getFormatted()).append('\n');
})
); addonInfo.append("Dependencies:\n");
}); addon.getDependencies().forEach(
(id, versions) -> addonInfo
.append(" - ")
.append(id)
.append('@')
.append(versions.getFormatted())
.append('\n'));
context.getSender().sendMessage(addonInfo.toString());
})
);
})))
);
} }
} }
@@ -2,10 +2,21 @@ package com.dfsek.terra.addons.commands.packs;
import cloud.commandframework.ArgumentDescription; import cloud.commandframework.ArgumentDescription;
import cloud.commandframework.CommandManager; import cloud.commandframework.CommandManager;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.command.CommandSender;
@@ -15,74 +26,73 @@ import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import java.util.function.Supplier;
public class PacksCommandAddon implements AddonInitializer {
public class PacksCommandAddon implements MonadAddonInitializer {
private static final Logger logger = LoggerFactory.getLogger(PacksCommandAddon.class); private static final Logger logger = LoggerFactory.getLogger(PacksCommandAddon.class);
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, CommandRegistrationEvent.class) Get.addon(),
.then(event -> { Get.platform(),
CommandManager<CommandSender> manager = event.getCommandManager(); ((functionalEventHandler, base, platform) -> Init.ofPure(
functionalEventHandler.register(base, CommandRegistrationEvent.class)
manager.command( .then(event -> {
manager.commandBuilder("packs", ArgumentDescription.of("List installed config packs")) CommandManager<CommandSender> manager = event.getCommandManager();
.permission("terra.packs")
.handler(context -> { manager.command(
StringBuilder packs = new StringBuilder("Installed packs:\n"); manager.commandBuilder("packs", ArgumentDescription.of("List installed config packs"))
platform.getConfigRegistry().forEach(pack -> packs.append(" - ") .permission("terra.packs")
.append(pack.getID()) .handler(context -> {
.append('@') StringBuilder packs = new StringBuilder("Installed packs:\n");
.append(pack.getVersion().getFormatted())); platform.getConfigRegistry().forEach(pack -> packs.append(" - ")
context.getSender().sendMessage(packs.toString()); .append(pack.getID())
}) .append('@')
) .append(pack.getVersion().getFormatted()));
.command( context.getSender().sendMessage(packs.toString());
manager.commandBuilder("packs") })
.literal("info", ArgumentDescription.of("Get information about a pack")) )
.permission("terra.packs.info") .command(
.argument(RegistryArgument.of("pack", platform.getConfigRegistry())) manager.commandBuilder("packs")
.handler(context -> { .literal("info", ArgumentDescription.of("Get information about a pack"))
ConfigPack pack = context.get("pack"); .permission("terra.packs.info")
StringBuilder packInfo = new StringBuilder("Pack ").append(pack.getID()).append('\n'); .argument(RegistryArgument.of("pack", platform.getConfigRegistry()))
.handler(context -> {
packInfo.append("Version: ").append(pack.getVersion().getFormatted()).append('\n'); ConfigPack pack = context.get("pack");
packInfo.append("Author: ").append(pack.getAuthor()).append('\n'); StringBuilder packInfo = new StringBuilder("Pack ").append(pack.getID()).append('\n');
packInfo.append("Addon Dependencies:\n"); packInfo.append("Version: ").append(pack.getVersion().getFormatted()).append('\n');
pack.addons().forEach((id, versions) -> packInfo packInfo.append("Author: ").append(pack.getAuthor()).append('\n');
.append(" - ")
.append(id.getID()) packInfo.append("Addon Dependencies:\n");
.append('@') pack.addons().forEach((id, versions) -> packInfo
.append(versions.getFormatted()) .append(" - ")
.append('\n')); .append(id.getID())
context.getSender().sendMessage(packInfo.toString()); .append('@')
})) .append(versions.getFormatted())
.command( .append('\n'));
manager.commandBuilder("packs") context.getSender().sendMessage(packInfo.toString());
.literal("reload", ArgumentDescription.of("Reload config packs")) }))
.permission("terra.packs.reload") .command(
.handler(context -> { manager.commandBuilder("packs")
context.getSender().sendMessage("Reloading Terra..."); .literal("reload", ArgumentDescription.of("Reload config packs"))
logger.info("Reloading Terra..."); .permission("terra.packs.reload")
if(platform.reload()) { .handler(context -> {
logger.info("Terra reloaded successfully."); context.getSender().sendMessage("Reloading Terra...");
context.getSender().sendMessage("Terra reloaded successfully."); logger.info("Reloading Terra...");
} else { if(platform.reload()) {
logger.error("Terra failed to reload."); logger.info("Terra reloaded successfully.");
context.getSender().sendMessage( context.getSender().sendMessage("Terra reloaded successfully.");
"Terra failed to reload. See logs for more information."); } else {
} logger.error("Terra failed to reload.");
})); context.getSender().sendMessage(
}); "Terra failed to reload. See logs for more information.");
}
}));
})))
);
} }
} }
@@ -2,10 +2,18 @@ package com.dfsek.terra.addons.commands.profiler;
import cloud.commandframework.ArgumentDescription; import cloud.commandframework.ArgumentDescription;
import cloud.commandframework.CommandManager; import cloud.commandframework.CommandManager;
import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.util.function.monad.Monad;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.command.CommandSender;
@@ -14,61 +22,58 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
public class ProfilerCommandAddon implements AddonInitializer { public class ProfilerCommandAddon implements MonadAddonInitializer {
private static final Logger logger = LoggerFactory.getLogger(ProfilerCommandAddon.class); private static final Logger logger = LoggerFactory.getLogger(ProfilerCommandAddon.class);
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, CommandRegistrationEvent.class) Get.addon(),
.then(event -> { Get.platform(),
CommandManager<CommandSender> manager = event.getCommandManager(); ((handler, base, platform) -> Init.ofPure(
manager handler.register(base, CommandRegistrationEvent.class)
.command( .then(event -> {
manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler")) CommandManager<CommandSender> manager = event.getCommandManager();
.literal("start", ArgumentDescription.of("Start profiling"), "st") manager
.permission("terra.profiler.start") .command(
.handler(context -> { manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler"))
platform.getProfiler().start(); .literal("start", ArgumentDescription.of("Start profiling"), "st")
context.getSender().sendMessage("Profiling started."); .permission("terra.profiler.start")
})) .handler(context -> {
.command( platform.getProfiler().start();
manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler")) context.getSender().sendMessage("Profiling started.");
.literal("stop", ArgumentDescription.of("Stop profiling"), "s") }))
.permission("terra.profiler.stop") .command(
.handler(context -> { manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler"))
platform.getProfiler().stop(); .literal("stop", ArgumentDescription.of("Stop profiling"), "s")
context.getSender().sendMessage("Profiling stopped."); .permission("terra.profiler.stop")
})) .handler(context -> {
.command( platform.getProfiler().stop();
manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler")) context.getSender().sendMessage("Profiling stopped.");
.literal("query", ArgumentDescription.of("Query profiler results"), "q") }))
.permission("terra.profiler.query") .command(
.handler(context -> { manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler"))
StringBuilder data = new StringBuilder("Terra Profiler data: \n"); .literal("query", ArgumentDescription.of("Query profiler results"), "q")
platform.getProfiler().getTimings().forEach((id, timings) -> data.append(id) .permission("terra.profiler.query")
.append(": ") .handler(context -> {
.append(timings.toString()) StringBuilder data = new StringBuilder("Terra Profiler data: \n");
.append('\n')); platform.getProfiler().getTimings().forEach((id, timings) -> data.append(id)
logger.info(data.toString()); .append(": ")
context.getSender().sendMessage("Profiling data dumped to console."); .append(timings.toString())
})) .append('\n'));
.command( logger.info(data.toString());
manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler")) context.getSender().sendMessage("Profiling data dumped to console.");
.literal("reset", ArgumentDescription.of("Reset the profiler"), "r") }))
.permission("terra.profiler.reset") .command(
.handler(context -> { manager.commandBuilder("profiler", ArgumentDescription.of("Access the profiler"))
platform.getProfiler().reset(); .literal("reset", ArgumentDescription.of("Reset the profiler"), "r")
context.getSender().sendMessage("Profiler reset."); .permission("terra.profiler.reset")
})); .handler(context -> {
}); platform.getProfiler().reset();
context.getSender().sendMessage("Profiler reset.");
}));
})))
);
} }
} }
@@ -8,60 +8,62 @@ import cloud.commandframework.context.CommandContext;
import java.util.Random; import java.util.Random;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.command.CommandSender;
import com.dfsek.terra.api.command.arguments.RegistryArgument; import com.dfsek.terra.api.command.arguments.RegistryArgument;
import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.Entity;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.Registry;
import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.util.Rotation; import com.dfsek.terra.api.util.Rotation;
import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.util.reflection.TypeKey;
public class StructureCommandAddon implements AddonInitializer { public class StructureCommandAddon implements MonadAddonInitializer {
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
private static Registry<Structure> getStructureRegistry(CommandContext<CommandSender> sender) { private static Registry<Structure> getStructureRegistry(CommandContext<CommandSender> sender) {
return sender.getSender().getEntity().orElseThrow().world().getPack().getRegistry(Structure.class); return sender.getSender().getEntity().orElseThrow().world().getPack().getRegistry(Structure.class);
} }
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, CommandRegistrationEvent.class) Get.addon(),
.then(event -> { ((handler, base) -> Init.ofPure(
CommandManager<CommandSender> manager = event.getCommandManager(); handler.register(base, CommandRegistrationEvent.class)
.then(event -> {
manager.command( CommandManager<CommandSender> manager = event.getCommandManager();
manager.commandBuilder("structures", ArgumentDescription.of("Manage or generate structures"))
.literal("generate") manager.command(
.argument(RegistryArgument.builder("structure", manager.commandBuilder("structures", ArgumentDescription.of("Manage or generate structures"))
StructureCommandAddon::getStructureRegistry, .literal("generate")
TypeKey.of(Structure.class))) .argument(RegistryArgument.builder("structure",
.argument(LongArgument.optional("seed", 0)) StructureCommandAddon::getStructureRegistry,
.argument(EnumArgument.optional(Rotation.class, "rotation", Rotation.NONE)) TypeKey.of(Structure.class)))
.handler(context -> { .argument(LongArgument.optional("seed", 0))
Structure structure = context.get("structure"); .argument(EnumArgument.optional(Rotation.class, "rotation", Rotation.NONE))
Entity sender = context.getSender().getEntity().orElseThrow(); .handler(context -> {
structure.generate( Structure structure = context.get("structure");
sender.position().toInt(), Entity sender = context.getSender().getEntity().orElseThrow();
sender.world(), structure.generate(
((Long) context.get("seed") == 0) ? new Random() : new Random(context.get("seed")), sender.position().toInt(),
context.get("rotation") sender.world(),
); ((Long) context.get("seed") == 0) ? new Random() : new Random(context.get("seed")),
}) context.get("rotation")
.permission("terra.structures.generate") );
); })
}); .permission("terra.structures.generate")
);
})))
);
} }
} }
@@ -9,30 +9,33 @@ package com.dfsek.terra.addons.biome;
import com.dfsek.terra.addons.biome.holder.PaletteHolder; import com.dfsek.terra.addons.biome.holder.PaletteHolder;
import com.dfsek.terra.addons.biome.holder.PaletteHolderLoader; import com.dfsek.terra.addons.biome.holder.PaletteHolderLoader;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.util.function.monad.Monad;
public class BiomeAddon implements AddonInitializer { public class BiomeAddon implements MonadAddonInitializer {
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> { Get.platform(),
event.getPack().registerConfigType(new BiomeConfigType(event.getPack()), addon.key("BIOME"), 1000); ((functionalEventHandler, base, platform) -> Init.ofPure(
event.getPack().applyLoader(PaletteHolder.class, new PaletteHolderLoader()); functionalEventHandler.register(base, ConfigPackPreLoadEvent.class)
}) .then(event -> {
.failThrough(); event.getPack().registerConfigType(new BiomeConfigType(event.getPack()),
base.key("BIOME"), 1000);
event.getPack().applyLoader(PaletteHolder.class, new PaletteHolderLoader());
})
.failThrough()
)));
} }
} }
@@ -21,7 +21,10 @@ import com.dfsek.terra.addons.feature.distributor.config.XorDistributorTemplate;
import com.dfsek.terra.addons.feature.distributor.config.YesDistributorTemplate; import com.dfsek.terra.addons.feature.distributor.config.YesDistributorTemplate;
import com.dfsek.terra.addons.feature.distributor.util.Point; import com.dfsek.terra.addons.feature.distributor.util.Point;
import com.dfsek.terra.addons.feature.distributor.util.PointTemplate; import com.dfsek.terra.addons.feature.distributor.util.PointTemplate;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
@@ -29,40 +32,39 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.structure.feature.Distributor; import com.dfsek.terra.api.structure.feature.Distributor;
import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.util.reflection.TypeKey;
public class DistributorAddon implements AddonInitializer { public class DistributorAddon implements MonadAddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<Distributor>>> DISTRIBUTOR_TOKEN = new TypeKey<>() { public static final TypeKey<Supplier<ObjectTemplate<Distributor>>> DISTRIBUTOR_TOKEN = new TypeKey<>() {
}; };
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> { ((functionalEventHandler, base) -> Init.ofPure(
CheckedRegistry<Supplier<ObjectTemplate<Distributor>>> distributorRegistry = event functionalEventHandler.register(base, ConfigPackPreLoadEvent.class)
.getPack() .then(event -> {
.getOrCreateRegistry(DISTRIBUTOR_TOKEN); CheckedRegistry<Supplier<ObjectTemplate<Distributor>>> distributorRegistry = event
.getPack()
distributorRegistry.register(addon.key("SAMPLER"), SamplerDistributorTemplate::new); .getOrCreateRegistry(DISTRIBUTOR_TOKEN);
distributorRegistry.register(addon.key("POINTS"), PointSetDistributorTemplate::new);
distributorRegistry.register(addon.key("PADDED_GRID"), PaddedGridDistributorTemplate::new); distributorRegistry.register(base.key("SAMPLER"), SamplerDistributorTemplate::new);
distributorRegistry.register(addon.key("AND"), AndDistributorTemplate::new); distributorRegistry.register(base.key("POINTS"), PointSetDistributorTemplate::new);
distributorRegistry.register(addon.key("OR"), OrDistributorTemplate::new); distributorRegistry.register(base.key("PADDED_GRID"), PaddedGridDistributorTemplate::new);
distributorRegistry.register(addon.key("XOR"), XorDistributorTemplate::new); distributorRegistry.register(base.key("AND"), AndDistributorTemplate::new);
distributorRegistry.register(addon.key("YES"), YesDistributorTemplate::new); distributorRegistry.register(base.key("OR"), OrDistributorTemplate::new);
distributorRegistry.register(addon.key("NO"), NoDistributorTemplate::new); distributorRegistry.register(base.key("XOR"), XorDistributorTemplate::new);
distributorRegistry.register(base.key("YES"), YesDistributorTemplate::new);
event.getPack() distributorRegistry.register(base.key("NO"), NoDistributorTemplate::new);
.applyLoader(Point.class, PointTemplate::new);
}) event.getPack()
.failThrough(); .applyLoader(Point.class, PointTemplate::new);
})
.failThrough()
)));
} }
} }
@@ -7,27 +7,30 @@
package com.dfsek.terra.addons.feature; package com.dfsek.terra.addons.feature;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.util.function.monad.Monad;
public class FeatureAddon implements AddonInitializer { public class FeatureAddon implements MonadAddonInitializer {
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> event.getPack().registerConfigType(new FeatureConfigType(), addon.key("FEATURE"), 500)) ((functionalEventHandler, base) -> Init.ofPure(
.failThrough(); functionalEventHandler.register(base, ConfigPackPreLoadEvent.class)
.then(event -> event.getPack()
.registerConfigType(new FeatureConfigType(), base.key("FEATURE"), 500))
.failThrough()))
);
} }
} }
@@ -9,30 +9,31 @@ package com.dfsek.terra.addons.flora;
import com.dfsek.terra.addons.flora.config.BlockLayerTemplate; import com.dfsek.terra.addons.flora.config.BlockLayerTemplate;
import com.dfsek.terra.addons.flora.flora.gen.BlockLayer; import com.dfsek.terra.addons.flora.flora.gen.BlockLayer;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.util.function.monad.Monad;
public class FloraAddon implements AddonInitializer { public class FloraAddon implements MonadAddonInitializer {
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> { ((functionalEventHandler, base) -> Init.ofPure(
event.getPack().registerConfigType(new FloraConfigType(), addon.key("FLORA"), 2); functionalEventHandler.register(base, ConfigPackPreLoadEvent.class)
event.getPack().applyLoader(BlockLayer.class, BlockLayerTemplate::new); .then(event -> {
}) event.getPack().registerConfigType(new FloraConfigType(), base.key("FLORA"), 2);
.failThrough(); event.getPack().applyLoader(BlockLayer.class, BlockLayerTemplate::new);
})
.failThrough()))
);
} }
} }
@@ -31,7 +31,10 @@ import com.dfsek.terra.addons.feature.locator.config.pattern.SingleBlockMatchPat
import com.dfsek.terra.addons.feature.locator.config.pattern.SolidMatchPatternTemplate; import com.dfsek.terra.addons.feature.locator.config.pattern.SolidMatchPatternTemplate;
import com.dfsek.terra.addons.feature.locator.config.pattern.XorPatternTemplate; import com.dfsek.terra.addons.feature.locator.config.pattern.XorPatternTemplate;
import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.addons.feature.locator.patterns.Pattern;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
@@ -39,56 +42,57 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.structure.feature.Locator;
import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.util.reflection.TypeKey;
public class LocatorAddon implements AddonInitializer { public class LocatorAddon implements MonadAddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<Locator>>> LOCATOR_TOKEN = new TypeKey<>() { public static final TypeKey<Supplier<ObjectTemplate<Locator>>> LOCATOR_TOKEN = new TypeKey<>() {
}; };
public static final TypeKey<Supplier<ObjectTemplate<Pattern>>> PATTERN_TOKEN = new TypeKey<>() { public static final TypeKey<Supplier<ObjectTemplate<Pattern>>> PATTERN_TOKEN = new TypeKey<>() {
}; };
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> { Get.platform(),
CheckedRegistry<Supplier<ObjectTemplate<Locator>>> locatorRegistry = event.getPack().getOrCreateRegistry(LOCATOR_TOKEN); ((functionalEventHandler, base, platform) -> Init.ofPure(
locatorRegistry.register(addon.key("SURFACE"), SurfaceLocatorTemplate::new); functionalEventHandler.register(base, ConfigPackPreLoadEvent.class)
locatorRegistry.register(addon.key("TOP"), TopLocatorTemplate::new); .then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<Locator>>> locatorRegistry = event.getPack().getOrCreateRegistry(LOCATOR_TOKEN);
locatorRegistry.register(addon.key("RANDOM"), RandomLocatorTemplate::new); locatorRegistry.register(base.key("SURFACE"), SurfaceLocatorTemplate::new);
locatorRegistry.register(addon.key("GAUSSIAN_RANDOM"), GaussianRandomLocatorTemplate::new); locatorRegistry.register(base.key("TOP"), TopLocatorTemplate::new);
locatorRegistry.register(addon.key("PATTERN"), PatternLocatorTemplate::new); locatorRegistry.register(base.key("RANDOM"), RandomLocatorTemplate::new);
locatorRegistry.register(addon.key("ADJACENT_PATTERN"), AdjacentPatternLocatorTemplate::new); locatorRegistry.register(base.key("GAUSSIAN_RANDOM"), GaussianRandomLocatorTemplate::new);
locatorRegistry.register(addon.key("SAMPLER"), SamplerLocatorTemplate::new); locatorRegistry.register(base.key("PATTERN"), PatternLocatorTemplate::new);
locatorRegistry.register(addon.key("SAMPLER_3D"), Sampler3DLocatorTemplate::new); locatorRegistry.register(base.key("ADJACENT_PATTERN"), AdjacentPatternLocatorTemplate::new);
locatorRegistry.register(addon.key("AND"), AndLocatorTemplate::new); locatorRegistry.register(base.key("SAMPLER"), SamplerLocatorTemplate::new);
locatorRegistry.register(addon.key("OR"), OrLocatorTemplate::new); locatorRegistry.register(base.key("SAMPLER_3D"), Sampler3DLocatorTemplate::new);
locatorRegistry.register(addon.key("XOR"), XorLocatorTemplate::new);
}) locatorRegistry.register(base.key("AND"), AndLocatorTemplate::new);
.then(event -> { locatorRegistry.register(base.key("OR"), OrLocatorTemplate::new);
CheckedRegistry<Supplier<ObjectTemplate<Pattern>>> patternRegistry = event.getPack().getOrCreateRegistry(PATTERN_TOKEN); locatorRegistry.register(base.key("XOR"), XorLocatorTemplate::new);
patternRegistry.register(addon.key("MATCH_AIR"), AirMatchPatternTemplate::new); })
patternRegistry.register(addon.key("MATCH_SOLID"), SolidMatchPatternTemplate::new); .then(event -> {
patternRegistry.register(addon.key("MATCH"), SingleBlockMatchPatternTemplate::new); CheckedRegistry<Supplier<ObjectTemplate<Pattern>>> patternRegistry = event.getPack().getOrCreateRegistry(PATTERN_TOKEN);
patternRegistry.register(addon.key("MATCH_SET"), BlockSetMatchPatternTemplate::new); patternRegistry.register(base.key("MATCH_AIR"), AirMatchPatternTemplate::new);
patternRegistry.register(base.key("MATCH_SOLID"), SolidMatchPatternTemplate::new);
patternRegistry.register(addon.key("AND"), AndPatternTemplate::new); patternRegistry.register(base.key("MATCH"), SingleBlockMatchPatternTemplate::new);
patternRegistry.register(addon.key("OR"), OrPatternTemplate::new); patternRegistry.register(base.key("MATCH_SET"), BlockSetMatchPatternTemplate::new);
patternRegistry.register(addon.key("XOR"), XorPatternTemplate::new);
patternRegistry.register(addon.key("NOT"), NotPatternTemplate::new); patternRegistry.register(base.key("AND"), AndPatternTemplate::new);
}) patternRegistry.register(base.key("OR"), OrPatternTemplate::new);
.failThrough(); patternRegistry.register(base.key("XOR"), XorPatternTemplate::new);
patternRegistry.register(base.key("NOT"), NotPatternTemplate::new);
})
.failThrough()))
);
} }
} }
@@ -13,7 +13,10 @@ import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler;
import com.dfsek.terra.addons.noise.config.templates.BinaryArithmeticTemplate; import com.dfsek.terra.addons.noise.config.templates.BinaryArithmeticTemplate;
import com.dfsek.terra.addons.noise.config.templates.DomainWarpTemplate; import com.dfsek.terra.addons.noise.config.templates.DomainWarpTemplate;
@@ -58,90 +61,93 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class NoiseAddon implements AddonInitializer { public class NoiseAddon implements MonadAddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<NoiseSampler>>> NOISE_SAMPLER_TOKEN = new TypeKey<>() { public static final TypeKey<Supplier<ObjectTemplate<NoiseSampler>>> NOISE_SAMPLER_TOKEN = new TypeKey<>() {
}; };
@Inject
private Platform plugin;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
plugin.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> { Get.platform(),
CheckedRegistry<Supplier<ObjectTemplate<NoiseSampler>>> noiseRegistry = event.getPack().getOrCreateRegistry( ((functionalEventHandler, base, platform) -> Init.ofPure(
NOISE_SAMPLER_TOKEN); functionalEventHandler.register(base, ConfigPackPreLoadEvent.class)
event.getPack() .then(event -> {
.applyLoader(CellularSampler.DistanceFunction.class, CheckedRegistry<Supplier<ObjectTemplate<NoiseSampler>>> noiseRegistry = event.getPack().getOrCreateRegistry(
(type, o, loader, depthTracker) -> CellularSampler.DistanceFunction.valueOf((String) o)) NOISE_SAMPLER_TOKEN);
.applyLoader(CellularSampler.ReturnType.class, event.getPack()
(type, o, loader, depthTracker) -> CellularSampler.ReturnType.valueOf((String) o)) .applyLoader(CellularSampler.DistanceFunction.class,
.applyLoader(DimensionApplicableNoiseSampler.class, DimensionApplicableNoiseSampler::new) (type, o, loader, depthTracker) -> CellularSampler.DistanceFunction.valueOf((String) o))
.applyLoader(FunctionTemplate.class, FunctionTemplate::new); .applyLoader(CellularSampler.ReturnType.class,
(type, o, loader, depthTracker) -> CellularSampler.ReturnType.valueOf((String) o))
noiseRegistry.register(addon.key("LINEAR"), LinearNormalizerTemplate::new); .applyLoader(DimensionApplicableNoiseSampler.class, DimensionApplicableNoiseSampler::new)
noiseRegistry.register(addon.key("NORMAL"), NormalNormalizerTemplate::new); .applyLoader(FunctionTemplate.class, FunctionTemplate::new);
noiseRegistry.register(addon.key("CLAMP"), ClampNormalizerTemplate::new);
noiseRegistry.register(addon.key("PROBABILITY"), ProbabilityNormalizerTemplate::new); noiseRegistry.register(base.key("LINEAR"), LinearNormalizerTemplate::new);
noiseRegistry.register(addon.key("SCALE"), ScaleNormalizerTemplate::new); noiseRegistry.register(base.key("NORMAL"), NormalNormalizerTemplate::new);
noiseRegistry.register(addon.key("POSTERIZATION"), PosterizationNormalizerTemplate::new); noiseRegistry.register(base.key("CLAMP"), ClampNormalizerTemplate::new);
noiseRegistry.register(base.key("PROBABILITY"), ProbabilityNormalizerTemplate::new);
noiseRegistry.register(addon.key("IMAGE"), ImageSamplerTemplate::new); noiseRegistry.register(base.key("SCALE"), ScaleNormalizerTemplate::new);
noiseRegistry.register(base.key("POSTERIZATION"), PosterizationNormalizerTemplate::new);
noiseRegistry.register(addon.key("DOMAIN_WARP"), DomainWarpTemplate::new);
noiseRegistry.register(base.key("IMAGE"), ImageSamplerTemplate::new);
noiseRegistry.register(addon.key("FBM"), BrownianMotionTemplate::new);
noiseRegistry.register(addon.key("PING_PONG"), PingPongTemplate::new); noiseRegistry.register(base.key("DOMAIN_WARP"), DomainWarpTemplate::new);
noiseRegistry.register(addon.key("RIDGED"), RidgedFractalTemplate::new);
noiseRegistry.register(base.key("FBM"), BrownianMotionTemplate::new);
noiseRegistry.register(addon.key("OPEN_SIMPLEX_2"), () -> new SimpleNoiseTemplate(OpenSimplex2Sampler::new)); noiseRegistry.register(base.key("PING_PONG"), PingPongTemplate::new);
noiseRegistry.register(addon.key("OPEN_SIMPLEX_2S"), () -> new SimpleNoiseTemplate(OpenSimplex2SSampler::new)); noiseRegistry.register(base.key("RIDGED"), RidgedFractalTemplate::new);
noiseRegistry.register(addon.key("PERLIN"), () -> new SimpleNoiseTemplate(PerlinSampler::new));
noiseRegistry.register(addon.key("SIMPLEX"), () -> new SimpleNoiseTemplate(SimplexSampler::new)); noiseRegistry.register(base.key("OPEN_SIMPLEX_2"), () -> new SimpleNoiseTemplate(OpenSimplex2Sampler::new));
noiseRegistry.register(addon.key("GABOR"), GaborNoiseTemplate::new); noiseRegistry.register(base.key("OPEN_SIMPLEX_2S"), () -> new SimpleNoiseTemplate(OpenSimplex2SSampler::new));
noiseRegistry.register(base.key("PERLIN"), () -> new SimpleNoiseTemplate(PerlinSampler::new));
noiseRegistry.register(base.key("SIMPLEX"), () -> new SimpleNoiseTemplate(SimplexSampler::new));
noiseRegistry.register(addon.key("VALUE"), () -> new SimpleNoiseTemplate(ValueSampler::new)); noiseRegistry.register(base.key("GABOR"), GaborNoiseTemplate::new);
noiseRegistry.register(addon.key("VALUE_CUBIC"), () -> new SimpleNoiseTemplate(ValueCubicSampler::new));
noiseRegistry.register(addon.key("CELLULAR"), CellularNoiseTemplate::new); noiseRegistry.register(base.key("VALUE"), () -> new SimpleNoiseTemplate(ValueSampler::new));
noiseRegistry.register(base.key("VALUE_CUBIC"), () -> new SimpleNoiseTemplate(ValueCubicSampler::new));
noiseRegistry.register(addon.key("WHITE_NOISE"), () -> new SimpleNoiseTemplate(WhiteNoiseSampler::new));
noiseRegistry.register(addon.key("POSITIVE_WHITE_NOISE"), () -> new SimpleNoiseTemplate(PositiveWhiteNoiseSampler::new)); noiseRegistry.register(base.key("CELLULAR"), CellularNoiseTemplate::new);
noiseRegistry.register(addon.key("GAUSSIAN"), () -> new SimpleNoiseTemplate(GaussianNoiseSampler::new));
noiseRegistry.register(base.key("WHITE_NOISE"), () -> new SimpleNoiseTemplate(WhiteNoiseSampler::new));
noiseRegistry.register(addon.key("CONSTANT"), ConstantNoiseTemplate::new); noiseRegistry.register(base.key("POSITIVE_WHITE_NOISE"), () -> new SimpleNoiseTemplate(PositiveWhiteNoiseSampler::new));
noiseRegistry.register(base.key("GAUSSIAN"), () -> new SimpleNoiseTemplate(GaussianNoiseSampler::new));
noiseRegistry.register(addon.key("KERNEL"), KernelTemplate::new);
noiseRegistry.register(base.key("CONSTANT"), ConstantNoiseTemplate::new);
noiseRegistry.register(addon.key("LINEAR_HEIGHTMAP"), LinearHeightmapSamplerTemplate::new);
noiseRegistry.register(base.key("KERNEL"), KernelTemplate::new);
noiseRegistry.register(addon.key("ADD"), () -> new BinaryArithmeticTemplate<>(AdditionSampler::new));
noiseRegistry.register(addon.key("SUB"), () -> new BinaryArithmeticTemplate<>(SubtractionSampler::new)); noiseRegistry.register(base.key("LINEAR_HEIGHTMAP"), LinearHeightmapSamplerTemplate::new);
noiseRegistry.register(addon.key("MUL"), () -> new BinaryArithmeticTemplate<>(MultiplicationSampler::new));
noiseRegistry.register(addon.key("DIV"), () -> new BinaryArithmeticTemplate<>(DivisionSampler::new)); noiseRegistry.register(base.key("ADD"), () -> new BinaryArithmeticTemplate<>(AdditionSampler::new));
noiseRegistry.register(addon.key("MAX"), () -> new BinaryArithmeticTemplate<>(MaxSampler::new)); noiseRegistry.register(base.key("SUB"), () -> new BinaryArithmeticTemplate<>(SubtractionSampler::new));
noiseRegistry.register(addon.key("MIN"), () -> new BinaryArithmeticTemplate<>(MinSampler::new)); noiseRegistry.register(base.key("MUL"), () -> new BinaryArithmeticTemplate<>(MultiplicationSampler::new));
noiseRegistry.register(base.key("DIV"), () -> new BinaryArithmeticTemplate<>(DivisionSampler::new));
noiseRegistry.register(base.key("MAX"), () -> new BinaryArithmeticTemplate<>(MaxSampler::new));
Map<String, DimensionApplicableNoiseSampler> packSamplers = new LinkedHashMap<>(); noiseRegistry.register(base.key("MIN"), () -> new BinaryArithmeticTemplate<>(MinSampler::new));
Map<String, FunctionTemplate> packFunctions = new LinkedHashMap<>();
noiseRegistry.register(addon.key("EXPRESSION"), () -> new ExpressionFunctionTemplate(packSamplers, packFunctions));
Map<String, DimensionApplicableNoiseSampler> packSamplers = new LinkedHashMap<>();
Map<String, FunctionTemplate> packFunctions = new LinkedHashMap<>();
NoiseConfigPackTemplate template = event.loadTemplate(new NoiseConfigPackTemplate()); noiseRegistry.register(base.key("EXPRESSION"), () -> new ExpressionFunctionTemplate(packSamplers, packFunctions));
packSamplers.putAll(template.getSamplers());
packFunctions.putAll(template.getFunctions());
event.getPack().getContext().put(template); NoiseConfigPackTemplate template = event.loadTemplate(new NoiseConfigPackTemplate());
}) packSamplers.putAll(template.getSamplers());
.priority(50) packFunctions.putAll(template.getFunctions());
.failThrough(); event.getPack().getContext().put(template);
})
.priority(50)
.failThrough()))
);
} }
} }
@@ -22,13 +22,13 @@ public class OreAddon implements MonadAddonInitializer {
return Do.with( return Do.with(
Get.eventManager().map(manager -> manager.getHandler(FunctionalEventHandler.class)), Get.eventManager().map(manager -> manager.getHandler(FunctionalEventHandler.class)),
Get.addon(), Get.addon(),
((eventHandler, addon) -> Init (eventHandler, addon) -> Init
.ofPure(eventHandler .ofPure(eventHandler
.register(addon, ConfigPackPreLoadEvent.class) .register(addon, ConfigPackPreLoadEvent.class)
.then(event -> event .then(event -> event
.getPack() .getPack()
.registerConfigType(new OreConfigType(), addon.key("ORE"), 1)) .registerConfigType(new OreConfigType(), addon.key("ORE"), 1))
.failThrough())) .failThrough())
); );
} }
} }
@@ -7,7 +7,12 @@
package com.dfsek.terra.addons.palette; package com.dfsek.terra.addons.palette;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.addons.palette.palette.PaletteLayerHolder; import com.dfsek.terra.addons.palette.palette.PaletteLayerHolder;
import com.dfsek.terra.addons.palette.palette.PaletteLayerLoader; import com.dfsek.terra.addons.palette.palette.PaletteLayerLoader;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
@@ -15,24 +20,28 @@ import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import java.util.function.Supplier;
public class PaletteAddon implements AddonInitializer { public class PaletteAddon implements MonadAddonInitializer {
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> { Get.platform(),
event.getPack().registerConfigType(new PaletteConfigType(platform), addon.key("PALETTE"), 2); ((handler, base, platform) -> Init.ofPure(
event.getPack().applyLoader(PaletteLayerHolder.class, PaletteLayerLoader::new); handler.register(base, ConfigPackPreLoadEvent.class)
}) .then(event -> {
.failThrough(); event.getPack().registerConfigType(new PaletteConfigType(platform), base.key("PALETTE"), 2);
event.getPack().applyLoader(PaletteLayerHolder.class, PaletteLayerLoader::new);
})
.failThrough()))
);
} }
} }
@@ -7,15 +7,19 @@
package com.dfsek.terra.addons.structure; package com.dfsek.terra.addons.structure;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.util.function.monad.Monad;
public class StructureAddon implements AddonInitializer { public class StructureAddon implements MonadAddonInitializer {
@Inject @Inject
private Platform platform; private Platform platform;
@@ -23,11 +27,15 @@ public class StructureAddon implements AddonInitializer {
private BaseAddon addon; private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> event.getPack().registerConfigType(new StructureConfigType(), addon.key("STRUCTURE"), 2)) Get.platform(),
.failThrough(); ((handler, base, platform) -> Init.ofPure(
handler.register(addon, ConfigPackPreLoadEvent.class)
.then(event -> event.getPack().registerConfigType(new StructureConfigType(), addon.key("STRUCTURE"), 2))
.failThrough()))
);
} }
} }
@@ -20,7 +20,10 @@ import java.util.function.Supplier;
import com.dfsek.terra.addons.generation.feature.config.BiomeFeatures; import com.dfsek.terra.addons.generation.feature.config.BiomeFeatures;
import com.dfsek.terra.addons.generation.feature.config.FeatureStageTemplate; import com.dfsek.terra.addons.generation.feature.config.FeatureStageTemplate;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.config.meta.Meta;
@@ -31,65 +34,67 @@ import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.properties.Context; import com.dfsek.terra.api.properties.Context;
import com.dfsek.terra.api.properties.PropertyKey; import com.dfsek.terra.api.properties.PropertyKey;
import com.dfsek.terra.api.structure.feature.Feature; import com.dfsek.terra.api.structure.feature.Feature;
import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.util.generic.Construct;
import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage;
import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider;
public class FeatureGenerationAddon implements AddonInitializer { public class FeatureGenerationAddon implements MonadAddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<GenerationStage>>> STAGE_TYPE_KEY = new TypeKey<>() { public static final TypeKey<Supplier<ObjectTemplate<GenerationStage>>> STAGE_TYPE_KEY = new TypeKey<>() {
}; };
public static final TypeKey<@Meta List<@Meta Feature>> FEATURE_LIST_TYPE_KEY = new TypeKey<>() { public static final TypeKey<@Meta List<@Meta Feature>> FEATURE_LIST_TYPE_KEY = new TypeKey<>() {
}; };
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
PropertyKey<BiomeFeatures> biomeFeaturesKey = Context.create(BiomeFeatures.class); PropertyKey<BiomeFeatures> biomeFeaturesKey = Context.create(BiomeFeatures.class);
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> event.getPack() Get.platform(),
.getOrCreateRegistry(STAGE_TYPE_KEY) ((handler, base, platform) -> Init.ofPure(Construct.construct(() -> {
.register(addon.key("FEATURE"), () -> new FeatureStageTemplate(platform, biomeFeaturesKey))) handler.register(base, ConfigPackPreLoadEvent.class)
.failThrough(); .then(event -> event.getPack()
.getOrCreateRegistry(STAGE_TYPE_KEY)
platform.getEventManager() .register(base.key("FEATURE"), () -> new FeatureStageTemplate(platform, biomeFeaturesKey)))
.getHandler(FunctionalEventHandler.class) .failThrough();
.register(addon, ConfigurationLoadEvent.class) return handler.register(base, ConfigurationLoadEvent.class)
.then(event -> { .then(event -> {
if(event.is(Biome.class)) { if(event.is(Biome.class)) {
DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder(); DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder();
List<FeatureGenerationStage> featureGenerationStages = new ArrayList<>(); List<FeatureGenerationStage> featureGenerationStages = new ArrayList<>();
event.getPack().getStages().forEach(stage -> { event.getPack().getStages().forEach(stage -> {
if(stage instanceof FeatureGenerationStage featureGenerationStage) { if(stage instanceof FeatureGenerationStage featureGenerationStage) {
featureGenerationStages.add(featureGenerationStage); featureGenerationStages.add(featureGenerationStage);
templateBuilder templateBuilder
.value(featureGenerationStage.getID(), .value(featureGenerationStage.getID(),
DynamicValue DynamicValue
.builder("features." + featureGenerationStage.getID(), List.class) .builder("features." + featureGenerationStage.getID(), List.class)
.annotatedType(FEATURE_LIST_TYPE_KEY.getAnnotatedType()) .annotatedType(FEATURE_LIST_TYPE_KEY.getAnnotatedType())
.setDefault(Collections.emptyList()) .setDefault(Collections.emptyList())
.build()); .build());
} }
}); });
DynamicTemplate template = event.load(templateBuilder.build()); DynamicTemplate template = event.load(templateBuilder.build());
Map<FeatureGenerationStage, List<Feature>> features = new HashMap<>(); Map<FeatureGenerationStage, List<Feature>> features = new HashMap<>();
featureGenerationStages.forEach(stage -> features.put(stage, template.get(stage.getID(), List.class))); featureGenerationStages.forEach(
stage -> features.put(stage, template.get(stage.getID(), List.class)));
event.getLoadedObject(Biome.class).getContext().put(biomeFeaturesKey, new BiomeFeatures(features));
} event.getLoadedObject(Biome.class).getContext().put(biomeFeaturesKey,
}) new BiomeFeatures(features));
.failThrough(); }
})
.failThrough();
}))));
} }
} }
@@ -1,43 +1,40 @@
package com.dfsek.terra.addons.generation.structure; package com.dfsek.terra.addons.generation.structure;
import com.dfsek.terra.addons.generation.structure.config.BiomeStructuresTemplate; import com.dfsek.terra.addons.generation.structure.config.BiomeStructuresTemplate;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.util.generic.Construct;
import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.chunk.generation.util.provider.GenerationStageProvider; import com.dfsek.terra.api.world.chunk.generation.util.provider.GenerationStageProvider;
public class StructureGenerationAddon implements AddonInitializer { public class StructureGenerationAddon implements MonadAddonInitializer {
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> event.getPack() Get.platform(),
.getOrCreateRegistry(GenerationStageProvider.class) ((handler, base, platform) -> Init.ofPure(Construct.construct(() -> {
.register(addon.key("STRUCTURE"), pack -> new StructureGenerationStage(platform))) handler.register(base, ConfigPackPreLoadEvent.class)
.failThrough(); .then(event -> event.getPack()
.getOrCreateRegistry(GenerationStageProvider.class)
platform.getEventManager() .register(base.key("STRUCTURE"), pack -> new StructureGenerationStage(platform)))
.getHandler(FunctionalEventHandler.class) .failThrough();
.register(addon, ConfigurationLoadEvent.class) return handler.register(base, ConfigurationLoadEvent.class)
.then(event -> { .then(event -> {
if(event.is(Biome.class)) { if(event.is(Biome.class)) {
event.getLoadedObject(Biome.class).getContext().put(event.load(new BiomeStructuresTemplate()).get()); event.getLoadedObject(Biome.class).getContext().put(
} event.load(new BiomeStructuresTemplate()).get());
}) }
.failThrough(); })
.failThrough();
}))));
} }
} }
@@ -8,10 +8,17 @@
package com.dfsek.terra.addons.yaml; package com.dfsek.terra.addons.yaml;
import com.dfsek.tectonic.yaml.YamlConfiguration; import com.dfsek.tectonic.yaml.YamlConfiguration;
import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.util.function.monad.Monad;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.ConfigurationDiscoveryEvent; import com.dfsek.terra.api.event.events.config.ConfigurationDiscoveryEvent;
@@ -19,24 +26,22 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
public class YamlAddon implements AddonInitializer { public class YamlAddon implements MonadAddonInitializer {
private static final Logger LOGGER = LoggerFactory.getLogger(YamlAddon.class); private static final Logger LOGGER = LoggerFactory.getLogger(YamlAddon.class);
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigurationDiscoveryEvent.class) Get.addon(),
.then(event -> event.getLoader().open("", ".yml").thenEntries(entries -> entries.forEach(entry -> { ((handler, base) -> Init.ofPure(
LOGGER.debug("Discovered config {}", entry.getKey()); handler.register(base, ConfigurationDiscoveryEvent.class)
event.register(entry.getKey(), new YamlConfiguration(entry.getValue(), entry.getKey())); .then(event -> event.getLoader().open("", ".yml").thenEntries(entries -> entries.forEach(entry -> {
})).close()) LOGGER.debug("Discovered config {}", entry.getKey());
.failThrough(); event.register(entry.getKey(), new YamlConfiguration(entry.getValue(), entry.getKey()));
})).close())
.failThrough()))
);
} }
} }
@@ -1,30 +1,32 @@
package com.dfsek.terra.addons.palette.shortcut.block; package com.dfsek.terra.addons.palette.shortcut.block;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.util.function.monad.Monad;
import com.dfsek.terra.api.world.chunk.generation.util.Palette; import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public class PaletteBlockShortcutAddon implements AddonInitializer { public class PaletteBlockShortcutAddon implements MonadAddonInitializer {
@Inject
private BaseAddon addon;
@Inject
private Platform platform;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> event.getPack() Get.platform(),
.registerShortcut(Palette.class, "BLOCK", ((handler, base, platform) -> Init.ofPure(
(configLoader, input, tracker) -> new SingletonPalette( handler.register(base, ConfigPackPreLoadEvent.class)
configLoader.loadType(BlockState.class, input, tracker)))) .then(event -> event.getPack()
.failThrough(); .registerShortcut(Palette.class, "BLOCK",
(configLoader, input, tracker) -> new SingletonPalette(
configLoader.loadType(BlockState.class, input, tracker))))
.failThrough()))
);
} }
} }
@@ -1,6 +1,9 @@
package com.dfsek.terra.addons.palette.shortcut.block; package com.dfsek.terra.addons.palette.shortcut.block;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.BlockState;
@@ -8,24 +11,23 @@ import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.util.function.monad.Monad;
public class StructureBlockShortcutAddon implements AddonInitializer { public class StructureBlockShortcutAddon implements MonadAddonInitializer {
@Inject
private BaseAddon addon;
@Inject
private Platform platform;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> event.getPack() ((handler, base) -> Init.ofPure(
.registerShortcut(Structure.class, "BLOCK", handler.register(base, ConfigPackPreLoadEvent.class)
(configLoader, input, tracker) -> new SingletonStructure( .then(event -> event.getPack()
configLoader.loadType(BlockState.class, input, tracker) .registerShortcut(Structure.class, "BLOCK",
))) (configLoader, input, tracker) -> new SingletonStructure(
.failThrough(); configLoader.loadType(BlockState.class, input, tracker)
)))
.failThrough()))
);
} }
} }
@@ -1,29 +1,29 @@
package com.dfsek.terra.addons.structure.mutator; package com.dfsek.terra.addons.structure.mutator;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.util.function.monad.Monad;
public class StructureMutatorAddon implements AddonInitializer { public class StructureMutatorAddon implements MonadAddonInitializer {
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> { ((handler, base) -> Init.ofPure(
event.getPack().registerConfigType(new MutatedStructureConfigType(addon), addon.key("MUTATED_STRUCTURE"), 499); handler.register(base, ConfigPackPreLoadEvent.class)
}) .then(event -> {
.failThrough(); event.getPack().registerConfigType(new MutatedStructureConfigType(base), base.key("MUTATED_STRUCTURE"), 499);
})
.failThrough()))
);
} }
} }
@@ -7,6 +7,13 @@
package com.dfsek.terra.addons.sponge; package com.dfsek.terra.addons.sponge;
import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.util.function.monad.Monad;
import net.querz.nbt.io.NBTDeserializer; import net.querz.nbt.io.NBTDeserializer;
import net.querz.nbt.tag.ByteArrayTag; import net.querz.nbt.tag.ByteArrayTag;
import net.querz.nbt.tag.CompoundTag; import net.querz.nbt.tag.CompoundTag;
@@ -20,7 +27,6 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.BlockState;
@@ -32,13 +38,7 @@ import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.util.StringUtil; import com.dfsek.terra.api.util.StringUtil;
public class SpongeSchematicAddon implements AddonInitializer { public class SpongeSchematicAddon implements MonadAddonInitializer {
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
private static InputStream detectDecompression(InputStream is) throws IOException { private static InputStream detectDecompression(InputStream is) throws IOException {
PushbackInputStream pbis = new PushbackInputStream(is, 2); PushbackInputStream pbis = new PushbackInputStream(is, 2);
int signature = (pbis.read() & 0xFF) + (pbis.read() << 8); int signature = (pbis.read() & 0xFF) + (pbis.read() << 8);
@@ -51,24 +51,28 @@ public class SpongeSchematicAddon implements AddonInitializer {
} }
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> { Get.platform(),
CheckedRegistry<Structure> structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); ((handler, base, platform) -> Init.ofPure(
event.getPack() handler.register(base, ConfigPackPreLoadEvent.class)
.getLoader() .then(event -> {
.open("", ".schem") CheckedRegistry<Structure> structureRegistry = event.getPack().getOrCreateRegistry(Structure.class);
.thenEntries(entries -> entries event.getPack()
.stream() .getLoader()
.map(entry -> convert(entry.getValue(), StringUtil.fileName(entry.getKey()))) .open("", ".schem")
.forEach(structureRegistry::register)).close(); .thenEntries(entries -> entries
}) .stream()
.failThrough(); .map(entry -> convert(entry.getValue(), StringUtil.fileName(entry.getKey()), platform, base))
.forEach(structureRegistry::register)).close();
})
.failThrough()))
);
} }
public SpongeStructure convert(InputStream in, String id) { public SpongeStructure convert(InputStream in, String id, Platform platform, BaseAddon addon) {
try { try {
CompoundTag baseTag = (CompoundTag) new NBTDeserializer(false).fromStream(detectDecompression(in)).getTag(); CompoundTag baseTag = (CompoundTag) new NBTDeserializer(false).fromStream(detectDecompression(in)).getTag();
int wid = baseTag.getShort("Width"); int wid = baseTag.getShort("Width");
@@ -7,7 +7,10 @@
package com.dfsek.terra.addons.terrascript; package com.dfsek.terra.addons.terrascript;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.StructureScript; import com.dfsek.terra.addons.terrascript.script.StructureScript;
@@ -20,45 +23,44 @@ import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.structure.LootTable; import com.dfsek.terra.api.structure.LootTable;
import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.util.StringUtil; import com.dfsek.terra.api.util.StringUtil;
import com.dfsek.terra.api.util.function.monad.Monad;
public class TerraScriptAddon implements AddonInitializer { public class TerraScriptAddon implements MonadAddonInitializer {
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> { Get.platform(),
CheckedRegistry<Structure> structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); ((handler, base, platform) -> Init.ofPure(
CheckedRegistry<LootTable> lootRegistry = event.getPack().getOrCreateRegistry(LootTable.class); handler.register(base, ConfigPackPreLoadEvent.class)
event.getPack().getLoader().open("", ".tesf").thenEntries( .then(event -> {
entries -> CheckedRegistry<Structure> structureRegistry = event.getPack().getOrCreateRegistry(Structure.class);
entries.stream() CheckedRegistry<LootTable> lootRegistry = event.getPack().getOrCreateRegistry(LootTable.class);
.parallel() event.getPack().getLoader().open("", ".tesf").thenEntries(
.map(entry -> { entries ->
try { entries.stream()
String id = StringUtil.fileName(entry.getKey()); .parallel()
return new StructureScript(entry.getValue(), .map(entry -> {
addon.key(id), try {
platform, String id = StringUtil.fileName(entry.getKey());
structureRegistry, return new StructureScript(entry.getValue(),
lootRegistry, base.key(id),
event.getPack().getOrCreateRegistry(FunctionBuilder.class)); platform,
} catch(ParseException e) { structureRegistry,
throw new RuntimeException("Failed to load script \"" + entry.getKey() + "\"", e); lootRegistry,
} event.getPack().getOrCreateRegistry(FunctionBuilder.class));
}) } catch(ParseException e) {
.toList() throw new RuntimeException("Failed to load script \"" + entry.getKey() + "\"", e);
.forEach(structureRegistry::register)) }
.close(); })
}) .toList()
.priority(100) .forEach(structureRegistry::register))
.failThrough(); .close();
})
.priority(100)
.failThrough()))
);
} }
} }
@@ -1,31 +1,33 @@
package com.dfsek.terra.addon.terrascript.check; package com.dfsek.terra.addon.terrascript.check;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.util.function.monad.Monad;
public class TerraScriptCheckFunctionAddon implements AddonInitializer { public class TerraScriptCheckFunctionAddon implements MonadAddonInitializer {
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.priority(1) Get.platform(),
.then(event -> { ((handler, base, platform) -> Init.ofPure(
event.getPack().getOrCreateRegistry(FunctionBuilder.class).register(addon.key("check"), handler.register(base, ConfigPackPreLoadEvent.class)
new CheckFunctionBuilder(platform)); .priority(1)
}) .then(event -> event
.failThrough(); .getPack()
.getOrCreateRegistry(FunctionBuilder.class)
.register(base.key("check"), new CheckFunctionBuilder(platform)))
.failThrough()))
);
} }
} }
@@ -1,6 +1,9 @@
package com.dfsek.terra.addons.terrascript.sampler; package com.dfsek.terra.addons.terrascript.sampler;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Do;
import com.dfsek.terra.addons.manifest.api.monad.Get;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.addons.noise.NoiseConfigPackTemplate; import com.dfsek.terra.addons.noise.NoiseConfigPackTemplate;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
@@ -8,27 +11,24 @@ import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.util.function.monad.Monad;
public class TerraScriptSamplerFunctionAddon implements AddonInitializer { public class TerraScriptSamplerFunctionAddon implements MonadAddonInitializer {
@Inject
private Platform platform;
@Inject
private BaseAddon addon;
@Override @Override
public void initialize() { public Monad<?, Init<?>> initialize() {
platform.getEventManager() return Do.with(
.getHandler(FunctionalEventHandler.class) Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.priority(51) ((handler, base) -> Init.ofPure(
.then(event -> event handler.register(base, ConfigPackPreLoadEvent.class)
.getPack() .priority(51)
.getOrCreateRegistry(FunctionBuilder.class) .then(event -> event
.register(addon.key("sampler"), new SamplerFunctionBuilder(event.getPack().getContext().get( .getPack()
NoiseConfigPackTemplate.class).getSamplers()))) .getOrCreateRegistry(FunctionBuilder.class)
.failThrough(); .register(base.key("sampler"), new SamplerFunctionBuilder(event.getPack().getContext().get(
NoiseConfigPackTemplate.class).getSamplers())))
.failThrough()))
);
} }
} }