From 81ee73e37348eaae6b1e4a23378d13d129133904 Mon Sep 17 00:00:00 2001 From: ubq323 Date: Sat, 11 Feb 2023 00:31:54 +0000 Subject: rework of tick interval, refactor of chunk loading/generation into ChunkS class --- client/main.lua | 2 +- common/chunk.lua | 9 ++++----- server/chunk.lua | 36 ++++++++++++++++++++++++++++++++++++ server/map.lua | 34 +++++++++++++--------------------- server/server.lua | 28 +++++----------------------- server/worldgen.lua | 3 ++- 6 files changed, 61 insertions(+), 51 deletions(-) create mode 100644 server/chunk.lua diff --git a/client/main.lua b/client/main.lua index 43705fe..a544250 100644 --- a/client/main.lua +++ b/client/main.lua @@ -151,7 +151,7 @@ function love.update(dt) local pl = j.pl local_player = {pos=coords.Pos:make(pl.x,pl.y),color=pl.color,id=pl.id} elseif op == "chunk" then - local ch = Chunk.from_packet_data(j) + local ch = Chunk:from_packet_data(j) map:add_chunk(ch) elseif op == "settile" then local h = coords.Hex:make(j.q,j.r) diff --git a/common/chunk.lua b/common/chunk.lua index 790e5a4..39fcaaf 100644 --- a/common/chunk.lua +++ b/common/chunk.lua @@ -20,27 +20,26 @@ function Chunk.make(cls,cp,tiles) return setmetatable({cp=cp,tiles=tiles},cls) end function Chunk.at(self,hoffs) + -- errors if invalid offset return self:_atqr(hoffs.q,hoffs.r) end function Chunk._atqr(self,q,r) - if not index_ok(q,r) then return nil end return self.tiles[index(q,r)] end function Chunk.set_at(self,hoffs,tile) - if not index_ok(hoffs.q,hoffs.r) then return end + -- errors if invalid offset self.tiles[index(hoffs.q,hoffs.r)] = tile end function Chunk.data_packet(self) return json.encode{t="chunk",tiles=self.tiles,u=self.cp.u,v=self.cp.v} end -function Chunk.from_packet_data(packet) +function Chunk.from_packet_data(cls,packet) -- assuming packet has already been json.decoded -- since otherwise how would we know it's a chunk packet local cp = coords.ChunkPos:make(packet.u,packet.v) - print("making from packet",packet.u,packet.v) - return Chunk:make(cp,packet.tiles) + return cls:make(cp,packet.tiles) end return { diff --git a/server/chunk.lua b/server/chunk.lua new file mode 100644 index 0000000..4fb2960 --- /dev/null +++ b/server/chunk.lua @@ -0,0 +1,36 @@ +local class = require"common.class" +local Chunk = require"common.chunk".Chunk +local json = require"common.dkjson" + +local ChunkS = class.extend(Chunk) +function ChunkS.make(cls,...) + local self = Chunk.make(cls,...) + self.dirty = true + 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) + f:close() + 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() + end +end +function ChunkS.set_at(self,...) + Chunk.set_at(self,...) + self.dirty = true +end + +return {ChunkS=ChunkS} diff --git a/server/map.lua b/server/map.lua index 0bb09c7..9627de9 100644 --- a/server/map.lua +++ b/server/map.lua @@ -2,7 +2,7 @@ local Map = require"common.map".Map local class = require"common.class" local worldgen = require"worldgen" local json = require"common.dkjson" -local Chunk = require"common.chunk".Chunk +local ChunkS = require"chunk".ChunkS local MapS = class.extend(Map) function MapS.obtain(self,cp) @@ -12,36 +12,28 @@ function MapS.obtain(self,cp) -- otherwise, generate a new chunk, load it, then return it. -- false is not used on serverside. yet. + -- local ch = self:chunk(cp) - if ch then return ch end - - local f = io.open(cp:filename(),"r") - if f then - print("loading from file",cp) - local j = json.decode(f:read("a")) - print(j) - for k in pairs(j) do print(k) end - ch = Chunk.from_packet_data(j) - f:close() + if ch then + return ch else - ch = worldgen.gen_chunk(cp) - end + ch = ChunkS:load_from_disk(cp) + if not ch then + ch = worldgen.gen_chunk(cp) + end - - print(ch.cp.u,ch.cp.v) - self:add_chunk(ch) - return ch + self:add_chunk(ch) + return ch + end + end function MapS.save_chunk(self,cp) -- any attempt to save not-loaded chunks is silently ignored local ch = self:chunk(cp) if not ch then return end - local f = io.open(cp:filename(),"w") - f:write(ch:data_packet()) - f:flush() - f:close() + ch:save_if_dirty() end function MapS.save_and_unload(self,cp) self:save_chunk(cp) diff --git a/server/server.lua b/server/server.lua index e9eef30..cc9903e 100644 --- a/server/server.lua +++ b/server/server.lua @@ -1,7 +1,6 @@ local enet = require"enet" local json = require"common.dkjson" local chunk = require"common.chunk" -local Chunk = require"common.chunk".Chunk local noise = require"noise" local coords = require"common.coords" local worldgen = require"worldgen" @@ -170,30 +169,13 @@ end while true do local now = timenow() local dt = now - last_tick_time - - if dt >= tick_interval then - dts[ndt] = dt - ndt = 1+(ndt%ndts) + local time_till_next_tick = (last_tick_time+tick_interval)-now + if time_till_next_tick > 0.001 then + local ev = host:service(time_till_next_tick*1000) + if ev then handle_ev(ev) end + else last_tick_time = now ntick = ntick + 1 - tick(ntick) - - local tps = 0 - for _,d in ipairs(dts) do tps = tps + 1/d end - tps = tps/#dts - - - print(ndt,ndts) - if 1 == ndt%ndts then - print("tps",tps) - end - end - - local now2 = timenow() - local time_till_next_tick = (last_tick_time+tick_interval)-now2 - if time_till_next_tick > 0 then - local ev = host:service(time_till_next_tick/1000) - if ev then handle_ev(ev) end end end diff --git a/server/worldgen.lua b/server/worldgen.lua index 5d496a0..2ef1ac0 100644 --- a/server/worldgen.lua +++ b/server/worldgen.lua @@ -1,6 +1,7 @@ local coords = require"common.coords" local noise = require"noise" local chunk = require"common.chunk" +local ChunkS = require"chunk".ChunkS local CHUNK_SIZE = require"common.constants".CHUNK_SIZE local function p(amp,scale) return {scale=scale,amp=amp,gen=noise.PerlinNoise:make()} end @@ -39,7 +40,7 @@ local function gen_chunk(chpos) end end - local the_chunk = chunk.Chunk:make(chpos,tiles) + local the_chunk = ChunkS:make(chpos,tiles) return the_chunk end -- cgit v1.2.3