amidstest/src/test/java/amidst/mojangapi/mocking/FakeWorldBuilder.java

79 lines
3.2 KiB
Java

package amidst.mojangapi.mocking;
import java.util.Map;
import java.util.function.Consumer;
import amidst.documentation.ThreadSafe;
import amidst.mojangapi.minecraftinterface.MinecraftInterface;
import amidst.mojangapi.minecraftinterface.MinecraftInterfaceException;
import amidst.mojangapi.world.World;
import amidst.mojangapi.world.WorldBuilder;
import amidst.mojangapi.world.WorldSeed;
import amidst.mojangapi.world.testworld.TestWorldDeclaration;
import amidst.mojangapi.world.testworld.TestWorldEntryNames;
import amidst.mojangapi.world.testworld.file.TestWorldDirectory;
import amidst.mojangapi.world.testworld.file.TestWorldDirectoryDeclaration;
import amidst.mojangapi.world.testworld.storage.json.BiomeDataJson;
import amidst.mojangapi.world.testworld.storage.json.WorldMetadataJson;
@ThreadSafe
public class FakeWorldBuilder {
public static FakeWorldBuilder create(TestWorldDirectoryDeclaration directoryDeclaration) {
return new FakeWorldBuilder(WorldBuilder.createSilentPlayerless(), directoryDeclaration);
}
private static final Consumer<World> NOOP = disposedWorld -> {
};
private final WorldBuilder builder;
private final TestWorldDirectoryDeclaration directoryDeclaration;
public FakeWorldBuilder(WorldBuilder builder, TestWorldDirectoryDeclaration directoryDeclaration) {
this.builder = builder;
this.directoryDeclaration = directoryDeclaration;
}
public World createRealWorld(TestWorldDeclaration worldDeclaration, MinecraftInterface realMinecraftInterface)
throws MinecraftInterfaceException {
return builder.fromSeed(
realMinecraftInterface,
NOOP,
worldDeclaration.getWorldSeed(),
worldDeclaration.getWorldType());
}
public World createFakeWorld(TestWorldDirectory worldDeclaration) throws MinecraftInterfaceException {
Map<String, Object> data = worldDeclaration.getData();
// @formatter:off
WorldMetadataJson worldMetadata = get(TestWorldEntryNames.METADATA, WorldMetadataJson.class, data);
BiomeDataJson quarterBiomeData = get(TestWorldEntryNames.QUARTER_RESOLUTION_BIOME_DATA, BiomeDataJson.class, data);
BiomeDataJson fullBiomeData = get(TestWorldEntryNames.FULL_RESOLUTION_BIOME_DATA, BiomeDataJson.class, data);
// @formatter:on
return createFakeWorld(worldMetadata, quarterBiomeData, fullBiomeData);
}
private <T> T get(String name, Class<T> clazz, Map<String, Object> data) {
return directoryDeclaration.getEntryDeclaration(name, clazz).extractFromDataMap(data);
}
private World createFakeWorld(
WorldMetadataJson worldMetadata,
BiomeDataJson quarterBiomeData,
BiomeDataJson fullBiomeData) throws MinecraftInterfaceException {
FakeMinecraftInterface fakeMinecraftInterface = createFakeMinecraftInterface(worldMetadata, quarterBiomeData, fullBiomeData);
return builder.fromSeed(
fakeMinecraftInterface,
NOOP,
WorldSeed.fromUserInput(worldMetadata.getSeed() + "", fakeMinecraftInterface.getGameEngineType()),
worldMetadata.getWorldType());
}
private static FakeMinecraftInterface createFakeMinecraftInterface(
WorldMetadataJson worldMetadataJson,
BiomeDataJson quarterBiomeData,
BiomeDataJson fullBiomeData) {
return new FakeMinecraftInterface(worldMetadataJson, quarterBiomeData, fullBiomeData);
}
}