====== Tạo sự kiện tùy chỉnh bằng Mini API ====== Trong Mini World, chúng ta đã có sẵn nhiều sự kiện được định nghĩa trước. Nhưng nếu muốn tạo ra một cấp độ phức tạp hơn, sâu hơn cho các đoạn mã của mình thì sao? Câu trả lời là: ta có thể tạo sự kiện tùy chỉnh (custom event) và [[https://en.wikipedia.org/wiki/Event_(computing)#Event_handler|Listen]] sự kiện đó. Việc này giúp mã của bạn trở nên linh hoạt hơn, dễ quản lý hơn và tránh được những logic rối rắm, phức tạp nếu chỉ sử dụng các sự kiện mặc định.\\ Việc tạo sự kiện tùy chỉnh rất hữu ích khi bạn làm việc với người khác, vì không cần phải gộp tất cả biến và hàm vào một script duy nhất. Thay vào đó, bạn có thể chia nhỏ script và chỉ cần "gọi" hoặc "lắng nghe" sự kiện từ các phần khác nhau.\\ ---- ===== Cách tạo sự kiện tùy chỉnh ===== Để tạo sự kiện tùy chỉnh, ta sử dụng phương thức: Game:dispatchEvent(msg: string, customdata: any) Trong đó:\\ * **msg** là tên của sự kiện tùy chỉnh bạn muốn tạo. * **customdata** là dữ liệu bạn muốn truyền kèm với sự kiện. Dữ liệu này phải được mã hóa dưới dạng JSON. ---- ==== Ví dụ 1: Tạo sự kiện tùy chỉnh (không truyền dữ liệu) ==== **Script lắng nghe sự kiện:**\\ function myEventFunction() Chat:sendSystemMsg("Sự kiện của tôi đã được kích hoạt!", 0) end ScriptSupportEvent:registerEvent("myEvent", myEventFunction) **Script phát sự kiện:**\\ function GameStart() Game:dispatchEvent("myEvent", {}) threadpool:wait(5) end ScriptSupportEvent:registerEvent([=[Game.Start]=], GameStart) ---- ==== Ví dụ 2: Tạo sự kiện tùy chỉnh (có truyền dữ liệu) ==== Chúng ta sẽ tạo 2 script:\\ * Script 1: Gửi sự kiện. * Script 2: Nhận sự kiện và xử lý dữ liệu. **Script gửi dữ liệu (Sender Script):**\\ function GameStart() print("Kiểm tra CustomEvent") local data = {Sent = "Yes", Uid = 123456789} local success, result = pcall(JSON.encode, JSON, data) if not success then print("Đã xảy ra lỗi.") print(result) else print("Mã hóa JSON thành công.") local ret = Game:dispatchEvent("myEvent", {customdata = result}) end end ScriptSupportEvent:registerEvent([=[Game.Start]=], GameStart) ---- **Script nhận dữ liệu (Receiver Script):**\\ function myEventFunction(params) Chat:sendSystemMsg("Sự kiện của tôi đã được kích hoạt!", 0) Chat:sendSystemMsg("Thông tin nhận được: ".. params.CurEventParam.CloudValue.Sent, 0) end ScriptSupportEvent:registerEvent("myEvent", myEventFunction) **📝 Lưu ý:**\\ Để lấy dữ liệu được gửi kèm theo sự kiện, bạn dùng cú pháp sau:\\ params.CurEventParam.CloudValue.TênBiến Với cách này, bạn có thể dễ dàng mở rộng kịch bản, chia tách logic phức tạp thành các phần nhỏ hơn, dễ đọc và dễ bảo trì hơn. Đây cũng là một cách rất hiệu quả khi làm việc nhóm trong các dự án map phức tạp hoặc game logic nhiều tầng trong Mini World.\\ ----