mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-08-29 13:20:32 +00:00
Registries are pretty cool, I guess
This commit is contained in:
@@ -1,10 +0,0 @@
|
|||||||
package com.dfsek.terra.biome;
|
|
||||||
|
|
||||||
import org.bukkit.block.data.BlockData;
|
|
||||||
import org.polydev.gaea.world.palette.Palette;
|
|
||||||
|
|
||||||
public class PaletteHolder {
|
|
||||||
public Palette<BlockData> getPalette(int y) {
|
|
||||||
return null; // TODO: implementation
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.dfsek.terra.biome.palette;
|
||||||
|
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.polydev.gaea.world.palette.Palette;
|
||||||
|
|
||||||
|
public class PaletteHolder {
|
||||||
|
private final Palette<BlockData>[] palettes;
|
||||||
|
|
||||||
|
protected PaletteHolder(Palette<BlockData>[] palettes) {
|
||||||
|
this.palettes = palettes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Palette<BlockData> getPalette(int y) {
|
||||||
|
return palettes[y];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.dfsek.terra.biome.palette;
|
||||||
|
|
||||||
|
import com.dfsek.terra.util.DataUtil;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.polydev.gaea.world.palette.Palette;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
public class PaletteHolderBuilder {
|
||||||
|
private final TreeMap<Integer, Palette<BlockData>> paletteMap = new TreeMap<>();
|
||||||
|
|
||||||
|
public PaletteHolderBuilder add(int y, Palette<BlockData> palette) {
|
||||||
|
paletteMap.put(y, palette);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public PaletteHolder build() {
|
||||||
|
Palette<BlockData>[] palettes = new Palette[paletteMap.lastKey() + 1];
|
||||||
|
for(int y = 0; y <= paletteMap.lastKey(); y++) {
|
||||||
|
Palette<BlockData> d = DataUtil.BLANK_PALETTE;
|
||||||
|
for(Map.Entry<Integer, Palette<BlockData>> e : paletteMap.entrySet()) {
|
||||||
|
if(e.getKey() >= y) {
|
||||||
|
d = e.getValue();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
palettes[y] = d;
|
||||||
|
}
|
||||||
|
return new PaletteHolder(palettes);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import com.dfsek.tectonic.exception.ConfigException;
|
|||||||
import com.dfsek.tectonic.loading.ConfigLoader;
|
import com.dfsek.tectonic.loading.ConfigLoader;
|
||||||
import com.dfsek.terra.Debug;
|
import com.dfsek.terra.Debug;
|
||||||
import com.dfsek.terra.biome.UserDefinedBiome;
|
import com.dfsek.terra.biome.UserDefinedBiome;
|
||||||
|
import com.dfsek.terra.biome.palette.PaletteHolder;
|
||||||
import com.dfsek.terra.carving.CarverPalette;
|
import com.dfsek.terra.carving.CarverPalette;
|
||||||
import com.dfsek.terra.carving.UserDefinedCarver;
|
import com.dfsek.terra.carving.UserDefinedCarver;
|
||||||
import com.dfsek.terra.config.builder.BiomeGridBuilder;
|
import com.dfsek.terra.config.builder.BiomeGridBuilder;
|
||||||
@@ -15,6 +16,7 @@ import com.dfsek.terra.config.factories.CarverFactory;
|
|||||||
import com.dfsek.terra.config.lang.LangUtil;
|
import com.dfsek.terra.config.lang.LangUtil;
|
||||||
import com.dfsek.terra.config.loaders.GridSpawnLoader;
|
import com.dfsek.terra.config.loaders.GridSpawnLoader;
|
||||||
import com.dfsek.terra.config.loaders.NoiseBuilderLoader;
|
import com.dfsek.terra.config.loaders.NoiseBuilderLoader;
|
||||||
|
import com.dfsek.terra.config.loaders.PaletteHolderLoader;
|
||||||
import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader;
|
import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader;
|
||||||
import com.dfsek.terra.config.loaders.RangeLoader;
|
import com.dfsek.terra.config.loaders.RangeLoader;
|
||||||
import com.dfsek.terra.config.loaders.base.CarverPaletteLoader;
|
import com.dfsek.terra.config.loaders.base.CarverPaletteLoader;
|
||||||
@@ -24,6 +26,10 @@ import com.dfsek.terra.config.templates.CarverTemplate;
|
|||||||
import com.dfsek.terra.config.templates.StructureTemplate;
|
import com.dfsek.terra.config.templates.StructureTemplate;
|
||||||
import com.dfsek.terra.generation.config.NoiseBuilder;
|
import com.dfsek.terra.generation.config.NoiseBuilder;
|
||||||
import com.dfsek.terra.procgen.GridSpawn;
|
import com.dfsek.terra.procgen.GridSpawn;
|
||||||
|
import com.dfsek.terra.registry.BiomeGridRegistry;
|
||||||
|
import com.dfsek.terra.registry.BiomeRegistry;
|
||||||
|
import com.dfsek.terra.registry.CarverRegistry;
|
||||||
|
import com.dfsek.terra.registry.StructureRegistry;
|
||||||
import com.dfsek.terra.util.ConfigUtil;
|
import com.dfsek.terra.util.ConfigUtil;
|
||||||
import org.polydev.gaea.math.ProbabilityCollection;
|
import org.polydev.gaea.math.ProbabilityCollection;
|
||||||
import org.polydev.gaea.math.Range;
|
import org.polydev.gaea.math.Range;
|
||||||
@@ -33,10 +39,7 @@ import java.io.FileInputStream;
|
|||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
@@ -45,10 +48,10 @@ import java.util.logging.Level;
|
|||||||
*/
|
*/
|
||||||
public class ConfigPack {
|
public class ConfigPack {
|
||||||
private final ConfigPackTemplate template = new ConfigPackTemplate();
|
private final ConfigPackTemplate template = new ConfigPackTemplate();
|
||||||
private final Map<String, UserDefinedBiome> biomes = new HashMap<>();
|
private final BiomeRegistry biomeRegistry = new BiomeRegistry();
|
||||||
private final Map<String, BiomeGridBuilder> biomeGrids = new HashMap<>();
|
private final BiomeGridRegistry biomeGridRegistry = new BiomeGridRegistry();
|
||||||
private final Map<String, StructureTemplate> structures = new HashMap<>();
|
private final StructureRegistry structureRegistry = new StructureRegistry();
|
||||||
private final Map<String, UserDefinedCarver> carvers = new HashMap<>();
|
private final CarverRegistry carverRegistry = new CarverRegistry();
|
||||||
|
|
||||||
|
|
||||||
public ConfigPack(File folder) throws ConfigException {
|
public ConfigPack(File folder) throws ConfigException {
|
||||||
@@ -69,32 +72,33 @@ public class ConfigPack {
|
|||||||
abstractConfigLoader.registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader())
|
abstractConfigLoader.registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader())
|
||||||
.registerLoader(Range.class, new RangeLoader())
|
.registerLoader(Range.class, new RangeLoader())
|
||||||
.registerLoader(CarverPalette.class, new CarverPaletteLoader())
|
.registerLoader(CarverPalette.class, new CarverPaletteLoader())
|
||||||
.registerLoader(GridSpawn.class, new GridSpawnLoader());
|
.registerLoader(GridSpawn.class, new GridSpawnLoader())
|
||||||
|
.registerLoader(PaletteHolder.class, new PaletteHolderLoader());
|
||||||
|
|
||||||
List<StructureTemplate> structureTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "structures/single").toPath()), StructureTemplate::new);
|
List<StructureTemplate> structureTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "structures/single").toPath()), StructureTemplate::new);
|
||||||
structureTemplates.forEach(structure -> {
|
structureTemplates.forEach(structure -> {
|
||||||
structures.put(structure.getID(), structure);
|
structureRegistry.add(structure.getID(), structure);
|
||||||
Debug.info("Loaded structure " + structure.getID());
|
Debug.info("Loaded structure " + structure.getID());
|
||||||
});
|
});
|
||||||
|
|
||||||
List<CarverTemplate> carverTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "carving").toPath()), CarverTemplate::new);
|
List<CarverTemplate> carverTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "carving").toPath()), CarverTemplate::new);
|
||||||
CarverFactory carverFactory = new CarverFactory();
|
CarverFactory carverFactory = new CarverFactory();
|
||||||
carverTemplates.forEach(carver -> {
|
carverTemplates.forEach(carver -> {
|
||||||
carvers.put(carver.getID(), carverFactory.build(carver));
|
carverRegistry.add(carver.getID(), carverFactory.build(carver));
|
||||||
Debug.info("Loaded carver " + carver.getID());
|
Debug.info("Loaded carver " + carver.getID());
|
||||||
});
|
});
|
||||||
|
|
||||||
List<BiomeTemplate> biomeTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "biomes").toPath()), () -> new BiomeTemplate(this));
|
List<BiomeTemplate> biomeTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "biomes").toPath()), () -> new BiomeTemplate(this));
|
||||||
BiomeFactory biomeFactory = new BiomeFactory();
|
BiomeFactory biomeFactory = new BiomeFactory();
|
||||||
biomeTemplates.forEach(biome -> {
|
biomeTemplates.forEach(biome -> {
|
||||||
biomes.put(biome.getID(), biomeFactory.build(biome));
|
biomeRegistry.add(biome.getID(), biomeFactory.build(biome));
|
||||||
Debug.info("Loaded biome " + biome.getID());
|
Debug.info("Loaded biome " + biome.getID());
|
||||||
});
|
});
|
||||||
|
|
||||||
List<BiomeGridTemplate> biomeGridTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "grids").toPath()), BiomeGridTemplate::new);
|
List<BiomeGridTemplate> biomeGridTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "grids").toPath()), BiomeGridTemplate::new);
|
||||||
BiomeGridFactory biomeGridFactory = new BiomeGridFactory();
|
BiomeGridFactory biomeGridFactory = new BiomeGridFactory();
|
||||||
biomeGridTemplates.forEach(grid -> {
|
biomeGridTemplates.forEach(grid -> {
|
||||||
biomeGrids.put(grid.getID(), biomeGridFactory.build(grid));
|
biomeGridRegistry.add(grid.getID(), biomeGridFactory.build(grid));
|
||||||
Debug.info("Loaded BiomeGrid " + grid.getID());
|
Debug.info("Loaded BiomeGrid " + grid.getID());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -102,38 +106,38 @@ public class ConfigPack {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public UserDefinedBiome getBiome(String id) {
|
public UserDefinedBiome getBiome(String id) {
|
||||||
return biomes.get(id);
|
return biomeRegistry.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BiomeGridBuilder getBiomeGrid(String id) {
|
public BiomeGridBuilder getBiomeGrid(String id) {
|
||||||
return biomeGrids.get(id);
|
return biomeGridRegistry.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getBiomeIDs() {
|
public List<String> getBiomeIDs() {
|
||||||
List<String> biomeIDs = new ArrayList<>();
|
List<String> biomeIDs = new ArrayList<>();
|
||||||
biomes.forEach((id, biome) -> biomeIDs.add(id));
|
biomeRegistry.forEach(biome -> biomeIDs.add(biome.getID()));
|
||||||
return biomeIDs;
|
return biomeIDs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public StructureTemplate getStructure(String id) {
|
public StructureTemplate getStructure(String id) {
|
||||||
return structures.get(id);
|
return structureRegistry.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<StructureTemplate> getStructures() {
|
public Set<StructureTemplate> getStructures() {
|
||||||
return new HashSet<>(structures.values());
|
return structureRegistry.entries();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<UserDefinedCarver> getCarvers() {
|
public Collection<UserDefinedCarver> getCarvers() {
|
||||||
return carvers.values();
|
return carverRegistry.entries();
|
||||||
}
|
}
|
||||||
|
|
||||||
public UserDefinedCarver getCarver(String id) {
|
public UserDefinedCarver getCarver(String id) {
|
||||||
return carvers.get(id);
|
return carverRegistry.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getStructureIDs() {
|
public List<String> getStructureIDs() {
|
||||||
List<String> ids = new ArrayList<>();
|
List<String> ids = new ArrayList<>();
|
||||||
structures.forEach((id, structure) -> ids.add(id));
|
structureRegistry.forEach(structure -> ids.add(structure.getID()));
|
||||||
return ids;
|
return ids;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.dfsek.terra.config.builder;
|
package com.dfsek.terra.config.builder;
|
||||||
|
|
||||||
import com.dfsek.terra.biome.PaletteHolder;
|
import com.dfsek.terra.biome.palette.PaletteHolder;
|
||||||
import com.dfsek.terra.generation.config.NoiseBuilder;
|
import com.dfsek.terra.generation.config.NoiseBuilder;
|
||||||
import com.dfsek.terra.generation.config.WorldGenerator;
|
import com.dfsek.terra.generation.config.WorldGenerator;
|
||||||
import parsii.eval.Scope;
|
import parsii.eval.Scope;
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.dfsek.terra.config.loaders;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.exception.LoadException;
|
||||||
|
import com.dfsek.tectonic.loading.ConfigLoader;
|
||||||
|
import com.dfsek.tectonic.loading.TypeLoader;
|
||||||
|
import com.dfsek.terra.biome.palette.PaletteHolder;
|
||||||
|
import com.dfsek.terra.biome.palette.PaletteHolderBuilder;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.polydev.gaea.world.palette.Palette;
|
||||||
|
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public class PaletteHolderLoader implements TypeLoader<PaletteHolder> {
|
||||||
|
@Override
|
||||||
|
public PaletteHolder load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
|
||||||
|
List<Map<String, Integer>> palette = (List<Map<String, Integer>>) o;
|
||||||
|
PaletteHolderBuilder builder = new PaletteHolderBuilder();
|
||||||
|
for(Map<String, Integer> layer : palette) {
|
||||||
|
for(Map.Entry<String, Integer> entry : layer.entrySet()) {
|
||||||
|
builder.add(entry.getValue(), (Palette<BlockData>) configLoader.loadType(Types.BLOCK_DATA_PALETTE, entry.getKey()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return builder.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
package com.dfsek.terra.config.loaders;
|
package com.dfsek.terra.config.loaders;
|
||||||
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.polydev.gaea.math.ProbabilityCollection;
|
import org.polydev.gaea.math.ProbabilityCollection;
|
||||||
|
import org.polydev.gaea.world.palette.Palette;
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -13,13 +15,16 @@ import java.util.Set;
|
|||||||
public final class Types {
|
public final class Types {
|
||||||
public static final Type MATERIAL_SET_TYPE;
|
public static final Type MATERIAL_SET_TYPE;
|
||||||
public static final Type MATERIAL_PROBABILITY_COLLECTION_TYPE;
|
public static final Type MATERIAL_PROBABILITY_COLLECTION_TYPE;
|
||||||
|
public static final Type BLOCK_DATA_PALETTE;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
MATERIAL_SET_TYPE = getType("materialSet");
|
MATERIAL_SET_TYPE = getType("materialSet");
|
||||||
MATERIAL_PROBABILITY_COLLECTION_TYPE = getType("materialProbabilityCollection");
|
MATERIAL_PROBABILITY_COLLECTION_TYPE = getType("materialProbabilityCollection");
|
||||||
|
BLOCK_DATA_PALETTE = getType("blockDataPalette");
|
||||||
}
|
}
|
||||||
|
|
||||||
private Set<Material> materialSet;
|
private Set<Material> materialSet;
|
||||||
|
private Palette<BlockData> blockDataPalette;
|
||||||
private ProbabilityCollection<Material> materialProbabilityCollection;
|
private ProbabilityCollection<Material> materialProbabilityCollection;
|
||||||
|
|
||||||
private static Type getType(String dummyFieldName) {
|
private static Type getType(String dummyFieldName) {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.dfsek.tectonic.annotations.Abstractable;
|
|||||||
import com.dfsek.tectonic.annotations.Default;
|
import com.dfsek.tectonic.annotations.Default;
|
||||||
import com.dfsek.tectonic.annotations.Value;
|
import com.dfsek.tectonic.annotations.Value;
|
||||||
import com.dfsek.tectonic.config.ConfigTemplate;
|
import com.dfsek.tectonic.config.ConfigTemplate;
|
||||||
import com.dfsek.terra.biome.PaletteHolder;
|
import com.dfsek.terra.biome.palette.PaletteHolder;
|
||||||
import com.dfsek.terra.carving.UserDefinedCarver;
|
import com.dfsek.terra.carving.UserDefinedCarver;
|
||||||
import com.dfsek.terra.config.base.ConfigPack;
|
import com.dfsek.terra.config.base.ConfigPack;
|
||||||
import com.dfsek.terra.generation.items.ores.Ore;
|
import com.dfsek.terra.generation.items.ores.Ore;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.dfsek.terra.generation.config;
|
package com.dfsek.terra.generation.config;
|
||||||
|
|
||||||
import com.dfsek.terra.biome.PaletteHolder;
|
import com.dfsek.terra.biome.palette.PaletteHolder;
|
||||||
import com.dfsek.terra.math.NoiseFunction2;
|
import com.dfsek.terra.math.NoiseFunction2;
|
||||||
import com.dfsek.terra.math.NoiseFunction3;
|
import com.dfsek.terra.math.NoiseFunction3;
|
||||||
import com.dfsek.terra.math.RandomFunction;
|
import com.dfsek.terra.math.RandomFunction;
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.dfsek.terra.registry;
|
||||||
|
|
||||||
|
import com.dfsek.terra.config.builder.BiomeGridBuilder;
|
||||||
|
|
||||||
|
public class BiomeGridRegistry extends TerraRegistry<BiomeGridBuilder> {
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.dfsek.terra.registry;
|
||||||
|
|
||||||
|
import com.dfsek.terra.biome.UserDefinedBiome;
|
||||||
|
|
||||||
|
public class BiomeRegistry extends TerraRegistry<UserDefinedBiome> {
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.dfsek.terra.registry;
|
||||||
|
|
||||||
|
import com.dfsek.terra.carving.UserDefinedCarver;
|
||||||
|
|
||||||
|
public class CarverRegistry extends TerraRegistry<UserDefinedCarver> {
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.dfsek.terra.registry;
|
||||||
|
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.polydev.gaea.world.palette.Palette;
|
||||||
|
|
||||||
|
public class PaletteRegistry extends TerraRegistry<Palette<BlockData>> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.dfsek.terra.registry;
|
||||||
|
|
||||||
|
import com.dfsek.terra.config.templates.StructureTemplate;
|
||||||
|
|
||||||
|
public class StructureRegistry extends TerraRegistry<StructureTemplate> {
|
||||||
|
}
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
package com.dfsek.terra.registry;
|
package com.dfsek.terra.registry;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public abstract class TerraRegistry<T> {
|
public abstract class TerraRegistry<T> {
|
||||||
private final Map<String, T> objects = new HashMap<>();
|
private final Map<String, T> objects = new HashMap<>();
|
||||||
@@ -38,4 +41,12 @@ public abstract class TerraRegistry<T> {
|
|||||||
public T get(String id) {
|
public T get(String id) {
|
||||||
return objects.get(id);
|
return objects.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void forEach(Consumer<T> consumer) {
|
||||||
|
objects.forEach((id, obj) -> consumer.accept(obj));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<T> entries() {
|
||||||
|
return new HashSet<>(objects.values());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user