[{"data":1,"prerenderedAt":100},["ShallowReactive",2],{"site":3,"config-slug-site":15,"config-product-en-x3d-slots":21,"config-public-x3d-slots":99},{"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},{"site":16,"contact":18,"seo":19,"payment":20},{"name":5,"host":6,"default_locale":7,"locales":17},[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},{"id":22,"slug":23,"name":24,"summary":25,"price_thb":26,"license_mode":27,"cover_key":28,"cover_url":29,"category_slugs":30,"tags":34,"latest_version":49,"latest_released_at":50,"published_at":51,"has_docs":52,"config":53,"rent_price_satang":54,"description_md":55,"docs_md":56,"seo_title":57,"seo_description":58,"media":59,"versions":78},"47a33337-7dcf-4a78-b056-4b3e324a648d","x3d-slots","X3D Slots 1024 Ways","1,024-way cascading slot, Mahjong style, 97.5% RTP. Server-authoritative spins, anti-exploit, with free spins, multipliers and big-win scenes.",250000,"shop_license","public\u002Fproducts\u002Fx3d-slots\u002Fcover\u002Fd09c2066a6ea2968.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-slots\u002Fcover\u002Fd09c2066a6ea2968.jpg",[31,32,33],"casino","economy","entertainment",[35,36,37,38,31,39,40,41,42,43,44,45,46,47,48],"esx","standalone","คาสิโน","สล็อต","slot","มินิเกม","minigame","RTP 97.5%","มาห์จอง","คาสเคด","ฟรีสปิน","ตู้สล็อต","ซื้อฟีเจอร์","ปรับ RTP","1.1.4","2026-10-12T17:13:01.863556Z","2026-09-14T15:28:02.281478Z",true,"owners",50000,"# 1,024-Way Cascading Mahjong Slot for FiveM ESX\r\n\r\nA Mahjong-themed slot machine you place in the city; players walk up, press **[E]** and play. 1,024-way Cascade\u002FTumble spins with free spins, multipliers, buy-feature and BIG \u002F MEGA \u002F SUPER WIN celebration scenes. Every spin is **resolved on the server**; the client only renders the result, so outcomes cannot be tampered with from the client side.\r\n\r\n---\r\n\r\n## Features\r\n\r\n- [+] Easy setup: tune everything in config, or set it from the web builder\r\n- [+] Every spin is resolved on the server; the client only shows the result\r\n- [+] One value, `PayScale`, moves the RTP without touching the paytable\r\n- [+] Set your own bet steps; bets outside the list are rejected\r\n- [+] Per-spin win cap and a daily house-loss limit that closes the machines\r\n- [+] Free spins: 3 scatters = 10 spins, with a retrigger cap you set\r\n- [+] Buy feature can be turned on or off and priced as a multiple of the bet\r\n- [+] Set your own BIG \u002F MEGA \u002F SUPER WIN thresholds\r\n- [+] Any number of machines, with your own positions, prop, blip and sounds\r\n- [+] Recolour the Mahjong UI from a single theme file\r\n- [+] Event logs to a Discord webhook, split by event\r\n- [+] Hook it into other scripts in addons\u002F\r\n\r\n---\r\n\r\n## Gameplay\r\n\r\n- **1,024 ways** — winning symbols burst and new ones tumble in (Cascade), so a single spin can chain several wins\r\n- **97.5% RTP** tuned out of the box; adjust it with one value, `Config.PayScale`, instead of guessing at a paytable\r\n- **Free spins** — 3 scatters = 10 spins, retriggerable with a configurable cap · **Buy feature** can be toggled and priced as a multiple of the bet\r\n- **Multipliers** accumulate through cascades and during free spins\r\n- **Celebration scenes** with your own big\u002Fmega\u002Fsuper thresholds (defaults 10×\u002F25×\u002F50×), count-up and coin timing\r\n- **Mahjong-style UI** — wood frame, felt table; every colour is editable from a single theme file\r\n\r\n## Anti-exploit and economy controls\r\n\r\n- **All spin results are computed server-side**; the client sends only \"spin\" and the bet amount\r\n- **Bets outside the allowed list are rejected** (`Config.BetSteps`), with a rate limit against spin spam\r\n- **Per-spin win cap** (`Config.MaxWinX`) and **automatic machine suspension when the house loses more than a daily limit** (`Config.DailyMaxLoss`)\r\n- **Event logging** for spin \u002F bigwin \u002F buyfeature \u002F suspend \u002F settle to a Discord webhook, azael, or your own adapter\r\n- Core game code in `core\u002F` is encrypted; everything in `config\u002F` and `addons\u002F` is yours to edit\r\n\r\n## Wire it into your server\r\n\r\n- **Server hooks** — `canPlay` (e.g. VIP only), `getMachines` (place machines from your zone system), `onSpinResolved`, `onBigWin`, `onSettle`\r\n- **Client hooks** — `onOpenUI` \u002F `onCloseUI` (hide HUD, blur, freeze the player), `drawPrompt` (switch to ox_target \u002F textUI), `onSessionSummary`\r\n- **Any number of machines**, each with its own position; prop, blip and audio are set in config\r\n- Thai \u002F English switchable in config\r\n\r\n## Requirements\r\n\r\nESX Legacy (`es_extended`) · `oxmysql` · MySQL · run `install.sql` once · put the key from your account page in `config\u002Fconfig.license.lua`, then `ensure x3d_slots`\r\n\r\nOne-time purchase with free version updates from your account page. Try it free for 7 days from the button on this page before you decide.\r\n","## Installation\n\n**Requires:** ESX Legacy (`es_extended`) · `oxmysql` · MySQL\n\n1. Run `install.sql` on your database (creates stats \u002F pending-round tables)\n2. Put the `x3d_slots` folder in `resources\u002F`\n3. Paste your key from your account page ([fivem.x3d-developer.com](https:\u002F\u002Ffivem.x3d-developer.com)) into `config\u002Fconfig.license.lua`\n   → `X3D_LICENSE_KEY = 'X3D-XXXXX-XXXXX-XXXXX-XXXXX'`\n   (or use a convar `set x3d_license_x3d_slots \"...\"` in `server.cfg`)\n4. `ensure x3d_slots` in `server.cfg`, then restart the server\n5. Walk to a machine, press **[E]** to play\n\n> Everything in `config\u002F` and `addons\u002F` is freely editable (warranty intact) · `core\u002F` is encrypted and not editable\n\n---\n\n## Game settings — `config\u002Fconfig.slots.lua`\n\n| Field | What it does |\n|-------|--------------|\n| `Config.PayScale` | **Main RTP knob** (default RTP 97.5%) · higher = players win more · change only this one |\n| `Config.BetSteps` | Selectable bet amounts (server rejects values off the list) |\n| `Config.MaxWinX` | Max win per spin (× bet) |\n| `Config.DailyMaxLoss` | House loss\u002Fday over this = machines auto-close (0 = unlimited) |\n| `Config.BigWinX` | Win multiple that triggers `onBigWin` hook + bigwin log |\n| `Config.Machines` | Machine positions (add as many as you like, unique `id`) |\n\n**Free spins \u002F Buy feature**\n- `Config.FreeSpinBase` (3 scatter = 10 spins) · `Config.FreeSpinCap` (retrigger cap)\n- `Config.BuyFeature.enabled` toggle buy button · `Config.BuyFeature.costMul` = price (floor(bet × costMul))\n\n> ⚠ `Paytable`, `Weights*`, `MultBase\u002FFree`, `GoldChance` are tuned for RTP 97.5% — changing them shifts RTP. Don't guess; use `PayScale` instead.\n\n**Celebrations** `Config.Celebration.tiers` — big\u002Fmega\u002Fsuper thresholds (× bet, default 10\u002F25\u002F50) + count-up\u002Fcoin timing\n\n**Game feel** `Config.Timing` — spin\u002Ftease\u002Fcascade speed (no RTP impact) · set `Config.Debug = true` and press `` ` `` in-game for a live tuning panel\n\n---\n\n## General — `config\u002Fconfig.general.lua`\n\n| Field | What it does |\n|-------|--------------|\n| `Config.Locale` | Language `'th'` \u002F `'en'` |\n| `Config.Debug` | `true` = live tuning panel (must be `false` in production) |\n| `Config.StreamDistance` | Machine prop spawn\u002Fdespawn range |\n| `Config.InteractDistance` | [E] prompt range |\n| `Config.RateWindow` \u002F `Config.RateMax` | Spin spam guard |\n| `Config.TimezoneOffset` | Timezone for daily reset (Thailand = 7) |\n\n---\n\n## Machine \u002F prop \u002F blip \u002F audio — `config\u002Fconfig.models.lua`\n\n- `Config.MachineProp` — toggle + change the machine prop `model`\n- `Config.Blip` — map blip (sprite\u002Fcolor\u002Fscale\u002Fname · `perMachine` = every machine or grouped)\n- `Config.Audio` — in-world sounds (open \u002F bigwin)\n\n---\n\n## Colors \u002F Theme — `config\u002Fconfig.theme.lua`\nAll colors are `#RRGGBB` codes — edit any single one. Applies to both the **slot window (NUI)** and the **in-game [E] prompt** · `restart x3d_slots` after editing.\n\n[E] prompt — `Config.Theme.prompt`\n\n| Field | Controls |\n|-------|----------|\n| `key` | [E] color when in press range |\n| `keyIdle` | [E] color when out of range |\n| `label` | label text color (e.g. \"Play Slots\") |\n| `outline` | `true`\u002F`false` black outline + shadow |\n\nSlot window — `Config.Theme.ui`\n\n| Field | Controls |\n|-------|----------|\n| `accent` | main color: buttons\u002Factive border\u002Fhighlight |\n| `accentDark` | darker tone of the primary button |\n| `gold` | money\u002Ftotal\u002Fwin labels |\n| `goldBright` | bright gold: active multiplier \u002F BIG-MEGA WIN banner |\n| `surface1` `surface2` `surface3` | panel surfaces (dark→light) |\n| `woodHi` `woodMid` `woodLo` `woodEdge` | machine wood frame |\n| `cellTop` `cellBot` `cellEdge` | info cells (balance\u002Fwin\u002Fbet) |\n| `felt1` `felt2` `felt3` | reel field (behind the reels) |\n\nExample jade theme: `accent = '#35D4AC'`, `accentDark = '#157F66'`,\n`woodHi\u002FMid\u002FLo\u002FEdge = '#1C6B57'\u002F'#124036'\u002F'#0E332B'\u002F'#0A251F'`,\n`surface1\u002F2\u002F3 = '#0B1513'\u002F'#101D1A'\u002F'#1A2B27'` (felt can stay green).\n\n---\n\n## Logging — `config\u002Fconfig.log.lua`\n\n`Config.Log.adapter` picks the sink: `none` \u002F `print` \u002F `discord` (direct webhook) \u002F `azael` \u002F `custom`\n- `Config.Log.events` — which events to log (`spin`\u002F`bigwin`\u002F`buyfeature`\u002F`suspend`\u002F`settle`)\n- ⚠ `spin = true` logs every spin — floods Discord with many players; enable only for debugging\n- discord: set `webhooks` (per-event) + username\u002Favatar\u002Fcolors\n\n---\n\n## Hooks — `config\u002Ffunctions\u002F` (wire in your own Lua)\n\n**Server** `config.functions.server.lua`\n\n| Hook | When |\n|------|------|\n| `canPlay(e)` | Gate before opening (`return false` = block), e.g. VIP only |\n| `getMachines()` | Provide machine positions from your zone system (nil = use `Config.Machines`) |\n| `onSpinResolved(e)` | After a spin resolves (logs\u002Fstats) |\n| `onBigWin(e)` | Win over `Config.BigWinX` (announce\u002Fwebhook) |\n| `onSettle(e)` | After money actually moves |\n\n**Client** `config.functions.client.lua`\n\n| Hook | When |\n|------|------|\n| `onOpenUI(e)` | Panel opened (hide HUD \u002F blur \u002F freeze \u002F sound) |\n| `onCloseUI(e)` | Panel closed (restore) |\n| `drawPrompt(e)` | Draw the [E] prompt yourself (swap to ox_target \u002F textUI · `return true`) |\n| `onMachineEnter\u002FExit(e)` | Enter\u002Fleave machine range |\n| `onSessionSummary(e)` | Summary on close (notify yourself · `return true`) |\n\n> Each file ships with ready copy-paste examples in the comments\n\n---\n\n## Troubleshooting\n- **No machines** = license not activated (check server console) or `install.sql` not run\n- **Console shows LICENSE CHECK FAILED** = wrong\u002Fexpired key or bound to another IP — check your account page\n- **RTP off** = you changed something other than `PayScale` — restore defaults and tune only `PayScale`\n- **Config change not applying** = you didn't `restart x3d_slots` (theme\u002F`web\u002F` changes need a restart)\n","FiveM ESX 1024-Way Slot Script","1,024-way cascading slot for FiveM ESX. 97.5% RTP, server-authoritative spins, free spins, multipliers, big-win scenes. Configurable, easy setup.",[60,63,65,67,69,71,73,75],{"kind":61,"url":62},"image","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-slots\u002Fmedia\u002F59d8fc97da242d20.png",{"kind":61,"url":64},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-slots\u002Fmedia\u002Fe7d043a4109039fa.png",{"kind":61,"url":66},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-slots\u002Fmedia\u002F6468365dc72e8053.png",{"kind":61,"url":68},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-slots\u002Fmedia\u002F4852cd593b2cf3b8.png",{"kind":61,"url":70},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-slots\u002Fmedia\u002F87024bdcda932663.png",{"kind":61,"url":72},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-slots\u002Fmedia\u002F1a4c3f07344b28dc.png",{"kind":61,"url":74},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-slots\u002Fmedia\u002Fa425cb91c7eabeb9.png",{"kind":76,"url":77},"video_url","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=MHdyZx90CQY",[79,81,85,89,92,95],{"version":49,"released_at":50,"changelog_md":80},"### Changed\n\n- Store images now carry English captions for the English store page",{"version":82,"released_at":83,"changelog_md":84},"1.1.2","2026-10-12T03:22:09.295203Z","### Changed\n\n- UI font is now Kanit (one family for Thai and English), bundled inside the script; the Thai font now really loads in game (FiveM's browser dropped the old font declaration and fell back to a system font)\n- New store images",{"version":86,"released_at":87,"changelog_md":88},"1.1.1","2026-10-11T09:23:42.275749Z","### Changed\n\n- Machine `[E]` label uses the X3D 3D-text standard (outlined Thai text); `Config.Theme.prompt.key` \u002F `keyIdle` still colour it",{"version":90,"released_at":91,"changelog_md":12},"1.0.2","2026-09-15T12:04:46.451723Z",{"version":93,"released_at":94,"changelog_md":12},"1.0.1","2026-09-14T19:16:35.948232Z",{"version":96,"released_at":97,"changelog_md":98},"1.0.0","2026-09-14T15:27:47.553683Z","### Added\n- 1,024-way cascading slot, server-authoritative, 97.5% RTP\n- Free spins, buy-feature, multiplier ladder\n- Escalating Big \u002F Mega \u002F Super Mega win scenes\n- Online license (activate\u002Fheartbeat, IP-bound, revocable)",null,1792316314749]