VirtualPocket loading via resource reference
This commit is contained in:
parent
c8389cf3e9
commit
2729344f5f
14 changed files with 301 additions and 63 deletions
|
@ -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);
|
||||||
|
}
|
|
@ -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(() -> {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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());
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue