diff --git a/src/main/java/org/dimdev/dimdoors/pockets/PocketTemplateV2.java b/src/main/java/org/dimdev/dimdoors/pockets/PocketTemplateV2.java index 5a96429e..1bc47118 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/PocketTemplateV2.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/PocketTemplateV2.java @@ -14,12 +14,10 @@ public class PocketTemplateV2 { private static final Logger LOGGER = LogManager.getLogger(); private static final boolean replacingPlaceholders = false; private final Schematic schematic; - private final int size; private final String id; - public PocketTemplateV2(Schematic schematic, int size, String id) { + public PocketTemplateV2(Schematic schematic, String id) { this.schematic = schematic; - this.size = size; this.id = id; } diff --git a/src/main/java/org/dimdev/dimdoors/pockets/SchematicV2Handler.java b/src/main/java/org/dimdev/dimdoors/pockets/SchematicV2Handler.java index 4f756aa0..07aaa724 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/SchematicV2Handler.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/SchematicV2Handler.java @@ -52,14 +52,14 @@ public class SchematicV2Handler { LOGGER.info("Loaded schematics in {} seconds", System.currentTimeMillis() - startTime); } - public void loadSchematic(Identifier templateID, String group, int size, String id) { + public void loadSchematic(Identifier templateID, String group, String id) { try { if (templates.containsKey(templateID)) return; Path basePath = Paths.get(SchematicV2Handler.class.getResource(String.format("/data/dimdoors/pockets/schematic/v2/%s/", group)).toURI()); Path schemPath = basePath.resolve(id + ".schem"); CompoundTag schemTag = NbtIo.readCompressed(Files.newInputStream(schemPath)); Schematic schematic = Schematic.fromTag(schemTag); - PocketTemplateV2 template = new PocketTemplateV2(schematic, size, id); + PocketTemplateV2 template = new PocketTemplateV2(schematic, id); templates.put(templateID, template); } catch (URISyntaxException | IOException e) { LOGGER.error("Could not load schematic!", e); diff --git a/src/main/java/org/dimdev/dimdoors/pockets/virtual/VirtualGeneratorPocket.java b/src/main/java/org/dimdev/dimdoors/pockets/virtual/VirtualGeneratorPocket.java index cbb00454..ad51d9a0 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/virtual/VirtualGeneratorPocket.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/virtual/VirtualGeneratorPocket.java @@ -14,21 +14,54 @@ import org.dimdev.dimdoors.pockets.TemplateUtils; import org.dimdev.dimdoors.pockets.virtual.modifier.Modifier; import org.dimdev.dimdoors.util.Location; import org.dimdev.dimdoors.util.PocketGenerationParameters; +import org.dimdev.dimdoors.util.math.StringEquationParser; import org.dimdev.dimdoors.world.pocket.Pocket; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Objects; public abstract class VirtualGeneratorPocket extends VirtualSingularPocket { private static final Logger LOGGER = LogManager.getLogger(); + private static final String defaultWeightEquation = "5"; // TODO: make config + private static final int fallbackWeight = 5; // TODO: make config private final List modifierList = new ArrayList<>(); + private String weight; + private StringEquationParser.Equation weightEquation; + + public VirtualGeneratorPocket() { } + + public VirtualGeneratorPocket(String weight) { + this.weight = weight; + try { + this.weightEquation = StringEquationParser.parse(weight); + } catch (StringEquationParser.EquationParseException e) { + LOGGER.error("Could not parse weight equation \"" + weight + "\", defaulting to weight \"5\""); + this.weightEquation = (stringDoubleMap -> 5d); + } + } + public VirtualGeneratorPocket fromTag(CompoundTag tag) { - if (!tag.contains("modifiers")) return this; - ListTag modifiersTag = tag.getList("modifiers", 10); - for (int i = 0; i < modifiersTag.size(); i++) { - modifierList.add(Modifier.deserialize(modifiersTag.getCompound(i))); + this.weight = tag.contains("weight") ? tag.getString("weight") : "5"; + try { + this.weightEquation = StringEquationParser.parse(weight); + } catch (StringEquationParser.EquationParseException e) { + LOGGER.error("Could not parse weight equation \"" + weight + "\", defaulting to default weight equation \"" + defaultWeightEquation + "\"", e); + try { + this.weightEquation = StringEquationParser.parse(defaultWeightEquation); + } catch (StringEquationParser.EquationParseException equationParseException) { + LOGGER.error("Could not parse default weight equation \"" + defaultWeightEquation + "\", defaulting to fallback weight \"" + fallbackWeight + "\"", equationParseException); + this.weightEquation = stringDoubleMap -> 5d; + } + } + + if (tag.contains("modifiers")) { + ListTag modifiersTag = tag.getList("modifiers", 10); + for (int i = 0; i < modifiersTag.size(); i++) { + modifierList.add(Modifier.deserialize(modifiersTag.getCompound(i))); + } } return this; } @@ -36,6 +69,8 @@ public abstract class VirtualGeneratorPocket extends VirtualSingularPocket { public CompoundTag toTag(CompoundTag tag) { super.toTag(tag); + if (!weight.equals("5")) tag.putString("weight", weight); + ListTag modifiersTag = new ListTag(); for (Modifier modifier : modifierList) { modifiersTag.add(modifier.toTag(new CompoundTag())); @@ -75,4 +110,9 @@ public abstract class VirtualGeneratorPocket extends VirtualSingularPocket { TemplateUtils.registerRifts(rifts, parameters.getLinkTo(), parameters.getLinkProperties(), pocket); pocket.virtualLocation = parameters.getSourceVirtualLocation(); //TODO: this makes very little sense } + + @Override + public double getWeight(PocketGenerationParameters parameters){ + return this.weightEquation.apply(parameters.toVariableMap(new HashMap<>())); + } } diff --git a/src/main/java/org/dimdev/dimdoors/pockets/virtual/VirtualPocketList.java b/src/main/java/org/dimdev/dimdoors/pockets/virtual/VirtualPocketList.java index b0fe5508..d17aa157 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/virtual/VirtualPocketList.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/virtual/VirtualPocketList.java @@ -46,7 +46,7 @@ public class VirtualPocketList extends WeightedList getType(); public abstract String getKey(); diff --git a/src/main/java/org/dimdev/dimdoors/pockets/virtual/generator/ChunkGenerator.java b/src/main/java/org/dimdev/dimdoors/pockets/virtual/generator/ChunkGenerator.java index eaf8ac68..df6380c3 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/virtual/generator/ChunkGenerator.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/virtual/generator/ChunkGenerator.java @@ -24,13 +24,9 @@ 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.virtual.VirtualGeneratorPocket; 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; -import org.dimdev.dimdoors.util.Location; import org.dimdev.dimdoors.util.PocketGenerationParameters; import org.dimdev.dimdoors.util.TeleportUtil; import org.dimdev.dimdoors.world.level.DimensionalRegistry; @@ -38,9 +34,7 @@ import org.dimdev.dimdoors.world.pocket.Pocket; import org.dimdev.dimdoors.world.pocket.VirtualLocation; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; public class ChunkGenerator extends VirtualGeneratorPocket { @@ -51,10 +45,8 @@ public class ChunkGenerator extends VirtualGeneratorPocket { private Vec3i size; private Vec3i offset; private int virtualYOffset; - private int weight; public ChunkGenerator() { - } @Override @@ -68,7 +60,6 @@ public class ChunkGenerator extends VirtualGeneratorPocket { this.offset = new Vec3i(temp[0], temp[1], temp[2]); this.virtualYOffset = tag.contains("virtual_y_offset") ? tag.getInt("virtual_y_offset") : 0; - this.weight = tag.contains("weight") ? tag.getInt("weight") : 5; return this; } @@ -80,7 +71,6 @@ public class ChunkGenerator extends VirtualGeneratorPocket { tag.putIntArray("size", new int[]{this.size.getX(), this.size.getY(), this.size.getZ()}); tag.putIntArray("offset", new int[]{this.offset.getX(), this.offset.getY(), this.offset.getZ()}); tag.putInt("virtual_y_offset", this.virtualYOffset); - tag.putInt("weight", this.weight); return tag; } @@ -92,8 +82,6 @@ public class ChunkGenerator extends VirtualGeneratorPocket { public Pocket prepareAndPlacePocket(PocketGenerationParameters parameters) { ServerWorld world = parameters.getWorld(); VirtualLocation sourceVirtualLocation = parameters.getSourceVirtualLocation(); - VirtualTarget linkTo = parameters.getLinkTo(); - LinkProperties linkProperties = parameters.getLinkProperties(); int ChunkSizeX = ((this.size.getX() >> 4) + (this.size.getX() % 16 == 0 ? 0 : 1)); int ChunkSizeZ = ((this.size.getZ() >> 4) + (this.size.getZ() % 16 == 0 ? 0 : 1)); @@ -199,11 +187,6 @@ public class ChunkGenerator extends VirtualGeneratorPocket { return pocket; } - @Override - public String toString() { - return null; - } - @Override public VirtualSingularPocketType getType() { return VirtualSingularPocketType.CHUNK; @@ -214,11 +197,6 @@ public class ChunkGenerator extends VirtualGeneratorPocket { return KEY; } - @Override - public int getWeight(PocketGenerationParameters parameters) { - return this.weight; - } - private static class ChunkRegionHack extends ChunkRegion { // Please someone tell me if there is a better way ChunkRegionHack(ServerWorld world, List chunks) { super(world, chunks); diff --git a/src/main/java/org/dimdev/dimdoors/pockets/virtual/generator/SchematicGenerator.java b/src/main/java/org/dimdev/dimdoors/pockets/virtual/generator/SchematicGenerator.java index 4900532c..94b3ce62 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/virtual/generator/SchematicGenerator.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/virtual/generator/SchematicGenerator.java @@ -26,47 +26,33 @@ public class SchematicGenerator extends VirtualGeneratorPocket { ).apply(instance, SchematicGenerator::new)); */ - private int size; - private String name; + private String id; private Identifier templateID; - private int weight; public SchematicGenerator() {} - public SchematicGenerator(int size, String name, int weight) { - this.size = size; - this.name = name; - this.weight = weight; + public SchematicGenerator(String id, String weight) { + super(weight); + this.id = id; - this.templateID = new Identifier("dimdoors", name); + this.templateID = new Identifier("dimdoors", id); } - public int getSize() { - return this.size; - } - - public String getName() { - return this.name; + public String getId() { + return this.id; } public Identifier getTemplateID() { return templateID; } - @Override - public int getWeight(PocketGenerationParameters parameters){ - return this.weight; - } - @Override public VirtualGeneratorPocket fromTag(CompoundTag tag) { super.fromTag(tag); - this.name = tag.getString("id"); - this.size = tag.getInt("size"); - this.weight = tag.contains("weight") ? tag.getInt("weight") : 5; + this.id = tag.getString("id"); - this.templateID = new Identifier("dimdoors", name); + this.templateID = new Identifier("dimdoors", id); return this; } @@ -74,15 +60,13 @@ public class SchematicGenerator extends VirtualGeneratorPocket { public CompoundTag toTag(CompoundTag tag) { super.toTag(tag); - tag.putString("id", this.name); - tag.putInt("size", this.size); - tag.putInt("weight", this.weight); + tag.putString("id", this.id); return tag; } @Override public void init(PocketGroup group) { - SchematicV2Handler.getInstance().loadSchematic(templateID, group.getGroup(), size, name); + SchematicV2Handler.getInstance().loadSchematic(templateID, group.getGroup(), id); } @Override @@ -101,15 +85,6 @@ public class SchematicGenerator extends VirtualGeneratorPocket { return pocket; } - @Override - public String toString() { - return "PocketEntry{" + - "size=" + this.size + - ", name='" + this.name + '\'' + - ", weight=" + this.weight + - '}'; - } - @Override public VirtualSingularPocketType getType() { return VirtualSingularPocketType.SCHEMATIC; diff --git a/src/main/java/org/dimdev/dimdoors/pockets/virtual/selection/DepthDependentSelector.java b/src/main/java/org/dimdev/dimdoors/pockets/virtual/selection/DepthDependentSelector.java index c2717221..9bd8ea32 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/virtual/selection/DepthDependentSelector.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/virtual/selection/DepthDependentSelector.java @@ -107,7 +107,7 @@ public class DepthDependentSelector extends VirtualSingularPocket { } @Override - public int getWeight(PocketGenerationParameters parameters) { + public double getWeight(PocketGenerationParameters parameters) { return getNextPocket(parameters).getWeight(parameters); } diff --git a/src/main/java/org/dimdev/dimdoors/util/PocketGenerationParameters.java b/src/main/java/org/dimdev/dimdoors/util/PocketGenerationParameters.java index e667e7e7..fa00e029 100644 --- a/src/main/java/org/dimdev/dimdoors/util/PocketGenerationParameters.java +++ b/src/main/java/org/dimdev/dimdoors/util/PocketGenerationParameters.java @@ -5,6 +5,8 @@ import org.dimdev.dimdoors.rift.registry.LinkProperties; import org.dimdev.dimdoors.rift.targets.VirtualTarget; import org.dimdev.dimdoors.world.pocket.VirtualLocation; +import java.util.Map; + public class PocketGenerationParameters { private final ServerWorld world; private final String group; @@ -39,4 +41,9 @@ public class PocketGenerationParameters { public LinkProperties getLinkProperties() { return linkProperties; } + + public Map toVariableMap(Map stringDoubleMap) { + stringDoubleMap.put("depth", (double) this.sourceVirtualLocation.getDepth()); + return stringDoubleMap; + } } diff --git a/src/main/java/org/dimdev/dimdoors/util/Weighted.java b/src/main/java/org/dimdev/dimdoors/util/Weighted.java index ac3a07dc..c638a2db 100644 --- a/src/main/java/org/dimdev/dimdoors/util/Weighted.java +++ b/src/main/java/org/dimdev/dimdoors/util/Weighted.java @@ -5,5 +5,5 @@ public interface Weighted

{ Should always return the same number if the same parameters are provided. returned number should always be >= 0 */ - int getWeight(P parameters); + double getWeight(P parameters); } diff --git a/src/main/java/org/dimdev/dimdoors/util/WeightedList.java b/src/main/java/org/dimdev/dimdoors/util/WeightedList.java index 93952308..0cf09896 100644 --- a/src/main/java/org/dimdev/dimdoors/util/WeightedList.java +++ b/src/main/java/org/dimdev/dimdoors/util/WeightedList.java @@ -20,8 +20,8 @@ public class WeightedList, P> extends ArrayList { private T getNextRandomWeighted(P parameters, boolean peek) { if (!peeked) { - int totalWeight = stream().mapToInt(weighted -> weighted.getWeight(parameters)).sum(); - int cursor = random.nextInt(totalWeight); + double totalWeight = stream().mapToDouble(weighted -> weighted.getWeight(parameters)).sum(); + double cursor = random.nextDouble() * totalWeight; for (T weighted : this) { cursor -= weighted.getWeight(parameters); if (cursor <= 0) {