pocket tags

This commit is contained in:
CreepyCre 2021-02-05 16:53:23 +01:00
parent 9af9a4576b
commit 1a4df669cc
5 changed files with 147 additions and 1 deletions

View file

@ -8,6 +8,7 @@ import java.nio.file.Paths;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.stream.Collectors;
import com.google.common.collect.*;
import com.google.gson.*;
@ -20,6 +21,8 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.pockets.generator.PocketGenerator;
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 {
@ -132,6 +135,10 @@ public class SchematicV2Handler {
}
}
public WeightedList<PocketGenerator, PocketGenerationParameters> getPocketsMatchingTags(List<String> required, List<String> blackList, boolean exact) {
return new WeightedList<>(pocketGeneratorMap.values().stream().filter(pocketGenerator -> pocketGenerator.checkTags(required, blackList, exact)).collect(Collectors.toList()));
}
public VirtualPocket getGroup(String group) {
return pocketGroups.get(group);
}

View file

@ -2,11 +2,13 @@ package org.dimdev.dimdoors.pockets.generator;
import com.mojang.serialization.Lifecycle;
import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder;
import net.fabricmc.fabric.api.util.NbtType;
import net.minecraft.block.entity.ChestBlockEntity;
import net.minecraft.block.entity.DispenserBlockEntity;
import net.minecraft.inventory.Inventory;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.StringTag;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
@ -42,6 +44,8 @@ public abstract class PocketGenerator implements Weighted<PocketGenerationParame
private String weight;
private Equation weightEquation;
private final List<String> tags = new ArrayList<>();
public PocketGenerator() { }
public PocketGenerator(String weight) {
@ -87,6 +91,13 @@ public abstract class PocketGenerator implements Weighted<PocketGenerationParame
modifierList.add(Modifier.deserialize(modifiersTag.getCompound(i)));
}
}
if (tag.contains("tags")) {
ListTag listTag = tag.getList("tags", NbtType.STRING);
for (int i = 0; i < listTag.size(); i++) {
tags.add(listTag.getString(i));
}
}
return this;
}
@ -100,6 +111,16 @@ public abstract class PocketGenerator implements Weighted<PocketGenerationParame
modifiersTag.add(modifier.toTag(new CompoundTag()));
}
if (modifiersTag.size() > 0) tag.put("modifiers", modifiersTag);
if (tags.size() > 0) {
ListTag listTag = new ListTag();
for (String tagString : tags) {
listTag.add(StringTag.of(tagString));
}
tag.put("tags", listTag);
}
return tag;
}
@ -146,6 +167,22 @@ public abstract class PocketGenerator implements Weighted<PocketGenerationParame
pocket.virtualLocation = parameters.getSourceVirtualLocation(); //TODO: this makes very little sense
}
// why would you want to check for exact tags, but still need a blackList? Good question, but there is probably some use case for it.
public boolean checkTags(List<String> required, List<String> blackList, boolean exact) {
if (exact && required.size() != tags.size()) return false;
if (required != null) {
for (String req : required) {
if (!tags.contains(req)) return false;
}
}
if (blackList != null) {
for (String black : blackList) {
if (tags.contains(black)) return false;
}
}
return true;
}
public interface PocketGeneratorType<T extends PocketGenerator> {
PocketGeneratorType<SchematicGenerator> SCHEMATIC = register(new Identifier("dimdoors", SchematicGenerator.KEY), SchematicGenerator::new);
PocketGeneratorType<ChunkGenerator> CHUNK = register(new Identifier("dimdoors", ChunkGenerator.KEY), ChunkGenerator::new);

View file

@ -8,6 +8,7 @@ import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.util.registry.SimpleRegistry;
import org.dimdev.dimdoors.pockets.virtual.reference.IdReference;
import org.dimdev.dimdoors.pockets.virtual.reference.TagReference;
import org.dimdev.dimdoors.pockets.virtual.selection.ConditionalSelector;
import java.util.function.Supplier;
@ -53,6 +54,7 @@ public abstract class VirtualSingularPocket implements VirtualPocket {
public interface VirtualSingularPocketType<T extends VirtualSingularPocket> {
VirtualSingularPocketType<IdReference> ID_REFERENCE = register(new Identifier("dimdoors", IdReference.KEY), IdReference::new);
VirtualSingularPocketType<TagReference> TAG_REFERENCE = register(new Identifier("dimdoors", TagReference.KEY), TagReference::new);
VirtualSingularPocketType<ConditionalSelector> DEPTH_DEPENDENT_SELECTOR = register(new Identifier("dimdoors", ConditionalSelector.KEY), ConditionalSelector::new);

View file

@ -0,0 +1,97 @@
package org.dimdev.dimdoors.pockets.virtual.reference;
import net.fabricmc.fabric.api.util.NbtType;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.StringTag;
import org.dimdev.dimdoors.pockets.SchematicV2Handler;
import org.dimdev.dimdoors.pockets.generator.PocketGenerator;
import org.dimdev.dimdoors.pockets.virtual.VirtualSingularPocket;
import org.dimdev.dimdoors.util.PocketGenerationParameters;
import org.dimdev.dimdoors.util.WeightedList;
import java.util.ArrayList;
import java.util.List;
public class TagReference extends PocketGeneratorReference{
public static final String KEY = "tag";
private final List<String> required = new ArrayList<>();
private final List<String> blackList = new ArrayList<>();
private Boolean exact;
private WeightedList<PocketGenerator, PocketGenerationParameters> pockets;
@Override
public VirtualSingularPocket fromTag(CompoundTag tag) {
super.fromTag(tag);
if (tag.contains("required")) {
ListTag listTag = tag.getList("required", NbtType.STRING);
for (int i = 0; i < listTag.size(); i++) {
required.add(listTag.getString(i));
}
}
if (tag.contains("blackList")) {
ListTag listTag = tag.getList("blackList", NbtType.STRING);
for (int i = 0; i < listTag.size(); i++) {
blackList.add(listTag.getString(i));
}
}
if (tag.contains("exact")) exact = tag.getBoolean("exact");
return this;
}
@Override
public CompoundTag toTag(CompoundTag tag) {
super.toTag(tag);
if (required.size() > 0) {
ListTag listTag = new ListTag();
for (String tagString : required) {
listTag.add(StringTag.of(tagString));
}
tag.put("required", listTag);
}
if (blackList.size() > 0) {
ListTag listTag = new ListTag();
for (String tagString : blackList) {
listTag.add(StringTag.of(tagString));
}
tag.put("blackList", listTag);
}
if (exact != null) {
tag.putBoolean("exact", exact);
}
return tag;
}
@Override
public VirtualSingularPocketType<? extends VirtualSingularPocket> getType() {
return VirtualSingularPocketType.TAG_REFERENCE;
}
@Override
public String getKey() {
return KEY;
}
// TODO: this will break if pockets change in between (which they could if we add a tool for creating pocket json config stuff ingame)
@Override
public PocketGenerator peekReferencedPocketGenerator(PocketGenerationParameters parameters) {
if (pockets == null) pockets = SchematicV2Handler.getInstance().getPocketsMatchingTags(required, blackList, exact);
return pockets.peekNextRandomWeighted(parameters);
}
@Override
public PocketGenerator getReferencedPocketGenerator(PocketGenerationParameters parameters) {
if (pockets == null) pockets = SchematicV2Handler.getInstance().getPocketsMatchingTags(required, blackList, exact);
return pockets.getNextRandomWeighted(parameters);
}
}

View file

@ -7,7 +7,10 @@ public class WeightedList<T extends Weighted<P>, P> extends ArrayList<T> {
private T peekedRandom;
private boolean peeked = false;
public WeightedList() {
public WeightedList() { }
public WeightedList(Collection<? extends T> c) {
super(c);
}
public T getNextRandomWeighted(P parameters) {