refactored SchematicHandler -> PocketLoader

made schematics load directly via resource loader
This commit is contained in:
CreepyCre 2021-02-22 23:08:30 +01:00
parent 55537f1df2
commit 316a306d5b
9 changed files with 45 additions and 43 deletions

View file

@ -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();

View file

@ -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) {

View file

@ -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<Identifier, PocketGenerator> pocketGeneratorMap = new ConcurrentHashMap<>();
private Map<Identifier, VirtualPocket> pocketGroups = new ConcurrentHashMap<>();
private Map<Identifier, PocketTemplate> templates = new ConcurrentHashMap<>();
private SchematicHandler() {
private PocketLoader() {
}
@Override
@ -49,10 +49,12 @@ public class SchematicHandler implements SimpleSynchronousResourceReloadListener
CompletableFuture<Map<Identifier, PocketGenerator>> futurePocketGeneratorMap = loadResourcePathFromJsonToMap(manager, "pockets/generators", this::loadPocketGenerator);
CompletableFuture<Map<Identifier, VirtualPocket>> futurePocketGroups = loadResourcePathFromJsonToMap(manager, "pockets/groups", this::loadPocketGroup);
CompletableFuture<Map<Identifier, PocketTemplate>> 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 <T> CompletableFuture<Map<Identifier, T>> loadResourcePathFromCompressedNbtToMap(ResourceManager manager, String startingPath, String extension, Function<Tag, T> reader) {
int sub = startingPath.endsWith("/") ? 0 : 1;
Collection<Identifier> 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<PocketGenerator, PocketGenerationParameters> getPocketsMatchingTags(List<String> required, List<String> 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;
}

View file

@ -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;
}
}

View file

@ -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<String, Double> 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());

View file

@ -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");

View file

@ -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");

View file

@ -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

View file

@ -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);
}