hangmu-docker / patch_movement.mjs
bep40's picture
Upload patch_movement.mjs
c039cce verified
Raw History Blame Contribute Delete
1.74 kB
/* patch_movement.mjs — ROOT CAUSE FIX: "không điều khiển được nhân vật 3D".
Trong vòng lặp Movement (app.js), nx/nz được khai báo bằng `let` BÊN TRONG
khối `if (moving) {...}` nhưng lại được tham chiếu BÊN NGOÀI khối đó trong
điều kiện gửi Net.update(...):
let nx = me.pos.x + ...
let nz = me.pos.z + ... // scope chỉ trong if (moving)
const p = last.current
if (!p.pos || Math.abs(nx - p.pos.x) > 0.01 || Math.abs(nz - p.pos.z) > 0.01 ...)
// ^^ ReferenceError: nx is not defined khi đứng yên
Khi nhân vật đứng yên (mới vào hang), luồng rAF văng ReferenceError ngay
frame thứ 2 -> loop chết -> KHÔNG điều khiển được nhân vật. Fix: dùng
me.pos.x / me.pos.z thay cho nx/nz (luôn tồn tại), độc lập với việc đang
di chuyển hay đứng yên. */
import fs from 'node:fs'
const path = 'frontend/app.js'
let s = fs.readFileSync(path, 'utf8')
const marker =
" if (!p.pos || Math.abs(nx - p.pos.x) > 0.01 || Math.abs(nz - p.pos.z) > 0.01 || p.rot !== rot || p.anim !== anim) {"
const count = s.split(marker).length - 1
if (count !== 1) {
console.error(`PATCH MOVEMENT FAILED: marker not unique/found (count=${count})`)
process.exit(1)
}
const fixed =
" // dùng me.pos thay nx/nz (nx/nz chỉ có scope trong if (moving) -> chống ReferenceError khi đứng yên)\n" +
" if (!p.pos || Math.abs(me.pos.x - p.pos.x) > 0.01 || Math.abs(me.pos.z - p.pos.z) > 0.01 || p.rot !== rot || p.anim !== anim) {"
s = s.replace(marker, fixed)
fs.writeFileSync(path, s)
console.log('patched app.js ok (MOVEMENT root-cause fix: nx/nz scope)')