修复了一些bug
This commit is contained in:
@@ -29,16 +29,17 @@ import (
|
||||
|
||||
// serverApp 服务器应用:世界 + 网络 + 定时存档 + Mod。
|
||||
type serverApp struct {
|
||||
cfg *config.ServerConfig
|
||||
log *logx.Logger
|
||||
reg *block.Registry
|
||||
world *world.World
|
||||
net *netserver.Server
|
||||
hub *mpsync.Hub
|
||||
modReg *mods.Registry
|
||||
luaMods []*mods.LuaMod
|
||||
seed int64
|
||||
tickCnt uint64
|
||||
cfg *config.ServerConfig
|
||||
log *logx.Logger
|
||||
reg *block.Registry
|
||||
world *world.World
|
||||
net *netserver.Server
|
||||
hub *mpsync.Hub
|
||||
modReg *mods.Registry
|
||||
luaMods []*mods.LuaMod
|
||||
seed int64
|
||||
tickCnt uint64
|
||||
savePool *save.SavePool
|
||||
}
|
||||
|
||||
// ---- netserver.Handler 实现(多人同步.md §2 权威链路入口)----
|
||||
@@ -76,15 +77,24 @@ func (s *serverApp) Tick(dt float64) {
|
||||
s.tickCnt++
|
||||
// 区块调度(以出生点为中心;后续按玩家位置)
|
||||
s.world.Update(8, 64, 8, 8*time.Millisecond)
|
||||
regionDir := paths.Join("worlds", s.cfg.World.Name, "region")
|
||||
for _, c := range s.world.DrainUnloaded() {
|
||||
if c.SaveDirty.Load() && s.savePool != nil {
|
||||
s.savePool.Enqueue(save.ChunkJob{RegionDir: regionDir, CX: c.CX, CZ: c.CZ, Data: save.EncodeChunk(c)})
|
||||
c.SaveDirty.Store(false)
|
||||
}
|
||||
}
|
||||
// Mod 事件:每秒派发 on_tick(Mod开发指南.md §4.3)
|
||||
if s.tickCnt%20 == 0 {
|
||||
for _, m := range s.luaMods {
|
||||
_ = m.DispatchEvent("tick")
|
||||
}
|
||||
}
|
||||
// 定时存档:30s(存档与持久化.md §2)
|
||||
// 定时存档:30s 入队(存档与持久化.md §4:tick 内不 fsync)
|
||||
if s.tickCnt%(20*30) == 0 {
|
||||
if err := save.SaveWorld(s.world, paths.Join("worlds"), s.cfg.World.Name, s.seed, int64(s.tickCnt)); err != nil {
|
||||
if err := save.EnqueueDirty(s.world, s.savePool, regionDir); err != nil {
|
||||
s.log.Errorf("定时存档失败: %v", err)
|
||||
} else if err := save.WriteLevel(paths.Join("worlds"), s.cfg.World.Name, save.LevelData{Version: 1, Seed: s.seed, Time: int64(s.tickCnt)}); err != nil {
|
||||
s.log.Errorf("定时存档失败: %v", err)
|
||||
} else {
|
||||
s.log.Infof("已存档(tick %d)", s.tickCnt)
|
||||
@@ -135,7 +145,8 @@ func main() {
|
||||
log.Infof("新建世界 %q", cfg.World.Name)
|
||||
}
|
||||
|
||||
app := &serverApp{cfg: cfg, log: log, reg: reg, world: w, seed: seed}
|
||||
pool := save.NewSavePool(log)
|
||||
app := &serverApp{cfg: cfg, log: log, reg: reg, world: w, seed: seed, savePool: pool}
|
||||
app.hub = mpsync.NewHub(w, cfg.Server.ViewDistance)
|
||||
|
||||
// Mod 加载(设计.md §3.3:扫描 mods/,type=mod 且有入口脚本的执行;热更新.md 由注册表支持)
|
||||
@@ -172,10 +183,14 @@ func main() {
|
||||
|
||||
engine.Run(ctx, app, engine.NoopRenderer{})
|
||||
|
||||
// 关服前全量存档(存档与持久化.md §2 关服 flush)
|
||||
if err := save.SaveWorld(w, paths.Join("worlds"), cfg.World.Name, seed, int64(app.tickCnt)); err != nil {
|
||||
// 关服前全量存档 + drain 保存池(存档与持久化.md §4)
|
||||
if err := save.EnqueueDirty(w, pool, paths.Join("worlds", cfg.World.Name, "region")); err != nil {
|
||||
log.Errorf("关服存档失败: %v", err)
|
||||
}
|
||||
if err := save.WriteLevel(paths.Join("worlds"), cfg.World.Name, save.LevelData{Version: 1, Seed: seed, Time: int64(app.tickCnt)}); err != nil {
|
||||
log.Errorf("关服存档失败: %v", err)
|
||||
}
|
||||
pool.Close()
|
||||
log.Infof("服务器已退出")
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user