Lua Formatter cho Roblox & FiveM | Quy ước indent then/end cho cộng đồng script VN
Trước khi tranh luận logic spawn/weapon, hãy format Lua cho đọc được. Script mua từ Discord / Facebook group cộng đồng Roblox–FiveM ở Việt Nam thường lệch indent hoặc dính một dòng — then/end dễ đọc sai. Thống nhất 2 space (hoặc 4) + luôn local, rồi dùng Lua Formatter trên trình duyệt để căn khối trước khi review. Tool không thay StyLua/CI; chỉ là bước “mở mắt” nhanh, chạy local.
Cộng đồng script game Việt Nam — Roblox Studio (Luau), FiveM (GTA RP), đôi khi LÖVE — trao đổi code chủ yếu qua Discord, Zalo, Facebook group. File .lua mua/ bán hoặc share thường:
- Bị strip khoảng trắng khi copy từ chat
- Viết một dòng để “khó đọc / chống copy”
- Trộn tab và space giữa nhiều tác giả
Reviewer mở ra thấy tường chữ. Bug không nằm ở “thuật toán”, mà ở chỗ không biết end nào đóng if nào.
Bài viết này giúp bạn
- Hiểu khi nào cần formatter trước khi debug FiveM/Roblox
- Áp dụng quy ước tối thiểu cho team/freelancer VN
- Phân biệt Lua thuần vs Luau khi format
- Tránh lỗi phổ biến: thiếu
local, lệchelse/elseif, minify một dòng - Gắn bước format vào checklist trước khi merge resource
Pain: script Discord không đọc được
Ví dụ kiểu hay gặp khi mua resource FiveM hoặc paste từ pastebin (rút gọn):
function GiveItem(src,item,qty)if not src then return end if qty==nil then qty=1 end local xPlayer=ESX.GetPlayerFromId(src)if not xPlayer then return end xPlayer.addInventoryItem(item,qty)end
Ở dạng này, khó trả lời nhanh:
qtydefault có đúng không?- Thiếu
localở biến nào? - Có nhánh
returnsớm che bug phía sau không?
Sau khi format (indent 2 space):
function GiveItem(src, item, qty)
if not src then
return
end
if qty == nil then
qty = 1
end
local xPlayer = ESX.GetPlayerFromId(src)
if not xPlayer then
return
end
xPlayer.addInventoryItem(item, qty)
end
Cùng logic — nhưng review 30 giây thay vì 5 phút đoán ngoặc end.
Lua Formatter làm gì (và không làm gì)
Lua Formatter trên Kawa căn thụt dòng theo khối function / then / do / else / end. Chạy trong trình duyệt: dán → Format → copy.
| Công cụ | Phù hợp | Không làm |
|---|---|---|
| Lua Formatter (browser) | Đoạn paste Discord, review nhanh, máy không cài StyLua | Không typecheck Luau, không lint ESX API |
| StyLua + CI | Repo dài hạn, PR tự format | Nặng khi chỉ cần đọc 40 dòng mua ngoài |
| Luau LSP / Studio | Gõ code Roblox hàng ngày | Không giúp đoạn minify dán từ chat |
Không phóng đại: formatter indent không sửa lỗi cú pháp, không đổi tên biến, không bảo mật script. Coi như kính lúp — không phải compiler.
Cách dùng nhanh
- Mở Lua Formatter
- Dán code (ưu tiên đã che webhook / license key)
- Bấm Định dạng → kiểm tra khối
if/end - Copy vào Studio, VS Code, hoặc
resources/[local]/your_script
Indent tool dùng 2 space — nếu repo bạn quy ước 4 space, format xong có thể indent lại trong editor, hoặc thống nhất team về 2 space cho đồng bộ.
Quy ước tối thiểu cho script Roblox / FiveM
Không cần styleguide 20 trang. Freelancer và server nhỏ chỉ cần 5 dòng ghi trong README:
| Hạng mục | Gợi ý |
|---|---|
| Indent | 2 hoặc 4 space — một repo một kiểu, không trộn tab |
| Biến | Luôn local trừ khi cố ý export global (hiếm) |
| Hằng | UPPER_SNAKE cho config (MAX_SLOTS, WebhookURL tách file) |
| Comment | -- một dòng; --[[ ... ]] khối. Comment tiếng Việt OK nếu team VN |
| Tên | snake_case hoặc lowerCamel — chọn một; FiveM hay gặp PascalCase function export |
Vì sao local quan trọng hơn indent đẹp
Lua mặc định global nếu quên local. Trên FiveM, hai resource cùng ghi đè biến global → bug “chỉ sai trên server production”. Format giúp thấy chỗ thiếu local; sửa tay vẫn bắt buộc.
-- Nguy hiểm: vô tình global
count = 0
-- An toàn trong file
local count = 0
Roblox Luau vs Lua FiveM
| Môi trường | Lưu ý khi format |
|---|---|
| FiveM / CitizenFX | Lua gần chuẩn; event RegisterNetEvent, lib ox_lib… — formatter chỉ indent |
| Roblox Luau | Có type (x: number), continue, một số syntax mở rộng — format xong mở Studio kiểm tra |
| LÖVE2D | Lua thuần; quy ước giống trên |
Nếu đoạn có annotation dày, format browser có thể lệch một vài dòng quanh : — đọc lại diff trước khi commit.
Case study 1: Review resource FiveM trước khi merge
Server RP nhỏ (10–30 slot) nhận PR thêm job. Diff 400 dòng, nửa là whitespace vì contributor dùng tab, maintainer dùng space.
Checklist 5 phút:
- Format toàn bộ file thay đổi bằng tool hoặc StyLua
- Reject PR nếu còn minify một dòng không lý do
- Grep
^[A-Za-z_][A-Za-z0-9_]*\s*=tìm global nghi ngờ - Chạy trên server staging, không production
- Đính kèm screenshot / log trong ticket tiếng Việt hoặc English — miễn rõ
Kết quả thực tế: nhiều “bug không vào được marker” hóa ra end đóng nhầm if khoảng cách — chỉ lộ sau khi indent đúng.
Case study 2: Freelancer giao script Roblox
Khách VN mua LocalScript GUI. Freelancer gửi file minify “cho gọn”. Khách không sửa được text button → mở dispute.
Cách làm chuyên nghiệp hơn:
- Giao bản pretty (indent rõ) + optional bản obfuscate nếu khách yêu cầu chống copy
- Comment ngắn chỗ hook (
-- đổi RemoteEvent tại đây) - Nhắc khách: paste vào Studio → không paste Discord lần nữa
Formatter giúp bạn tự kiểm trước khi zip gửi khách — 1 phút, giảm support.
Lỗi thường gặp sau khi format
1. else / elseif lệch cấp
if state == "idle" then
playIdle()
elseif state == "run" then
playRun()
else
playFallback()
end
Nếu tool hoặc tay đẩy else cùng cấp end sai, logic vẫn chạy nhưng review nhầm nhánh. Sau format, đọc cặp if–elseif–else–end từ trong ra ngoài.
2. function một dòng vẫn khó đọc
local function onHit(player) if player.Team == "Police" then return end damage(player) end
Format tách khối. Đừng để function dài trên một dòng trong git.
3. Trộn repeat / until với while
repeat ... until indent khác while ... do. Nếu output trông lạ, kiểm tra cú pháp tay — formatter đơn giản có thể không hoàn hảo với mọi edge case.
4. Dán nhầm JSON / JS vào ô Lua
Tool không validate dialect. Output “có indent” nhưng không chạy. Luôn giữ đuôi .lua / .luau và test runtime.
Checklist trước khi publish script
- Đã format; không còn tường một dòng trừ khi cố ý minify build
- Mọi biến file-scope dùng
local - Không hardcode webhook / OpenCloud key trong bản share công khai
- Quy ước indent ghi 1 dòng trong README
- Test trên Studio Play Solo hoặc FiveM staging
- Diff PR không gồm 500 dòng đổi space vô nghĩa (format cả file một lần, commit riêng “chore: format”)
FAQ ngắn trong bài
Có cần học StyLua ngay không?
Nếu bạn maintain repo > vài tuần: nên. Nếu chỉ đọc script mua về: browser formatter đủ để hiểu rồi quyết định có thuê người sửa tiếp.
Comment tiếng Việt có sao không?
Không — team nội bộ OK. Resource public quốc tế nên comment English ngắn cho dễ fork.
Format có làm script chậm không?
Không. Indent là whitespace; runtime Lua bỏ qua. Obfuscate/minify mới ảnh hưởng kích thước tải, không phải tốc độ logic đáng kể ở script thường.
Liên kết liên quan
- Lua Formatter — format indent trên trình duyệt
- Danh sách công cụ
- JSON Formatter — khi config resource dạng JSON
- SQL Formatter — khi debug query kèm backend