diff --git a/src/main/java/org/dimdev/dimdoors/pockets/virtual/VirtualSingularPocket.java b/src/main/java/org/dimdev/dimdoors/pockets/virtual/VirtualSingularPocket.java index 465e1b87..b35933fb 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/virtual/VirtualSingularPocket.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/virtual/VirtualSingularPocket.java @@ -8,32 +8,21 @@ import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.util.registry.SimpleRegistry; import org.dimdev.dimdoors.pockets.virtual.reference.IdReference; +import org.dimdev.dimdoors.pockets.virtual.reference.PocketGeneratorReference; import org.dimdev.dimdoors.pockets.virtual.reference.TagReference; import org.dimdev.dimdoors.pockets.virtual.selection.ConditionalSelector; +import org.dimdev.dimdoors.util.PocketGenerationParameters; +import org.dimdev.dimdoors.world.pocket.type.Pocket; import java.util.function.Supplier; -// TODO: do something about getting correct Pocket sizes public abstract class VirtualSingularPocket implements VirtualPocket { public static final Registry> REGISTRY = FabricRegistryBuilder.from(new SimpleRegistry>(RegistryKey.ofRegistry(new Identifier("dimdoors", "virtual_pocket_type")), Lifecycle.stable())).buildAndRegister(); - /* - public static final Codec CODEC = new Codec() { - @Override - public DataResult> decode(DynamicOps dynamicOps, T input) { - Identifier id = new Identifier("dimdoors", Codec.STRING.decode(dynamicOps, dynamicOps.get(input, "virtual_type").getOrThrow(false, System.err::println)).getOrThrow(false, System.err::println).getFirst()); - return REGISTRY.get(id).getCodec().decode(dynamicOps, input).map(pair -> pair.mapFirst(virtualPocket -> (VirtualPocket) virtualPocket)); - } - - @Override - public DataResult encode(VirtualPocket input, DynamicOps ops, T prefix) { - return null; // TODO: write encode function - } - }; - */ public static VirtualSingularPocket deserialize(CompoundTag tag) { - Identifier id = Identifier.tryParse(tag.getString("type")); // TODO: return some NONE VirtualPocket if type cannot be found or deserialization fails. - return REGISTRY.get(id).fromTag(tag); + Identifier id = Identifier.tryParse(tag.getString("type")); + VirtualSingularPocketType type = REGISTRY.get(id); + return type != null ? type.fromTag(tag) : VirtualSingularPocketType.NONE.fromTag(tag); } public static CompoundTag serialize(VirtualSingularPocket virtualSingularPocket) { @@ -51,9 +40,10 @@ public abstract class VirtualSingularPocket implements VirtualPocket { public abstract String getKey(); public interface VirtualSingularPocketType { + VirtualSingularPocketType NONE = register(new Identifier("dimdoors", NoneVirtualPocket.KEY), () -> NoneVirtualPocket.NONE); VirtualSingularPocketType ID_REFERENCE = register(new Identifier("dimdoors", IdReference.KEY), IdReference::new); VirtualSingularPocketType TAG_REFERENCE = register(new Identifier("dimdoors", TagReference.KEY), TagReference::new); - VirtualSingularPocketType DEPTH_DEPENDENT_SELECTOR = register(new Identifier("dimdoors", ConditionalSelector.KEY), ConditionalSelector::new); + VirtualSingularPocketType CONDITIONAL_SELECTOR = register(new Identifier("dimdoors", ConditionalSelector.KEY), ConditionalSelector::new); VirtualSingularPocket fromTag(CompoundTag tag); @@ -77,4 +67,45 @@ public abstract class VirtualSingularPocket implements VirtualPocket { }); } } + + // TODO: NoneReference instead? + public static class NoneVirtualPocket extends VirtualSingularPocket { + public static final String KEY = "none"; + public static final NoneVirtualPocket NONE = new NoneVirtualPocket(); + + @Override + public Pocket prepareAndPlacePocket(PocketGenerationParameters parameters) { + throw new UnsupportedOperationException("Cannot call this method on a NoneVirtualPocket"); + } + + @Override + public PocketGeneratorReference getNextPocketGeneratorReference(PocketGenerationParameters parameters) { + throw new UnsupportedOperationException("Cannot call this method on a NoneVirtualPocket"); + } + + @Override + public PocketGeneratorReference peekNextPocketGeneratorReference(PocketGenerationParameters parameters) { + throw new UnsupportedOperationException("Cannot call this method on a NoneVirtualPocket"); + } + + @Override + public VirtualSingularPocket fromTag(CompoundTag tag) { + return this; + } + + @Override + public VirtualSingularPocketType getType() { + return VirtualSingularPocketType.NONE; + } + + @Override + public String getKey() { + return KEY; + } + + @Override + public double getWeight(PocketGenerationParameters parameters) { + return 0; + } + } } diff --git a/src/main/java/org/dimdev/dimdoors/pockets/virtual/selection/ConditionalSelector.java b/src/main/java/org/dimdev/dimdoors/pockets/virtual/selection/ConditionalSelector.java index c3fab811..805671f1 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/virtual/selection/ConditionalSelector.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/virtual/selection/ConditionalSelector.java @@ -83,7 +83,7 @@ public class ConditionalSelector extends VirtualSingularPocket { @Override public VirtualSingularPocketType getType() { - return VirtualSingularPocketType.DEPTH_DEPENDENT_SELECTOR; + return VirtualSingularPocketType.CONDITIONAL_SELECTOR; } @Override @@ -102,6 +102,6 @@ public class ConditionalSelector extends VirtualSingularPocket { return entry.getValue(); } } - return pocketMap.values().stream().findFirst().get(); // TODO: orElse() with some NONE VirtualPocket + return pocketMap.values().stream().findFirst().orElse(NoneVirtualPocket.NONE); } }