From 0fb93068bd17ffbd1cf192b22a015593fe6472cc Mon Sep 17 00:00:00 2001 From: CreepyCre Date: Thu, 28 Jan 2021 16:22:18 +0100 Subject: [PATCH] switched VirtualPockets from Codecs to fromTag/ toTag serialization --- .../dimdev/dimdoors/pockets/PocketGroup.java | 37 +++++++++-- .../dimdoors/pockets/SchematicV2Handler.java | 32 +++++----- .../dimdoors/pockets/VirtualPocket.java | 44 +++++++++++-- .../pockets/generator/SchematicGenerator.java | 37 ++++++++--- .../selection/DepthDependentSelector.java | 62 ++++++++++++++----- .../pockets/json/v2/default_private.json | 16 ++--- .../pockets/json/v2/default_public.json | 18 +++--- 7 files changed, 181 insertions(+), 65 deletions(-) diff --git a/src/main/java/org/dimdev/dimdoors/pockets/PocketGroup.java b/src/main/java/org/dimdev/dimdoors/pockets/PocketGroup.java index 9c3433fa..8cd5be9a 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/PocketGroup.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/PocketGroup.java @@ -3,21 +3,50 @@ package org.dimdev.dimdoors.pockets; import java.util.List; import java.util.Objects; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.google.common.collect.Lists; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; public final class PocketGroup { + /* public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.STRING.fieldOf("group").forGetter(PocketGroup::getGroup), VirtualPocket.CODEC.listOf().fieldOf("pockets").forGetter(PocketGroup::getEntries) ).apply(instance, PocketGroup::new)); - private final String group; - private final List entries; + */ + + private String group; + private List entries; + + public PocketGroup() { + } public PocketGroup(String group, List entries) { this.group = group; this.entries = entries; } + + public PocketGroup fromTag(CompoundTag tag) { + this.group = tag.getString("group"); + + ListTag pockets = tag.getList("pockets", 10); + this.entries = Lists.newArrayList(); + for (int i = 0; i < pockets.size(); i++) { + CompoundTag pocket = pockets.getCompound(i); + entries.add(VirtualPocket.deserialize(pocket)); + } + return this; + } + + public CompoundTag toTag(CompoundTag tag) { + tag.putString("group", this.group); + + ListTag pockets = new ListTag(); + entries.forEach(pocket -> pockets.add(pocket.toTag(new CompoundTag()))); + tag.put("pockets", pockets); + return tag; + } + public String getGroup() { return this.group; } diff --git a/src/main/java/org/dimdev/dimdoors/pockets/SchematicV2Handler.java b/src/main/java/org/dimdev/dimdoors/pockets/SchematicV2Handler.java index 4dbc87a4..df7419cb 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/SchematicV2Handler.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/SchematicV2Handler.java @@ -11,8 +11,8 @@ import java.util.*; import com.google.common.collect.*; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.mojang.serialization.JsonOps; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.nbt.*; import net.minecraft.util.Identifier; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -20,9 +20,6 @@ import org.dimdev.dimdoors.util.PocketGenerationParameters; import org.dimdev.dimdoors.util.WeightedList; import org.dimdev.dimdoors.util.schematic.v2.Schematic; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtIo; - public class SchematicV2Handler { private static final Logger LOGGER = LogManager.getLogger(); private static final Gson GSON = new GsonBuilder().setLenient().setPrettyPrinting().create(); @@ -43,17 +40,18 @@ public class SchematicV2Handler { long startTime = System.currentTimeMillis(); Set names = ImmutableSet.of("default_private", "default_public"); for (String name : names) { - try (BufferedReader reader = Files.newBufferedReader(Paths.get(SchematicV2Handler.class.getResource(String.format("/data/dimdoors/pockets/json/v2/%s.json", name)).toURI()))) { - List result = new ArrayList<>(); - while (true) { - String line = reader.readLine(); - if (line == null) { - break; - } - result.add(line); - } - JsonObject json = GSON.fromJson(String.join("", result), JsonObject.class); - PocketGroup type = PocketGroup.CODEC.decode(JsonOps.INSTANCE, json).getOrThrow(false, System.err::println).getFirst(); + try (BufferedReader reader = Files.newBufferedReader(Paths.get(SchematicV2Handler.class.getResource(String.format("/data/dimdoors/pockets/json/v2/%s.json", name)).toURI()))) { + List result = new ArrayList<>(); + while (true) { + String line = reader.readLine(); + if (line == null) { + break; + } + result.add(line); + } + + CompoundTag groupTag = StringNbtReader.parse(String.join("", result)); + PocketGroup type = new PocketGroup().fromTag(groupTag); this.pocketGroups.add(type); @@ -64,7 +62,7 @@ public class SchematicV2Handler { virtualPocket.init(type.getGroup()); weightedPockets.add(virtualPocket); } - } catch (IOException | URISyntaxException e) { + } catch (IOException | URISyntaxException | CommandSyntaxException e) { e.printStackTrace(); } } diff --git a/src/main/java/org/dimdev/dimdoors/pockets/VirtualPocket.java b/src/main/java/org/dimdev/dimdoors/pockets/VirtualPocket.java index ddd81582..d4de761b 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/VirtualPocket.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/VirtualPocket.java @@ -1,8 +1,8 @@ package org.dimdev.dimdoors.pockets; -import com.mojang.datafixers.util.Pair; import com.mojang.serialization.*; import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder; +import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; @@ -13,10 +13,13 @@ import org.dimdev.dimdoors.util.PocketGenerationParameters; import org.dimdev.dimdoors.util.Weighted; import org.dimdev.dimdoors.world.pocket.Pocket; +import java.util.function.Supplier; + // TODO: do something about getting correct Pocket sizes public abstract class VirtualPocket implements Weighted { 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) { @@ -29,6 +32,22 @@ public abstract class VirtualPocket implements Weighted { - VirtualPocketType SCHEMATIC = register(new Identifier("dimdoors", SchematicGenerator.KEY), SchematicGenerator.CODEC); + VirtualPocketType SCHEMATIC = register(new Identifier("dimdoors", SchematicGenerator.KEY), SchematicGenerator::new); - VirtualPocketType DEPTH_DEPENDENT = register(new Identifier("dimdoors", DepthDependentSelector.KEY), DepthDependentSelector.CODEC); + VirtualPocketType DEPTH_DEPENDENT = register(new Identifier("dimdoors", DepthDependentSelector.KEY), DepthDependentSelector::new); + VirtualPocket fromTag(CompoundTag tag); - Codec getCodec(); + CompoundTag toTag(CompoundTag tag); static void register() { } - static VirtualPocketType register(Identifier id, Codec codec) { - return Registry.register(REGISTRY, id, () -> codec); + static VirtualPocketType register(Identifier id, Supplier constructor) { + return Registry.register(REGISTRY, id, new VirtualPocketType() { + @Override + public VirtualPocket fromTag(CompoundTag tag) { + return constructor.get().fromTag(tag); + } + + @Override + public CompoundTag toTag(CompoundTag tag) { + tag.putString("type", id.toString()); + return tag; + } + }); } } } diff --git a/src/main/java/org/dimdev/dimdoors/pockets/generator/SchematicGenerator.java b/src/main/java/org/dimdev/dimdoors/pockets/generator/SchematicGenerator.java index 6f9b8bc5..96a368de 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/generator/SchematicGenerator.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/generator/SchematicGenerator.java @@ -1,7 +1,6 @@ package org.dimdev.dimdoors.pockets.generator; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.nbt.CompoundTag; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; import org.apache.logging.log4j.LogManager; @@ -20,18 +19,22 @@ public class SchematicGenerator extends VirtualPocket { private static final Logger LOGGER = LogManager.getLogger(); public static final String KEY = "schematic"; + /* public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.INT.fieldOf("size").forGetter(SchematicGenerator::getSize), Codec.STRING.fieldOf("id").forGetter(SchematicGenerator::getName), Codec.INT.optionalFieldOf("weight", 5).forGetter(schematicGenerator -> schematicGenerator.getWeight(null)) ).apply(instance, SchematicGenerator::new)); + */ - private final int size; - private final String name; - private final Identifier templateID; - private final int weight; + private int size; + private String name; + private Identifier templateID; + private int weight; - SchematicGenerator(int size, String name, int weight) { + public SchematicGenerator() {} + + public SchematicGenerator(int size, String name, int weight) { this.size = size; this.name = name; this.weight = weight; @@ -56,6 +59,26 @@ public class SchematicGenerator extends VirtualPocket { return this.weight; } + @Override + public VirtualPocket fromTag(CompoundTag tag) { + this.name = tag.getString("id"); + this.size = tag.getInt("size"); + this.weight = tag.contains("weight") ? tag.getInt("weight") : 5; + + this.templateID = new Identifier("dimdoors", name); + return this; + } + + @Override + public CompoundTag toTag(CompoundTag tag) { + super.toTag(tag); + + tag.putString("id", this.name); + tag.putInt("size", this.size); + tag.putInt("weight", this.weight); + return tag; + } + @Override public void init(String group) { SchematicV2Handler.getInstance().loadSchematic(templateID, group, size, name); diff --git a/src/main/java/org/dimdev/dimdoors/pockets/selection/DepthDependentSelector.java b/src/main/java/org/dimdev/dimdoors/pockets/selection/DepthDependentSelector.java index 7abfd265..122bb1c1 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/selection/DepthDependentSelector.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/selection/DepthDependentSelector.java @@ -1,18 +1,19 @@ package org.dimdev.dimdoors.pockets.selection; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.util.Pair; +import com.google.common.collect.Maps; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; import org.dimdev.dimdoors.pockets.VirtualPocket; import org.dimdev.dimdoors.util.PocketGenerationParameters; import org.dimdev.dimdoors.world.pocket.Pocket; -import java.util.List; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.regex.Pattern; public class DepthDependentSelector extends VirtualPocket { public static final String KEY = "depth_dependent"; - + /* private static final Codec> PAIR_CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.STRING.fieldOf("regex").forGetter(Pair::getLeft), VirtualPocket.CODEC.fieldOf("pocket").forGetter(Pair::getRight) @@ -22,13 +23,17 @@ public class DepthDependentSelector extends VirtualPocket { Codec.STRING.fieldOf("id").forGetter(DepthDependentSelector::getName), PAIR_CODEC.listOf().fieldOf("pockets").forGetter(DepthDependentSelector::getPocketList) ).apply(instance, DepthDependentSelector::new)); + */ - private final String name; - private final List> pocketList; + private String name; + private LinkedHashMap pocketList; - public DepthDependentSelector(String name, List> pocketList) { + public DepthDependentSelector() { + + } + public DepthDependentSelector(String name, LinkedHashMap pocketList) { this.name = name; this.pocketList = pocketList; } @@ -37,13 +42,42 @@ public class DepthDependentSelector extends VirtualPocket { return name; } - public List> getPocketList() { + public LinkedHashMap getPocketList() { return pocketList; } + @Override + public VirtualPocket fromTag(CompoundTag tag) { + this.name = tag.getString("id"); + ListTag regexPockets = tag.getList("pockets", 10); + pocketList = Maps.newLinkedHashMap(); + for (int i = 0; i < regexPockets.size(); i++) { + CompoundTag pocket = regexPockets.getCompound(i); + pocketList.put(pocket.getString("regex"), VirtualPocket.deserialize(pocket.getCompound("pocket"))); + } + return this; + } + + @Override + public CompoundTag toTag(CompoundTag tag) { + super.toTag(tag); + + tag.putString("id", this.name); + + ListTag regexPockets = new ListTag(); + pocketList.forEach((regex, pocket) -> { + CompoundTag compound = new CompoundTag(); + compound.putString("regex", regex); + compound.put("pocket", pocket.toTag(new CompoundTag())); + regexPockets.add(compound); + }); + tag.put("pockets", regexPockets); + return tag; + } + @Override public void init(String group) { - pocketList.forEach(pair -> pair.getRight().init(group)); + pocketList.forEach((regex, pocket) -> pocket.init(group)); } @Override @@ -73,11 +107,11 @@ public class DepthDependentSelector extends VirtualPocket { } private VirtualPocket getNextPocket(PocketGenerationParameters parameters) { - for (Pair pair : pocketList) { - if (Pattern.compile(pair.getLeft()).matcher(String.valueOf(parameters.getSourceVirtualLocation().getDepth())).matches()) { - return pair.getRight(); + for (Map.Entry entry : pocketList.entrySet()) { + if (Pattern.compile(entry.getKey()).matcher(String.valueOf(parameters.getSourceVirtualLocation().getDepth())).matches()) { + return entry.getValue(); } } - return pocketList.get(0).getRight(); + return pocketList.values().stream().findFirst().get(); } } diff --git a/src/main/resources/data/dimdoors/pockets/json/v2/default_private.json b/src/main/resources/data/dimdoors/pockets/json/v2/default_private.json index 06a90e99..312d60bb 100644 --- a/src/main/resources/data/dimdoors/pockets/json/v2/default_private.json +++ b/src/main/resources/data/dimdoors/pockets/json/v2/default_private.json @@ -2,49 +2,49 @@ "group": "private", "pockets": [ { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "private_pocket_0", "size": 0, "weight": 20 }, { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "private_pocket_1", "size": 1, "weight": 17 }, { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "private_pocket_2", "size": 2, "weight": 14 }, { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "private_pocket_3", "size": 3, "weight": 11 }, { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "private_pocket_4", "size": 4, "weight": 8 }, { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "private_pocket_5", "size": 5, "weight": 5 }, { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "private_pocket_6", "size": 6, "weight": 3 }, { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "private_pocket_7", "size": 7, "weight": 1 diff --git a/src/main/resources/data/dimdoors/pockets/json/v2/default_public.json b/src/main/resources/data/dimdoors/pockets/json/v2/default_public.json index 73099e05..e808dce6 100644 --- a/src/main/resources/data/dimdoors/pockets/json/v2/default_public.json +++ b/src/main/resources/data/dimdoors/pockets/json/v2/default_public.json @@ -2,13 +2,13 @@ "group": "public", "pockets": [ { - "virtual_type": "depth_dependent", + "type": "dimdoors:depth_dependent", "id": "public_pocket", "pockets": [ { "regex": "6", "pocket": { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "public_pocket_0", "size": 0, "weight": 20 @@ -17,7 +17,7 @@ { "regex": "7", "pocket": { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "public_pocket_1", "size": 1, "weight": 17 @@ -26,7 +26,7 @@ { "regex": "8", "pocket": { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "public_pocket_2", "size": 2, "weight": 14 @@ -35,7 +35,7 @@ { "regex": "9", "pocket": { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "public_pocket_3", "size": 3, "weight": 11 @@ -44,7 +44,7 @@ { "regex": "10", "pocket": { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "public_pocket_4", "size": 4, "weight": 8 @@ -53,7 +53,7 @@ { "regex": "11", "pocket": { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "public_pocket_5", "size": 5, "weight": 5 @@ -62,7 +62,7 @@ { "regex": "12", "pocket": { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "public_pocket_6", "size": 6, "weight": 3 @@ -71,7 +71,7 @@ { "regex": "[0-9]+", "pocket": { - "virtual_type": "schematic", + "type": "dimdoors:schematic", "id": "public_pocket_7", "size": 7, "weight": 1