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_MessageCore
  • MPP_ChoiceEX
  • MessageSe
  • SL_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"
}},
⚠️ Lưu ý: "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

  1. Lưu tất cả thay đổi
  2. Build lại APK/Android package
  3. 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_BackLog nằm TRƯỚC YEP_MessageCore và các plugin message khác trong plugins.js
  • ☐ Parameters đã được thêm vào plugins.js
  • "windowSkin":"" hoặc file windowskin custom tồn tại trong img/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