added VirtualPocketList
previous VirtualPocket -> VirtualSingularPocket new VirtualPocket superclass of VirtualPocketList and VirtualSingularPocket
This commit is contained in:
parent
1e362a43c3
commit
b641753e11
11 changed files with 187 additions and 103 deletions
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue