Files
factorio-clusterio/lib/chunkStore.js
T

93 lines
2.7 KiB
JavaScript

var mkdirp = require("mkdirp-promise");
var mkdirpSync = require("mkdirp").sync;
var fs = require("fs");
var objectOps = require("./objectOps");
let allowLogging = false;
let log = string => (allowLogging)? console.log(string):""
module.exports = class chunkStore {
constructor(name, chunkSize = 32, path = "./chunkStore/"){
this.name = name;
this.chunkSize = chunkSize;
this.path = (path[path.length] == "/") ? path : path+"/";
mkdirpSync(path+name);
}
setEntity(x, y, newEntity){
return new Promise((resolve, reject) => {
var localX = Math.round(x % this.chunkSize);
x = Math.floor(Math.round(x)/this.chunkSize);
var localY = Math.round(y % this.chunkSize);
y = Math.floor(Math.round(y)/this.chunkSize);
this.getChunk(x,y).then(chunk => {
log("Setentity")
if(!chunk.dataObject[localX]) chunk.dataObject[localX] = {};
if(!chunk.dataObject[localX][localY]) chunk.dataObject[localX][localY] = {};
let entity = chunk.dataObject[localX][localY]
if(newEntity && typeof newEntity == "object"){
log("Overwriting with new entity");
entity.name = newEntity.name;
} else {
log("Deleting entry at "+localX+", "+localY);
chunk.dataObject[localX][localY] = undefined;
}
this.setChunk(x, y, chunk).then(()=>{
log("Successfully saved chunk!");
this.getChunk(x,y).then(chunk => resolve(chunk));
});
});
});
}
setChunk(x, y, chunk){
return new Promise((resolve, reject) => {
mkdirp(this.path+this.name+"/"+x).then(() => {
fs.writeFile(this.path+this.name+"/"+x+"/"+y, JSON.stringify(chunk), function(){
resolve();
});
});
});
}
getChunk(x, y){
return new Promise((resolve, reject) => {
// make new chunk in case we can't find an existing one
let chunk = {
dataObject: {},
position:{x,y}, // fancy ES6 feature that generates to {x:x, y:y}
chunkSize:this.chunkSize,
get: function(x, y){
if(this.dataObject[Math.round(x)] && this.dataObject[Math.round(x)][Math.round(y)]){
return this.dataObject[Math.round(x)][Math.round(y)];
} else {
return undefined;
}
},
};
fs.readFile(this.path+this.name+"/"+x+"/"+y, (err, chunkFile) => {
if(err){
log(err)
resolve(chunk);
} else {
if(objectOps.isJSON(chunkFile)) {
log("returned from file")
let chunk = JSON.parse(chunkFile);
chunk.get = function(x, y){
if(this.dataObject[Math.round(x)] && this.dataObject[Math.round(x)][Math.round(y)]){
return this.dataObject[Math.round(x)][Math.round(y)];
} else {
return undefined;
}
}
resolve(chunk);
} else {
log("file failed")
resolve(chunk);
}
}
}); // add x and y values as well and we are done?
});
}
}