From 316a306d5b02c1e2cd2be98e1e428726f66e7a65 Mon Sep 17 00:00:00 2001 From: CreepyCre Date: Mon, 22 Feb 2021 23:08:30 +0100 Subject: [PATCH] refactored SchematicHandler -> PocketLoader made schematics load directly via resource loader --- .../dimdoors/DimensionalDoorsInitializer.java | 4 +- .../dimdoors/pockets/PocketGenerator.java | 2 +- ...chematicHandler.java => PocketLoader.java} | 42 ++++++++++++------- .../dimdoors/pockets/PocketTemplate.java | 10 +---- .../pockets/generator/SchematicGenerator.java | 12 +++--- .../modifier/DimensionalDoorModifier.java | 4 +- .../pockets/modifier/RiftDataModifier.java | 4 +- .../virtual/reference/IdReference.java | 4 +- .../virtual/reference/TagReference.java | 6 +-- 9 files changed, 45 insertions(+), 43 deletions(-) rename src/main/java/org/dimdev/dimdoors/pockets/{SchematicHandler.java => PocketLoader.java} (76%) diff --git a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java index 958acdba..6869d24d 100644 --- a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java +++ b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java @@ -28,7 +28,7 @@ import org.dimdev.dimdoors.listener.ChunkLoadListener; import org.dimdev.dimdoors.listener.pocket.*; import org.dimdev.dimdoors.network.ExtendedServerPlayNetworkHandler; import org.dimdev.dimdoors.particle.ModParticleTypes; -import org.dimdev.dimdoors.pockets.SchematicHandler; +import org.dimdev.dimdoors.pockets.PocketLoader; import org.dimdev.dimdoors.pockets.generator.PocketGenerator; import org.dimdev.dimdoors.pockets.virtual.VirtualSingularPocket; import org.dimdev.dimdoors.pockets.modifier.Modifier; @@ -106,7 +106,7 @@ public class DimensionalDoorsInitializer implements ModInitializer { AbstractPocket.AbstractPocketType.register(); PocketAddon.PocketAddonType.register(); - ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(SchematicHandler.getInstance()); + ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(PocketLoader.getInstance()); ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("dimdoors", "default_pockets"), dimDoorsMod, ResourcePackActivationType.DEFAULT_ENABLED); registerListeners(); diff --git a/src/main/java/org/dimdev/dimdoors/pockets/PocketGenerator.java b/src/main/java/org/dimdev/dimdoors/pockets/PocketGenerator.java index 869ca747..9a5a4154 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/PocketGenerator.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/PocketGenerator.java @@ -39,7 +39,7 @@ public final class PocketGenerator { public static Pocket generateFromPocketGroupV2(ServerWorld world, Identifier group, VirtualLocation virtualLocation, VirtualTarget linkTo, LinkProperties linkProperties) { PocketGenerationParameters parameters = new PocketGenerationParameters(world, virtualLocation, linkTo, linkProperties); - return generatePocketV2(SchematicHandler.getInstance().getGroup(group).getNextPocketGeneratorReference(parameters), parameters); + return generatePocketV2(PocketLoader.getInstance().getGroup(group).getNextPocketGeneratorReference(parameters), parameters); } public static Pocket generatePocketV2(PocketGeneratorReference pocketGeneratorReference, PocketGenerationParameters parameters) { diff --git a/src/main/java/org/dimdev/dimdoors/pockets/SchematicHandler.java b/src/main/java/org/dimdev/dimdoors/pockets/PocketLoader.java similarity index 76% rename from src/main/java/org/dimdev/dimdoors/pockets/SchematicHandler.java rename to src/main/java/org/dimdev/dimdoors/pockets/PocketLoader.java index 63a6d3b8..e462edaf 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/SchematicHandler.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/PocketLoader.java @@ -30,15 +30,15 @@ import org.dimdev.dimdoors.util.PocketGenerationParameters; import org.dimdev.dimdoors.util.WeightedList; import org.dimdev.dimdoors.util.schematic.Schematic; -public class SchematicHandler implements SimpleSynchronousResourceReloadListener { +public class PocketLoader implements SimpleSynchronousResourceReloadListener { private static final Logger LOGGER = LogManager.getLogger(); private static final Gson GSON = new GsonBuilder().setLenient().setPrettyPrinting().create(); - private static final SchematicHandler INSTANCE = new SchematicHandler(); + private static final PocketLoader INSTANCE = new PocketLoader(); private Map pocketGeneratorMap = new ConcurrentHashMap<>(); private Map pocketGroups = new ConcurrentHashMap<>(); private Map templates = new ConcurrentHashMap<>(); - private SchematicHandler() { + private PocketLoader() { } @Override @@ -49,10 +49,12 @@ public class SchematicHandler implements SimpleSynchronousResourceReloadListener CompletableFuture> futurePocketGeneratorMap = loadResourcePathFromJsonToMap(manager, "pockets/generators", this::loadPocketGenerator); CompletableFuture> futurePocketGroups = loadResourcePathFromJsonToMap(manager, "pockets/groups", this::loadPocketGroup); + CompletableFuture> futureTemplates = loadResourcePathFromCompressedNbtToMap(manager, "pockets/schematic", ".schem", this::loadPocketTemplate); try { pocketGeneratorMap = futurePocketGeneratorMap.get(); pocketGroups = futurePocketGroups.get(); + templates = futureTemplates.get(); } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } @@ -76,6 +78,22 @@ public class SchematicHandler implements SimpleSynchronousResourceReloadListener }))); } + private CompletableFuture> loadResourcePathFromCompressedNbtToMap(ResourceManager manager, String startingPath, String extension, Function reader) { + int sub = startingPath.endsWith("/") ? 0 : 1; + + Collection ids = manager.findResources(startingPath, str -> str.endsWith(extension)); + return CompletableFuture.supplyAsync(() -> + ids.parallelStream().unordered().collect(Collectors.toConcurrentMap( + id -> new Identifier(id.getNamespace(), id.getPath().substring(0, id.getPath().lastIndexOf(".")).substring(startingPath.length() + sub)), + id -> { + try { + return reader.apply(NbtIo.readCompressed(manager.getResource(id).getInputStream())); + } catch (IOException e) { + throw new RuntimeException("Error loading resource: " + id); + } + }))); + } + // public void load() { // long startTime = System.currentTimeMillis(); // @@ -99,7 +117,7 @@ public class SchematicHandler implements SimpleSynchronousResourceReloadListener public Tag readNbtFromJson(String id) { try { - Path path = Paths.get(SchematicHandler.class.getResource("/resourcepacks/default_pockets/data/dimdoors/pockets/json/" + id + ".json").toURI()); + Path path = Paths.get(PocketLoader.class.getResource("/resourcepacks/default_pockets/data/dimdoors/pockets/json/" + id + ".json").toURI()); if (!Files.isRegularFile(path)) { return null; } @@ -126,17 +144,11 @@ public class SchematicHandler implements SimpleSynchronousResourceReloadListener return PocketGenerator.deserialize((CompoundTag) tag); } - public void loadSchematic(Identifier templateID, String id) { - try { - if (templates.containsKey(templateID)) return; - Path schemPath = Paths.get(SchematicHandler.class.getResource(String.format("/resourcepacks/default_pockets/data/dimdoors/pockets/schematic/%s.schem", id)).toURI()); - CompoundTag schemTag = NbtIo.readCompressed(Files.newInputStream(schemPath)); - Schematic schematic = Schematic.fromTag(schemTag); - PocketTemplate template = new PocketTemplate(schematic, id); - templates.put(templateID, template); - } catch (URISyntaxException | IOException e) { - LOGGER.error("Could not load schematic!", e); + private PocketTemplate loadPocketTemplate(Tag tag) { + if (tag == null || tag.getType() != NbtType.COMPOUND) { + throw new RuntimeException("Could not load Schematic since its json does not represent a CompoundTag!"); } + return new PocketTemplate(Schematic.fromTag((CompoundTag) tag)); } public WeightedList getPocketsMatchingTags(List required, List blackList, boolean exact) { @@ -147,7 +159,7 @@ public class SchematicHandler implements SimpleSynchronousResourceReloadListener return pocketGroups.get(group); } - public static SchematicHandler getInstance() { + public static PocketLoader getInstance() { return INSTANCE; } diff --git a/src/main/java/org/dimdev/dimdoors/pockets/PocketTemplate.java b/src/main/java/org/dimdev/dimdoors/pockets/PocketTemplate.java index 80777a9a..90865bb6 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/PocketTemplate.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/PocketTemplate.java @@ -19,11 +19,9 @@ public class PocketTemplate { private static final Logger LOGGER = LogManager.getLogger(); private static final boolean replacingPlaceholders = false; private final Schematic schematic; - private final String id; - public PocketTemplate(Schematic schematic, String id) { + public PocketTemplate(Schematic schematic) { this.schematic = schematic; - this.id = id; } /* @@ -65,7 +63,6 @@ public class PocketTemplate { pocket.setSize(schematic.getWidth(), schematic.getHeight(), schematic.getLength()); ServerWorld world = DimensionalDoorsInitializer.getWorld(pocket.getWorld()); BlockPos origin = pocket.getOrigin(); - LOGGER.info("Placing new pocket using schematic " + this.id + " at x = " + origin.getX() + ", z = " + origin.getZ()); SchematicPlacer.place(this.schematic, world, origin, blockUpdate); } @@ -73,7 +70,6 @@ public class PocketTemplate { pocket.setSize(schematic.getWidth(), schematic.getHeight(), schematic.getLength()); ServerWorld world = DimensionalDoorsInitializer.getWorld(pocket.getWorld()); BlockPos origin = pocket.getOrigin(); - LOGGER.info("Placing new pocket using schematic " + this.id + " at x = " + origin.getX() + ", z = " + origin.getZ()); return SchematicPlacer.placeRiftsOnly(this.schematic, world, origin); } @@ -88,8 +84,4 @@ public class PocketTemplate { public Schematic getSchematic() { return this.schematic; } - - public String getId() { - return this.id; - } } 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 7fcd2f09..268b9565 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/generator/SchematicGenerator.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/generator/SchematicGenerator.java @@ -10,8 +10,8 @@ import net.minecraft.world.chunk.Chunk; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dimdev.dimdoors.block.entity.RiftBlockEntity; +import org.dimdev.dimdoors.pockets.PocketLoader; import org.dimdev.dimdoors.pockets.PocketTemplate; -import org.dimdev.dimdoors.pockets.SchematicHandler; import org.dimdev.dimdoors.pockets.modifier.RiftManager; import org.dimdev.dimdoors.util.PocketGenerationParameters; import org.dimdev.dimdoors.util.schematic.Schematic; @@ -62,7 +62,7 @@ public class SchematicGenerator extends LazyPocketGenerator{ @Override public void generateChunk(LazyGenerationPocket pocket, Chunk chunk) { - PocketTemplate template = SchematicHandler.getInstance().getTemplates().get(templateID); + PocketTemplate template = PocketLoader.getInstance().getTemplates().get(templateID); if (template == null) throw new RuntimeException("Pocket template of id " + templateID + " not found!"); template.place(pocket, chunk, origin, blockUpdate); setupChunk(pocket, chunk, isSetupLoot()); @@ -82,8 +82,6 @@ public class SchematicGenerator extends LazyPocketGenerator{ } if (tag.contains("block_update")) blockUpdate = tag.getBoolean("block_update"); - SchematicHandler.getInstance().loadSchematic(templateID, id); - return this; } @@ -129,11 +127,11 @@ public class SchematicGenerator extends LazyPocketGenerator{ ServerWorld world = parameters.getWorld(); Map variableMap = parameters.toVariableMap(new HashMap<>()); - PocketTemplate template = SchematicHandler.getInstance().getTemplates().get(templateID); + PocketTemplate template = PocketLoader.getInstance().getTemplates().get(templateID); if (template == null) throw new RuntimeException("Pocket template of id " + templateID + " not found!"); Pocket pocket = DimensionalRegistry.getPocketDirectory(world.getRegistryKey()).newPocket(builder); - LOGGER.info("Generating pocket from template " + template.getId() + " at location " + pocket.getOrigin()); + LOGGER.info("Generating pocket from template " + templateID + " at location " + pocket.getOrigin()); if (pocket instanceof LazyGenerationPocket) { rifts.addAll(template.placeRiftsOnly(pocket)); @@ -156,7 +154,7 @@ public class SchematicGenerator extends LazyPocketGenerator{ @Override public Vec3i getSize(PocketGenerationParameters parameters) { - PocketTemplate template = SchematicHandler.getInstance().getTemplates().get(templateID); + PocketTemplate template = PocketLoader.getInstance().getTemplates().get(templateID); if (template == null) throw new RuntimeException("Pocket template of id " + templateID + " not found!"); Schematic schem = template.getSchematic(); return new Vec3i(schem.getWidth(), schem.getHeight(), schem.getLength()); diff --git a/src/main/java/org/dimdev/dimdoors/pockets/modifier/DimensionalDoorModifier.java b/src/main/java/org/dimdev/dimdoors/pockets/modifier/DimensionalDoorModifier.java index 701756c1..4b5ca3b6 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/modifier/DimensionalDoorModifier.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/modifier/DimensionalDoorModifier.java @@ -24,7 +24,7 @@ import org.dimdev.dimdoors.block.ModBlocks; import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity; import org.dimdev.dimdoors.block.entity.ModBlockEntityTypes; import org.dimdev.dimdoors.block.entity.RiftData; -import org.dimdev.dimdoors.pockets.SchematicHandler; +import org.dimdev.dimdoors.pockets.PocketLoader; import org.dimdev.dimdoors.rift.targets.IdMarker; import org.dimdev.dimdoors.util.PocketGenerationParameters; import org.dimdev.dimdoors.util.TagEquations; @@ -70,7 +70,7 @@ public class DimensionalDoorModifier implements LazyCompatibleModifier { if (tag.getType("rift_data") == NbtType.STRING) { doorDataReference = tag.getString("rift_data"); - doorData = (CompoundTag) SchematicHandler.getInstance().readNbtFromJson(doorDataReference); + doorData = (CompoundTag) PocketLoader.getInstance().readNbtFromJson(doorDataReference); } else if (tag.getType("rift_data") == NbtType.COMPOUND) doorData = tag.getCompound("rift_data"); diff --git a/src/main/java/org/dimdev/dimdoors/pockets/modifier/RiftDataModifier.java b/src/main/java/org/dimdev/dimdoors/pockets/modifier/RiftDataModifier.java index 370f527e..4ffed62e 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/modifier/RiftDataModifier.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/modifier/RiftDataModifier.java @@ -15,7 +15,7 @@ import net.fabricmc.fabric.api.util.NbtType; import com.google.common.base.MoreObjects; import org.dimdev.dimdoors.block.entity.RiftBlockEntity; import org.dimdev.dimdoors.block.entity.RiftData; -import org.dimdev.dimdoors.pockets.SchematicHandler; +import org.dimdev.dimdoors.pockets.PocketLoader; import org.dimdev.dimdoors.rift.targets.VirtualTarget; import org.dimdev.dimdoors.util.PocketGenerationParameters; import org.dimdev.dimdoors.util.TagEquations; @@ -32,7 +32,7 @@ public class RiftDataModifier implements Modifier { public Modifier fromTag(CompoundTag tag) { if (tag.getType("rift_data") == NbtType.STRING) { doorDataReference = tag.getString("rift_data"); - doorData = (CompoundTag) SchematicHandler.getInstance().readNbtFromJson(doorDataReference); + doorData = (CompoundTag) PocketLoader.getInstance().readNbtFromJson(doorDataReference); } else if (tag.getType("rift_data") == NbtType.COMPOUND) doorData = tag.getCompound("rift_data"); diff --git a/src/main/java/org/dimdev/dimdoors/pockets/virtual/reference/IdReference.java b/src/main/java/org/dimdev/dimdoors/pockets/virtual/reference/IdReference.java index cc192984..3718bfd6 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/virtual/reference/IdReference.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/virtual/reference/IdReference.java @@ -4,7 +4,7 @@ import net.minecraft.nbt.CompoundTag; import com.google.common.base.MoreObjects; import net.minecraft.util.Identifier; -import org.dimdev.dimdoors.pockets.SchematicHandler; +import org.dimdev.dimdoors.pockets.PocketLoader; import org.dimdev.dimdoors.pockets.generator.PocketGenerator; import org.dimdev.dimdoors.pockets.virtual.VirtualSingularPocket; import org.dimdev.dimdoors.util.PocketGenerationParameters; @@ -40,7 +40,7 @@ public class IdReference extends PocketGeneratorReference { @Override public PocketGenerator getReferencedPocketGenerator(PocketGenerationParameters parameters) { - return SchematicHandler.getInstance().getGenerator(id); + return PocketLoader.getInstance().getGenerator(id); } @Override diff --git a/src/main/java/org/dimdev/dimdoors/pockets/virtual/reference/TagReference.java b/src/main/java/org/dimdev/dimdoors/pockets/virtual/reference/TagReference.java index 9a628e64..d894809f 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/virtual/reference/TagReference.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/virtual/reference/TagReference.java @@ -6,7 +6,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.StringTag; import com.google.common.base.MoreObjects; -import org.dimdev.dimdoors.pockets.SchematicHandler; +import org.dimdev.dimdoors.pockets.PocketLoader; import org.dimdev.dimdoors.pockets.generator.PocketGenerator; import org.dimdev.dimdoors.pockets.virtual.VirtualSingularPocket; import org.dimdev.dimdoors.util.PocketGenerationParameters; @@ -87,13 +87,13 @@ public class TagReference extends PocketGeneratorReference{ // TODO: this will break if pockets change in between (which they could if we add a tool for creating pocket json config stuff ingame) @Override public PocketGenerator peekReferencedPocketGenerator(PocketGenerationParameters parameters) { - if (pockets == null) pockets = SchematicHandler.getInstance().getPocketsMatchingTags(required, blackList, exact); + if (pockets == null) pockets = PocketLoader.getInstance().getPocketsMatchingTags(required, blackList, exact); return pockets.peekNextRandomWeighted(parameters); } @Override public PocketGenerator getReferencedPocketGenerator(PocketGenerationParameters parameters) { - if (pockets == null) pockets = SchematicHandler.getInstance().getPocketsMatchingTags(required, blackList, exact); + if (pockets == null) pockets = PocketLoader.getInstance().getPocketsMatchingTags(required, blackList, exact); return pockets.getNextRandomWeighted(parameters); }