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; 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.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
@ -12,8 +14,6 @@ import net.minecraft.resource.ResourceManager;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; 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.IOException;
import java.io.InputStream; 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) { 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)); Collection<Identifier> ids = manager.findResources(startingPath, str -> str.endsWith(extension));
return CompletableFuture.supplyAsync(() -> { return CompletableFuture.supplyAsync(() -> {

View file

@ -2,6 +2,7 @@ package org.dimdev.dimdoors.pockets;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.function.BiFunction;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; 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(); 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, 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(this::loadVirtualPocket), 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(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(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); 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!"); return NbtUtil.asNbtCompound(getDataNbt(id), "Could not convert NbtElement \"" + id + "\" to NbtCompound!");
} }
private VirtualPocket loadVirtualPocket(NbtElement nbt, Path<String> ignore) { private BiFunction<NbtElement, Path<String>, VirtualPocket> virtualPocketLoader(ResourceManager manager) {
return VirtualPocket.deserialize(nbt); return (nbt, ignore) -> VirtualPocket.deserialize(nbt, manager);
} }
private PocketGenerator loadPocketGenerator(NbtElement nbt, Path<String> ignore) { private BiFunction<NbtElement, Path<String>, PocketGenerator> pocketGeneratorLoader(ResourceManager manager) {
return PocketGenerator.deserialize(NbtUtil.asNbtCompound(nbt, "Could not load PocketGenerator since its json does not represent an NbtCompound!")); 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) { 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 com.mojang.serialization.*;
import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder; import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder;
import net.fabricmc.fabric.api.util.NbtType;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.resource.ResourceManager;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryKey; import net.minecraft.util.registry.RegistryKey;
import net.minecraft.util.registry.SimpleRegistry; import net.minecraft.util.registry.SimpleRegistry;
import org.dimdev.dimdoors.DimensionalDoorsInitializer; 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.IdReference;
import org.dimdev.dimdoors.pockets.virtual.reference.PocketGeneratorReference; import org.dimdev.dimdoors.pockets.virtual.reference.PocketGeneratorReference;
import org.dimdev.dimdoors.pockets.virtual.reference.TagReference; 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.PocketGenerationContext;
import org.dimdev.dimdoors.pockets.virtual.selection.PathSelector; import org.dimdev.dimdoors.pockets.virtual.selection.PathSelector;
import org.dimdev.dimdoors.world.pocket.type.Pocket; import org.dimdev.dimdoors.world.pocket.type.Pocket;
import org.jetbrains.annotations.Nullable;
import java.util.function.Supplier; import java.util.function.Supplier;
public interface ImplementedVirtualPocket extends VirtualPocket { 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(); 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")); Identifier id = Identifier.tryParse(nbt.getString("type"));
VirtualPocketType<?> type = REGISTRY.get(id); 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) { static ImplementedVirtualPocket deserialize(NbtCompound nbt) {
return implementedVirtualPocket.toNbt(new NbtCompound()); 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) { static NbtElement serialize(ImplementedVirtualPocket implementedVirtualPocket) {
return this.getType().toNbt(nbt); 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(); 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<ConditionalSelector> CONDITIONAL_SELECTOR = register(new Identifier("dimdoors", ConditionalSelector.KEY), ConditionalSelector::new);
VirtualPocketType<PathSelector> PATH_SELECTOR = register(new Identifier("dimdoors", PathSelector.KEY), PathSelector::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); 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) { static <U extends ImplementedVirtualPocket> VirtualPocketType<U> register(Identifier id, Supplier<U> factory) {
return Registry.register(REGISTRY, id, new VirtualPocketType<U>() { return Registry.register(REGISTRY, id, new VirtualPocketType<U>() {
@Override @Override
public ImplementedVirtualPocket fromNbt(NbtCompound nbt) { public ImplementedVirtualPocket fromNbt(NbtCompound nbt, ResourceManager manager) {
return factory.get().fromNbt(nbt); return factory.get().fromNbt(nbt, manager);
} }
@Override @Override
@ -74,7 +114,7 @@ public interface ImplementedVirtualPocket extends VirtualPocket {
} }
// TODO: NoneReference instead? // TODO: NoneReference instead?
public static class NoneVirtualPocket implements ImplementedVirtualPocket { class NoneVirtualPocket extends AbstractVirtualPocket {
public static final String KEY = "none"; public static final String KEY = "none";
public static final NoneVirtualPocket NONE = new NoneVirtualPocket(); public static final NoneVirtualPocket NONE = new NoneVirtualPocket();
@ -97,7 +137,7 @@ public interface ImplementedVirtualPocket extends VirtualPocket {
} }
@Override @Override
public ImplementedVirtualPocket fromNbt(NbtCompound nbt) { public ImplementedVirtualPocket fromNbt(NbtCompound nbt, ResourceManager manager) {
return this; return this;
} }

View file

@ -1,5 +1,9 @@
package org.dimdev.dimdoors.pockets.virtual; 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.virtual.reference.PocketGeneratorReference;
import org.dimdev.dimdoors.pockets.PocketGenerationContext; import org.dimdev.dimdoors.pockets.PocketGenerationContext;
import org.dimdev.dimdoors.api.util.Weighted; 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.NbtCompound;
import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtList; 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) { static VirtualPocket deserialize(NbtElement nbt) {
if (nbt.getType() == NbtType.LIST) { return deserialize(nbt, null);
return VirtualPocketList.deserialize((NbtList) nbt); }
//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()));
} }
return ImplementedVirtualPocket.deserialize((NbtCompound) nbt); // should be NbtCompound }
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) { static NbtElement serialize(VirtualPocket virtualPocket) {
if (virtualPocket instanceof VirtualPocketList) { return serialize(virtualPocket, false);
return VirtualPocketList.serialize((VirtualPocketList) virtualPocket);
}
return ImplementedVirtualPocket.serialize((ImplementedVirtualPocket) virtualPocket);
} }
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); Pocket prepareAndPlacePocket(PocketGenerationContext parameters);

View file

@ -1,39 +1,92 @@
package org.dimdev.dimdoors.pockets.virtual; 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.virtual.reference.PocketGeneratorReference;
import org.dimdev.dimdoors.pockets.PocketGenerationContext; import org.dimdev.dimdoors.pockets.PocketGenerationContext;
import net.minecraft.nbt.NbtList; import net.minecraft.nbt.NbtList;
import org.dimdev.dimdoors.api.util.WeightedList; import org.dimdev.dimdoors.api.util.WeightedList;
import org.dimdev.dimdoors.world.pocket.type.Pocket; import org.dimdev.dimdoors.world.pocket.type.Pocket;
import org.jetbrains.annotations.Nullable;
public class VirtualPocketList extends WeightedList<VirtualPocket, PocketGenerationContext> implements VirtualPocket { public class VirtualPocketList extends WeightedList<VirtualPocket, PocketGenerationContext> implements VirtualPocket {
private String resourceKey = null;
public static VirtualPocketList deserialize(NbtList nbt) { public static VirtualPocketList deserialize(NbtElement nbt, @Nullable ResourceManager manager) {
return new VirtualPocketList().fromNbt(nbt); 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) { public static VirtualPocketList deserialize(NbtElement nbt) {
return virtualPocketList.toNbt(new NbtList()); 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() { public VirtualPocketList() {
super(); super();
} }
public VirtualPocketList fromNbt(NbtList nbt) { // Keep in mind, this would add onto the list instead of overwriting it if called multiple times. 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 (net.minecraft.nbt.NbtElement value : nbt) { for (NbtElement value : nbt) {
this.add(VirtualPocket.deserialize(value)); this.add(VirtualPocket.deserialize(value, manager));
} }
return this; 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) { for(VirtualPocket virtualPocket : this) {
nbt.add(VirtualPocket.serialize(virtualPocket)); nbt.add(VirtualPocket.serialize(virtualPocket, allowReference));
} }
return nbt; return nbt;
} }
public NbtElement toNbt(NbtList nbt) {
return toNbt(nbt, false);
}
@Override @Override
public Pocket prepareAndPlacePocket(PocketGenerationContext context) { public Pocket prepareAndPlacePocket(PocketGenerationContext context) {
return getNextPocketGeneratorReference(context).prepareAndPlacePocket(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 com.google.common.base.MoreObjects;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
import net.minecraft.resource.ResourceManager;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import org.dimdev.dimdoors.pockets.PocketLoader; import org.dimdev.dimdoors.pockets.PocketLoader;
import org.dimdev.dimdoors.pockets.generator.PocketGenerator; import org.dimdev.dimdoors.pockets.generator.PocketGenerator;
@ -14,8 +15,8 @@ public class IdReference extends PocketGeneratorReference {
private Identifier id; private Identifier id;
@Override @Override
public ImplementedVirtualPocket fromNbt(NbtCompound nbt) { public ImplementedVirtualPocket fromNbt(NbtCompound nbt, ResourceManager manager) {
super.fromNbt(nbt); super.fromNbt(nbt, manager);
// TODO: make the json need the "dimdoors:" as well and load id via Identifier#tryParse instead // TODO: make the json need the "dimdoors:" as well and load id via Identifier#tryParse instead
id = new Identifier("dimdoors", nbt.getString("id")); id = new Identifier("dimdoors", nbt.getString("id"));
@ -24,8 +25,8 @@ public class IdReference extends PocketGeneratorReference {
} }
@Override @Override
public NbtCompound toNbt(NbtCompound nbt) { protected NbtCompound toNbtInternal(NbtCompound nbt, boolean allowReference) {
super.toNbt(nbt); super.toNbtInternal(nbt, allowReference);
nbt.putString("id", id.getPath()); 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.fabricmc.fabric.api.util.NbtType;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtList; import net.minecraft.nbt.NbtList;
import net.minecraft.resource.ResourceManager;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.ServerTask; import net.minecraft.server.ServerTask;
import net.minecraft.server.world.ChunkHolder; 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.LazyModifier;
import org.dimdev.dimdoors.pockets.modifier.Modifier; import org.dimdev.dimdoors.pockets.modifier.Modifier;
import org.dimdev.dimdoors.pockets.modifier.RiftManager; 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.virtual.ImplementedVirtualPocket;
import org.dimdev.dimdoors.pockets.PocketGenerationContext; import org.dimdev.dimdoors.pockets.PocketGenerationContext;
import org.dimdev.dimdoors.api.util.math.Equation; 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.LazyGenerationPocket;
import org.dimdev.dimdoors.world.pocket.type.Pocket; 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(); private static final Logger LOGGER = LogManager.getLogger();
protected String weight; protected String weight;
@ -58,7 +60,7 @@ public abstract class PocketGeneratorReference implements ImplementedVirtualPock
} }
@Override @Override
public ImplementedVirtualPocket fromNbt(NbtCompound nbt) { public ImplementedVirtualPocket fromNbt(NbtCompound nbt, ResourceManager manager) {
if (nbt.contains("weight")) { // override referenced pockets weight if (nbt.contains("weight")) { // override referenced pockets weight
this.weight = nbt.getString("weight"); this.weight = nbt.getString("weight");
parseWeight(); parseWeight();
@ -69,6 +71,7 @@ public abstract class PocketGeneratorReference implements ImplementedVirtualPock
if (nbt.contains("modifiers")) { if (nbt.contains("modifiers")) {
NbtList modifiersNbt = nbt.getList("modifiers", 10); NbtList modifiersNbt = nbt.getList("modifiers", 10);
for (int i = 0; i < modifiersNbt.size(); i++) { for (int i = 0; i < modifiersNbt.size(); i++) {
// TODO: deserialize with ResourceManager
modifierList.add(Modifier.deserialize(modifiersNbt.getCompound(i))); modifierList.add(Modifier.deserialize(modifiersNbt.getCompound(i)));
} }
} }
@ -76,6 +79,7 @@ public abstract class PocketGeneratorReference implements ImplementedVirtualPock
if (nbt.contains("addons", NbtType.LIST)) { if (nbt.contains("addons", NbtType.LIST)) {
NbtList addonsNbt = nbt.getList("addons", 10); NbtList addonsNbt = nbt.getList("addons", 10);
for (int i = 0; i < addonsNbt.size(); i++) { for (int i = 0; i < addonsNbt.size(); i++) {
// TODO: something with the ResourceManager??? Probably need AddonBuilder now.
addons.add(addonsNbt.getCompound(i)); addons.add(addonsNbt.getCompound(i));
} }
} }
@ -84,20 +88,21 @@ public abstract class PocketGeneratorReference implements ImplementedVirtualPock
} }
@Override @Override
public NbtCompound toNbt(NbtCompound nbt) { protected NbtCompound toNbtInternal(NbtCompound nbt, boolean allowReference) {
ImplementedVirtualPocket.super.toNbt(nbt);
if (weight != null) nbt.putString("weight", weight); if (weight != null) nbt.putString("weight", weight);
if (setupLoot != null) nbt.putBoolean("setup_loot", setupLoot); if (setupLoot != null) nbt.putBoolean("setup_loot", setupLoot);
NbtList modifiersNbt = new NbtList(); NbtList modifiersNbt = new NbtList();
// TODO: deserialize with ResourceManager
for (Modifier modifier : modifierList) { for (Modifier modifier : modifierList) {
modifiersNbt.add(modifier.toNbt(new NbtCompound())); modifiersNbt.add(modifier.toNbt(new NbtCompound()));
} }
if (modifiersNbt.size() > 0) nbt.put("modifiers", modifiersNbt); if (modifiersNbt.size() > 0) nbt.put("modifiers", modifiersNbt);
NbtList addonsNbt = new NbtList(); NbtList addonsNbt = new NbtList();
// TODO: something with the ResourceManager??? Probably need AddonBuilder now.
addonsNbt.addAll(addons); addonsNbt.addAll(addons);
if (addonsNbt.size() > 0) nbt.put("addons", addonsNbt); 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.NbtList;
import net.minecraft.nbt.NbtString; import net.minecraft.nbt.NbtString;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import net.minecraft.resource.ResourceManager;
import org.dimdev.dimdoors.pockets.PocketLoader; import org.dimdev.dimdoors.pockets.PocketLoader;
import org.dimdev.dimdoors.pockets.generator.PocketGenerator; import org.dimdev.dimdoors.pockets.generator.PocketGenerator;
import org.dimdev.dimdoors.pockets.virtual.ImplementedVirtualPocket; 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.ArrayList;
import java.util.List; import java.util.List;
public class TagReference extends PocketGeneratorReference{ public class TagReference extends PocketGeneratorReference {
public static final String KEY = "tag"; public static final String KEY = "tag";
private final List<String> required = new ArrayList<>(); private final List<String> required = new ArrayList<>();
@ -24,8 +25,8 @@ public class TagReference extends PocketGeneratorReference{
private WeightedList<PocketGenerator, PocketGenerationContext> pockets; private WeightedList<PocketGenerator, PocketGenerationContext> pockets;
@Override @Override
public ImplementedVirtualPocket fromNbt(NbtCompound nbt) { public ImplementedVirtualPocket fromNbt(NbtCompound nbt, ResourceManager manager) {
super.fromNbt(nbt); super.fromNbt(nbt, manager);
if (nbt.contains("required")) { if (nbt.contains("required")) {
NbtList listNbt = nbt.getList("required", NbtType.STRING); NbtList listNbt = nbt.getList("required", NbtType.STRING);
@ -47,8 +48,8 @@ public class TagReference extends PocketGeneratorReference{
} }
@Override @Override
public NbtCompound toNbt(NbtCompound nbt) { protected NbtCompound toNbtInternal(NbtCompound nbt, boolean allowReference) {
super.toNbt(nbt); super.toNbtInternal(nbt, allowReference);
if (required.size() > 0) { if (required.size() > 0) {
NbtList listNbt = new NbtList(); NbtList listNbt = new NbtList();

View file

@ -1,6 +1,8 @@
package org.dimdev.dimdoors.pockets.virtual.selection; package org.dimdev.dimdoors.pockets.virtual.selection;
import net.minecraft.nbt.NbtCompound; 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.api.util.WeightedList;
import org.dimdev.dimdoors.pockets.PocketGenerationContext; import org.dimdev.dimdoors.pockets.PocketGenerationContext;
import org.dimdev.dimdoors.pockets.virtual.ImplementedVirtualPocket; 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; import org.dimdev.dimdoors.world.pocket.type.Pocket;
public abstract class AbstractVirtualPocketList extends WeightedList<VirtualPocket, PocketGenerationContext> implements ImplementedVirtualPocket { public abstract class AbstractVirtualPocketList extends WeightedList<VirtualPocket, PocketGenerationContext> implements ImplementedVirtualPocket {
private String resourceKey = null;
public NbtCompound toNbt(NbtCompound nbt) { @Override
ImplementedVirtualPocket.super.toNbt(nbt); public void setResourceKey(String resourceKey) {
return nbt; 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 @Override

View file

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

View file

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

View file

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