From 40aab303a2fc2af0e882967107639d73dbe28497 Mon Sep 17 00:00:00 2001 From: Romain Beaumont Date: Thu, 14 Jan 2016 19:18:01 +0100 Subject: [PATCH] use new prismarine-provider-anvil to read/write the seed, use a worldFolder option instead of regionFolder option, fix #178 --- config/default-settings.json | 2 +- doc/API.md | 2 +- package.json | 2 ++ src/lib/plugins/world.js | 23 +++++++++++++++++++++-- world/{region => }/.gitkeep | 0 5 files changed, 25 insertions(+), 4 deletions(-) rename world/{region => }/.gitkeep (100%) diff --git a/config/default-settings.json b/config/default-settings.json index aa914b1..5e42010 100644 --- a/config/default-settings.json +++ b/config/default-settings.json @@ -5,7 +5,7 @@ "online-mode": true, "logging": true, "gameMode": 1, - "regionFolder":"world/region", + "worldFolder":"world", "generation": { "name": "diamond_square", "options":{ diff --git a/doc/API.md b/doc/API.md index afc49f3..268805c 100644 --- a/doc/API.md +++ b/doc/API.md @@ -226,7 +226,7 @@ Options is an object containing the following properties: } ``` * modpe: defaults to false, wether or not modpe should be enabled. -* regionFolder : the region folder of the saved world +* worldFolder : the world folder of the saved world (containing region, level.dat,...) * plugins * view-distance * player-list-text : an object with keys header and footer, displayed on the player list diff --git a/package.json b/package.json index d5715b7..1aed17b 100644 --- a/package.json +++ b/package.json @@ -31,11 +31,13 @@ "mkdirp": "0.5.1", "moment": "^2.10.6", "node-dir": "~0.1.9", + "node-promise-es6": "^0.3.0", "node-uuid": "^1.4.3", "prismarine-block": "0.1.0", "prismarine-chunk": "0.2.1", "prismarine-entity": "0.2.0", "prismarine-item": "0.0.0", + "prismarine-provider-anvil": "^0.2.0", "prismarine-windows": "0.0.0", "prismarine-world": "0.4.0", "prismarine-world-sync": "0.1.0", diff --git a/src/lib/plugins/world.js b/src/lib/plugins/world.js index 5360c3b..3f3b45f 100644 --- a/src/lib/plugins/world.js +++ b/src/lib/plugins/world.js @@ -4,9 +4,28 @@ const World = require('prismarine-world'); const WorldSync = require("prismarine-world-sync"); const generations=require("flying-squid").generations; +import {fs} from 'node-promise-es6'; +import {level} from 'prismarine-provider-anvil'; -module.exports.server=function(serv,{regionFolder,generation={"name":"diamond_square","options":{"worldHeight":80}}}={}) { - generation.options.seed=generation.options.seed || Math.random()*Math.pow(2, 32); +module.exports.server=async function(serv,{worldFolder,generation={"name":"diamond_square","options":{"worldHeight":80}}}={}) { + const regionFolder=worldFolder+"/region"; + try { + const stats = await fs.stat(regionFolder); + } + catch(err) { + await fs.mkdir(regionFolder); + } + + let seed; + try { + const levelData=await level.readLevel(worldFolder+"/level.dat"); + seed=levelData["RandomSeed"][0]; + } + catch(err){ + seed=generation.options.seed || Math.floor(Math.random()*Math.pow(2, 31)); + await level.writeLevel(worldFolder+"/level.dat",{"RandomSeed":[seed,0]}); + } + generation.options.seed=seed; serv.emit("seed",generation.options.seed); serv.overworld = new World(generations[generation.name](generation.options), regionFolder); serv.netherworld = new World(generations["nether"]({})); diff --git a/world/region/.gitkeep b/world/.gitkeep similarity index 100% rename from world/region/.gitkeep rename to world/.gitkeep