Merge branch 'ver/7.0.0' into dev/pipeline-reimplementation

This commit is contained in:
Astrash
2022-08-20 13:05:12 +10:00
42 changed files with 1280 additions and 895 deletions
+3
View File
@@ -9,6 +9,9 @@ object Versions {
const val slf4j = "1.7.36" const val slf4j = "1.7.36"
const val log4j_slf4j_impl = "2.14.1" const val log4j_slf4j_impl = "2.14.1"
const val caffeine = "3.1.0"
const val vavr = "0.10.4"
object Internal { object Internal {
const val apacheText = "1.9" const val apacheText = "1.9"
const val jafama = "2.3.2" const val jafama = "2.3.2"
@@ -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,21 +23,24 @@ import com.dfsek.terra.addons.biome.pipeline.config.stage.mutator.SmoothStageTem
import com.dfsek.terra.addons.biome.pipeline.api.Source; import com.dfsek.terra.addons.biome.pipeline.api.Source;
import com.dfsek.terra.addons.biome.pipeline.api.Stage; import com.dfsek.terra.addons.biome.pipeline.api.Stage;
import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome;
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.api.addon.BaseAddon; 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.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 BiomePipelineAddon implements AddonInitializer { public class BiomePipelineAddon implements MonadAddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<Source>>> SOURCE_REGISTRY_KEY = new TypeKey<>() { public static final TypeKey<Supplier<ObjectTemplate<Source>>> SOURCE_REGISTRY_KEY = new TypeKey<>() {
}; };
@@ -46,44 +49,46 @@ 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<Source>>> 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<Source>>> 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"), SmoothStageTemplate::new); .then(event -> {
stageRegistry.register(addon.key("REPLACE"), ReplaceStageTemplate::new); CheckedRegistry<Supplier<ObjectTemplate<Stage>>> stageRegistry =
stageRegistry.register(addon.key("REPLACE_LIST"), ReplaceListStageTemplate::new); event.getPack().getOrCreateRegistry(
stageRegistry.register(addon.key("BORDER"), BorderStageTemplate::new); STAGE_REGISTRY_KEY);
stageRegistry.register(addon.key("BORDER_LIST"), BorderListStageTemplate::new); stageRegistry.register(base.key("FRACTAL_EXPAND"), ExpanderStageTemplate::new);
}) stageRegistry.register(base.key("SMOOTH"), SmoothStageTemplate::new);
.failThrough(); stageRegistry.register(base.key("REPLACE"), ReplaceStageTemplate::new);
platform.getEventManager() stageRegistry.register(base.key("REPLACE_LIST"), ReplaceListStageTemplate::new);
.getHandler(FunctionalEventHandler.class) stageRegistry.register(base.key("BORDER"), BorderStageTemplate::new);
.register(addon, ConfigPackPostLoadEvent.class) stageRegistry.register(base.key("BORDER_LIST"), BorderListStageTemplate::new);
.then(event -> { })
Registry<Biome> biomeRegistry = event.getPack().getRegistry(Biome.class); .failThrough();
event.getPack().applyLoader(PipelineBiome.class, new PipelineBiomeLoader(biomeRegistry)); return functionalEventHandler.register(base, ConfigPackPostLoadEvent.class)
}); .then(event -> {
Registry<Biome> biomeRegistry = event.getPack().getRegistry(Biome.class);
event.getPack().applyLoader(PipelineBiome.class,
new PipelineBiomeLoader(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(
Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)),
Get.addon(),
((functionalEventHandler, base) -> Init.ofPure(
functionalEventHandler.register(base, ConfigPackPostLoadEvent.class)
.then(event -> {
Collection<Biome> biomes = event
.getPack()
.getRegistry(Biome.class)
.entries();
platform.getEventManager() BiomeTagFlattener flattener = new BiomeTagFlattener(
.getHandler(FunctionalEventHandler.class) biomes.stream()
.register(addon, ConfigPackPostLoadEvent.class) .flatMap(biome -> biome.getTags().stream())
.then(event -> { .toList());
Collection<Biome> biomes = event
.getPack()
.getRegistry(Biome.class)
.entries();
BiomeTagFlattener flattener = new BiomeTagFlattener(biomes biomes.forEach(biome -> biome.getContext()
.stream() .put(BIOME_TAG_KEY, new BiomeTagHolder(biome, flattener)));
.flatMap(biome -> biome.getTags().stream()) })
.toList()); .global()
)));
biomes.forEach(biome -> biome.getContext().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)
.then(event -> {
NoiseChunkGeneratorPackConfigTemplate config = event.loadTemplate(new NoiseChunkGeneratorPackConfigTemplate());
event.getPack() event.getPack()
.getOrCreateRegistry(ChunkGeneratorProvider.class) .getOrCreateRegistry(ChunkGeneratorProvider.class)
.register(addon.key("NOISE_3D"), .register(base.key("NOISE_3D"),
pack -> new NoiseChunkGenerator3D(pack, platform, config.getElevationBlend(), pack -> new NoiseChunkGenerator3D(pack, platform, config.getElevationBlend(),
config.getHorizontalRes(), config.getHorizontalRes(),
config.getVerticalRes(), noisePropertiesPropertyKey, config.getVerticalRes(), noisePropertiesPropertyKey,
paletteInfoPropertyKey)); paletteInfoPropertyKey));
event.getPack() event.getPack()
.applyLoader(SlantLayer.class, SlantLayer::new); .applyLoader(SlantLayer.class, SlantLayer::new);
}) })
.failThrough(); .failThrough();
return handler.register(base, ConfigurationLoadEvent.class)
.then(event -> {
if(event.is(Biome.class)) {
event.getLoadedObject(Biome.class).getContext().put(paletteInfoPropertyKey,
event.load(new BiomePaletteTemplate(platform)).get());
event.getLoadedObject(Biome.class).getContext().put(noisePropertiesPropertyKey,
event.load(new BiomeNoiseConfigTemplate()).get());
}
})
.failThrough();
}))));
platform.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(addon, ConfigurationLoadEvent.class)
.then(event -> {
if(event.is(Biome.class)) {
event.getLoadedObject(Biome.class).getContext().put(paletteInfoPropertyKey,
event.load(new BiomePaletteTemplate(platform)).get());
event.getLoadedObject(Biome.class).getContext().put(noisePropertiesPropertyKey,
event.load(new BiomeNoiseConfigTemplate()).get());
}
})
.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
.register(base, CommandRegistrationEvent.class)
.then(event -> {
CommandManager<CommandSender> manager = event.getCommandManager();
manager.command( manager.command(
manager.commandBuilder("addons", ArgumentDescription.of("List installed Terra addons")) manager.commandBuilder("addons", ArgumentDescription.of(
.permission("terra.addons") "List installed Terra addons"))
.handler(context -> { .permission("terra.addons")
StringBuilder addons = new StringBuilder("Installed addons:\n"); .handler(context -> {
platform.getAddons() StringBuilder addons = new StringBuilder(
.forEach(addon -> addons "Installed addons:\n");
.append(" - ") platform.getAddons()
.append(addon.getID()) .forEach(addon -> addons
.append('@') .append(" - ")
.append(addon.getVersion().getFormatted()) .append(addon.getID())
.append('\n')); .append('@')
context.getSender().sendMessage(addons.toString()); .append(addon.getVersion().getFormatted())
}) .append('\n'));
) context.getSender().sendMessage(addons.toString());
.command( })
manager.commandBuilder("addons") )
.argument(RegistryArgument.of("addon", platform.getAddons())) .command(
.permission("terra.addons.info") manager.commandBuilder("addons")
.handler(context -> { .argument(
BaseAddon addon = context.get("addon"); RegistryArgument.of("addon", platform.getAddons()))
StringBuilder addonInfo = new StringBuilder("Addon ").append(addon.getID()).append('\n'); .permission("terra.addons.info")
.handler(context -> {
BaseAddon addon = context.get("addon");
StringBuilder addonInfo = new StringBuilder(
"Addon ").append(addon.getID()).append('\n');
addonInfo.append("Version: ").append(addon.getVersion().getFormatted()).append('\n'); addonInfo.append("Version: ").append(
addon.getVersion().getFormatted()).append('\n');
addonInfo.append("Dependencies:\n"); addonInfo.append("Dependencies:\n");
addon.getDependencies().forEach((id, versions) -> addonInfo addon.getDependencies().forEach(
.append(" - ") (id, versions) -> addonInfo
.append(id) .append(" - ")
.append('@') .append(id)
.append(versions.getFormatted()) .append('@')
.append('\n')); .append(versions.getFormatted())
context.getSender().sendMessage(addonInfo.toString()); .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)
.then(event -> {
CommandManager<CommandSender> manager = event.getCommandManager();
manager.command( manager.command(
manager.commandBuilder("packs", ArgumentDescription.of("List installed config packs")) manager.commandBuilder("packs", ArgumentDescription.of("List installed config packs"))
.permission("terra.packs") .permission("terra.packs")
.handler(context -> { .handler(context -> {
StringBuilder packs = new StringBuilder("Installed packs:\n"); StringBuilder packs = new StringBuilder("Installed packs:\n");
platform.getConfigRegistry().forEach(pack -> packs.append(" - ") platform.getConfigRegistry().forEach(pack -> packs.append(" - ")
.append(pack.getID()) .append(pack.getID())
.append('@') .append('@')
.append(pack.getVersion().getFormatted())); .append(pack.getVersion().getFormatted()));
context.getSender().sendMessage(packs.toString()); context.getSender().sendMessage(packs.toString());
}) })
) )
.command( .command(
manager.commandBuilder("packs") manager.commandBuilder("packs")
.literal("info", ArgumentDescription.of("Get information about a pack")) .literal("info", ArgumentDescription.of("Get information about a pack"))
.permission("terra.packs.info") .permission("terra.packs.info")
.argument(RegistryArgument.of("pack", platform.getConfigRegistry())) .argument(RegistryArgument.of("pack", platform.getConfigRegistry()))
.handler(context -> { .handler(context -> {
ConfigPack pack = context.get("pack"); ConfigPack pack = context.get("pack");
StringBuilder packInfo = new StringBuilder("Pack ").append(pack.getID()).append('\n'); StringBuilder packInfo = new StringBuilder("Pack ").append(pack.getID()).append('\n');
packInfo.append("Version: ").append(pack.getVersion().getFormatted()).append('\n'); packInfo.append("Version: ").append(pack.getVersion().getFormatted()).append('\n');
packInfo.append("Author: ").append(pack.getAuthor()).append('\n'); packInfo.append("Author: ").append(pack.getAuthor()).append('\n');
packInfo.append("Addon Dependencies:\n"); packInfo.append("Addon Dependencies:\n");
pack.addons().forEach((id, versions) -> packInfo pack.addons().forEach((id, versions) -> packInfo
.append(" - ") .append(" - ")
.append(id.getID()) .append(id.getID())
.append('@') .append('@')
.append(versions.getFormatted()) .append(versions.getFormatted())
.append('\n')); .append('\n'));
context.getSender().sendMessage(packInfo.toString()); context.getSender().sendMessage(packInfo.toString());
})) }))
.command( .command(
manager.commandBuilder("packs") manager.commandBuilder("packs")
.literal("reload", ArgumentDescription.of("Reload config packs")) .literal("reload", ArgumentDescription.of("Reload config packs"))
.permission("terra.packs.reload") .permission("terra.packs.reload")
.handler(context -> { .handler(context -> {
context.getSender().sendMessage("Reloading Terra..."); context.getSender().sendMessage("Reloading Terra...");
logger.info("Reloading Terra..."); logger.info("Reloading Terra...");
if(platform.reload()) { if(platform.reload()) {
logger.info("Terra reloaded successfully."); logger.info("Terra reloaded successfully.");
context.getSender().sendMessage("Terra reloaded successfully."); context.getSender().sendMessage("Terra reloaded successfully.");
} else { } else {
logger.error("Terra failed to reload."); logger.error("Terra failed to reload.");
context.getSender().sendMessage( context.getSender().sendMessage(
"Terra failed to reload. See logs for more information."); "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 -> {
CommandManager<CommandSender> manager = event.getCommandManager();
manager.command( manager.command(
manager.commandBuilder("structures", ArgumentDescription.of("Manage or generate structures")) manager.commandBuilder("structures", ArgumentDescription.of("Manage or generate structures"))
.literal("generate") .literal("generate")
.argument(RegistryArgument.builder("structure", .argument(RegistryArgument.builder("structure",
StructureCommandAddon::getStructureRegistry, StructureCommandAddon::getStructureRegistry,
TypeKey.of(Structure.class))) TypeKey.of(Structure.class)))
.argument(LongArgument.optional("seed", 0)) .argument(LongArgument.optional("seed", 0))
.argument(EnumArgument.optional(Rotation.class, "rotation", Rotation.NONE)) .argument(EnumArgument.optional(Rotation.class, "rotation", Rotation.NONE))
.handler(context -> { .handler(context -> {
Structure structure = context.get("structure"); Structure structure = context.get("structure");
Entity sender = context.getSender().getEntity().orElseThrow(); Entity sender = context.getSender().getEntity().orElseThrow();
structure.generate( structure.generate(
sender.position().toInt(), sender.position().toInt(),
sender.world(), sender.world(),
((Long) context.get("seed") == 0) ? new Random() : new Random(context.get("seed")), ((Long) context.get("seed") == 0) ? new Random() : new Random(context.get("seed")),
context.get("rotation") 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()
.getOrCreateRegistry(DISTRIBUTOR_TOKEN);
distributorRegistry.register(addon.key("SAMPLER"), SamplerDistributorTemplate::new); distributorRegistry.register(base.key("SAMPLER"), SamplerDistributorTemplate::new);
distributorRegistry.register(addon.key("POINTS"), PointSetDistributorTemplate::new); distributorRegistry.register(base.key("POINTS"), PointSetDistributorTemplate::new);
distributorRegistry.register(addon.key("PADDED_GRID"), PaddedGridDistributorTemplate::new); distributorRegistry.register(base.key("PADDED_GRID"), PaddedGridDistributorTemplate::new);
distributorRegistry.register(addon.key("AND"), AndDistributorTemplate::new); distributorRegistry.register(base.key("AND"), AndDistributorTemplate::new);
distributorRegistry.register(addon.key("OR"), OrDistributorTemplate::new); distributorRegistry.register(base.key("OR"), OrDistributorTemplate::new);
distributorRegistry.register(addon.key("XOR"), XorDistributorTemplate::new); distributorRegistry.register(base.key("XOR"), XorDistributorTemplate::new);
distributorRegistry.register(addon.key("YES"), YesDistributorTemplate::new); distributorRegistry.register(base.key("YES"), YesDistributorTemplate::new);
distributorRegistry.register(addon.key("NO"), NoDistributorTemplate::new); distributorRegistry.register(base.key("NO"), NoDistributorTemplate::new);
event.getPack() event.getPack()
.applyLoader(Point.class, PointTemplate::new); .applyLoader(Point.class, PointTemplate::new);
}) })
.failThrough(); .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(base.key("SURFACE"), SurfaceLocatorTemplate::new);
locatorRegistry.register(base.key("TOP"), TopLocatorTemplate::new);
locatorRegistry.register(addon.key("RANDOM"), RandomLocatorTemplate::new); locatorRegistry.register(base.key("RANDOM"), RandomLocatorTemplate::new);
locatorRegistry.register(addon.key("GAUSSIAN_RANDOM"), GaussianRandomLocatorTemplate::new); locatorRegistry.register(base.key("GAUSSIAN_RANDOM"), GaussianRandomLocatorTemplate::new);
locatorRegistry.register(addon.key("PATTERN"), PatternLocatorTemplate::new); locatorRegistry.register(base.key("PATTERN"), PatternLocatorTemplate::new);
locatorRegistry.register(addon.key("ADJACENT_PATTERN"), AdjacentPatternLocatorTemplate::new); locatorRegistry.register(base.key("ADJACENT_PATTERN"), AdjacentPatternLocatorTemplate::new);
locatorRegistry.register(addon.key("SAMPLER"), SamplerLocatorTemplate::new); locatorRegistry.register(base.key("SAMPLER"), SamplerLocatorTemplate::new);
locatorRegistry.register(addon.key("SAMPLER_3D"), Sampler3DLocatorTemplate::new); locatorRegistry.register(base.key("SAMPLER_3D"), Sampler3DLocatorTemplate::new);
locatorRegistry.register(addon.key("AND"), AndLocatorTemplate::new); locatorRegistry.register(base.key("AND"), AndLocatorTemplate::new);
locatorRegistry.register(addon.key("OR"), OrLocatorTemplate::new); locatorRegistry.register(base.key("OR"), OrLocatorTemplate::new);
locatorRegistry.register(addon.key("XOR"), XorLocatorTemplate::new); locatorRegistry.register(base.key("XOR"), XorLocatorTemplate::new);
}) })
.then(event -> { .then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<Pattern>>> patternRegistry = event.getPack().getOrCreateRegistry(PATTERN_TOKEN); CheckedRegistry<Supplier<ObjectTemplate<Pattern>>> patternRegistry = event.getPack().getOrCreateRegistry(PATTERN_TOKEN);
patternRegistry.register(addon.key("MATCH_AIR"), AirMatchPatternTemplate::new); patternRegistry.register(base.key("MATCH_AIR"), AirMatchPatternTemplate::new);
patternRegistry.register(addon.key("MATCH_SOLID"), SolidMatchPatternTemplate::new); patternRegistry.register(base.key("MATCH_SOLID"), SolidMatchPatternTemplate::new);
patternRegistry.register(addon.key("MATCH"), SingleBlockMatchPatternTemplate::new); patternRegistry.register(base.key("MATCH"), SingleBlockMatchPatternTemplate::new);
patternRegistry.register(addon.key("MATCH_SET"), BlockSetMatchPatternTemplate::new); patternRegistry.register(base.key("MATCH_SET"), BlockSetMatchPatternTemplate::new);
patternRegistry.register(base.key("AND"), AndPatternTemplate::new);
patternRegistry.register(base.key("OR"), OrPatternTemplate::new);
patternRegistry.register(base.key("XOR"), XorPatternTemplate::new);
patternRegistry.register(base.key("NOT"), NotPatternTemplate::new);
})
.failThrough()))
);
patternRegistry.register(addon.key("AND"), AndPatternTemplate::new);
patternRegistry.register(addon.key("OR"), OrPatternTemplate::new);
patternRegistry.register(addon.key("XOR"), XorPatternTemplate::new);
patternRegistry.register(addon.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))
.applyLoader(DimensionApplicableNoiseSampler.class, DimensionApplicableNoiseSampler::new)
.applyLoader(FunctionTemplate.class, FunctionTemplate::new);
noiseRegistry.register(addon.key("LINEAR"), LinearNormalizerTemplate::new); noiseRegistry.register(base.key("LINEAR"), LinearNormalizerTemplate::new);
noiseRegistry.register(addon.key("NORMAL"), NormalNormalizerTemplate::new); noiseRegistry.register(base.key("NORMAL"), NormalNormalizerTemplate::new);
noiseRegistry.register(addon.key("CLAMP"), ClampNormalizerTemplate::new); noiseRegistry.register(base.key("CLAMP"), ClampNormalizerTemplate::new);
noiseRegistry.register(addon.key("PROBABILITY"), ProbabilityNormalizerTemplate::new); noiseRegistry.register(base.key("PROBABILITY"), ProbabilityNormalizerTemplate::new);
noiseRegistry.register(addon.key("SCALE"), ScaleNormalizerTemplate::new); noiseRegistry.register(base.key("SCALE"), ScaleNormalizerTemplate::new);
noiseRegistry.register(addon.key("POSTERIZATION"), PosterizationNormalizerTemplate::new); noiseRegistry.register(base.key("POSTERIZATION"), PosterizationNormalizerTemplate::new);
noiseRegistry.register(addon.key("IMAGE"), ImageSamplerTemplate::new); noiseRegistry.register(base.key("IMAGE"), ImageSamplerTemplate::new);
noiseRegistry.register(addon.key("DOMAIN_WARP"), DomainWarpTemplate::new); noiseRegistry.register(base.key("DOMAIN_WARP"), DomainWarpTemplate::new);
noiseRegistry.register(addon.key("FBM"), BrownianMotionTemplate::new); noiseRegistry.register(base.key("FBM"), BrownianMotionTemplate::new);
noiseRegistry.register(addon.key("PING_PONG"), PingPongTemplate::new); noiseRegistry.register(base.key("PING_PONG"), PingPongTemplate::new);
noiseRegistry.register(addon.key("RIDGED"), RidgedFractalTemplate::new); noiseRegistry.register(base.key("RIDGED"), RidgedFractalTemplate::new);
noiseRegistry.register(addon.key("OPEN_SIMPLEX_2"), () -> new SimpleNoiseTemplate(OpenSimplex2Sampler::new)); noiseRegistry.register(base.key("OPEN_SIMPLEX_2"), () -> new SimpleNoiseTemplate(OpenSimplex2Sampler::new));
noiseRegistry.register(addon.key("OPEN_SIMPLEX_2S"), () -> new SimpleNoiseTemplate(OpenSimplex2SSampler::new)); noiseRegistry.register(base.key("OPEN_SIMPLEX_2S"), () -> new SimpleNoiseTemplate(OpenSimplex2SSampler::new));
noiseRegistry.register(addon.key("PERLIN"), () -> new SimpleNoiseTemplate(PerlinSampler::new)); noiseRegistry.register(base.key("PERLIN"), () -> new SimpleNoiseTemplate(PerlinSampler::new));
noiseRegistry.register(addon.key("SIMPLEX"), () -> new SimpleNoiseTemplate(SimplexSampler::new)); noiseRegistry.register(base.key("SIMPLEX"), () -> new SimpleNoiseTemplate(SimplexSampler::new));
noiseRegistry.register(addon.key("GABOR"), GaborNoiseTemplate::new); noiseRegistry.register(base.key("GABOR"), GaborNoiseTemplate::new);
noiseRegistry.register(addon.key("VALUE"), () -> new SimpleNoiseTemplate(ValueSampler::new)); noiseRegistry.register(base.key("VALUE"), () -> new SimpleNoiseTemplate(ValueSampler::new));
noiseRegistry.register(addon.key("VALUE_CUBIC"), () -> new SimpleNoiseTemplate(ValueCubicSampler::new)); noiseRegistry.register(base.key("VALUE_CUBIC"), () -> new SimpleNoiseTemplate(ValueCubicSampler::new));
noiseRegistry.register(addon.key("CELLULAR"), CellularNoiseTemplate::new); noiseRegistry.register(base.key("CELLULAR"), CellularNoiseTemplate::new);
noiseRegistry.register(addon.key("WHITE_NOISE"), () -> new SimpleNoiseTemplate(WhiteNoiseSampler::new)); noiseRegistry.register(base.key("WHITE_NOISE"), () -> new SimpleNoiseTemplate(WhiteNoiseSampler::new));
noiseRegistry.register(addon.key("POSITIVE_WHITE_NOISE"), () -> new SimpleNoiseTemplate(PositiveWhiteNoiseSampler::new)); noiseRegistry.register(base.key("POSITIVE_WHITE_NOISE"), () -> new SimpleNoiseTemplate(PositiveWhiteNoiseSampler::new));
noiseRegistry.register(addon.key("GAUSSIAN"), () -> new SimpleNoiseTemplate(GaussianNoiseSampler::new)); noiseRegistry.register(base.key("GAUSSIAN"), () -> new SimpleNoiseTemplate(GaussianNoiseSampler::new));
noiseRegistry.register(addon.key("CONSTANT"), ConstantNoiseTemplate::new); noiseRegistry.register(base.key("CONSTANT"), ConstantNoiseTemplate::new);
noiseRegistry.register(addon.key("KERNEL"), KernelTemplate::new); noiseRegistry.register(base.key("KERNEL"), KernelTemplate::new);
noiseRegistry.register(addon.key("LINEAR_HEIGHTMAP"), LinearHeightmapSamplerTemplate::new); noiseRegistry.register(base.key("LINEAR_HEIGHTMAP"), LinearHeightmapSamplerTemplate::new);
noiseRegistry.register(addon.key("ADD"), () -> new BinaryArithmeticTemplate<>(AdditionSampler::new)); noiseRegistry.register(base.key("ADD"), () -> new BinaryArithmeticTemplate<>(AdditionSampler::new));
noiseRegistry.register(addon.key("SUB"), () -> new BinaryArithmeticTemplate<>(SubtractionSampler::new)); noiseRegistry.register(base.key("SUB"), () -> new BinaryArithmeticTemplate<>(SubtractionSampler::new));
noiseRegistry.register(addon.key("MUL"), () -> new BinaryArithmeticTemplate<>(MultiplicationSampler::new)); noiseRegistry.register(base.key("MUL"), () -> new BinaryArithmeticTemplate<>(MultiplicationSampler::new));
noiseRegistry.register(addon.key("DIV"), () -> new BinaryArithmeticTemplate<>(DivisionSampler::new)); noiseRegistry.register(base.key("DIV"), () -> new BinaryArithmeticTemplate<>(DivisionSampler::new));
noiseRegistry.register(addon.key("MAX"), () -> new BinaryArithmeticTemplate<>(MaxSampler::new)); noiseRegistry.register(base.key("MAX"), () -> new BinaryArithmeticTemplate<>(MaxSampler::new));
noiseRegistry.register(addon.key("MIN"), () -> new BinaryArithmeticTemplate<>(MinSampler::new)); noiseRegistry.register(base.key("MIN"), () -> new BinaryArithmeticTemplate<>(MinSampler::new));
Map<String, DimensionApplicableNoiseSampler> packSamplers = new LinkedHashMap<>(); Map<String, DimensionApplicableNoiseSampler> packSamplers = new LinkedHashMap<>();
Map<String, FunctionTemplate> packFunctions = new LinkedHashMap<>(); Map<String, FunctionTemplate> packFunctions = new LinkedHashMap<>();
noiseRegistry.register(addon.key("EXPRESSION"), () -> new ExpressionFunctionTemplate(packSamplers, packFunctions)); noiseRegistry.register(base.key("EXPRESSION"), () -> new ExpressionFunctionTemplate(packSamplers, packFunctions));
NoiseConfigPackTemplate template = event.loadTemplate(new NoiseConfigPackTemplate()); NoiseConfigPackTemplate template = event.loadTemplate(new NoiseConfigPackTemplate());
packSamplers.putAll(template.getSamplers()); packSamplers.putAll(template.getSamplers());
packFunctions.putAll(template.getFunctions()); packFunctions.putAll(template.getFunctions());
event.getPack().getContext().put(template); event.getPack().getContext().put(template);
}) })
.priority(50) .priority(50)
.failThrough(); .failThrough()))
);
} }
} }
@@ -7,27 +7,28 @@
package com.dfsek.terra.addons.ore; package com.dfsek.terra.addons.ore;
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.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;
public class OreAddon implements AddonInitializer { public class OreAddon 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(manager -> manager.getHandler(FunctionalEventHandler.class)),
.register(addon, ConfigPackPreLoadEvent.class) Get.addon(),
.then(event -> event.getPack().registerConfigType(new OreConfigType(), addon.key("ORE"), 1)) (eventHandler, addon) -> Init
.failThrough(); .ofPure(eventHandler
.register(addon, ConfigPackPreLoadEvent.class)
.then(event -> event
.getPack()
.registerConfigType(new OreConfigType(), addon.key("ORE"), 1))
.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)
.register(base.key("FEATURE"), () -> new FeatureStageTemplate(platform, biomeFeaturesKey)))
.failThrough();
return handler.register(base, ConfigurationLoadEvent.class)
.then(event -> {
if(event.is(Biome.class)) {
DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder();
platform.getEventManager() List<FeatureGenerationStage> featureGenerationStages = new ArrayList<>();
.getHandler(FunctionalEventHandler.class) event.getPack().getStages().forEach(stage -> {
.register(addon, ConfigurationLoadEvent.class) if(stage instanceof FeatureGenerationStage featureGenerationStage) {
.then(event -> { featureGenerationStages.add(featureGenerationStage);
if(event.is(Biome.class)) { templateBuilder
DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder(); .value(featureGenerationStage.getID(),
DynamicValue
.builder("features." + featureGenerationStage.getID(), List.class)
.annotatedType(FEATURE_LIST_TYPE_KEY.getAnnotatedType())
.setDefault(Collections.emptyList())
.build());
}
});
List<FeatureGenerationStage> featureGenerationStages = new ArrayList<>(); DynamicTemplate template = event.load(templateBuilder.build());
event.getPack().getStages().forEach(stage -> {
if(stage instanceof FeatureGenerationStage featureGenerationStage) {
featureGenerationStages.add(featureGenerationStage);
templateBuilder
.value(featureGenerationStage.getID(),
DynamicValue
.builder("features." + featureGenerationStage.getID(), List.class)
.annotatedType(FEATURE_LIST_TYPE_KEY.getAnnotatedType())
.setDefault(Collections.emptyList())
.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()))
);
} }
} }
@@ -0,0 +1,9 @@
package com.dfsek.terra.addons.manifest.api;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.util.function.monad.Monad;
public interface MonadAddonInitializer {
Monad<?, Init<?>> initialize();
}
@@ -0,0 +1,108 @@
package com.dfsek.terra.addons.manifest.api.monad;
import io.vavr.Function1;
import io.vavr.Function2;
import io.vavr.Function3;
import io.vavr.Function4;
import com.dfsek.terra.api.util.function.monad.Monad;
public final class Do {
private Do() {
}
public static <T, M extends Monad<?, M>> Monad<T, M> with(Monad<T, M> monad) {
return monad;
}
public static <T, U, M extends Monad<?, M>> Monad<U, M> with(Monad<T, M> monad,
Function1<T, Monad<U, M>> bind) {
return monad
.bind(bind);
}
public static <T, U, V, M extends Monad<?, M>> Monad<V, M> with(Monad<T, M> monad,
Function1<T, Monad<U, M>> bind,
Function2<T, U, Monad<V, M>> bind2) {
return monad
.bind(t -> monad
.bind(bind)
.bind(bind2.apply(t)));
}
public static <T, U, V, M extends Monad<?, M>> Monad<V, M> with(Monad<T, M> monad,
Monad<U, M> monad2,
Function2<T, U, Monad<V, M>> bind2) {
return with(monad, Function1.constant(monad2), bind2);
}
public static <T, U, V, W, M extends Monad<?, M>> Monad<W, M> with(Monad<T, M> monad,
Function1<T, Monad<U, M>> bind,
Function2<T, U, Monad<V, M>> bind2,
Function3<T, U, V, Monad<W, M>> bind3) {
return monad
.bind(t -> monad
.bind(bind)
.bind(u -> bind2.apply(t)
.andThen(vmMonad -> vmMonad
.bind(bind3.apply(t, u)))
.apply(u)));
}
public static <T, U, V, W, M extends Monad<?, M>> Monad<W, M> with(Monad<T, M> monad,
Monad<U, M> monad2,
Function2<T, U, Monad<V, M>> bind2,
Function3<T, U, V, Monad<W, M>> bind3) {
return with(monad, Function1.constant(monad2), bind2, bind3);
}
public static <T, U, V, W, M extends Monad<?, M>> Monad<W, M> with(Monad<T, M> monad,
Monad<U, M> monad2,
Monad<V, M> monad3,
Function3<T, U, V, Monad<W, M>> bind3) {
return with(monad, monad2, Function2.constant(monad3), bind3);
}
public static <T, U, V, W, X, M extends Monad<?, M>> Monad<X, M> with(Monad<T, M> monad,
Function1<T, Monad<U, M>> bind,
Function2<T, U, Monad<V, M>> bind2,
Function3<T, U, V, Monad<W, M>> bind3,
Function4<T, U, V, W, Monad<X, M>> bind4) {
return monad
.bind(t -> monad
.bind(bind)
.bind(u -> bind2.apply(t)
.andThen(vmMonad -> vmMonad
.bind(v -> bind3.apply(t, u)
.andThen(wmMonad -> wmMonad
.bind(bind4.apply(t, u, v)))
.apply(v)))
.apply(u)));
}
public static <T, U, V, W, X, M extends Monad<?, M>> Monad<X, M> with(Monad<T, M> monad,
Monad<U, M> monad2,
Function2<T, U, Monad<V, M>> bind2,
Function3<T, U, V, Monad<W, M>> bind3,
Function4<T, U, V, W, Monad<X, M>> bind4) {
return with(monad, Function1.constant(monad2), bind2, bind3, bind4);
}
public static <T, U, V, W, X, M extends Monad<?, M>> Monad<X, M> with(Monad<T, M> monad,
Monad<U, M> monad2,
Monad<V, M> monad3,
Function3<T, U, V, Monad<W, M>> bind3,
Function4<T, U, V, W, Monad<X, M>> bind4) {
return with(monad, monad2, Function2.constant(monad3), bind3, bind4);
}
public static <T, U, V, W, X, M extends Monad<?, M>> Monad<X, M> with(Monad<T, M> monad,
Monad<U, M> monad2,
Monad<V, M> monad3,
Monad<W, M> monad4,
Function4<T, U, V, W, Monad<X, M>> bind4) {
return with(monad, monad2, monad3, Function3.constant(monad4), bind4);
}
}
@@ -0,0 +1,25 @@
package com.dfsek.terra.addons.manifest.api.monad;
import com.dfsek.terra.addons.manifest.impl.InitInfo;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.EventManager;
public final class Get {
private Get() {
}
public static Init<EventManager> eventManager() {
return Init.of(initInfo -> initInfo.platform().getEventManager());
}
public static Init<BaseAddon> addon() {
return Init.of(InitInfo::addon);
}
public static Init<Platform> platform() {
return Init.of(InitInfo::platform);
}
}
@@ -0,0 +1,43 @@
package com.dfsek.terra.addons.manifest.api.monad;
import com.dfsek.terra.addons.manifest.impl.InitInfo;
import com.dfsek.terra.api.util.function.Functions;
import com.dfsek.terra.api.util.function.monad.Monad;
import java.util.function.Function;
public class Init<T> implements Monad<T, Init<?>> {
private final Function<InitInfo, T> get;
public static <T> Init<T> of(Function<InitInfo, T> get) {
return new Init<>(get);
}
private Init(Function<InitInfo, T> get) {
this.get = get;
}
public T apply(InitInfo platform) {
return get.apply(platform);
}
@Override
public <U> Init<U> bind(Function<T, Monad<U, Init<?>>> map) {
return new Init<>(info -> ((Init<U>) map.apply(apply(info))).apply(info));
}
@Override
public <U> Init<U> map(Function<T, U> fn) {
return (Init<U>) Monad.super.map(fn);
}
@Override
public <U> Monad<U, Init<?>> pure(U u) {
return ofPure(u);
}
public static <T> Init<T> ofPure(T t) {
return of(Functions.constant(t));
}
}
@@ -0,0 +1,13 @@
package com.dfsek.terra.addons.manifest.impl;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon;
import java.util.function.Function;
public record InitInfo(
Platform platform,
BaseAddon addon
) {
}
@@ -0,0 +1,66 @@
package com.dfsek.terra.addons.manifest.impl;
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import com.dfsek.terra.addons.manifest.api.monad.Init;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.inject.Injector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class Initializer {
private Initializer() {
}
public static Initializer of(MonadAddonInitializer addon) {
return new MonadInitializer(addon);
}
public static Initializer of(AddonInitializer addonInitializer) {
return new BasicInitializer(addonInitializer);
}
public abstract void initialize(InitInfo info);
private static class MonadInitializer extends Initializer {
private final MonadAddonInitializer addon;
private MonadInitializer(MonadAddonInitializer addon) {
this.addon = addon;
}
@Override
public void initialize(InitInfo info) {
((Init<?>) addon.initialize()).apply(info);
}
}
private static class BasicInitializer extends Initializer {
private final AddonInitializer initializer;
private BasicInitializer(AddonInitializer initializer) {
this.initializer = initializer;
}
@Override
public void initialize(InitInfo info) {
Injector<BaseAddon> addonInjector = Injector.get(info.addon());
addonInjector.addExplicitTarget(BaseAddon.class);
Injector<Platform> platformInjector = Injector.get(info.platform());
platformInjector.addExplicitTarget(Platform.class);
Injector<Logger> loggerInjector = Injector.get(LoggerFactory.getLogger(initializer.getClass()));
loggerInjector.addExplicitTarget(Logger.class);
addonInjector.inject(initializer);
platformInjector.inject(initializer);
loggerInjector.inject(initializer);
initializer.initialize();
}
}
}
@@ -26,11 +26,11 @@ import com.dfsek.terra.api.inject.annotations.Inject;
public class ManifestAddon implements BaseAddon { public class ManifestAddon implements BaseAddon {
private static final Logger logger = LoggerFactory.getLogger(ManifestAddon.class); private static final Logger logger = LoggerFactory.getLogger(ManifestAddon.class);
private final AddonManifest manifest; private final AddonManifest manifest;
private final List<AddonInitializer> initializers; private final List<Initializer> initializers;
@Inject @Inject
private Platform platform; private Platform platform;
public ManifestAddon(AddonManifest manifest, List<AddonInitializer> initializers) { public ManifestAddon(AddonManifest manifest, List<Initializer> initializers) {
this.manifest = manifest; this.manifest = manifest;
this.initializers = initializers; this.initializers = initializers;
} }
@@ -45,23 +45,13 @@ public class ManifestAddon implements BaseAddon {
} }
public void initialize() { public void initialize() {
Injector<BaseAddon> addonInjector = Injector.get(this);
addonInjector.addExplicitTarget(BaseAddon.class);
Injector<Platform> platformInjector = Injector.get(platform);
platformInjector.addExplicitTarget(Platform.class);
logger.debug("Initializing addon {}", getID()); logger.debug("Initializing addon {}", getID());
initializers.forEach(initializer -> { initializers.forEach(initializer -> {
Injector<Logger> loggerInjector = Injector.get(LoggerFactory.getLogger(initializer.getClass()));
loggerInjector.addExplicitTarget(Logger.class);
logger.debug("Invoking entry point {}", initializer.getClass()); logger.debug("Invoking entry point {}", initializer.getClass());
addonInjector.inject(initializer); initializer.initialize(new InitInfo(platform, this));
platformInjector.inject(initializer);
loggerInjector.inject(initializer);
initializer.initialize();
}); });
} }
@@ -13,6 +13,9 @@ import ca.solostudios.strata.version.VersionRange;
import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.exception.LoadException;
import com.dfsek.tectonic.api.loader.ConfigLoader; import com.dfsek.tectonic.api.loader.ConfigLoader;
import com.dfsek.tectonic.yaml.YamlConfiguration; import com.dfsek.tectonic.yaml.YamlConfiguration;
import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -72,13 +75,17 @@ public class ManifestAddonLoader implements BootstrapBaseAddon<ManifestAddon> {
throw new AddonException("Addon " + manifest.getID() + " has unknown schema version: " + manifest.getSchemaVersion()); throw new AddonException("Addon " + manifest.getID() + " has unknown schema version: " + manifest.getSchemaVersion());
} }
List<AddonInitializer> initializers = manifest.getEntryPoints().stream().map(entryPoint -> { List<Initializer> initializers = manifest.getEntryPoints().stream().map(entryPoint -> {
try { try {
Object in = loader.loadClass(entryPoint).getConstructor().newInstance(); Object in = loader.loadClass(entryPoint).getConstructor().newInstance();
if(!(in instanceof AddonInitializer)) { if(in instanceof AddonInitializer a) {
throw new AddonException(in.getClass() + " does not extend " + AddonInitializer.class); return Initializer.of(a);
} }
return (AddonInitializer) in;
if(in instanceof MonadAddonInitializer m) {
return Initializer.of(m);
}
throw new AddonException(in.getClass() + " is not a valid initializer" );
} catch(InvocationTargetException e) { } catch(InvocationTargetException e) {
throw new AddonException("Exception occurred while instantiating addon", e); throw new AddonException("Exception occurred while instantiating addon", e);
} catch(NoSuchMethodException | IllegalAccessException | InstantiationException e) { } catch(NoSuchMethodException | IllegalAccessException | InstantiationException e) {
@@ -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()))
);
} }
} }
+4 -1
View File
@@ -6,6 +6,9 @@ dependencies {
api("com.dfsek.tectonic", "common", Versions.Libraries.tectonic) api("com.dfsek.tectonic", "common", Versions.Libraries.tectonic)
api("com.github.ben-manes.caffeine:caffeine:3.1.0") api("com.github.ben-manes.caffeine", "caffeine", Versions.Libraries.caffeine)
api("io.vavr", "vavr", Versions.Libraries.vavr)
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
} }
@@ -0,0 +1,14 @@
package com.dfsek.terra.api.util.function;
import java.util.function.Function;
public final class Functions {
private Functions() {
}
public static <T, U> Function<T, U> constant(U value) {
return ignore -> value;
}
}
@@ -3,6 +3,6 @@ package com.dfsek.terra.api.util.function.functor;
import java.util.function.Function; import java.util.function.Function;
public interface Functor<T> { public interface Functor<T, F extends Functor<?, F>> {
<U> Functor<U> map(Function<T, U> map); <U> Functor<U, F> map(Function<T, U> map);
} }
@@ -1,8 +1,16 @@
package com.dfsek.terra.api.util.function.monad; package com.dfsek.terra.api.util.function.monad;
import com.dfsek.terra.api.util.function.functor.Functor;
import java.util.function.Function; import java.util.function.Function;
public interface Monad<T> { public interface Monad<T, M extends Monad<?, M>> extends Functor<T, M> {
<U> Monad<U> bind(Function<T, Monad<U>> map); <U> Monad<U, M> bind(Function<T, Monad<U, M>> map);
default <U> Monad<U, M> map(Function<T, U> fn) {
return bind(a -> pure(fn.apply(a)));
}
<U> Monad<U, M> pure(U u);
} }