feat(game): 玩法接线——实体AI/夜间刷僵尸/受伤重生、掉落物拾取、熔炉烧炼产出、服务器与客户端 Mod 加载、客户端单机存档

This commit is contained in:
NianGao Dev
2026-08-15 23:48:58 +08:00
parent 6cc0f12079
commit 90e33380fc
6 changed files with 224 additions and 13 deletions

View File

@@ -29,6 +29,7 @@ import (
"mc/internal/physics"
"mc/internal/recipe"
"mc/internal/render"
"mc/internal/save"
"mc/internal/ui"
"mc/internal/world"
"mc/internal/worldgen"
@@ -56,6 +57,7 @@ type clientApp struct {
pendingMesh []*worldMeshJob // tick 构建 → 渲染线程上传
winW, winH int
tickCnt uint64
lastTime time.Time
}
@@ -110,6 +112,15 @@ func (a *clientApp) Tick(dt float64) {
a.in.apply(a.sess)
a.sess.Tick(dt)
// 定时存档:30s(存档与持久化.md §2)
a.tickCnt++
if a.tickCnt%(20*30) == 0 {
if err := save.SaveWorld(a.sess.World, "worlds", "NewWorld", 123456789, int64(a.tickCnt)); err != nil {
// 日志由调用方输出(避免每次 tick 刷屏)
_ = err
}
}
// 脏区块网格重建(CPU 侧,预算内)
start := time.Now()
for _, c := range a.sess.World.ActiveChunks() {
@@ -253,6 +264,15 @@ func main() {
}
defer w.Close()
// 单机存档(存档与持久化.md §3:diff-only 载入,无存档则新建)
if _, err := os.Stat("worlds/NewWorld/level.dat"); err == nil {
if _, err := save.LoadWorld(w, "worlds", "NewWorld"); err != nil {
log.Warnf("存档载入失败: %v", err)
} else {
log.Infof("已载入世界 NewWorld")
}
}
// 4) 游戏会话(玩家先高空下落,区块加载后落地)
p := physics.NewPlayer(8.5, 100, 8.5)
cam := camera.New(p.Eye(), 0, 0, cfg.Client.FOV)