Hướng dẫn sửa lỗi plugin Saba_BackLog trong RPG Maker MV
Hướng dẫn sửa lỗi plugin Saba_BackLog trong RPG Maker MV
Tổng quan
Plugin Saba_BackLog.js cho phép người chơi xem lại hội thoại đã qua trong game RPG Maker MV. Tuy nhiên, plugin này thường gặp các lỗi khi chạy trên Android do thiếu null check và thiếu parameters.
Các lỗi thường gặp
Lỗi 1: TypeError: Cannot read properties of undefined (reading 'name')
Nguyên nhân: Plugin cố đọc $dataActors[actorId].name khi actor không tồn tại.
Stack trace:
TypeError: Cannot read properties of undefined (reading 'name')
at new Game_TalkLog (Saba_BackLog.js:146:54)
Lỗi 2: ReferenceError: Saba is not defined
Nguyên nhân: Thứ tự load plugin sai - các plugin khác gọi Saba.BackLog trước khi Saba_BackLog.js được load.
Stack trace:
ReferenceError: Saba is not defined
at eval (eval at Game_Interpreter.command355)
Lỗi 3: TypeError: Cannot read properties of undefined (reading 'length')
Nguyên nhân: Plugin parameters trống, windowSkin bị undefined.
Stack trace:
TypeError: Cannot read properties of undefined (reading 'length')
at Scene_Boot.loadSystemImages (Saba_BackLog.js:319:23)
Lỗi 4: Failed to execute 'drawImage'
Nguyên nhân: File windowskin custom (VD: WindowBacklog.png) không tồn tại trong img/system/.
Stack trace:
Error: Failed to execute 'drawImage' on 'CanvasRenderingContext2D'
at Bitmap._createCanvas (rpg_core.js:766:24)
Cách sửa
Bước 1: Tải file Saba_BackLog.js đã sửa
Tải file Saba_BackLog_v2.js đã được fix và đổi tên thành Saba_BackLog.js.
Thay thế file cũ tại: js/plugins/Saba_BackLog.js
Bước 2: Sửa file plugins.js
Mở file js/plugins.js và tìm dòng chứa "Saba_BackLog".
2.1. Kiểm tra vị trí plugin
Đảm bảo Saba_BackLog được load TRƯỚC các plugin sau:
YEP_MessageCoreMPP_ChoiceEXMessageSeSL_MessageWindow- Bất kỳ plugin nào liên quan đến message/choice
Ví dụ thứ tự đúng:
{"name":"MessageWindowHidden","status":true,...},
{"name":"Saba_BackLog","status":true,...}, // ← Phải ở đây
{"name":"YEP_MessageCore","status":true,...},
{"name":"MPP_ChoiceEX","status":true,...},
Ví dụ thứ tự SAI:
{"name":"YEP_MessageCore","status":true,...},
{"name":"MPP_ChoiceEX","status":true,...},
{"name":"Saba_BackLog","status":true,...}, // ← SAI: Quá muộn
2.2. Thêm parameters
Tìm dòng:
{"name":"Saba_BackLog","status":true,"description":"","parameters":{}},
Thay bằng:
{"name":"Saba_BackLog","status":true,"description":"","parameters":{
"backLogButton":"pageup",
"marginLeft":"70",
"marginRight":"30",
"nameLeft":"20",
"fontSize":"24",
"scrollSpeed":"5",
"windowHeight":"2000",
"maxLogCount":"50",
"bottmMargin":"50",
"logMargin":"44",
"windowSkin":"",
"backOpacity":"230"
}},
"windowSkin":"" để dùng Window.png mặc định. Nếu muốn dùng windowskin riêng, đổi thành "windowSkin":"TenFile" và đảm bảo file img/system/TenFile.png tồn tại.
Bước 3: Rebuild game
- Lưu tất cả thay đổi
- Build lại APK/Android package
- Test game
Chi tiết các sửa đổi trong Saba_BackLog_v2.js
Fix 1: Null check cho actor (dòng 145-149)
Trước:
if (actorId > 0) {
this.name = $dataActors[actorId].name;
} else {
this.name = name;
}
Sau:
if (actorId > 0 && $dataActors[actorId]) {
this.name = $dataActors[actorId].name;
} else {
this.name = name || '';
}
Fix 2: Default values cho parameters (dòng 94-106)
Trước:
var windowSkin = parameters['windowSkin']; var backOpacity = parseInt(parameters['backOpacity']);
Sau:
var windowSkin = parameters['windowSkin'] || ''; var backOpacity = parseInt(parameters['backOpacity']) || 230; var backLogButton = parameters['backLogButton'] || 'pageup'; var scrollSpeed = parseInt(parameters['scrollSpeed']) || 5; // ... (tất cả parameters đều có default value)
Fix 3: Fallback windowskin (dòng 169-175)
Trước:
Window_BackLog.prototype.loadWindowskin = function () {
this.windowskin = ImageManager.loadSystem(windowSkin);
};
Sau:
Window_BackLog.prototype.loadWindowskin = function () {
if (windowSkin && windowSkin.length > 0) {
this.windowskin = ImageManager.loadSystem(windowSkin);
} else {
this.windowskin = ImageManager.loadSystem('Window');
}
};
Fix 4: Try-catch cho preload (dòng 320-330)
Trước:
Scene_Boot.loadSystemImages = function () {
Scene_Boot_loadSystemImages.call(this);
if (windowSkin.length > 0) {
ImageManager.loadSystem(windowSkin);
}
};
Sau:
Scene_Boot.loadSystemImages = function () {
Scene_Boot_loadSystemImages.call(this);
if (windowSkin && windowSkin.length > 0) {
try {
ImageManager.loadSystem(windowSkin);
} catch (e) {
console.warn('Failed to preload windowSkin:', windowSkin);
}
}
};
Tùy chỉnh parameters
Sau khi sửa, bạn có thể tùy chỉnh các parameters trong plugins.js:
| Parameter | Mô tả | Giá trị mặc định |
|---|---|---|
backLogButton |
Phím mở backlog | "pageup" |
marginLeft |
Khoảng cách lề trái | "70" |
marginRight |
Khoảng cách lề phải | "30" |
nameLeft |
Vị trí tên nhân vật | "20" |
fontSize |
Cỡ chữ | "24" |
scrollSpeed |
Tốc độ scroll | "5" |
windowHeight |
Chiều cao cửa sổ | "2000" |
maxLogCount |
Số log tối đa lưu | "50" |
bottmMargin |
Khoảng cách đáy | "50" |
logMargin |
Khoảng cách giữa các log | "44" |
windowSkin |
Tên file windowskin | "" (dùng Window.png) |
backOpacity |
Độ trong suốt nền | "230" |
Checklist kiểm tra
- ☐ File
Saba_BackLog.jsđã được thay thế bằng phiên bản v2 - ☐ Plugin
Saba_BackLognằm TRƯỚCYEP_MessageCorevà các plugin message khác trongplugins.js - ☐ Parameters đã được thêm vào
plugins.js - ☐
"windowSkin":""hoặc file windowskin custom tồn tại trongimg/system/ - ☐ Game đã được rebuild
- ☐ Test chức năng backlog trong game
Kết luận
Sau khi áp dụng các fix trên, plugin Saba_BackLog sẽ hoạt động ổn định trên cả PC và Android. Các lỗi crash do null pointer và missing parameters đã được khắc phục hoàn toàn.
Phiên bản: v2
Ngày cập nhật: 2025-11-29
Tương thích: RPG Maker MV
Nền tảng: PC, Android

Tham gia cuộc trò chuyện