📢 Ads System - Modern Advertisement Suite for QB-Core / QBox
One command. Searchable composer. Job-gated broadcasts. Per-ad billing. Discord logs. Admin panel. Built for QB-Core and QBox./ads opens a polished NUI composer where players write predefined ads (police callouts, EMS notices, mechanic specials, taxi calls, anonymous messages, custom business ads…) - sent as a clean, scrollable banner that broadcasts to every player on the server. Server-side cooldowns, billing, profanity filter, and oxmysql history out of the box.
✨ Headline Features
- 🔍 Searchable Composer - Type to filter ad types instantly. Job-gated entries hidden automatically.
- 📋 Predefined Ads - Police, EMS, Mechanic, Taxi, Realtor, Lawyer, Anonymous, General - fully editable in
shared/adtypes.lua. - ✏️ Custom Ads Tab - Players craft their own banners with title, message, category, logo URL, background URL, text colour, and sound. Live preview while typing.
- 🕒 Personal History - Last 50 ads stored per player. One-click Resend pre-fills the composer.
- 🛡️ Admin Panel - Recent-ads audit, ban / unban / edit ban per CitizenID, ad scheduling (date + time + sender + subject + message), kill running ad, disable system, clear stuck broadcast lock.
- 💰 Per-Ad Billing - Each predefined ad has its own price. Custom ads charged a flat fee from bank. Cash-first / bank-first toggle.
- ⏱️ Server-Side Cooldowns - Per-player throttle, configurable. Cooldown bar shown in the UI.
- 🚫 Word Filter - Block or censor profanity (configurable list, action
blockorcensor). - 📡 Discord Logging - Rich embed sent on every ad. Webhook URL configurable.
- 🗄️ oxmysql History - Auto-creates
ads_historytable. Per-player row limit configurable. - 🔊 Sound System - OGG via NUI (default) or GTA frontend beep fallback. Per-ad-type sound override.
- 📍 Banner Positions -
top-center,top-left,top-right,bottom-center,bottom-left,bottom-right. - 🎨 Banner Branding - Per-type logo, background, text colour. Player-defined colours on custom ads.
- 🧭 Job Gating -
allowedJobs = { 'police', 'lspd', 'sheriff' }. Empty = everyone.adminOnly = truefor staff-only types. - ⚙️ Framework Detection -
Config.Framework = 'auto'finds QB-Core or qbx_core; force either if you prefer.