Lua Formatter cho Roblox & FiveM | Quy ước indent then/end cho cộng đồng script VN

(Cập nhật: 19 tháng 7, 2026 ) Lua formatter Roblox FiveM Luau coding style indent game script
Kết luận

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ệch else/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:

  • qty default có đúng không?
  • Thiếu local ở biến nào?
  • Có nhánh return sớ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.

Formatter nhanh vs tooling repo
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

  1. Mở Lua Formatter
  2. Dán code (ưu tiên đã che webhook / license key)
  3. Bấm Định dạng → kiểm tra khối if/end
  4. 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:

Quy ước Lua thực dụng
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ườngLưu ý khi format
FiveM / CitizenFXLua gần chuẩn; event RegisterNetEvent, lib ox_lib… — formatter chỉ indent
Roblox LuauCó type (x: number), continue, một số syntax mở rộng — format xong mở Studio kiểm tra
LÖVE2DLua 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:

  1. Format toàn bộ file thay đổi bằng tool hoặc StyLua
  2. Reject PR nếu còn minify một dòng không lý do
  3. Grep ^[A-Za-z_][A-Za-z0-9_]*\s*= tìm global nghi ngờ
  4. Chạy trên server staging, không production
  5. Đí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