Implement layer palette groups

This commit is contained in:
Astrash
2022-07-16 20:11:17 +10:00
parent edcba9707d
commit 4d31fda79f
8 changed files with 99 additions and 12 deletions

View File

@@ -88,6 +88,7 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer {
paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new);
paletteTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerPaletteTemplate::new);
CheckedRegistry<InstanceWrapper<LayerPalette>> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN);
event.getPack().applyLoader(LayerPalette.Group.class, new LayerPalette.Group.Loader(event.getPack()));
event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> {
paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette));
});

View File

@@ -1,10 +1,71 @@
package com.dfsek.terra.addons.chunkgenerator.api;
import com.dfsek.tectonic.api.depth.DepthTracker;
import com.dfsek.tectonic.api.exception.LoadException;
import com.dfsek.tectonic.api.loader.ConfigLoader;
import com.dfsek.tectonic.api.loader.type.TypeLoader;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.AnnotatedType;
import java.util.HashMap;
import java.util.Map;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.properties.Properties;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public interface LayerPalette {
public abstract class LayerPalette {
Palette get(long seed, Biome biome, int x, int y, int z);
private final Group group;
private final boolean resetsGroup;
protected LayerPalette(Group group, boolean resetsGroup) {
this.group = group;
this.resetsGroup = resetsGroup;
}
public abstract Palette get(long seed, Biome biome, int x, int y, int z);
public final Group getGroup() {
return group;
}
public final boolean resetsGroup() {
return resetsGroup;
}
public static class Group {
public static Group NO_GROUP = new Group();
private Group() {}
public static Group get(String string, ConfigPack pack) {
if (!pack.getContext().has(Holder.class)) {
pack.getContext().put(new Holder(new HashMap<>()));
}
return pack.getContext().get(Holder.class).groups.computeIfAbsent(string, s -> new Group());
}
private record Holder(Map<String, Group> groups) implements Properties {}
public static class Loader implements TypeLoader<Group> {
private final ConfigPack pack;
public Loader(ConfigPack pack) {
this.pack = pack;
}
@Override
public Group load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader,
DepthTracker depthTracker) throws LoadException {
String groupName = (String) o;
return Group.get(groupName, pack);
}
}
}
}

View File

@@ -2,14 +2,13 @@ package com.dfsek.terra.addons.chunkgenerator.config.palette;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public class BiomeDefinedLayerPaletteTemplate implements ObjectTemplate<LayerPalette> {
public class BiomeDefinedLayerPaletteTemplate extends LayerPaletteTemplate {
@Value("default")
@Default
@@ -17,6 +16,6 @@ public class BiomeDefinedLayerPaletteTemplate implements ObjectTemplate<LayerPal
@Override
public LayerPalette get() {
return new BiomeDefinedLayerPalette(defaultPalette);
return new BiomeDefinedLayerPalette(group, resetsGroup, defaultPalette);
}
}

View File

@@ -0,0 +1,21 @@
package com.dfsek.terra.addons.chunkgenerator.config.palette;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
public abstract class LayerPaletteTemplate implements ObjectTemplate<LayerPalette> {
@Value("group")
@Default
protected LayerPalette.Group group = LayerPalette.Group.NO_GROUP;
@Value("resets-group")
@Default
protected boolean resetsGroup = false;
}

View File

@@ -1,20 +1,19 @@
package com.dfsek.terra.addons.chunkgenerator.config.palette;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.SimpleLayerPalette;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public class SimpleLayerPaletteTemplate implements ObjectTemplate<LayerPalette> {
public class SimpleLayerPaletteTemplate extends LayerPaletteTemplate {
@Value("palette")
private Palette palette;
@Override
public LayerPalette get() {
return new SimpleLayerPalette(palette);
return new SimpleLayerPalette(group, resetsGroup, palette);
}
}

View File

@@ -52,6 +52,10 @@ public class LayeredChunkGenerator implements ChunkGenerator {
if (previousLayerPalette == layerPalette) {
paletteLevel++;
} else if (layerPalette.resetsGroup()) {
paletteLevel = 0;
} else if (previousLayerPalette != null && layerPalette.getGroup() == previousLayerPalette.getGroup()) {
paletteLevel++;
} else {
paletteLevel = 0;
}

View File

@@ -18,11 +18,12 @@ import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public class BiomeDefinedLayerPalette implements LayerPalette {
public class BiomeDefinedLayerPalette extends LayerPalette {
private final Palette defaultPalette;
public BiomeDefinedLayerPalette(Palette defaultPalette) {
public BiomeDefinedLayerPalette(Group group, boolean resetsGroup, Palette defaultPalette) {
super(group, resetsGroup);
this.defaultPalette = defaultPalette;
}

View File

@@ -5,11 +5,12 @@ import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
public class SimpleLayerPalette implements LayerPalette {
public class SimpleLayerPalette extends LayerPalette {
private final Palette palette;
public SimpleLayerPalette(Palette palette) {
public SimpleLayerPalette(Group group, boolean resetsGroup, Palette palette) {
super(group, resetsGroup);
this.palette = palette;
}