This commit is contained in:
dfsek
2021-12-14 11:01:28 -07:00
parent bf5e7f589d
commit 58acca3078
147 changed files with 414 additions and 479 deletions
@@ -42,9 +42,8 @@ import com.dfsek.terra.fabric.util.FabricUtil;
public final class FabricAddon implements BaseAddon {
private static final Version VERSION = Versions.getVersion(1, 0, 0);
private final PlatformImpl terraFabricPlugin;
private static final Logger logger = LoggerFactory.getLogger(FabricAddon.class);
private final PlatformImpl terraFabricPlugin;
private final Map<ConfigPack, Mutable<PreLoadCompatibilityOptions, PostLoadCompatibilityOptions>> templates = new HashMap<>();
public FabricAddon(PlatformImpl terraFabricPlugin) {
@@ -20,11 +20,8 @@ package com.dfsek.terra.fabric;
import ca.solostudios.strata.Versions;
import ca.solostudios.strata.parser.tokenizer.ParseException;
import ca.solostudios.strata.version.Version;
import com.dfsek.tectonic.api.exception.LoadException;
import com.dfsek.tectonic.api.TypeRegistry;
import com.dfsek.terra.api.world.biome.PlatformBiome;
import com.dfsek.tectonic.api.exception.LoadException;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.MinecraftVersion;
import net.minecraft.server.world.ServerWorld;
@@ -46,6 +43,7 @@ import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.handle.ItemHandle;
import com.dfsek.terra.api.handle.WorldHandle;
import com.dfsek.terra.api.util.generic.Lazy;
import com.dfsek.terra.api.world.biome.PlatformBiome;
import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper;
import com.dfsek.terra.fabric.handle.FabricItemHandle;
import com.dfsek.terra.fabric.handle.FabricWorldHandle;
@@ -45,7 +45,7 @@ public class FabricBlockState implements BlockState {
PROPERTY_DELEGATES_T2M = Construct.construct(() -> {
Map<Property<?>, Pair<net.minecraft.state.property.Property<?>, Function<Object, Object>>> map = new HashMap<>();
map.put(Properties.AXIS, Pair.of(net.minecraft.state.property.Properties.AXIS,
a -> FabricAdapter.adapt((net.minecraft.util.math.Direction.Axis) a)));
a -> FabricAdapter.adapt((net.minecraft.util.math.Direction.Axis) a)));
map.put(Properties.NORTH, Pair.of(net.minecraft.state.property.Properties.NORTH, Function.identity()));
map.put(Properties.SOUTH, Pair.of(net.minecraft.state.property.Properties.SOUTH, Function.identity()));
@@ -53,13 +53,13 @@ public class FabricBlockState implements BlockState {
map.put(Properties.WEST, Pair.of(net.minecraft.state.property.Properties.WEST, Function.identity()));
map.put(Properties.NORTH_CONNECTION, Pair.of(net.minecraft.state.property.Properties.NORTH_WIRE_CONNECTION,
c -> FabricAdapter.adapt((WireConnection) c)));
c -> FabricAdapter.adapt((WireConnection) c)));
map.put(Properties.SOUTH_CONNECTION, Pair.of(net.minecraft.state.property.Properties.SOUTH_WIRE_CONNECTION,
c -> FabricAdapter.adapt((WireConnection) c)));
c -> FabricAdapter.adapt((WireConnection) c)));
map.put(Properties.EAST_CONNECTION, Pair.of(net.minecraft.state.property.Properties.EAST_WIRE_CONNECTION,
c -> FabricAdapter.adapt((WireConnection) c)));
c -> FabricAdapter.adapt((WireConnection) c)));
map.put(Properties.WEST_CONNECTION, Pair.of(net.minecraft.state.property.Properties.WEST_WIRE_CONNECTION,
c -> FabricAdapter.adapt((WireConnection) c)));
c -> FabricAdapter.adapt((WireConnection) c)));
map.put(Properties.NORTH_HEIGHT,
@@ -17,18 +17,17 @@
package com.dfsek.terra.fabric.config;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.terra.api.world.biome.Biome;
import net.minecraft.util.Identifier;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.dfsek.terra.api.world.biome.Biome;
@SuppressWarnings("FieldMayBeFinal")
public class PostLoadCompatibilityOptions implements ConfigTemplate {
@@ -17,9 +17,9 @@
package com.dfsek.terra.fabric.config;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import net.minecraft.util.Identifier;
import java.util.HashSet;
@@ -66,8 +66,6 @@ import com.dfsek.terra.fabric.mixin.access.StructureAccessorAccessor;
public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.ChunkGenerator implements GeneratorWrapper {
private static final Logger logger = LoggerFactory.getLogger(FabricChunkGeneratorWrapper.class);
public static final Codec<ConfigPack> PACK_CODEC = RecordCodecBuilder.create(
config -> config.group(
Codec.STRING.fieldOf("pack")
@@ -79,7 +77,7 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C
() -> new IllegalArgumentException(
"No such config pack " +
id)))));
private static final Logger logger = LoggerFactory.getLogger(FabricChunkGeneratorWrapper.class);
public static final Codec<FabricChunkGeneratorWrapper> CODEC = RecordCodecBuilder.create(
instance -> instance.group(
TerraBiomeSource.CODEC.fieldOf("biome_source")
@@ -118,14 +116,6 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C
return new FabricChunkGeneratorWrapper((TerraBiomeSource) this.biomeSource.withSeed(seed), seed, pack);
}
public void setPack(ConfigPack pack) {
this.pack = pack;
this.delegate = pack.getGeneratorProvider().newInstance(pack);
biomeSource.setPack(pack);
logger.debug("Loading world with config pack {}", pack.getID());
}
@Override
public MultiNoiseUtil.MultiNoiseSampler getMultiNoiseSampler() {
return (x, y, z) -> new MultiNoiseUtil.NoiseValuePoint(0, 0, 0, 0, 0, 0);
@@ -236,7 +226,8 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C
public VerticalBlockSample getColumnSample(int x, int z, HeightLimitView view) {
BlockState[] array = new BlockState[view.getHeight()];
for(int y = view.getTopY() - 1; y >= view.getBottomY(); y--) {
array[y - view.getBottomY()] = ((FabricBlockState) ((ServerWorld) world).getGenerator().getBlock((ServerWorld) world, x, y, z)).getHandle();
array[y - view.getBottomY()] = ((FabricBlockState) ((ServerWorld) world).getGenerator().getBlock((ServerWorld) world, x, y,
z)).getHandle();
}
return new VerticalBlockSample(view.getBottomY(), array);
}
@@ -245,6 +236,14 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C
return pack;
}
public void setPack(ConfigPack pack) {
this.pack = pack;
this.delegate = pack.getGeneratorProvider().newInstance(pack);
biomeSource.setPack(pack);
logger.debug("Loading world with config pack {}", pack.getID());
}
@Override
public void carve(ChunkRegion chunkRegion, long seed, BiomeAccess biomeAccess, StructureAccessor structureAccessor, Chunk chunk,
GenerationStep.Carver generationStep) {
@@ -17,8 +17,6 @@
package com.dfsek.terra.fabric.generation;
import com.dfsek.terra.api.world.biome.Biome;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.util.Identifier;
@@ -31,6 +29,7 @@ import java.util.Objects;
import java.util.stream.Collectors;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.fabric.FabricEntryPoint;
import com.dfsek.terra.fabric.util.FabricUtil;
@@ -22,10 +22,8 @@ import net.fabricmc.api.Environment;
import net.minecraft.client.world.GeneratorType;
import net.minecraft.util.registry.DynamicRegistryManager;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.GeneratorOptions;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.fabric.FabricEntryPoint;
@@ -24,14 +24,13 @@ import net.minecraft.block.Blocks;
import net.minecraft.command.argument.BlockArgumentParser;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
import org.jetbrains.annotations.NotNull;
import com.dfsek.terra.api.entity.EntityType;
import com.dfsek.terra.api.handle.WorldHandle;
import com.dfsek.terra.fabric.block.FabricBlockState;
import com.dfsek.terra.fabric.util.FabricAdapter;
import org.jetbrains.annotations.NotNull;
public class FabricWorldHandle implements WorldHandle {
@@ -1,7 +1,5 @@
package com.dfsek.terra.fabric.mixin;
import com.dfsek.terra.fabric.util.FabricUtil;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.feature.ConfiguredStructureFeature;
@@ -14,10 +12,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Set;
import java.util.function.BiConsumer;
import com.dfsek.terra.fabric.util.FabricUtil;
@Mixin(ConfiguredStructureFeatures.class)
public class ConfiguredStructureFeaturesMixin {
@Inject(method = "register(Ljava/util/function/BiConsumer;Lnet/minecraft/world/gen/feature/ConfiguredStructureFeature;Lnet/minecraft/util/registry/RegistryKey;)V", at = @At("HEAD"))
@Inject(method = "register(Ljava/util/function/BiConsumer;Lnet/minecraft/world/gen/feature/ConfiguredStructureFeature;" +
"Lnet/minecraft/util/registry/RegistryKey;)V",
at = @At("HEAD"))
private static void addStructuresToTerraBiomes(BiConsumer<ConfiguredStructureFeature<?, ?>, RegistryKey<Biome>> registrar,
ConfiguredStructureFeature<?, ?> feature,
RegistryKey<Biome> biome,
@@ -27,7 +29,8 @@ public class ConfiguredStructureFeaturesMixin {
}
}
@Inject(method = "register(Ljava/util/function/BiConsumer;Lnet/minecraft/world/gen/feature/ConfiguredStructureFeature;Ljava/util/Set;)V",
@Inject(method = "register(Ljava/util/function/BiConsumer;Lnet/minecraft/world/gen/feature/ConfiguredStructureFeature;Ljava/util/Set;" +
")V",
at = @At("HEAD"))
private static void addStructuresToTerraBiomes(BiConsumer<ConfiguredStructureFeature<?, ?>, RegistryKey<Biome>> registrar,
ConfiguredStructureFeature<?, ?> feature, Set<RegistryKey<Biome>> biomes,
@@ -17,14 +17,10 @@
package com.dfsek.terra.fabric.mixin.access;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.MobSpawnerEntry;
import net.minecraft.world.MobSpawnerLogic;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(MobSpawnerLogic.class)
@@ -17,14 +17,14 @@
package com.dfsek.terra.fabric.mixin.implementations;
import com.dfsek.terra.api.world.biome.PlatformBiome;
import net.minecraft.world.biome.Biome;
import org.spongepowered.asm.mixin.Implements;
import org.spongepowered.asm.mixin.Interface;
import org.spongepowered.asm.mixin.Intrinsic;
import org.spongepowered.asm.mixin.Mixin;
import com.dfsek.terra.api.world.biome.PlatformBiome;
@Mixin(Biome.class)
@Implements(@Interface(iface = PlatformBiome.class, prefix = "terra$", remap = Interface.Remap.NONE))
@@ -62,7 +62,7 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity {
}
public void terra$setDelay(int delay) {
}
public int terra$getMinSpawnDelay() {
@@ -70,7 +70,7 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity {
}
public void terra$setMinSpawnDelay(int delay) {
}
public int terra$getMaxSpawnDelay() {
@@ -78,7 +78,7 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity {
}
public void terra$setMaxSpawnDelay(int delay) {
}
public int terra$getSpawnCount() {
@@ -86,7 +86,7 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity {
}
public void terra$setSpawnCount(int spawnCount) {
}
public int terra$getMaxNearbyEntities() {
@@ -94,7 +94,7 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity {
}
public void terra$setMaxNearbyEntities(int maxNearbyEntities) {
}
public int terra$getRequiredPlayerRange() {
@@ -102,7 +102,7 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity {
}
public void terra$setRequiredPlayerRange(int requiredPlayerRange) {
}
public int terra$getSpawnRange() {
@@ -110,7 +110,7 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity {
}
public void terra$setSpawnRange(int spawnRange) {
}
public void terra$applyState(String state) {
@@ -17,9 +17,6 @@
package com.dfsek.terra.fabric.mixin.implementations.chunk;
import com.dfsek.terra.api.world.ServerWorld;
import com.dfsek.terra.api.world.chunk.Chunk;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.ChunkRegion;
import org.jetbrains.annotations.NotNull;
@@ -30,6 +27,7 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.world.chunk.Chunk;
import com.dfsek.terra.fabric.block.FabricBlockState;
@@ -48,7 +46,8 @@ public abstract class ChunkRegionMixin {
public @NotNull BlockState terraChunk$getBlock(int x, int y, int z) {
return new FabricBlockState(
((ChunkRegion) (Object) this).getBlockState(new BlockPos(x + (centerPos.getPos().x << 4), y, z + (centerPos.getPos().z << 4))));
((ChunkRegion) (Object) this).getBlockState(
new BlockPos(x + (centerPos.getPos().x << 4), y, z + (centerPos.getPos().z << 4))));
}
public int terraChunk$getX() {
@@ -17,9 +17,6 @@
package com.dfsek.terra.fabric.mixin.implementations.chunk;
import com.dfsek.terra.api.world.ServerWorld;
import com.dfsek.terra.api.world.chunk.Chunk;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.chunk.WorldChunk;
import org.jetbrains.annotations.NotNull;
@@ -32,6 +29,8 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.world.ServerWorld;
import com.dfsek.terra.api.world.chunk.Chunk;
import com.dfsek.terra.fabric.block.FabricBlockState;
@@ -54,7 +53,8 @@ public abstract class WorldChunkMixin {
}
public void terra$setBlock(int x, int y, int z, @NotNull BlockState blockState) {
((net.minecraft.world.chunk.Chunk) (Object) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockState) blockState).getHandle(), false);
((net.minecraft.world.chunk.Chunk) (Object) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockState) blockState).getHandle(),
false);
}
public @NotNull BlockState terra$getBlock(int x, int y, int z) {
@@ -37,7 +37,8 @@ public abstract class ProtoChunkMixin {
public abstract net.minecraft.block.BlockState getBlockState(BlockPos pos);
public void terra$setBlock(int x, int y, int z, @NotNull BlockState blockState) {
((net.minecraft.world.chunk.Chunk) (Object) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockState) blockState).getHandle(), false);
((net.minecraft.world.chunk.Chunk) (Object) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockState) blockState).getHandle(),
false);
}
public @NotNull BlockState terra$getBlock(int x, int y, int z) {
@@ -17,9 +17,6 @@
package com.dfsek.terra.fabric.mixin.implementations.world;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.world.chunk.generation.ProtoWorld;
import net.minecraft.block.FluidBlock;
import net.minecraft.fluid.Fluid;
import net.minecraft.util.math.BlockPos;
@@ -44,12 +41,14 @@ import java.util.List;
import com.dfsek.terra.api.block.entity.BlockEntity;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.entity.Entity;
import com.dfsek.terra.api.entity.EntityType;
import com.dfsek.terra.api.util.vector.Vector3;
import com.dfsek.terra.api.world.ServerWorld;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
import com.dfsek.terra.api.world.chunk.generation.ProtoWorld;
import com.dfsek.terra.fabric.block.FabricBlockState;
import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper;
import com.dfsek.terra.fabric.generation.TerraBiomeSource;
@@ -68,17 +67,17 @@ public abstract class ChunkRegionMixin {
@Shadow
@Final
private long seed;
@Shadow
public abstract QueryableTickScheduler<Fluid> getFluidTickScheduler();
@Shadow
@Final
private Chunk centerPos;
@Shadow
public abstract QueryableTickScheduler<Fluid> getFluidTickScheduler();
@Inject(at = @At("RETURN"),
method = "<init>(Lnet/minecraft/server/world/ServerWorld;Ljava/util/List;Lnet/minecraft/world/chunk/ChunkStatus;I)V")
public void injectConstructor(net.minecraft.server.world.ServerWorld world, List<net.minecraft.world.chunk.Chunk> list, ChunkStatus chunkStatus, int i,
public void injectConstructor(net.minecraft.server.world.ServerWorld world, List<net.minecraft.world.chunk.Chunk> list,
ChunkStatus chunkStatus, int i,
CallbackInfo ci) {
this.config = ((ServerWorld) world).getPack();
}
@@ -97,8 +96,9 @@ public abstract class ChunkRegionMixin {
BlockPos pos = new BlockPos(x, y, z);
((ChunkRegion) (Object) this).setBlockState(pos, ((FabricBlockState) data).getHandle(), physics ? 3 : 1042);
if(physics && ((FabricBlockState) data).getHandle().getBlock() instanceof FluidBlock) {
getFluidTickScheduler().scheduleTick(OrderedTick.create(((FluidBlock) ((FabricBlockState) data).getHandle().getBlock()).getFluidState(
((FabricBlockState) data).getHandle()).getFluid(), pos));
getFluidTickScheduler().scheduleTick(
OrderedTick.create(((FluidBlock) ((FabricBlockState) data).getHandle().getBlock()).getFluidState(
((FabricBlockState) data).getHandle()).getFluid(), pos));
}
}
@@ -160,6 +160,7 @@ public abstract class ChunkRegionMixin {
// TODO remove this; we shouldnt need it anymore
/**
* We need regions delegating to the same world
* to have the same hashcode. This
@@ -17,8 +17,6 @@
package com.dfsek.terra.fabric.mixin.implementations.world;
import com.dfsek.terra.api.config.ConfigPack;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.WorldGenerationProgressListener;
import net.minecraft.server.world.ServerChunkManager;
@@ -45,12 +43,13 @@ import java.util.concurrent.Executor;
import com.dfsek.terra.api.block.entity.BlockEntity;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.entity.Entity;
import com.dfsek.terra.api.entity.EntityType;
import com.dfsek.terra.api.util.vector.Vector3;
import com.dfsek.terra.api.world.chunk.Chunk;
import com.dfsek.terra.api.world.ServerWorld;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.Chunk;
import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
import com.dfsek.terra.fabric.block.FabricBlockState;
import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper;
@@ -86,7 +85,8 @@ public abstract class ServerWorldMixin {
}
public Entity terra$spawnEntity(Vector3 location, EntityType entityType) {
net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType<?>) entityType).create(((net.minecraft.server.world.ServerWorld) (Object) this));
net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType<?>) entityType).create(
((net.minecraft.server.world.ServerWorld) (Object) this));
entity.setPos(location.getX(), location.getY(), location.getZ());
((net.minecraft.server.world.ServerWorld) (Object) this).spawnEntity(entity);
return (Entity) entity;
@@ -94,7 +94,8 @@ public abstract class ServerWorldMixin {
public void terra$setBlockData(int x, int y, int z, BlockState data, boolean physics) {
BlockPos pos = new BlockPos(x, y, z);
((net.minecraft.server.world.ServerWorld) (Object) this).setBlockState(pos, ((FabricBlockState) data).getHandle(), physics ? 3 : 1042);
((net.minecraft.server.world.ServerWorld) (Object) this).setBlockState(pos, ((FabricBlockState) data).getHandle(),
physics ? 3 : 1042);
}
@Intrinsic
@@ -103,7 +104,8 @@ public abstract class ServerWorldMixin {
}
public int terra$getMaxHeight() {
return (((net.minecraft.server.world.ServerWorld) (Object) this).getBottomY()) + ((net.minecraft.server.world.ServerWorld) (Object) this).getHeight();
return (((net.minecraft.server.world.ServerWorld) (Object) this).getBottomY()) +
((net.minecraft.server.world.ServerWorld) (Object) this).getHeight();
}
public Chunk terra$getChunkAt(int x, int z) {
@@ -127,7 +129,9 @@ public abstract class ServerWorldMixin {
}
public BiomeProvider terra$getBiomeProvider() {
return ((TerraBiomeSource) ((net.minecraft.server.world.ServerWorld) (Object) this).getChunkManager().getChunkGenerator().getBiomeSource()).getProvider();
return ((TerraBiomeSource) ((net.minecraft.server.world.ServerWorld) (Object) this).getChunkManager()
.getChunkGenerator()
.getBiomeSource()).getProvider();
}
public ConfigPack terra$getPack() {
@@ -78,7 +78,7 @@ public abstract class GeneratorOptionsMixin {
l, false);
prop = prop.substring(prop.indexOf(":") + 1);
String finalProp = prop;
ConfigPack config = main.getConfigRegistry().get(prop).orElseThrow(() -> new IllegalArgumentException(
"No such pack " + finalProp));