VirtualPocket loading via resource reference

This commit is contained in:
CreepyCre 2022-05-27 19:40:31 +02:00
parent c8389cf3e9
commit 2729344f5f
14 changed files with 301 additions and 63 deletions

View file

@ -0,0 +1,7 @@
package org.dimdev.dimdoors.api.util;
import com.google.common.collect.Multimap;
public interface ReferenceSerializable {
void processFlags(Multimap<String, String> flags);
}

View file

@ -1,5 +1,7 @@
package org.dimdev.dimdoors.api.util;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
@ -12,8 +14,6 @@ import net.minecraft.resource.ResourceManager;
import net.minecraft.util.Identifier;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.api.util.ExceptionHandlingCollector;
import org.dimdev.dimdoors.api.util.Path;
import java.io.IOException;
import java.io.InputStream;
@ -46,6 +46,39 @@ public class ResourceUtil {
}
};
public static <R extends ReferenceSerializable> R loadReferencedResource(ResourceManager manager, String startingPath, String resourceKey, Function<InputStream, R> reader) {
// last two is resource path, rest is flags
String[] splitResourceKey = resourceKey.split("\\|");
Multimap<String, String> flags = HashMultimap.create();
flags.put("resource_key", resourceKey);
for (int i = 0; i < splitResourceKey.length - 1; i++) {
String keyValuePair = splitResourceKey[i];
int splitIndex = keyValuePair.indexOf(':');
if (splitIndex == -1) {
// TODO: some logging about malformed flag
continue;
}
flags.put(keyValuePair.substring(0, splitIndex), keyValuePair.substring(splitIndex + 1));
}
String identifier = splitResourceKey[splitResourceKey.length - 1];
int identifierSplitIndex = identifier.indexOf(':');
R resource = loadResource(manager, new Identifier(identifier.substring(0, identifierSplitIndex), startingPath + identifier.substring(identifierSplitIndex + 1)), reader);
resource.processFlags(flags);
return resource;
}
public static <R> R loadResource(ResourceManager manager, Identifier resourceKey, Function<InputStream, R> reader) {
try {
return reader.apply(manager.getResource(resourceKey).getInputStream());
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
public static <K, T, M extends Map<K, T>> CompletableFuture<M> loadResourcePathToMap(ResourceManager manager, String startingPath, String extension, M map, BiFunction<InputStream, K, T> reader, BiFunction<String, Identifier, K> keyProvider) {
Collection<Identifier> ids = manager.findResources(startingPath, str -> str.endsWith(extension));
return CompletableFuture.supplyAsync(() -> {

View file

@ -2,6 +2,7 @@ package org.dimdev.dimdoors.pockets;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener;
@ -42,9 +43,9 @@ public class PocketLoader implements SimpleSynchronousResourceReloadListener {
dataTree = ResourceUtil.loadResourcePathToMap(manager, "pockets/json", ".json", new SimpleTree<>(String.class), ResourceUtil.NBT_READER.composeIdentity(), ResourceUtil.PATH_KEY_PROVIDER).join();
CompletableFuture<SimpleTree<String, PocketGenerator>> futurePocketGeneratorMap = ResourceUtil.loadResourcePathToMap(manager, "pockets/generators", ".json", new SimpleTree<>(String.class), ResourceUtil.NBT_READER.andThenReader(this::loadPocketGenerator), ResourceUtil.PATH_KEY_PROVIDER);
CompletableFuture<SimpleTree<String, VirtualPocket>> futurePocketGroups = ResourceUtil.loadResourcePathToMap(manager, "pockets/groups", ".json", new SimpleTree<>(String.class), ResourceUtil.NBT_READER.andThenReader(this::loadVirtualPocket), ResourceUtil.PATH_KEY_PROVIDER);
CompletableFuture<SimpleTree<String, VirtualPocket>> futureVirtualPockets = ResourceUtil.loadResourcePathToMap(manager, "pockets/virtual", ".json", new SimpleTree<>(String.class), ResourceUtil.NBT_READER.andThenReader(this::loadVirtualPocket), ResourceUtil.PATH_KEY_PROVIDER);
CompletableFuture<SimpleTree<String, PocketGenerator>> futurePocketGeneratorMap = ResourceUtil.loadResourcePathToMap(manager, "pockets/generators", ".json", new SimpleTree<>(String.class), ResourceUtil.NBT_READER.andThenReader(pocketGeneratorLoader(manager)), ResourceUtil.PATH_KEY_PROVIDER);
CompletableFuture<SimpleTree<String, VirtualPocket>> futurePocketGroups = ResourceUtil.loadResourcePathToMap(manager, "pockets/groups", ".json", new SimpleTree<>(String.class), ResourceUtil.NBT_READER.andThenReader(virtualPocketLoader(manager)), ResourceUtil.PATH_KEY_PROVIDER);
CompletableFuture<SimpleTree<String, VirtualPocket>> futureVirtualPockets = ResourceUtil.loadResourcePathToMap(manager, "pockets/virtual", ".json", new SimpleTree<>(String.class), ResourceUtil.NBT_READER.andThenReader(virtualPocketLoader(manager)), ResourceUtil.PATH_KEY_PROVIDER);
CompletableFuture<SimpleTree<String, PocketTemplate>> futureTemplates = ResourceUtil.loadResourcePathToMap(manager, "pockets/schematic", ".schem", new SimpleTree<>(String.class), ResourceUtil.COMPRESSED_NBT_READER.andThenReader(this::loadPocketTemplate), ResourceUtil.PATH_KEY_PROVIDER);
@ -86,12 +87,12 @@ public class PocketLoader implements SimpleSynchronousResourceReloadListener {
return NbtUtil.asNbtCompound(getDataNbt(id), "Could not convert NbtElement \"" + id + "\" to NbtCompound!");
}
private VirtualPocket loadVirtualPocket(NbtElement nbt, Path<String> ignore) {
return VirtualPocket.deserialize(nbt);
private BiFunction<NbtElement, Path<String>, VirtualPocket> virtualPocketLoader(ResourceManager manager) {
return (nbt, ignore) -> VirtualPocket.deserialize(nbt, manager);
}
private PocketGenerator loadPocketGenerator(NbtElement nbt, Path<String> ignore) {
return PocketGenerator.deserialize(NbtUtil.asNbtCompound(nbt, "Could not load PocketGenerator since its json does not represent an NbtCompound!"));
private BiFunction<NbtElement, Path<String>, PocketGenerator> pocketGeneratorLoader(ResourceManager manager) {
return (nbt, ignore) -> PocketGenerator.deserialize(NbtUtil.asNbtCompound(nbt, "Could not load PocketGenerator since its json does not represent an NbtCompound!")/*, manager*/);
}
private PocketTemplate loadPocketTemplate(NbtCompound nbt, Path<String> id) {

View file

@ -0,0 +1,34 @@
package org.dimdev.dimdoors.pockets.virtual;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtString;
public abstract class AbstractVirtualPocket implements ImplementedVirtualPocket {
private String resourceKey = null;
@Override
public void setResourceKey(String resourceKey) {
this.resourceKey = resourceKey;
}
@Override
public String getResourceKey() {
return resourceKey;
}
@Override
public NbtElement toNbt(NbtCompound nbt, boolean allowReference) {
if (allowReference && this.getResourceKey() != null) {
return NbtString.of(this.getResourceKey());
}
return toNbtInternal(nbt, allowReference);
}
// utility so the first part of toNbt can be extracted into default method
// at this point we know for a fact, that we need to serialize into the NbtCompound
// overwrite in subclass
protected NbtCompound toNbtInternal(NbtCompound nbt, boolean allowReference) {
return this.getType().toNbt(nbt);
}
}

View file

@ -2,13 +2,17 @@ package org.dimdev.dimdoors.pockets.virtual;
import com.mojang.serialization.*;
import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder;
import net.fabricmc.fabric.api.util.NbtType;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.resource.ResourceManager;
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.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.api.util.ResourceUtil;
import org.dimdev.dimdoors.pockets.virtual.reference.IdReference;
import org.dimdev.dimdoors.pockets.virtual.reference.PocketGeneratorReference;
import org.dimdev.dimdoors.pockets.virtual.reference.TagReference;
@ -16,26 +20,58 @@ import org.dimdev.dimdoors.pockets.virtual.selection.ConditionalSelector;
import org.dimdev.dimdoors.pockets.PocketGenerationContext;
import org.dimdev.dimdoors.pockets.virtual.selection.PathSelector;
import org.dimdev.dimdoors.world.pocket.type.Pocket;
import org.jetbrains.annotations.Nullable;
import java.util.function.Supplier;
public interface ImplementedVirtualPocket extends VirtualPocket {
String RESOURCE_STARTING_PATH = "pockets/virtual"; //TODO: might want to restructure data packs
Registry<VirtualPocketType<? extends ImplementedVirtualPocket>> REGISTRY = FabricRegistryBuilder.from(new SimpleRegistry<VirtualPocketType<? extends ImplementedVirtualPocket>>(RegistryKey.ofRegistry(new Identifier("dimdoors", "virtual_pocket_type")), Lifecycle.stable(), null)).buildAndRegister();
static ImplementedVirtualPocket deserialize(NbtCompound nbt) {
static ImplementedVirtualPocket deserialize(NbtElement nbt, @Nullable ResourceManager manager) {
switch (nbt.getType()) {
case NbtType.COMPOUND:
return deserialize((NbtCompound) nbt, manager);
case NbtType.STRING:
return ResourceUtil.loadReferencedResource(manager, RESOURCE_STARTING_PATH, nbt.asString(), ResourceUtil.NBT_READER.andThenComposable(nbtElement -> deserialize(nbtElement, manager)));
default:
throw new RuntimeException(String.format("Unexpected NbtType %d!", nbt.getType()));
}
}
static ImplementedVirtualPocket deserialize(NbtElement nbt) {
return deserialize(nbt, null);
}
static ImplementedVirtualPocket deserialize(NbtCompound nbt, @Nullable ResourceManager manager) {
Identifier id = Identifier.tryParse(nbt.getString("type"));
VirtualPocketType<?> type = REGISTRY.get(id);
return type != null ? type.fromNbt(nbt) : VirtualPocketType.NONE.fromNbt(nbt);
return type != null ? type.fromNbt(nbt, manager) : VirtualPocketType.NONE.fromNbt(nbt, manager);
}
static NbtCompound serialize(ImplementedVirtualPocket implementedVirtualPocket) {
return implementedVirtualPocket.toNbt(new NbtCompound());
static ImplementedVirtualPocket deserialize(NbtCompound nbt) {
return deserialize(nbt, null);
}
ImplementedVirtualPocket fromNbt(NbtCompound nbt);
static NbtElement serialize(ImplementedVirtualPocket implementedVirtualPocket, boolean allowReference) {
return implementedVirtualPocket.toNbt(new NbtCompound(), allowReference);
}
default NbtCompound toNbt(NbtCompound nbt) {
return this.getType().toNbt(nbt);
static NbtElement serialize(ImplementedVirtualPocket implementedVirtualPocket) {
return serialize(implementedVirtualPocket, false);
}
ImplementedVirtualPocket fromNbt(NbtCompound nbt, @Nullable ResourceManager manager);
default ImplementedVirtualPocket fromNbt(NbtCompound nbt) {
return fromNbt(nbt, null);
}
NbtElement toNbt(NbtCompound nbt, boolean allowReference);
default NbtElement toNbt(NbtCompound nbt) {
return this.toNbt(nbt, false);
}
VirtualPocketType<? extends ImplementedVirtualPocket> getType();
@ -49,7 +85,11 @@ public interface ImplementedVirtualPocket extends VirtualPocket {
VirtualPocketType<ConditionalSelector> CONDITIONAL_SELECTOR = register(new Identifier("dimdoors", ConditionalSelector.KEY), ConditionalSelector::new);
VirtualPocketType<PathSelector> PATH_SELECTOR = register(new Identifier("dimdoors", PathSelector.KEY), PathSelector::new);
ImplementedVirtualPocket fromNbt(NbtCompound nbt);
ImplementedVirtualPocket fromNbt(NbtCompound nbt, @Nullable ResourceManager manager);
default ImplementedVirtualPocket fromNbt(NbtCompound nbt) {
return fromNbt(nbt, null);
}
NbtCompound toNbt(NbtCompound nbt);
@ -60,8 +100,8 @@ public interface ImplementedVirtualPocket extends VirtualPocket {
static <U extends ImplementedVirtualPocket> VirtualPocketType<U> register(Identifier id, Supplier<U> factory) {
return Registry.register(REGISTRY, id, new VirtualPocketType<U>() {
@Override
public ImplementedVirtualPocket fromNbt(NbtCompound nbt) {
return factory.get().fromNbt(nbt);
public ImplementedVirtualPocket fromNbt(NbtCompound nbt, ResourceManager manager) {
return factory.get().fromNbt(nbt, manager);
}
@Override
@ -74,7 +114,7 @@ public interface ImplementedVirtualPocket extends VirtualPocket {
}
// TODO: NoneReference instead?
public static class NoneVirtualPocket implements ImplementedVirtualPocket {
class NoneVirtualPocket extends AbstractVirtualPocket {
public static final String KEY = "none";
public static final NoneVirtualPocket NONE = new NoneVirtualPocket();
@ -97,7 +137,7 @@ public interface ImplementedVirtualPocket extends VirtualPocket {
}
@Override
public ImplementedVirtualPocket fromNbt(NbtCompound nbt) {
public ImplementedVirtualPocket fromNbt(NbtCompound nbt, ResourceManager manager) {
return this;
}

View file

@ -1,5 +1,9 @@
package org.dimdev.dimdoors.pockets.virtual;
import com.google.common.collect.Multimap;
import net.minecraft.resource.ResourceManager;
import org.dimdev.dimdoors.api.util.ReferenceSerializable;
import org.dimdev.dimdoors.api.util.ResourceUtil;
import org.dimdev.dimdoors.pockets.virtual.reference.PocketGeneratorReference;
import org.dimdev.dimdoors.pockets.PocketGenerationContext;
import org.dimdev.dimdoors.api.util.Weighted;
@ -9,23 +13,54 @@ import net.fabricmc.fabric.api.util.NbtType;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtList;
import org.jetbrains.annotations.Nullable;
public interface VirtualPocket extends Weighted<PocketGenerationContext> {
import java.util.Collection;
public interface VirtualPocket extends Weighted<PocketGenerationContext>, ReferenceSerializable {
String RESOURCE_STARTING_PATH = "pockets/virtual"; //TODO: might want to restructure data packs
static VirtualPocket deserialize(NbtElement nbt) {
if (nbt.getType() == NbtType.LIST) {
return VirtualPocketList.deserialize((NbtList) nbt);
return deserialize(nbt, null);
}
return ImplementedVirtualPocket.deserialize((NbtCompound) nbt); // should be NbtCompound
//TODO: split up in ImplementedVirtualPocket and VirtualPocketList
static VirtualPocket deserialize(NbtElement nbt, @Nullable ResourceManager manager) {
switch (nbt.getType()) {
case NbtType.LIST: // It's a list of VirtualPocket
return VirtualPocketList.deserialize((NbtList) nbt, manager);
case NbtType.COMPOUND: // It's a serialized VirtualPocket
return ImplementedVirtualPocket.deserialize((NbtCompound) nbt, manager);
case NbtType.STRING: // It's a reference to a resource location
return ResourceUtil.loadReferencedResource(manager, RESOURCE_STARTING_PATH, nbt.asString(), ResourceUtil.NBT_READER.andThenComposable(nbtElement -> deserialize(nbtElement, manager)));
default:
throw new RuntimeException(String.format("Unexpected NbtType %d!", nbt.getType()));
}
}
static NbtElement serialize(VirtualPocket virtualPocket, boolean allowReference) {
if (virtualPocket instanceof VirtualPocketList) {
return VirtualPocketList.serialize((VirtualPocketList) virtualPocket, allowReference);
}
return ImplementedVirtualPocket.serialize((ImplementedVirtualPocket) virtualPocket, allowReference);
}
static NbtElement serialize(VirtualPocket virtualPocket) {
if (virtualPocket instanceof VirtualPocketList) {
return VirtualPocketList.serialize((VirtualPocketList) virtualPocket);
}
return ImplementedVirtualPocket.serialize((ImplementedVirtualPocket) virtualPocket);
return serialize(virtualPocket, false);
}
void setResourceKey(String resourceKey);
String getResourceKey();
default void processFlags(Multimap<String, String> flags) {
// TODO: discuss some flag standardization
Collection<String> reference = flags.get("reference");
if (reference.stream().findFirst().map(string -> string.equals("local") || string.equals("global")).orElse(false)) {
setResourceKey(flags.get("resource_key").stream().findFirst().orElse(null));
}
}
Pocket prepareAndPlacePocket(PocketGenerationContext parameters);

View file

@ -1,39 +1,92 @@
package org.dimdev.dimdoors.pockets.virtual;
import net.fabricmc.fabric.api.util.NbtType;
import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtString;
import net.minecraft.resource.ResourceManager;
import org.dimdev.dimdoors.api.util.ResourceUtil;
import org.dimdev.dimdoors.pockets.virtual.reference.PocketGeneratorReference;
import org.dimdev.dimdoors.pockets.PocketGenerationContext;
import net.minecraft.nbt.NbtList;
import org.dimdev.dimdoors.api.util.WeightedList;
import org.dimdev.dimdoors.world.pocket.type.Pocket;
import org.jetbrains.annotations.Nullable;
public class VirtualPocketList extends WeightedList<VirtualPocket, PocketGenerationContext> implements VirtualPocket {
private String resourceKey = null;
public static VirtualPocketList deserialize(NbtList nbt) {
return new VirtualPocketList().fromNbt(nbt);
public static VirtualPocketList deserialize(NbtElement nbt, @Nullable ResourceManager manager) {
switch (nbt.getType()) {
case NbtType.LIST:
return deserialize((NbtList) nbt, manager);
case NbtType.STRING:
return ResourceUtil.loadReferencedResource(manager, RESOURCE_STARTING_PATH, nbt.asString(), ResourceUtil.NBT_READER.andThenComposable(nbtElement -> deserialize(nbtElement, manager)));
default:
throw new RuntimeException(String.format("Unexpected NbtType %d!", nbt.getType()));
}
}
public static NbtList serialize(VirtualPocketList virtualPocketList) {
return virtualPocketList.toNbt(new NbtList());
public static VirtualPocketList deserialize(NbtElement nbt) {
return deserialize(nbt, null);
}
public static VirtualPocketList deserialize(NbtList nbt, @Nullable ResourceManager manager) {
return new VirtualPocketList().fromNbt(nbt, manager);
}
public static VirtualPocketList deserialize(NbtList nbt) {
return deserialize(nbt, null);
}
@Override
public void setResourceKey(String resourceKey) {
this.resourceKey = resourceKey;
}
@Override
public String getResourceKey() {
return this.resourceKey;
}
public static NbtElement serialize(VirtualPocketList virtualPocketList, boolean allowReference) {
return virtualPocketList.toNbt(new NbtList(), allowReference);
}
public static NbtElement serialize(VirtualPocketList virtualPocket) {
return serialize(virtualPocket, false);
}
public VirtualPocketList() {
super();
}
public VirtualPocketList fromNbt(NbtList nbt) { // Keep in mind, this would add onto the list instead of overwriting it if called multiple times.
for (net.minecraft.nbt.NbtElement value : nbt) {
this.add(VirtualPocket.deserialize(value));
public VirtualPocketList fromNbt(NbtList nbt, ResourceManager manager) { // Keep in mind, this would add onto the list instead of overwriting it if called multiple times.
for (NbtElement value : nbt) {
this.add(VirtualPocket.deserialize(value, manager));
}
return this;
}
public NbtList toNbt(NbtList nbt) {
public VirtualPocketList fromNbt(NbtList nbt) {
return fromNbt(nbt, null);
}
public NbtElement toNbt(NbtList nbt, boolean allowReference) {
if (allowReference && resourceKey != null) {
return NbtString.of(resourceKey);
}
for(VirtualPocket virtualPocket : this) {
nbt.add(VirtualPocket.serialize(virtualPocket));
nbt.add(VirtualPocket.serialize(virtualPocket, allowReference));
}
return nbt;
}
public NbtElement toNbt(NbtList nbt) {
return toNbt(nbt, false);
}
@Override
public Pocket prepareAndPlacePocket(PocketGenerationContext context) {
return getNextPocketGeneratorReference(context).prepareAndPlacePocket(context);

View file

@ -2,6 +2,7 @@ package org.dimdev.dimdoors.pockets.virtual.reference;
import com.google.common.base.MoreObjects;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.resource.ResourceManager;
import net.minecraft.util.Identifier;
import org.dimdev.dimdoors.pockets.PocketLoader;
import org.dimdev.dimdoors.pockets.generator.PocketGenerator;
@ -14,8 +15,8 @@ public class IdReference extends PocketGeneratorReference {
private Identifier id;
@Override
public ImplementedVirtualPocket fromNbt(NbtCompound nbt) {
super.fromNbt(nbt);
public ImplementedVirtualPocket fromNbt(NbtCompound nbt, ResourceManager manager) {
super.fromNbt(nbt, manager);
// TODO: make the json need the "dimdoors:" as well and load id via Identifier#tryParse instead
id = new Identifier("dimdoors", nbt.getString("id"));
@ -24,8 +25,8 @@ public class IdReference extends PocketGeneratorReference {
}
@Override
public NbtCompound toNbt(NbtCompound nbt) {
super.toNbt(nbt);
protected NbtCompound toNbtInternal(NbtCompound nbt, boolean allowReference) {
super.toNbtInternal(nbt, allowReference);
nbt.putString("id", id.getPath());

View file

@ -9,6 +9,7 @@ import com.google.common.collect.Maps;
import net.fabricmc.fabric.api.util.NbtType;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtList;
import net.minecraft.resource.ResourceManager;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.ServerTask;
import net.minecraft.server.world.ChunkHolder;
@ -23,6 +24,7 @@ import org.dimdev.dimdoors.pockets.modifier.LazyCompatibleModifier;
import org.dimdev.dimdoors.pockets.modifier.LazyModifier;
import org.dimdev.dimdoors.pockets.modifier.Modifier;
import org.dimdev.dimdoors.pockets.modifier.RiftManager;
import org.dimdev.dimdoors.pockets.virtual.AbstractVirtualPocket;
import org.dimdev.dimdoors.pockets.virtual.ImplementedVirtualPocket;
import org.dimdev.dimdoors.pockets.PocketGenerationContext;
import org.dimdev.dimdoors.api.util.math.Equation;
@ -30,7 +32,7 @@ import org.dimdev.dimdoors.api.util.math.Equation.EquationParseException;
import org.dimdev.dimdoors.world.pocket.type.LazyGenerationPocket;
import org.dimdev.dimdoors.world.pocket.type.Pocket;
public abstract class PocketGeneratorReference implements ImplementedVirtualPocket {
public abstract class PocketGeneratorReference extends AbstractVirtualPocket {
private static final Logger LOGGER = LogManager.getLogger();
protected String weight;
@ -58,7 +60,7 @@ public abstract class PocketGeneratorReference implements ImplementedVirtualPock
}
@Override
public ImplementedVirtualPocket fromNbt(NbtCompound nbt) {
public ImplementedVirtualPocket fromNbt(NbtCompound nbt, ResourceManager manager) {
if (nbt.contains("weight")) { // override referenced pockets weight
this.weight = nbt.getString("weight");
parseWeight();
@ -69,6 +71,7 @@ public abstract class PocketGeneratorReference implements ImplementedVirtualPock
if (nbt.contains("modifiers")) {
NbtList modifiersNbt = nbt.getList("modifiers", 10);
for (int i = 0; i < modifiersNbt.size(); i++) {
// TODO: deserialize with ResourceManager
modifierList.add(Modifier.deserialize(modifiersNbt.getCompound(i)));
}
}
@ -76,6 +79,7 @@ public abstract class PocketGeneratorReference implements ImplementedVirtualPock
if (nbt.contains("addons", NbtType.LIST)) {
NbtList addonsNbt = nbt.getList("addons", 10);
for (int i = 0; i < addonsNbt.size(); i++) {
// TODO: something with the ResourceManager??? Probably need AddonBuilder now.
addons.add(addonsNbt.getCompound(i));
}
}
@ -84,20 +88,21 @@ public abstract class PocketGeneratorReference implements ImplementedVirtualPock
}
@Override
public NbtCompound toNbt(NbtCompound nbt) {
ImplementedVirtualPocket.super.toNbt(nbt);
protected NbtCompound toNbtInternal(NbtCompound nbt, boolean allowReference) {
if (weight != null) nbt.putString("weight", weight);
if (setupLoot != null) nbt.putBoolean("setup_loot", setupLoot);
NbtList modifiersNbt = new NbtList();
// TODO: deserialize with ResourceManager
for (Modifier modifier : modifierList) {
modifiersNbt.add(modifier.toNbt(new NbtCompound()));
}
if (modifiersNbt.size() > 0) nbt.put("modifiers", modifiersNbt);
NbtList addonsNbt = new NbtList();
// TODO: something with the ResourceManager??? Probably need AddonBuilder now.
addonsNbt.addAll(addons);
if (addonsNbt.size() > 0) nbt.put("addons", addonsNbt);

View file

@ -5,6 +5,7 @@ import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtList;
import net.minecraft.nbt.NbtString;
import com.google.common.base.MoreObjects;
import net.minecraft.resource.ResourceManager;
import org.dimdev.dimdoors.pockets.PocketLoader;
import org.dimdev.dimdoors.pockets.generator.PocketGenerator;
import org.dimdev.dimdoors.pockets.virtual.ImplementedVirtualPocket;
@ -14,7 +15,7 @@ import org.dimdev.dimdoors.api.util.WeightedList;
import java.util.ArrayList;
import java.util.List;
public class TagReference extends PocketGeneratorReference{
public class TagReference extends PocketGeneratorReference {
public static final String KEY = "tag";
private final List<String> required = new ArrayList<>();
@ -24,8 +25,8 @@ public class TagReference extends PocketGeneratorReference{
private WeightedList<PocketGenerator, PocketGenerationContext> pockets;
@Override
public ImplementedVirtualPocket fromNbt(NbtCompound nbt) {
super.fromNbt(nbt);
public ImplementedVirtualPocket fromNbt(NbtCompound nbt, ResourceManager manager) {
super.fromNbt(nbt, manager);
if (nbt.contains("required")) {
NbtList listNbt = nbt.getList("required", NbtType.STRING);
@ -47,8 +48,8 @@ public class TagReference extends PocketGeneratorReference{
}
@Override
public NbtCompound toNbt(NbtCompound nbt) {
super.toNbt(nbt);
protected NbtCompound toNbtInternal(NbtCompound nbt, boolean allowReference) {
super.toNbtInternal(nbt, allowReference);
if (required.size() > 0) {
NbtList listNbt = new NbtList();

View file

@ -1,6 +1,8 @@
package org.dimdev.dimdoors.pockets.virtual.selection;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtString;
import org.dimdev.dimdoors.api.util.WeightedList;
import org.dimdev.dimdoors.pockets.PocketGenerationContext;
import org.dimdev.dimdoors.pockets.virtual.ImplementedVirtualPocket;
@ -9,10 +11,31 @@ import org.dimdev.dimdoors.pockets.virtual.reference.PocketGeneratorReference;
import org.dimdev.dimdoors.world.pocket.type.Pocket;
public abstract class AbstractVirtualPocketList extends WeightedList<VirtualPocket, PocketGenerationContext> implements ImplementedVirtualPocket {
private String resourceKey = null;
public NbtCompound toNbt(NbtCompound nbt) {
ImplementedVirtualPocket.super.toNbt(nbt);
return nbt;
@Override
public void setResourceKey(String resourceKey) {
this.resourceKey = resourceKey;
}
@Override
public String getResourceKey() {
return resourceKey;
}
@Override
public NbtElement toNbt(NbtCompound nbt, boolean allowReference) {
if (allowReference && this.getResourceKey() != null) {
return NbtString.of(this.getResourceKey());
}
return toNbtInternal(nbt, allowReference);
}
// utility so the first part of toNbt can be extracted into default method
// at this point we know for a fact, that we need to serialize into the NbtCompound
// overwrite in subclass
protected NbtCompound toNbtInternal(NbtCompound nbt, boolean allowReference) {
return this.getType().toNbt(nbt);
}
@Override

View file

@ -1,8 +1,10 @@
package org.dimdev.dimdoors.pockets.virtual.selection;
import com.google.common.collect.Maps;
import net.minecraft.resource.ResourceManager;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.pockets.virtual.AbstractVirtualPocket;
import org.dimdev.dimdoors.pockets.virtual.ImplementedVirtualPocket;
import org.dimdev.dimdoors.pockets.virtual.VirtualPocket;
import org.dimdev.dimdoors.pockets.virtual.reference.PocketGeneratorReference;
@ -16,10 +18,11 @@ import java.util.Map;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtList;
public class ConditionalSelector implements ImplementedVirtualPocket {
public class ConditionalSelector extends AbstractVirtualPocket {
private static final Logger LOGGER = LogManager.getLogger();
public static final String KEY = "conditional";
// TODO: redo this weird map part, Equations now have Equation.asString()
private LinkedHashMap<String, VirtualPocket> pocketMap = Maps.newLinkedHashMap();
private LinkedHashMap<String, Equation> equationMap = Maps.newLinkedHashMap();
@ -35,7 +38,7 @@ public class ConditionalSelector implements ImplementedVirtualPocket {
}
@Override
public ImplementedVirtualPocket fromNbt(NbtCompound nbt) {
public ImplementedVirtualPocket fromNbt(NbtCompound nbt, ResourceManager manager) {
NbtList conditionalPockets = nbt.getList("pockets", 10);
for (int i = 0; i < conditionalPockets.size(); i++) {
NbtCompound pocket = conditionalPockets.getCompound(i);
@ -43,7 +46,7 @@ public class ConditionalSelector implements ImplementedVirtualPocket {
if (pocketMap.containsKey(condition)) continue;
try {
equationMap.put(condition, Equation.parse(condition));
pocketMap.put(condition, VirtualPocket.deserialize(pocket.get("pocket")));
pocketMap.put(condition, VirtualPocket.deserialize(pocket.get("pocket"), manager));
} catch (Equation.EquationParseException e) {
LOGGER.error("Could not parse pocket condition equation!", e);
}
@ -52,14 +55,14 @@ public class ConditionalSelector implements ImplementedVirtualPocket {
}
@Override
public NbtCompound toNbt(NbtCompound nbt) {
ImplementedVirtualPocket.super.toNbt(nbt);
public NbtCompound toNbtInternal(NbtCompound nbt, boolean allowReference) {
super.toNbtInternal(nbt, allowReference);
NbtList conditionalPockets = new NbtList();
pocketMap.forEach((condition, pocket) -> {
NbtCompound compound = new NbtCompound();
compound.putString("condition", condition);
compound.put("pocket", VirtualPocket.serialize(pocket));
compound.put("pocket", VirtualPocket.serialize(pocket, allowReference));
conditionalPockets.add(compound);
});
nbt.put("pockets", conditionalPockets);

View file

@ -1,6 +1,7 @@
package org.dimdev.dimdoors.pockets.virtual.selection;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.resource.ResourceManager;
import org.dimdev.dimdoors.api.util.Path;
import org.dimdev.dimdoors.pockets.PocketLoader;
import org.dimdev.dimdoors.pockets.virtual.ImplementedVirtualPocket;
@ -12,15 +13,15 @@ public class PathSelector extends AbstractVirtualPocketList {
private String path;
@Override
public ImplementedVirtualPocket fromNbt(NbtCompound nbt) {
public ImplementedVirtualPocket fromNbt(NbtCompound nbt, ResourceManager manager) {
this.path = nbt.getString("path");
return this;
}
@Override
public NbtCompound toNbt(NbtCompound nbt) {
super.toNbt(nbt);
public NbtCompound toNbtInternal(NbtCompound nbt, boolean allowReference) {
super.toNbtInternal(nbt, allowReference);
nbt.putString("path", path);

View file

@ -165,6 +165,7 @@ public class RelativeBlockSample implements BlockView, ModifiableWorld {
}
if(section.getBlockState(x, y, z).isAir()) {
BlockState newState = this.blockContainer.get(blockPos.subtract(origin));
// FIXME: newState can be null in some circumstances
if (!newState.isAir()) {
section.setBlockState(x, y, z, newState, false);
if (placementType.shouldMarkForUpdate()) serverChunkManager.markForUpdate(blockPos);