From 94e32a69215afa49a18fac93223ec8b8f11eded7 Mon Sep 17 00:00:00 2001 From: Forwolk Date: Thu, 2 Aug 2018 13:14:59 +0300 Subject: [PATCH] World info saving --- core/src/main/java/mc/core/Location.java | 4 +- core/src/main/java/mc/core/WarpPosition.java | 14 +++++ core/src/main/java/mc/core/player/Look.java | 4 +- core/src/main/java/mc/core/world/World.java | 14 +++-- .../main/java/mc/world/flat/FlatWorld.java | 6 +- .../world/generated_world/WorldConstants.java | 1 + .../generator/SeedBasedWorldGenerator.java | 2 + .../serialization/WorldReaderWriter.java | 62 +++++++++++++++++++ .../generated_world/world/CubicWorld.java | 21 ++++--- 9 files changed, 112 insertions(+), 16 deletions(-) create mode 100644 core/src/main/java/mc/core/WarpPosition.java create mode 100644 generated_world/src/main/java/mc/world/generated_world/serialization/WorldReaderWriter.java diff --git a/core/src/main/java/mc/core/Location.java b/core/src/main/java/mc/core/Location.java index 78b25c8..7240e7c 100644 --- a/core/src/main/java/mc/core/Location.java +++ b/core/src/main/java/mc/core/Location.java @@ -7,9 +7,11 @@ package mc.core; import lombok.AllArgsConstructor; import lombok.Data; +import java.io.Serializable; + @AllArgsConstructor @Data -public class Location { +public class Location implements Serializable{ private double x, y, z; public static Location copyOf(Location location) { diff --git a/core/src/main/java/mc/core/WarpPosition.java b/core/src/main/java/mc/core/WarpPosition.java new file mode 100644 index 0000000..6e1aacf --- /dev/null +++ b/core/src/main/java/mc/core/WarpPosition.java @@ -0,0 +1,14 @@ +package mc.core; + +import lombok.AllArgsConstructor; +import lombok.Data; +import mc.core.player.Look; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +public class WarpPosition implements Serializable { + private Location location; + private Look look; +} diff --git a/core/src/main/java/mc/core/player/Look.java b/core/src/main/java/mc/core/player/Look.java index 9335111..1c0f7f4 100644 --- a/core/src/main/java/mc/core/player/Look.java +++ b/core/src/main/java/mc/core/player/Look.java @@ -7,9 +7,11 @@ package mc.core.player; import lombok.AllArgsConstructor; import lombok.Data; +import java.io.Serializable; + @Data @AllArgsConstructor -public class Look { +public class Look implements Serializable{ private float yaw, pitch; public void set(Look look) { diff --git a/core/src/main/java/mc/core/world/World.java b/core/src/main/java/mc/core/world/World.java index 86184e4..bc18bf8 100644 --- a/core/src/main/java/mc/core/world/World.java +++ b/core/src/main/java/mc/core/world/World.java @@ -5,6 +5,7 @@ package mc.core.world; import mc.core.Location; +import mc.core.WarpPosition; import mc.core.nbt.Taggable; import java.io.Serializable; @@ -45,14 +46,17 @@ public interface World extends Taggable, Serializable{ UUID getWorldId(); IWorldType getWorldType(); - Location getSpawn(); - void setSpawn(Location location); + WarpPosition getSpawn(); + void setSpawn(WarpPosition location); Chunk getChunk(int x, int y, int z); void setChunk(int x, int y, int z, Chunk chunk); - Region getRegion (int x, int z); - void setRegion (int x, int z, Region region); + Region getRegion(int x, int z); + void setRegion(int x, int z, Region region); - int getSeed (); + int getSeed(); + + String getName(); + void setName(String name); } diff --git a/flat_world/src/main/java/mc/world/flat/FlatWorld.java b/flat_world/src/main/java/mc/world/flat/FlatWorld.java index 0671c31..4f7ef22 100644 --- a/flat_world/src/main/java/mc/world/flat/FlatWorld.java +++ b/flat_world/src/main/java/mc/world/flat/FlatWorld.java @@ -8,6 +8,8 @@ import com.flowpowered.nbt.Tag; import lombok.Getter; import lombok.Setter; import mc.core.Location; +import mc.core.WarpPosition; +import mc.core.player.Look; import mc.core.world.*; import java.util.UUID; @@ -17,10 +19,12 @@ public class FlatWorld implements World { @Getter@Setter private UUID worldId = UUID.fromString("00000000-0000-0000-C000-000000000046"); + @Getter@Setter + private String name; @Getter @Setter - private Location spawn = new Location(0, 6, 0); + private WarpPosition spawn = new WarpPosition(new Location(0, 6, 0), new Look(0, 0)); private Chunk chunk = new SimpleChunk(); @Override diff --git a/generated_world/src/main/java/mc/world/generated_world/WorldConstants.java b/generated_world/src/main/java/mc/world/generated_world/WorldConstants.java index 728a825..a635084 100644 --- a/generated_world/src/main/java/mc/world/generated_world/WorldConstants.java +++ b/generated_world/src/main/java/mc/world/generated_world/WorldConstants.java @@ -6,6 +6,7 @@ public final class WorldConstants { public static final String CHUNK_FILE_NAME_TEMPLATE = "chunk_{0}_{1}_{2}.dat"; public static final String BIOME_FILE_NAME_TEMPLATE = "biomes.dat"; + public static final String WORLD_INFO_FILE_NAME_TEMPLATE = "world.dat"; public static final String REGION_FILE_NAME_TEMPLATE = "r.{0}.{1}"; public static final int WORLD_MIN_HEIGHT = 36; diff --git a/generated_world/src/main/java/mc/world/generated_world/generator/SeedBasedWorldGenerator.java b/generated_world/src/main/java/mc/world/generated_world/generator/SeedBasedWorldGenerator.java index edcbe21..78f2d67 100644 --- a/generated_world/src/main/java/mc/world/generated_world/generator/SeedBasedWorldGenerator.java +++ b/generated_world/src/main/java/mc/world/generated_world/generator/SeedBasedWorldGenerator.java @@ -8,6 +8,7 @@ import mc.core.world.*; import mc.world.generated_world.region.RegionImpl; import mc.world.generated_world.serialization.ChunkSerializer; import mc.world.generated_world.serialization.RegionReaderWriter; +import mc.world.generated_world.serialization.WorldReaderWriter; import mc.world.generated_world.world.CubicWorld; import mc.world.generated_world.world.Temperature; import mc.world.generated_world.world.Wetness; @@ -27,6 +28,7 @@ public class SeedBasedWorldGenerator implements WorldGenerator { World world = new CubicWorld(UUID.fromString("00000000-0000-0000-C000-000000000046"), 2626949); Region region = worldGenerator.generateRegion(0, 0, world); region.save(new ChunkSerializer(), new RegionReaderWriter(new File("worlds", world.getWorldId().toString()))); + new WorldReaderWriter(new File("worlds")).writeWorldInfo(world); /*worldGenerator.generateRegion(1, 0, world); worldGenerator.generateRegion(-1, 0, world); worldGenerator.generateRegion(0, 1, world); diff --git a/generated_world/src/main/java/mc/world/generated_world/serialization/WorldReaderWriter.java b/generated_world/src/main/java/mc/world/generated_world/serialization/WorldReaderWriter.java new file mode 100644 index 0000000..485c98f --- /dev/null +++ b/generated_world/src/main/java/mc/world/generated_world/serialization/WorldReaderWriter.java @@ -0,0 +1,62 @@ +package mc.world.generated_world.serialization; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import mc.core.WarpPosition; +import mc.core.world.World; +import mc.world.generated_world.world.CubicWorld; + +import java.io.*; +import java.util.UUID; + +import static mc.world.generated_world.WorldConstants.WORLD_INFO_FILE_NAME_TEMPLATE; + +@Slf4j +public class WorldReaderWriter { + private final File worldsFolder; + + public WorldReaderWriter(File worldsFolder) { + this.worldsFolder = worldsFolder; + } + + public World readWorld (UUID uuid) throws IOException { + World world = null; + File worldFolder = new File(worldsFolder, uuid.toString()); + if (!worldFolder.exists()) { + throw new FileNotFoundException("World folder is not exist"); + } + File worldInfoFile = new File(worldFolder, WORLD_INFO_FILE_NAME_TEMPLATE); + WorldInfo worldInfo; + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(worldInfoFile))) { + worldInfo = (WorldInfo) ois.readObject(); + } catch (ClassNotFoundException e) { + log.error("Error occurred while reading world info file", e); + return null; + } + world = new CubicWorld(uuid, worldInfo.getSeed()); + world.setSpawn(worldInfo.getSpawn()); + world.setName(worldInfo.getName()); + return world; + } + + public void writeWorldInfo (World world) throws IOException { + File worldFolder = new File(worldsFolder, world.getWorldId().toString()); + worldFolder.mkdirs(); + File worldInfoFile = new File(worldFolder, WORLD_INFO_FILE_NAME_TEMPLATE); + WorldInfo worldInfo = new WorldInfo(); + worldInfo.setName(world.getName()); + worldInfo.setSeed(world.getSeed()); + worldInfo.setSpawn(world.getSpawn()); + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(worldInfoFile))) { + oos.writeObject(worldInfo); + oos.flush(); + } + } + + @Data + public static class WorldInfo implements Serializable { + private WarpPosition spawn; + private String name; + private int seed; + } +} diff --git a/generated_world/src/main/java/mc/world/generated_world/world/CubicWorld.java b/generated_world/src/main/java/mc/world/generated_world/world/CubicWorld.java index 8442528..b419717 100644 --- a/generated_world/src/main/java/mc/world/generated_world/world/CubicWorld.java +++ b/generated_world/src/main/java/mc/world/generated_world/world/CubicWorld.java @@ -2,7 +2,10 @@ package mc.world.generated_world.world; import com.flowpowered.nbt.Tag; import lombok.Getter; +import lombok.Setter; import mc.core.Location; +import mc.core.WarpPosition; +import mc.core.player.Look; import mc.core.world.*; import mc.world.generated_world.chunk.InMemoryCacheChunkLoader; @@ -15,10 +18,12 @@ public class CubicWorld implements World { @Getter private final UUID worldId; private final int seed; - private volatile Location spawnLocation; + private volatile WarpPosition warpPosition; private final transient Object spawnLocationLock = new Object(); private final transient ChunkLoader chunkLoader; private final Map> nbtTagMap = new HashMap<>(); + @Getter@Setter + private String name; public CubicWorld(UUID worldId, int seed) { this.worldId = worldId; @@ -50,21 +55,21 @@ public class CubicWorld implements World { } @Override - public Location getSpawn() { - if (spawnLocation == null) { + public WarpPosition getSpawn() { + if (warpPosition == null) { synchronized (spawnLocationLock) { - if (spawnLocation == null) { - spawnLocation = Location.startPointLocation(); + if (warpPosition == null) { + warpPosition = new WarpPosition(Location.startPointLocation(), new Look(0,0)); } } } - return spawnLocation; + return warpPosition; } @Override - public void setSpawn(Location location) { + public void setSpawn(WarpPosition warpPosition) { synchronized (spawnLocationLock) { - this.spawnLocation = location; + this.warpPosition = warpPosition; } }