From e77609c5bc8b44aa22ef88063246fd05add5e705 Mon Sep 17 00:00:00 2001 From: ubq323 Date: Fri, 24 Mar 2023 21:11:10 +0000 Subject: use lmdb for world storage; plus other small things support numpad 8456 for movement in addition to wasd refactor server and add player module update outdated documentation slightly --- server/chunk.lua | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) (limited to 'server/chunk.lua') diff --git a/server/chunk.lua b/server/chunk.lua index 8e71327..852f1fe 100644 --- a/server/chunk.lua +++ b/server/chunk.lua @@ -1,6 +1,7 @@ local class = require"common.class" local Chunk = require"common.chunk".Chunk local json = require"common.dkjson" +local db = require'db' local ChunkS = class.extend(Chunk) function ChunkS.make(cls,...) @@ -8,31 +9,41 @@ function ChunkS.make(cls,...) self.dirty = false return self end -function ChunkS.load_from_disk(cls,cp) - -- returns nil if not there - local filename = cp:filename() - local f = io.open(filename,"r") - if not f then return nil end - local j = json.decode(f:read("a")) - self = cls:from_packet_data(j) + +function ChunkS.apply_migrations(self) + -- if tile format has changed and format in db isn't up to date any more + -- then perform updates here for i,t in ipairs(self.tiles) do if t == false then self.tiles[i] = 0 elseif t == true then self.tiles[i] = 9 end end - f:close() +end + +function ChunkS.load_from_disk(cls,cp) + -- tries to load from database. returns nil if not there. + local txn,dbi = db.get_db('chunks') + local d = dbi[tostring(cp)] + txn:commit() + + if not d then return nil end + local j = json.decode(d) + + local self = cls:from_packet_data(j) + self:apply_migrations() + return self end + function ChunkS.save_if_dirty(self) if self.dirty then print("saving chunk",self.cp) - local filename = self.cp:filename() - local f = io.open(filename,"w") - f:write(self:data_packet()) - f:flush() - f:close() + local txn,dbi = db.get_db('chunks',true) + dbi[tostring(self.cp)] = self:data_packet() + txn:commit() self.dirty = false end end + function ChunkS.set_at(self,...) Chunk.set_at(self,...) self.dirty = true -- cgit v1.2.3