fix(crash): 修复双击闪退——路径基于可执行文件目录解析、崩溃兜底日志、资源入 bin 与安装包
This commit is contained in:
@@ -14,12 +14,14 @@ import (
|
||||
"mc/internal/assets"
|
||||
"mc/internal/block"
|
||||
"mc/internal/config"
|
||||
"mc/internal/crash"
|
||||
"mc/internal/engine"
|
||||
"mc/internal/logx"
|
||||
"mc/internal/mods"
|
||||
"mc/internal/mpsync"
|
||||
"mc/internal/netproto"
|
||||
"mc/internal/netserver"
|
||||
"mc/internal/paths"
|
||||
"mc/internal/save"
|
||||
"mc/internal/world"
|
||||
"mc/internal/worldgen"
|
||||
@@ -82,7 +84,7 @@ func (s *serverApp) Tick(dt float64) {
|
||||
}
|
||||
// 定时存档:30s(存档与持久化.md §2)
|
||||
if s.tickCnt%(20*30) == 0 {
|
||||
if err := save.SaveWorld(s.world, "worlds", s.cfg.World.Name, s.seed, int64(s.tickCnt)); err != nil {
|
||||
if err := save.SaveWorld(s.world, paths.Join("worlds"), s.cfg.World.Name, s.seed, int64(s.tickCnt)); err != nil {
|
||||
s.log.Errorf("定时存档失败: %v", err)
|
||||
} else {
|
||||
s.log.Infof("已存档(tick %d)", s.tickCnt)
|
||||
@@ -91,20 +93,21 @@ func (s *serverApp) Tick(dt float64) {
|
||||
}
|
||||
|
||||
func main() {
|
||||
defer crash.Guard(paths.Join("logs", "crash.log")) // 崩溃兜底:闪退可诊断
|
||||
flag.Parse()
|
||||
|
||||
log, err := logx.New("logs/server.log", logx.LevelInfo)
|
||||
log, err := logx.New(paths.Join("logs", "server.log"), logx.LevelInfo)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
cfg, err := config.Load("config/server.yaml", config.DefaultServer())
|
||||
cfg, err := config.Load(paths.Join("config", "server.yaml"), config.DefaultServer())
|
||||
if err != nil {
|
||||
log.Warnf("配置加载失败,使用默认值:%v", err)
|
||||
}
|
||||
log.Infof("年糕历险记 服务器启动:端口 %d,世界 %q,种子 %d,tick 率 %d", cfg.Server.Port, cfg.World.Name, cfg.World.Seed, cfg.Server.TickRate)
|
||||
|
||||
// 注册表与生成器
|
||||
reg, err := block.Load("assets/config/blocks.json")
|
||||
reg, err := block.Load(paths.Join("assets", "config", "blocks.json"))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
@@ -120,8 +123,8 @@ func main() {
|
||||
|
||||
// 载入已有存档(diff-only:生成器重建 + 已保存区块覆盖,存档与持久化.md §3)
|
||||
seed := cfg.World.Seed
|
||||
if _, err := os.Stat("worlds/" + cfg.World.Name + "/level.dat"); err == nil {
|
||||
if got, err := save.LoadWorld(w, "worlds", cfg.World.Name); err != nil {
|
||||
if _, err := os.Stat(paths.Join("worlds", cfg.World.Name, "level.dat")); err == nil {
|
||||
if got, err := save.LoadWorld(w, paths.Join("worlds"), cfg.World.Name); err != nil {
|
||||
log.Errorf("存档载入失败: %v", err)
|
||||
} else if got != 0 {
|
||||
seed = got
|
||||
@@ -136,7 +139,7 @@ func main() {
|
||||
|
||||
// Mod 加载(设计.md §3.3:扫描 mods/,type=mod 且有入口脚本的执行;热更新.md 由注册表支持)
|
||||
am := assets.New()
|
||||
if err := am.Load("assets", "mods", "resourcepacks"); err != nil {
|
||||
if err := am.Load(paths.Join("assets"), paths.Join("mods"), paths.Join("resourcepacks")); err != nil {
|
||||
log.Warnf("内容包扫描失败: %v", err)
|
||||
}
|
||||
app.modReg = mods.NewRegistry()
|
||||
@@ -169,7 +172,7 @@ func main() {
|
||||
engine.Run(ctx, app, engine.NoopRenderer{})
|
||||
|
||||
// 关服前全量存档(存档与持久化.md §2 关服 flush)
|
||||
if err := save.SaveWorld(w, "worlds", cfg.World.Name, seed, int64(app.tickCnt)); err != nil {
|
||||
if err := save.SaveWorld(w, paths.Join("worlds"), cfg.World.Name, seed, int64(app.tickCnt)); err != nil {
|
||||
log.Errorf("关服存档失败: %v", err)
|
||||
}
|
||||
log.Infof("服务器已退出")
|
||||
|
||||
Reference in New Issue
Block a user