[{"data":1,"prerenderedAt":53},["ShallowReactive",2],{"site":3,"blog-post-th-fxmanifest-lua54-cerulean":15,"blog-slug-site":46,"blog-scripts-th-fxmanifest-lua54-cerulean":52},{"site":4,"contact":10,"seo":13,"payment":14},{"name":5,"host":6,"default_locale":7,"locales":8},"X3D Developer","fivem.x3d-developer.com","th",[7,9],"en",{"discord_invite":11,"email":12,"line":12},"https:\u002F\u002Fdiscord.gg\u002FNA5kPVynFv","",{"google_site_verification":12,"bing_site_verification":12},{"bank_name":12,"account_name":12,"account_no":12,"promptpay_id":12},{"post":16,"html":21,"others":22,"productSlugs":45},{"slug":17,"title":18,"description":19,"date":20},"fxmanifest-lua54-cerulean","ทำไม fxmanifest.lua ต้องมี fx_version 'cerulean' และ lua54 'yes' (ไม่ใส่แล้วเป็นอะไร พร้อม template)","อธิบายสองบรรทัดที่ทุก resource FiveM ยุคนี้ต้องมี: fx_version 'cerulean' คือเวอร์ชันของ manifest ที่กำหนดพฤติกรรม runtime และ NUI ส่วน lua54 'yes' เปิด Lua 5.4 ให้ resource นั้น ทำไม ox_lib และ ESX Legacy บังคับ error ที่เจอเมื่อลืมใส่ ความต่างจาก adamant\u002Fbodacious และ __resource.lua พร้อม fxmanifest.lua ตัวอย่างที่ใช้ได้จริง","2026-09-27","\u003Cp>เปิด \u003Ccode>fxmanifest.lua\u003C\u002Fcode> ของสคริปยุคนี้จะเจอสองบรรทัดแรกเหมือนกันแทบทุกตัว:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-lua\">fx_version 'cerulean'\nlua54 'yes'\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>คนเขียนสคริปใหม่มักก๊อปตามโดยไม่รู้ว่าทำอะไร แล้วพอลืมใส่ในสคริปตัวเองก็เจอ error ที่อ่านไม่ออก บทความนี้อธิบายทีละบรรทัด: มันคืออะไร ทำไมต้องมี ไม่มีแล้วพังยังไง และ manifest ที่ถูกต้องสำหรับสคริป ESX ควรหน้าตาเป็นแบบไหน\u003C\u002Fp>\n\u003Ch2 id=\"fxmanifest-lua-คืออะไรก่อน\">fxmanifest.lua คืออะไรก่อน\u003C\u002Fh2>\n\u003Cp>ไฟล์นี้คือ &quot;ใบสั่งโหลด&quot; ที่ FXServer อ่านก่อนสตาร์ท resource: ไฟล์ไหนรันฝั่ง client ไฟล์ไหนฝั่ง server หน้า NUI อยู่ที่ไหน ต้องพึ่ง resource อะไร และ \u003Cstrong>จะรันด้วยกติกาเวอร์ชันไหน\u003C\u002Fstrong> สองบรรทัดที่ถามคือส่วน &quot;กติกา&quot; นั่นเอง ก่อนปี 2019 ไฟล์นี้ชื่อ \u003Ccode>__resource.lua\u003C\u002Fcode> และระบุเวอร์ชันด้วย \u003Ccode>resource_manifest_version\u003C\u002Fcode> ตามด้วย GUID ยาว ๆ ที่จำไม่ได้ \u003Ccode>fxmanifest.lua\u003C\u002Fcode> กับ \u003Ccode>fx_version\u003C\u002Fcode> มาแทนเพื่อให้คนอ่านออก\u003C\u002Fp>\n\u003Ch2 id=\"fx-version-cerulean-คืออะไร\">fx_version 'cerulean' คืออะไร\u003C\u002Fh2>\n\u003Cp>\u003Ccode>fx_version\u003C\u002Fcode> บอก FXServer ว่า resource นี้เขียนตาม \u003Cstrong>กติกา manifest รุ่นไหน\u003C\u002Fstrong> เพราะ FiveM ปรับพฤติกรรม runtime เป็นระยะ และไม่อยากให้สคริปเก่าพังเมื่ออัปเดต จึงล็อกพฤติกรรมไว้ที่เวอร์ชันที่ผู้เขียนประกาศ ชื่อรุ่นเรียงตามตัวอักษร:\u003C\u002Fp>\n\u003Cdiv class=\"table-scroll\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>fx_version\u003C\u002Fth>\n\u003Cth>ช่วงเวลา\u003C\u002Fth>\n\u003Cth>ความหมาย\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>adamant\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>ปลาย 2019\u003C\u002Ftd>\n\u003Ctd>รุ่นแรกของรูปแบบ \u003Ccode>fxmanifest.lua\u003C\u002Fcode> แทน \u003Ccode>__resource.lua\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>bodacious\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>ต้น 2020\u003C\u002Ftd>\n\u003Ctd>รุ่นกลาง ปรับพฤติกรรม runtime บางส่วนระหว่างทาง\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cerulean\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>กลาง 2020 ถึงปัจจุบัน\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>รุ่นล่าสุด\u003C\u002Fstrong> NUI โหลดจาก origin \u003Ccode>https:\u002F\u002Fcfx-nui-&lt;resource&gt;\u002F\u003C\u002Fcode> แทน \u003Ccode>nui:\u002F\u002F\u003C\u002Fcode> ทำให้หน้า NUI เป็น secure context ใช้ \u003Ccode>fetch\u003C\u002Fcode> ไปหา callback และโหลดทรัพยากร https ได้ตรง ๆ\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>ไม่มีรุ่นใหม่กว่า \u003Ccode>cerulean\u003C\u002Fcode> ตั้งแต่ 2020 ทุก resource ที่เขียนใหม่ใช้ค่านี้ค่าเดียว ไม่ต้องคิด\u003C\u002Fp>\n\u003Cp>ถ้าไม่ใส่ \u003Ccode>fx_version\u003C\u002Fcode> เลย FXServer ไม่รู้ว่าจะโหลดด้วยกติกาไหน resource จะไม่สตาร์ทและ console จะฟ้องว่า manifest ไม่ถูกต้อง ถ้าใส่ \u003Ccode>adamant\u003C\u002Fcode> กับสคริปที่มี NUI ยุคใหม่ หน้า UI ที่ใช้ \u003Ccode>fetch\u003C\u002Fcode> หรือโหลดฟอนต์\u002Fรูปจาก https จะทำงานผิดเพราะ origin ยังเป็น \u003Ccode>nui:\u002F\u002F\u003C\u002Fcode>\u003C\u002Fp>\n\u003Ch2 id=\"lua54-yes-คืออะไร\">lua54 'yes' คืออะไร\u003C\u002Fh2>\n\u003Cp>FiveM รัน Lua ด้วย runtime ของตัวเอง (CfxLua) ที่ค่าเริ่มต้นเป็น \u003Cstrong>Lua 5.3\u003C\u002Fstrong> ตั้งแต่ปี 2021 มี runtime \u003Cstrong>Lua 5.4\u003C\u002Fstrong> ให้เลือก แต่เปิดให้ \u003Cstrong>ทีละ resource\u003C\u002Fstrong> ด้วยบรรทัด \u003Ccode>lua54 'yes'\u003C\u002Fcode> เพราะ 5.4 เปลี่ยนพฤติกรรมบางอย่าง (เช่นการแปลงสตริงเป็นตัวเลข การล้นของ integer ใน for loop) สคริปเก่าบางตัวจะพังถ้าถูกบังคับทั้งเซิฟ\u003C\u002Fp>\n\u003Cp>สิ่งที่ได้จาก Lua 5.4:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>เร็วกว่า\u003C\u002Fstrong> garbage collector แบบ generational และการเรียกฟังก์ชันที่เบากว่า สคริปที่มี loop ถี่ ๆ (HUD, ระยะ, ตรวจโซน) ได้ประโยชน์ชัด\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ไวยากรณ์ใหม่\u003C\u002Fstrong> \u003Ccode>local x &lt;const&gt; = 1\u003C\u002Fcode> (ค่าคงที่ แก้แล้ว error ตอนคอมไพล์) และ \u003Ccode>local f &lt;close&gt; = ...\u003C\u002Fcode> (ปิดทรัพยากรอัตโนมัติเมื่อออกจาก scope)\u003C\u002Fli>\n\u003Cli>ฟังก์ชันใหม่เช่น \u003Ccode>coroutine.close\u003C\u002Fcode>, \u003Ccode>warn\u003C\u002Fcode>, \u003Ccode>math.tointeger\u003C\u002Fcode> และ \u003Ccode>utf8\u003C\u002Fcode> ที่เข้มงวดขึ้น\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>ทำไม &quot;ต้องมี&quot; ไม่ใช่แค่ &quot;ควรมี&quot;: \u003Cstrong>library ที่สคริปยุคนี้พึ่งพาเขียนด้วยไวยากรณ์ 5.4 และเช็กจริง\u003C\u002Fstrong> ตัวอย่างที่เจอบ่อยที่สุดคือ ox_lib บรรทัดแรก ๆ ของ \u003Ccode>@ox_lib\u002Finit.lua\u003C\u002Fcode> คือ\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-lua\">if not _VERSION:find('5.4') then\n    error('Lua 5.4 must be enabled in the resource manifest!', 2)\nend\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>และเพราะ runtime เป็นของ \u003Cstrong>แต่ละ resource\u003C\u002Fstrong> การที่ ox_lib เองมี \u003Ccode>lua54 'yes'\u003C\u002Fcode> ไม่ช่วยอะไร สคริปของคุณที่ \u003Ccode>shared_script '@ox_lib\u002Finit.lua'\u003C\u002Fcode> ต้องมี \u003Ccode>lua54 'yes'\u003C\u002Fcode> ในไฟล์ manifest ของตัวเองด้วย ไม่งั้นเจอ error ข้างบนตอนสตาร์ท เช่นเดียวกับ ox_inventory, ox_target, qbx_core และ ESX Legacy รุ่นใหม่ที่ manifest ของ \u003Ccode>es_extended\u003C\u002Fcode> ประกาศ \u003Ccode>lua54 'yes'\u003C\u002Fcode> มาตั้งแต่ต้น\u003C\u002Fp>\n\u003Cp>อาการเมื่อลืมใส่แต่โค้ดใช้ไวยากรณ์ 5.4: error ตอนโหลดไฟล์แบบ \u003Ccode>'=' expected near '&lt;'\u003C\u002Fcode> ชี้ไปบรรทัดที่มี \u003Ccode>&lt;const&gt;\u003C\u002Fcode> หรือ \u003Ccode>&lt;close&gt;\u003C\u002Fcode> หรือ error \u003Ccode>attempt to call a nil value (field 'close')\u003C\u002Fcode> เมื่อเรียก \u003Ccode>coroutine.close\u003C\u002Fcode>\u003C\u002Fp>\n\u003Ch2 id=\"แล้ว-use-experimental-fxv2-oal-yes-ล่ะ\">แล้ว use_experimental_fxv2_oal 'yes' ล่ะ\u003C\u002Fh2>\n\u003Cp>บรรทัดที่สามที่มักเห็นคู่กันใน ESX Legacy คือ\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-lua\">use_experimental_fxv2_oal 'yes'\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>เปิดวิธีเรียก native แบบใหม่ที่เร็วกว่า (one-argument-list) ไม่บังคับ แต่ปลอดภัยกับสคริปที่เขียนใหม่และให้ประสิทธิภาพเพิ่มในสคริปที่เรียก native ถี่ ถ้าเจอพฤติกรรมแปลกกับ native ที่คืนค่าหลายตัว ลองปิดบรรทัดนี้ก่อน\u003C\u002Fp>\n\u003Ch2 id=\"fxmanifest-lua-ตัวอย่างสำหรับสคริป-esx\">fxmanifest.lua ตัวอย่างสำหรับสคริป ESX\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-lua\">fx_version 'cerulean'\ngame 'gta5'\nlua54 'yes'\nuse_experimental_fxv2_oal 'yes'\n\nauthor 'X3D Developer'\ndescription 'x3d_example: ตัวอย่างโครง manifest'\nversion '1.0.0'\n\nshared_scripts {\n  '@es_extended\u002Fimports.lua',\n  '@ox_lib\u002Finit.lua',\n  'config\u002Fconfig.lua',\n}\n\nclient_scripts {\n  'client\u002F*.lua',\n}\n\nserver_scripts {\n  '@oxmysql\u002Flib\u002FMySQL.lua',\n  'config\u002Fconfig.license.lua',\n  'server\u002F*.lua',\n}\n\nui_page 'html\u002Findex.html'\n\nfiles {\n  'html\u002Findex.html',\n  'html\u002F**\u002F*',\n  'locales\u002F*.json',\n}\n\ndependencies {\n  '\u002Fserver:7290',\n  '\u002Fonesync',\n  'es_extended',\n  'ox_lib',\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>จุดที่คนพลาดบ่อย:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>game 'gta5'\u003C\u002Fcode> จำเป็น ถ้าทำ RedM ใช้ \u003Ccode>game 'rdr3'\u003C\u002Fcode> และเพิ่ม \u003Ccode>rdr3_warning\u003C\u002Fcode> ตามที่ FXServer บอก\u003C\u002Fli>\n\u003Cli>ไฟล์ที่ต้องเปิดจาก NUI (รูป ฟอนต์ เสียง) ต้องอยู่ใน \u003Ccode>files\u003C\u002Fcode> ไม่งั้นโหลดไม่ขึ้นแม้ไฟล์มีอยู่จริง (\u003Ccode>html\u002F**\u002F*\u003C\u002Fcode> ครอบให้หมดในโฟลเดอร์)\u003C\u002Fli>\n\u003Cli>ไฟล์ที่มีความลับฝั่ง server เช่น \u003Ccode>config\u002Fconfig.license.lua\u003C\u002Fcode> \u003Cstrong>ห้าม\u003C\u002Fstrong> อยู่ใน \u003Ccode>shared_scripts\u003C\u002Fcode> เพราะ shared ส่งไปให้ทุกไคลเอนต์ ต้องอยู่ใน \u003Ccode>server_scripts\u003C\u002Fcode> เท่านั้น (สคริป X3D ทุกตัววาง license config ไว้ใน \u003Ccode>server_scripts\u003C\u002Fcode> เป็นบรรทัดแรก)\u003C\u002Fli>\n\u003Cli>\u003Ccode>dependencies\u003C\u002Fcode> แบบ \u003Ccode>\u002Fserver:7290\u003C\u002Fcode> บังคับเวอร์ชัน FXServer ขั้นต่ำ และ \u003Ccode>\u002Fonesync\u003C\u002Fcode> บังคับให้เปิด OneSync ถ้าไม่ครบ resource จะไม่สตาร์ทพร้อมข้อความบอกชัด ดีกว่าพังเงียบ ๆ ทีหลัง\u003C\u002Fli>\n\u003Cli>ลำดับใน \u003Ccode>server.cfg\u003C\u002Fcode> ยังสำคัญ: \u003Ccode>es_extended\u003C\u002Fcode> และ \u003Ccode>ox_lib\u003C\u002Fcode> ต้อง \u003Ccode>ensure\u003C\u002Fcode> ก่อนสคริปที่ import จากมัน\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"คำถามที่พบบ่อย\">คำถามที่พบบ่อย\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>สคริปเก่าที่ยังเป็น \u003Ccode>__resource.lua\u003C\u002Fcode> ต้องแปลงไหม\u003C\u002Fstrong> — ยังรันได้ แต่ควรเปลี่ยนชื่อไฟล์เป็น \u003Ccode>fxmanifest.lua\u003C\u002Fcode> และแทน \u003Ccode>resource_manifest_version '...'\u003C\u002Fcode> ด้วย \u003Ccode>fx_version 'cerulean'\u003C\u002Fcode> แล้วทดสอบ NUI อีกรอบ\u003C\u002Fp>\n\u003Cp>\u003Cstrong>ใส่ \u003Ccode>lua54 'yes'\u003C\u002Fcode> กับสคริปเก่าแล้วจะพังไหม\u003C\u002Fstrong> — ส่วนใหญ่ไม่ ที่เจอคือโค้ดที่พึ่งการแปลง \u003Ccode>&quot;10&quot; + 5\u003C\u002Fcode> โดยอัตโนมัติ (5.4 ยังทำได้ผ่าน string metamethod) และ integer overflow ใน for loop ที่ 5.4 หยุด loop แทนที่จะวนต่อ ทดสอบก่อนขึ้น prod\u003C\u002Fp>\n\u003Cp>\u003Cstrong>ใส่ \u003Ccode>lua54 'yes'\u003C\u002Fcode> ที่ es_extended ตัวเดียวพอไหม\u003C\u002Fstrong> — ไม่พอ ค่านี้เป็นรายตัว ทุก resource ที่ใช้ไวยากรณ์ 5.4 หรือ import ox_lib ต้องใส่เอง\u003C\u002Fp>\n\u003Cp>\u003Cstrong>เห็น \u003Ccode>fx_version 'bodacious'\u003C\u002Fcode> ในสคริปที่ซื้อมา\u003C\u002Fstrong> — ทำงานได้ แต่เป็นสัญญาณว่าโค้ดไม่ได้อัปเดตตั้งแต่ 2020 ตรวจ NUI และความเข้ากันได้กับ ESX Legacy รุ่นปัจจุบันก่อนใช้\u003C\u002Fp>\n\u003Cp>สคริปฟรีของ X3D ทุกตัว (เช่น \u003Ca href=\"\u002Fth\u002Fproducts\u002Fes-extended\u002F\">ESX Legacy Core — X3D Build\u003C\u002Fa> และ \u003Ca href=\"\u002Fth\u002Fproducts\u002Fx3d-phone\u002F\">X3D Phone\u003C\u002Fa>) ใช้โครง manifest แบบข้างบน ดูไฟล์จริงได้จาก\u003Ca href=\"\u002Fth\u002Fblog\u002Ffree-fivem-scripts\u002F\">บทความแจกสคริป FiveM ฟรี\u003C\u002Fa> อยากให้ทีมช่วยเขียนสคริปตามโจทย์: \u003Ca href=\"\u002Fth\u002Fservices\u002Fcustom-script\u002F\">รับเขียนสคริป FiveM\u003C\u002Fa>\u003C\u002Fp>\n",[23,29,34,40],{"slug":24,"title":25,"description":26,"date":27,"updated":28},"free-fivem-scripts","แจกสคริป FiveM ฟรี 27 ตัว ของแท้จากผู้พัฒนา: สกินอาวุธ ดาเมจปืน กระเป๋า ESX ตู้เซฟ ท้ายรถ แผงแอดมิน และอื่น ๆ","สคริป FiveM ฟรี 27 ตัวจาก X3D — สกินอาวุธแบบสะสม, ระบบดาเมจปืน, กระเป๋า ESX ช่องลัด 1–9, ตู้เซฟ, ท้ายรถ, แผงแอดมินแบนด้วย token, ธนาคาร+ATM, ลำโพงเปิดเพลง YouTube, หมอดูเซียมซี\u002Fไพ่ยิปซี, โทรศัพท์ ESX, หน้าจอตาย, ขายยา, งัดบ้าน, มินิเกม, ESX Legacy Core X3D Build, หน้าโหลด, Notify, Progress Bar, ไอเทมใช้ได้, สไลด์, ตกแต่งตัวละคร, เมนูหลัก, Daily Login, Mailbox, Carry, Environment","2026-09-18","2026-10-11",{"slug":30,"title":31,"description":32,"date":33,"updated":20},"fivem-stuck-loading-screen","FiveM ค้างหน้าโหลด เข้าเซิฟไม่ได้ แก้ยังไง — ฝั่งผู้เล่นและฝั่งเจ้าของเซิฟ (2026)","FiveM ค้างหน้าโหลด ค้างหน้า Rockstar ค้างหน้า Connecting ค้างหน้าโหลดที่มีเพลง จอดำ จอขาว เข้าเซิฟไม่ได้ รวมวิธีแก้ทีละขั้นสำหรับผู้เล่น (ล้างแคช ย้ายลง SSD ปิด ReShade ตรวจไฟล์เกม) และสาเหตุฝั่งเซิฟที่เจ้าของต้องแก้เอง (หน้าโหลดจอขาว resource ค้าง core ปล่อยลงเมืองก่อนโหลดเสร็จ)","2026-09-24",{"slug":35,"title":36,"description":37,"date":38,"updated":39},"open-fivem-server-budget","เปิดเซิฟ FiveM กี่บาท ใช้อะไรบ้าง — งบและสคริปที่ต้องมี ตั้งแต่ 32 คนถึงเมือง 2,000 คน (2026)","รวมสคริปที่จำเป็นสำหรับเปิดเซิร์ฟเวอร์ FiveM 2026 พร้อมงบ 3 สเกล: เริ่มต้น 32–64 คน, เปิดสาธารณะ 128–500 คน, เมืองใหญ่ 1,000–2,048 คน (Element Club Platinum, เครื่อง dedicated, เสียงแยก, DB แยก, ทีมงาน) ตัวไหนใช้ของฟรีได้ ตัวไหนควรจ่าย ตัวไหนต้องเขียนใหม่เมื่อคนถึงสองพัน","2026-09-15","2026-10-14",{"slug":41,"title":42,"description":43,"date":44,"updated":39},"fivem-scripts-guide","สคริป FiveM คืออะไร มีกี่แบบ และเลือกอย่างไรให้เซิร์ฟไม่หน่วง","คู่มือสคริป FiveM ฉบับเข้าใจง่าย: ประเภทสคริป (HUD, อาชีพ, คาสิโน, แอนตี้โกง, ล้างแมพ) ความต่าง ESX\u002FQBCore\u002FStandalone และวิธีเลือกให้เหมาะกับเซิร์ฟของคุณ","2026-09-16",[],{"site":47,"contact":49,"seo":50,"payment":51},{"name":5,"host":6,"default_locale":7,"locales":48},[7,9],{"discord_invite":11,"email":12,"line":12},{"google_site_verification":12,"bing_site_verification":12},{"bank_name":12,"account_name":12,"account_no":12,"promptpay_id":12},[],1792316311042]