reworked weight system
This commit is contained in:
parent
5b987f70aa
commit
6607499177
11 changed files with 70 additions and 75 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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<Modifier> 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<>()));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ public class VirtualPocketList extends WeightedList<VirtualPocket, PocketGenerat
|
|||
}
|
||||
|
||||
@Override
|
||||
public int getWeight(PocketGenerationParameters parameters) {
|
||||
public double getWeight(PocketGenerationParameters parameters) {
|
||||
return peekNextRandomWeighted(parameters).getWeight(parameters);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,9 +52,6 @@ public abstract class VirtualSingularPocket implements VirtualPocket {
|
|||
|
||||
public abstract Pocket prepareAndPlacePocket(PocketGenerationParameters parameters);
|
||||
|
||||
public abstract String toString();
|
||||
// TODO: are equals() and hashCode() necessary?
|
||||
|
||||
public abstract VirtualSingularPocketType<? extends VirtualSingularPocket> getType();
|
||||
|
||||
public abstract String getKey();
|
||||
|
|
|
@ -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<? extends VirtualSingularPocket> 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<Chunk> chunks) {
|
||||
super(world, chunks);
|
||||
|
|
|
@ -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<? extends VirtualSingularPocket> getType() {
|
||||
return VirtualSingularPocketType.SCHEMATIC;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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<String, Double> toVariableMap(Map<String, Double> stringDoubleMap) {
|
||||
stringDoubleMap.put("depth", (double) this.sourceVirtualLocation.getDepth());
|
||||
return stringDoubleMap;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,5 +5,5 @@ public interface Weighted<P> {
|
|||
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);
|
||||
}
|
||||
|
|
|
@ -20,8 +20,8 @@ public class WeightedList<T extends Weighted<P>, P> extends ArrayList<T> {
|
|||
|
||||
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) {
|
||||
|
|
Loading…
Reference in a new issue