added VirtualPocketList

previous VirtualPocket -> VirtualSingularPocket
new VirtualPocket superclass of VirtualPocketList and VirtualSingularPocket
This commit is contained in:
CreepyCre 2021-01-31 13:32:09 +01:00
parent 1e362a43c3
commit b641753e11
11 changed files with 187 additions and 103 deletions

View file

@ -12,7 +12,7 @@ import org.dimdev.dimdoors.item.ModItems;
import org.dimdev.dimdoors.particle.ModParticleTypes;
import org.dimdev.dimdoors.pockets.SchematicHandler;
import org.dimdev.dimdoors.pockets.SchematicV2Handler;
import org.dimdev.dimdoors.pockets.VirtualPocket;
import org.dimdev.dimdoors.pockets.virtual.VirtualSingularPocket;
import org.dimdev.dimdoors.rift.targets.Targets;
import org.dimdev.dimdoors.rift.targets.VirtualTarget;
import org.dimdev.dimdoors.sound.ModSoundEvents;
@ -80,7 +80,7 @@ public class DimensionalDoorsInitializer implements ModInitializer {
Targets.registerDefaultTargets();
VirtualTarget.VirtualTargetType.register();
VirtualPocket.VirtualPocketType.register();
VirtualSingularPocket.VirtualSingularPocketType.register();
SchematicV2Handler.getInstance().load();
SchematicHandler.INSTANCE.loadSchematics();

View file

@ -6,6 +6,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.ModConfig;
import org.dimdev.dimdoors.pockets.virtual.VirtualPocket;
import org.dimdev.dimdoors.rift.registry.LinkProperties;
import org.dimdev.dimdoors.rift.targets.VirtualTarget;
import org.dimdev.dimdoors.util.PocketGenerationParameters;

View file

@ -1,11 +1,10 @@
package org.dimdev.dimdoors.pockets;
import java.util.List;
import java.util.Objects;
import com.google.common.collect.Lists;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import org.dimdev.dimdoors.pockets.virtual.VirtualPocketList;
public final class PocketGroup {
/*
@ -16,34 +15,25 @@ public final class PocketGroup {
*/
private String group;
private List<VirtualPocket> entries;
private VirtualPocketList pocketList;
public PocketGroup() {
}
public PocketGroup(String group, List<VirtualPocket> entries) {
public PocketGroup(String group, VirtualPocketList pocketList) {
this.group = group;
this.entries = entries;
this.pocketList = pocketList;
}
public PocketGroup fromTag(CompoundTag tag) {
this.group = tag.getString("group");
ListTag pockets = tag.getList("pockets", 10);
this.entries = Lists.newArrayList();
for (int i = 0; i < pockets.size(); i++) {
CompoundTag pocket = pockets.getCompound(i);
entries.add(VirtualPocket.deserialize(pocket));
}
this.pocketList = VirtualPocketList.deserialize(tag.getList("pockets", 10));
return this;
}
public CompoundTag toTag(CompoundTag tag) {
tag.putString("group", this.group);
ListTag pockets = new ListTag();
entries.forEach(pocket -> pockets.add(pocket.toTag(new CompoundTag())));
tag.put("pockets", pockets);
tag.put("pockets", pocketList.toTag(new ListTag()));
return tag;
}
@ -51,8 +41,8 @@ public final class PocketGroup {
return this.group;
}
public List<VirtualPocket> getEntries() {
return this.entries;
public VirtualPocketList getPocketList() {
return this.pocketList;
}
@Override
@ -60,7 +50,7 @@ public final class PocketGroup {
return "PocketType{" +
"group='" + this.group + '\'' +
", entries=" + this.entries +
", entries=" + this.pocketList +
'}';
}
@ -70,11 +60,15 @@ public final class PocketGroup {
if (o == null || this.getClass() != o.getClass()) return false;
PocketGroup that = (PocketGroup) o;
return Objects.equals(this.group, that.group) &&
Objects.equals(this.entries, that.entries);
Objects.equals(this.pocketList, that.pocketList);
}
@Override
public int hashCode() {
return Objects.hash(this.group, this.entries);
return Objects.hash(this.group, this.pocketList);
}
public void init() {
pocketList.init(this);
}
}

View file

@ -9,24 +9,20 @@ import java.nio.file.Paths;
import java.util.*;
import com.google.common.collect.*;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.nbt.*;
import net.minecraft.util.Identifier;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.pockets.virtual.VirtualPocket;
import org.dimdev.dimdoors.util.PocketGenerationParameters;
import org.dimdev.dimdoors.util.WeightedList;
import org.dimdev.dimdoors.util.schematic.v2.Schematic;
public class SchematicV2Handler {
private static final Logger LOGGER = LogManager.getLogger();
private static final Gson GSON = new GsonBuilder().setLenient().setPrettyPrinting().create();
private static final SchematicV2Handler INSTANCE = new SchematicV2Handler();
private final Map<Identifier, PocketTemplateV2> templates = Maps.newHashMap();
private final Map<String, WeightedList<VirtualPocket, PocketGenerationParameters>> weightedPocketGroups = Maps.newHashMap(); //TODO: un-ugly-fy
private final List<PocketGroup> pocketGroups = Lists.newArrayList();
private final Map<String, PocketGroup> pocketGroups = Maps.newHashMap();
private boolean loaded = false;
private SchematicV2Handler() {
@ -52,16 +48,9 @@ public class SchematicV2Handler {
CompoundTag groupTag = StringNbtReader.parse(String.join("", result));
PocketGroup type = new PocketGroup().fromTag(groupTag);
type.init();
this.pocketGroups.put(type.getGroup(), type);
this.pocketGroups.add(type);
WeightedList<VirtualPocket, PocketGenerationParameters> weightedPockets = new WeightedList<>();
weightedPocketGroups.put(type.getGroup(), weightedPockets);
for (VirtualPocket virtualPocket : type.getEntries()) {
virtualPocket.init(type.getGroup());
weightedPockets.add(virtualPocket);
}
} catch (IOException | URISyntaxException | CommandSyntaxException e) {
e.printStackTrace();
}
@ -84,16 +73,8 @@ public class SchematicV2Handler {
}
}
public VirtualPocket getRandomPublicPocket(PocketGenerationParameters parameters) {
return getRandomPocketFromGroup("public", parameters);
}
public VirtualPocket getRandomPrivatePocket(PocketGenerationParameters parameters) {
return getRandomPocketFromGroup("private", parameters);
}
public VirtualPocket getRandomPocketFromGroup(String group, PocketGenerationParameters parameters) {
return weightedPocketGroups.get(group).getRandomWeighted(parameters);
return pocketGroups.get(group).getPocketList().getNextRandomWeighted(parameters);
}
public static SchematicV2Handler getInstance() {
@ -104,7 +85,7 @@ public class SchematicV2Handler {
return this.templates;
}
public List<PocketGroup> getPocketGroups() {
public Map<String, PocketGroup> getPocketGroups() {
return this.pocketGroups;
}
}

View file

@ -0,0 +1,31 @@
package org.dimdev.dimdoors.pockets.virtual;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.Tag;
import org.dimdev.dimdoors.pockets.PocketGroup;
import org.dimdev.dimdoors.util.PocketGenerationParameters;
import org.dimdev.dimdoors.util.Weighted;
import org.dimdev.dimdoors.world.pocket.Pocket;
public interface VirtualPocket extends Weighted<PocketGenerationParameters> {
static VirtualPocket deserialize(Tag tag) {
if (tag.getType() == 9) { // ListTag
return VirtualPocketList.deserialize((ListTag) tag);
}
return VirtualSingularPocket.deserialize((CompoundTag) tag); // should be CompoundTag
}
static Tag serialize(VirtualPocket virtualPocket) {
if (virtualPocket instanceof VirtualPocketList) {
return VirtualPocketList.serialize((VirtualPocketList) virtualPocket);
}
return VirtualSingularPocket.serialize((VirtualSingularPocket) virtualPocket);
}
Pocket prepareAndPlacePocket(PocketGenerationParameters parameters);
void init(PocketGroup group);
}

View file

@ -0,0 +1,55 @@
package org.dimdev.dimdoors.pockets.virtual;
import net.minecraft.nbt.ListTag;
import org.dimdev.dimdoors.pockets.PocketGroup;
import org.dimdev.dimdoors.util.PocketGenerationParameters;
import org.dimdev.dimdoors.util.WeightedList;
import org.dimdev.dimdoors.world.pocket.Pocket;
import java.util.List;
public class VirtualPocketList extends WeightedList<VirtualPocket, PocketGenerationParameters> implements VirtualPocket {
public static VirtualPocketList deserialize(ListTag tag) {
return new VirtualPocketList().fromTag(tag);
}
public static ListTag serialize(VirtualPocketList virtualPocketList) {
return virtualPocketList.toTag(new ListTag());
}
public VirtualPocketList() {
super();
}
public VirtualPocketList fromTag(ListTag tag) { // Keep in mind, this would add onto the list instead of overwriting it if called multiple times.
List<VirtualPocket> list = this.getList();
for (net.minecraft.nbt.Tag value : tag) {
list.add(VirtualPocket.deserialize(value));
}
return this;
}
public ListTag toTag(ListTag tag) {
int pointer = tag.size() - 1;
for(VirtualPocket virtualPocket : this.getList()) {
tag.set(pointer, VirtualPocket.serialize(virtualPocket));
}
return tag;
}
public Pocket prepareAndPlacePocket(PocketGenerationParameters parameters) {
return getNextRandomWeighted(parameters).prepareAndPlacePocket(parameters);
}
@Override
public void init(PocketGroup group) {
getList().forEach(pocket -> pocket.init(group));
}
@Override
public int getWeight(PocketGenerationParameters parameters) {
return peekNextRandomWeighted(parameters).getWeight(parameters);
}
}

View file

@ -1,4 +1,4 @@
package org.dimdev.dimdoors.pockets;
package org.dimdev.dimdoors.pockets.virtual;
import com.mojang.serialization.*;
import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder;
@ -7,9 +7,9 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.util.registry.SimpleRegistry;
import org.dimdev.dimdoors.pockets.generator.ChunkGenerator;
import org.dimdev.dimdoors.pockets.generator.SchematicGenerator;
import org.dimdev.dimdoors.pockets.selection.DepthDependentSelector;
import org.dimdev.dimdoors.pockets.virtual.generator.ChunkGenerator;
import org.dimdev.dimdoors.pockets.virtual.generator.SchematicGenerator;
import org.dimdev.dimdoors.pockets.virtual.selection.DepthDependentSelector;
import org.dimdev.dimdoors.util.PocketGenerationParameters;
import org.dimdev.dimdoors.util.Weighted;
import org.dimdev.dimdoors.world.pocket.Pocket;
@ -18,8 +18,8 @@ import java.util.function.Supplier;
// TODO: do something about getting correct Pocket sizes
public abstract class VirtualPocket implements Weighted<PocketGenerationParameters> {
public static final Registry<VirtualPocketType<? extends VirtualPocket>> REGISTRY = FabricRegistryBuilder.from(new SimpleRegistry<VirtualPocketType<? extends VirtualPocket>>(RegistryKey.ofRegistry(new Identifier("dimdoors", "virtual_pocket_type")), Lifecycle.stable())).buildAndRegister();
public abstract class VirtualSingularPocket implements VirtualPocket {
public static final Registry<VirtualSingularPocketType<? extends VirtualSingularPocket>> REGISTRY = FabricRegistryBuilder.from(new SimpleRegistry<VirtualSingularPocketType<? extends VirtualSingularPocket>>(RegistryKey.ofRegistry(new Identifier("dimdoors", "virtual_pocket_type")), Lifecycle.stable())).buildAndRegister();
/*
public static final Codec<VirtualPocket> CODEC = new Codec<VirtualPocket>() {
@Override
@ -35,51 +35,49 @@ public abstract class VirtualPocket implements Weighted<PocketGenerationParamete
};
*/
public static VirtualPocket deserialize(CompoundTag tag) {
public static VirtualSingularPocket deserialize(CompoundTag tag) {
Identifier id = Identifier.tryParse(tag.getString("type")); // TODO: return some NONE VirtualPocket if type cannot be found or deserialization fails.
return REGISTRY.get(id).fromTag(tag);
}
public static CompoundTag serialize(VirtualPocket virtualPocket) {
return virtualPocket.toTag(new CompoundTag());
public static CompoundTag serialize(VirtualSingularPocket virtualSingularPocket) {
return virtualSingularPocket.toTag(new CompoundTag());
}
public abstract VirtualPocket fromTag(CompoundTag tag);
public abstract VirtualSingularPocket fromTag(CompoundTag tag);
public CompoundTag toTag(CompoundTag tag) {
return this.getType().toTag(tag);
}
public abstract void init(String group);
public abstract Pocket prepareAndPlacePocket(PocketGenerationParameters parameters);
public abstract String toString();
// TODO: are equals() and hashCode() necessary?
public abstract VirtualPocketType<? extends VirtualPocket> getType();
public abstract VirtualSingularPocketType<? extends VirtualSingularPocket> getType();
public abstract String getKey();
public interface VirtualPocketType<T extends VirtualPocket> {
VirtualPocketType<SchematicGenerator> SCHEMATIC = register(new Identifier("dimdoors", SchematicGenerator.KEY), SchematicGenerator::new);
VirtualPocketType<ChunkGenerator> CHUNK = register(new Identifier("dimdoors", ChunkGenerator.KEY), ChunkGenerator::new);
public interface VirtualSingularPocketType<T extends VirtualSingularPocket> {
VirtualSingularPocketType<SchematicGenerator> SCHEMATIC = register(new Identifier("dimdoors", SchematicGenerator.KEY), SchematicGenerator::new);
VirtualSingularPocketType<ChunkGenerator> CHUNK = register(new Identifier("dimdoors", ChunkGenerator.KEY), ChunkGenerator::new);
VirtualPocketType<DepthDependentSelector> DEPTH_DEPENDENT = register(new Identifier("dimdoors", DepthDependentSelector.KEY), DepthDependentSelector::new);
VirtualSingularPocketType<DepthDependentSelector> DEPTH_DEPENDENT = register(new Identifier("dimdoors", DepthDependentSelector.KEY), DepthDependentSelector::new);
VirtualPocket fromTag(CompoundTag tag);
VirtualSingularPocket fromTag(CompoundTag tag);
CompoundTag toTag(CompoundTag tag);
static void register() {
}
static <U extends VirtualPocket> VirtualPocketType<U> register(Identifier id, Supplier<U> constructor) {
return Registry.register(REGISTRY, id, new VirtualPocketType<U>() {
static <U extends VirtualSingularPocket> VirtualSingularPocketType<U> register(Identifier id, Supplier<U> constructor) {
return Registry.register(REGISTRY, id, new VirtualSingularPocketType<U>() {
@Override
public VirtualPocket fromTag(CompoundTag tag) {
public VirtualSingularPocket fromTag(CompoundTag tag) {
return constructor.get().fromTag(tag);
}

View file

@ -1,4 +1,4 @@
package org.dimdev.dimdoors.pockets.generator;
package org.dimdev.dimdoors.pockets.virtual.generator;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
@ -23,8 +23,9 @@ import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.block.ModBlocks;
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity;
import org.dimdev.dimdoors.block.entity.ModBlockEntityTypes;
import org.dimdev.dimdoors.pockets.PocketGroup;
import org.dimdev.dimdoors.pockets.TemplateUtils;
import org.dimdev.dimdoors.pockets.VirtualPocket;
import org.dimdev.dimdoors.pockets.virtual.VirtualSingularPocket;
import org.dimdev.dimdoors.rift.registry.LinkProperties;
import org.dimdev.dimdoors.rift.targets.PocketEntranceMarker;
import org.dimdev.dimdoors.rift.targets.VirtualTarget;
@ -41,7 +42,7 @@ import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class ChunkGenerator extends VirtualPocket {
public class ChunkGenerator extends VirtualSingularPocket {
private static final Logger LOGGER = LogManager.getLogger();
public static final String KEY = "chunk";
@ -56,7 +57,7 @@ public class ChunkGenerator extends VirtualPocket {
}
@Override
public VirtualPocket fromTag(CompoundTag tag) {
public VirtualSingularPocket fromTag(CompoundTag tag) {
this.dimensionID = new Identifier(tag.getString("dimension_id"));
int[] temp = tag.getIntArray("size");
@ -83,8 +84,7 @@ public class ChunkGenerator extends VirtualPocket {
}
@Override
public void init(String group) {
public void init(PocketGroup group) {
}
@Override
@ -115,7 +115,7 @@ public class ChunkGenerator extends VirtualPocket {
}
}
ChunkRegion protoRegion = new ChunkRegionHack(genWorld, protoChunks);
for (Chunk protoChunk : protoChunks) {
for (Chunk protoChunk : protoChunks) { // TODO: check wether structures are even activated
genWorldChunkGenerator.setStructureStarts(genWorld.getRegistryManager(), genWorld.getStructureAccessor().forRegion(protoRegion), protoChunk, genWorld.getStructureManager(), genWorld.getSeed());
((ProtoChunk) protoChunk).setStatus(ChunkStatus.STRUCTURE_STARTS);
}
@ -205,8 +205,8 @@ public class ChunkGenerator extends VirtualPocket {
}
@Override
public VirtualPocketType<? extends VirtualPocket> getType() {
return VirtualPocketType.CHUNK;
public VirtualSingularPocketType<? extends VirtualSingularPocket> getType() {
return VirtualSingularPocketType.CHUNK;
}
@Override

View file

@ -1,13 +1,14 @@
package org.dimdev.dimdoors.pockets.generator;
package org.dimdev.dimdoors.pockets.virtual.generator;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.Identifier;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.pockets.PocketGroup;
import org.dimdev.dimdoors.pockets.PocketTemplateV2;
import org.dimdev.dimdoors.pockets.SchematicV2Handler;
import org.dimdev.dimdoors.pockets.VirtualPocket;
import org.dimdev.dimdoors.pockets.virtual.VirtualSingularPocket;
import org.dimdev.dimdoors.rift.registry.LinkProperties;
import org.dimdev.dimdoors.rift.targets.VirtualTarget;
import org.dimdev.dimdoors.util.PocketGenerationParameters;
@ -15,7 +16,7 @@ import org.dimdev.dimdoors.world.level.DimensionalRegistry;
import org.dimdev.dimdoors.world.pocket.Pocket;
import org.dimdev.dimdoors.world.pocket.VirtualLocation;
public class SchematicGenerator extends VirtualPocket {
public class SchematicGenerator extends VirtualSingularPocket {
private static final Logger LOGGER = LogManager.getLogger();
public static final String KEY = "schematic";
@ -60,7 +61,7 @@ public class SchematicGenerator extends VirtualPocket {
}
@Override
public VirtualPocket fromTag(CompoundTag tag) {
public VirtualSingularPocket fromTag(CompoundTag tag) {
this.name = tag.getString("id");
this.size = tag.getInt("size");
this.weight = tag.contains("weight") ? tag.getInt("weight") : 5;
@ -80,8 +81,8 @@ public class SchematicGenerator extends VirtualPocket {
}
@Override
public void init(String group) {
SchematicV2Handler.getInstance().loadSchematic(templateID, group, size, name);
public void init(PocketGroup group) {
SchematicV2Handler.getInstance().loadSchematic(templateID, group.getGroup(), size, name);
}
@Override
@ -113,8 +114,8 @@ public class SchematicGenerator extends VirtualPocket {
}
@Override
public VirtualPocketType<? extends VirtualPocket> getType() {
return VirtualPocketType.SCHEMATIC;
public VirtualSingularPocketType<? extends VirtualSingularPocket> getType() {
return VirtualSingularPocketType.SCHEMATIC;
}
@Override

View file

@ -1,9 +1,12 @@
package org.dimdev.dimdoors.pockets.selection;
package org.dimdev.dimdoors.pockets.virtual.selection;
import com.google.common.collect.Maps;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import org.dimdev.dimdoors.pockets.VirtualPocket;
import net.minecraft.nbt.Tag;
import org.dimdev.dimdoors.pockets.PocketGroup;
import org.dimdev.dimdoors.pockets.virtual.VirtualPocket;
import org.dimdev.dimdoors.pockets.virtual.VirtualSingularPocket;
import org.dimdev.dimdoors.util.PocketGenerationParameters;
import org.dimdev.dimdoors.world.pocket.Pocket;
@ -11,7 +14,7 @@ import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Pattern;
public class DepthDependentSelector extends VirtualPocket {
public class DepthDependentSelector extends VirtualSingularPocket {
public static final String KEY = "depth_dependent";
/*
private static final Codec<Pair<String, VirtualPocket>> PAIR_CODEC = RecordCodecBuilder.create(instance -> instance.group(
@ -47,13 +50,15 @@ public class DepthDependentSelector extends VirtualPocket {
}
@Override
public VirtualPocket fromTag(CompoundTag tag) {
public VirtualSingularPocket fromTag(CompoundTag tag) {
this.name = tag.getString("id");
ListTag regexPockets = tag.getList("pockets", 10);
pocketList = Maps.newLinkedHashMap();
for (int i = 0; i < regexPockets.size(); i++) {
CompoundTag pocket = regexPockets.getCompound(i);
pocketList.putIfAbsent(pocket.getString("regex"), VirtualPocket.deserialize(pocket.getCompound("pocket")));
String regex = pocket.getString("regex");
if (pocketList.containsKey(regex)) continue;
pocketList.put(pocket.getString("regex"), VirtualPocket.deserialize(pocket.get("pocket")));
}
return this;
}
@ -68,7 +73,7 @@ public class DepthDependentSelector extends VirtualPocket {
pocketList.forEach((regex, pocket) -> {
CompoundTag compound = new CompoundTag();
compound.putString("regex", regex);
compound.put("pocket", pocket.toTag(new CompoundTag()));
compound.put("pocket", VirtualPocket.serialize(pocket));
regexPockets.add(compound);
});
tag.put("pockets", regexPockets);
@ -76,7 +81,7 @@ public class DepthDependentSelector extends VirtualPocket {
}
@Override
public void init(String group) {
public void init(PocketGroup group) {
pocketList.forEach((regex, pocket) -> pocket.init(group));
}
@ -92,8 +97,8 @@ public class DepthDependentSelector extends VirtualPocket {
}
@Override
public VirtualPocketType<? extends VirtualPocket> getType() {
return VirtualPocketType.DEPTH_DEPENDENT;
public VirtualSingularPocketType<? extends VirtualSingularPocket> getType() {
return VirtualSingularPocketType.DEPTH_DEPENDENT;
}
@Override
@ -112,6 +117,6 @@ public class DepthDependentSelector extends VirtualPocket {
return entry.getValue();
}
}
return pocketList.values().stream().findFirst().get();
return pocketList.values().stream().findFirst().get(); // TODO: orElse() with some NONE VirtualPocket
}
}

View file

@ -7,22 +7,40 @@ import java.util.*;
public class WeightedList<T extends Weighted<P>, P> {
private final List<T> list;
private final Random random = new Random();
private T peekedRandom;
private boolean peeked = false;
public WeightedList() {
this.list = Lists.newArrayList();
}
public T getRandomWeighted(P parameters) {
public T getNextRandomWeighted(P parameters) {
return getNextRandomWeighted(parameters, false);
}
public T peekNextRandomWeighted(P parameters) {
return getNextRandomWeighted(parameters, true);
}
private T getNextRandomWeighted(P parameters, boolean peek) {
int totalWeight = list.stream().mapToInt(weighted -> weighted.getWeight(parameters)).sum();
if (!peeked) {
int cursor = random.nextInt(totalWeight);
for (T weighted : list) {
cursor -= weighted.getWeight(parameters);
if (cursor <= 0) {
if (peek) {
peekedRandom = weighted;
peeked = true;
}
return weighted; // should never return an entry with weight 0, unless there are only weight 0 entries
}
}
return null;
}
if (!peek) peeked = false;
return peekedRandom;
}
public boolean add(T t) {
return list.add(t);