01配置
快速安装 · config.lua · Agency-Lifeinvader V3
--[[ ============================================================================
AGENCY LIFEINVADER 3.2 · config.lua
----------------------------------------------------------------------------
The ad agency of the city. Players write ads that run across the screen of
every player: categories, boosts, scheduling, drafts, a live feed, review
by admins or the staff of the agency job, and an Auto-Check for spam.
Finds QBCore, Qbox or ESX by itself and runs fully standalone without any
of them, with or without a database.
Admins change prices, review and the categories in the menu (/aladmin,
tab Settings). Those values are saved for the whole server and win over
this file until "Reset to config.lua" is pressed.
============================================================================ ]]
Config = {}
-- =============================================================================
-- 1. GENERAL
-- =============================================================================
Config.Framework = 'auto' -- 'auto' | 'qbcore' (also Qbox) | 'esx' | 'standalone'
Config.Locale = 'en' -- en de fr es it pt nl pl cs sv da no fi ro hu hr bg el tr ru uk ar hi ja ko zh
-- Debug mode: every request and every ad of the queue in the server console.
-- Admins can switch it in the menu as well.
Config.Debug = false
-- Where ads, drafts and player settings are saved. 'auto' uses oxmysql when
-- it runs (the V3 tables, created and upgraded by themselves) and otherwise
-- the server's own key value store, so a server without a database works too.
Config.Storage = 'auto' -- 'auto' | 'mysql' | 'kvp'
-- How messages are shown: 'auto' = Agency-Notify when it runs, then a
-- notification on Agency Phone, then your framework, then the GTA feed.
-- While the app is open, messages appear in it.
-- Agency-Notify is free: https://agencyscripts.dev/en/product/notify
Config.Notify = 'auto' -- 'auto' | 'agency' | 'framework' | 'gta'
-- =============================================================================
-- 2. LOOK
-- =============================================================================
Config.UI = {
brand = 'LIFEINVADER', -- name in the app and on every ad
subtitle = '', -- line under the name, '' = "Ad agency" in the server language
-- A file in html/, a nui:// or https:// link, or '' for a megaphone icon.
-- Best as a square PNG with a transparent background (logo.png is the
-- gold Agency logo).
logo = 'logo.png',
tintLogo = false, -- true draws the logo in the accent colour (good for a white logo)
accent = '#E2B649', -- accent colour of app and ads (Agency gold)
scale = 1.0, -- size of the app, 0.8 to 1.3 (players size their ad banners themselves)
}
-- =============================================================================
-- 3. KEYS AND COMMANDS
-- =============================================================================
-- Players can change both keys in the GTA settings (Key Bindings > FiveM).
-- F6 is free in all Agency scripts (Vehiclekeys F5, Housing F7, Admin F10).
Config.Keys = {
open = 'F6', -- opens the app
feed = '', -- opens the live feed directly, '' = no key (players can set one)
}
Config.Commands = {
open = 'alad', -- the app
feed = 'alfeed', -- the live feed
test = 'altest', -- shows a sample ad to yourself, to try the banner position
admin = 'aladmin', -- admin panel
agency = 'alagency', -- staff panel of the ad agency job
}
-- =============================================================================
-- 4. ADS
-- =============================================================================
Config.Ads = {
minLength = 10, -- characters an ad needs at least
maxLength = 300, -- characters at most
maxLines = 6, -- lines one ad may have
maxRepetitions = 5, -- how often one ad may run (categories can lower it)
interval = { min = 30, max = 300, default = 60 }, -- seconds between two runs of the same ad
duration = { min = 5, max = 60, default = 8 }, -- seconds an ad stays on screen
delays = { 0, 10, 30, 60, 300 }, -- start delays the form offers, in seconds
anonymous = true, -- players may post without their name
schedule = { enabled = true, maxHoursAhead = 24 }, -- post an ad for a later time
-- Seconds between two ads across the whole city. Ads wait in a queue and
-- never flood the screen, however many are booked.
gap = 15,
maxOnScreen = 3, -- banners on a player's screen at the same time
}
Config.Boost = {
enabled = true,
multiplier = 2.0, -- a boosted ad costs this many times the price
priority = 8, -- and jumps this far ahead in the queue
}
-- =============================================================================
-- 5. PRICES AND PAYMENT
-- =============================================================================
-- Price of one run = (base + perSecond x seconds on screen) x category factor,
-- times 2 with a boost. The total is that times the number of runs.
Config.Pricing = {
base = 5000,
perSecond = 500,
}
Config.Money = {
-- What players pay with. The first one is picked in the form, the player
-- can switch when there are more. 'bank' | 'cash'
methods = { 'bank', 'cash' },
currency = '$',
-- Rejected, withdrawn and stopped ads pay back what has not run yet.
-- A player who is offline gets it the next time he joins.
refunds = true,
-- Agency Pay from Agency Phone: the phone opens, the player confirms the
-- payment there, the money comes from his bank account. Offered as soon
-- as the phone runs; enabled = false hides it.
agencyPay = { enabled = true, resource = 'agency-phone', timeout = 90 },
}
-- =============================================================================
-- 6. CATEGORIES
-- =============================================================================
-- id stays the same once ads use it
-- label used when the language files have no text for this id
-- icon briefcase car home wrench party pin food shop music heart star megaphone tag bolt
-- price factor on the price (0.9 = 10 % cheaper)
-- priority places ahead in the queue
-- review ads of this category always wait for a staff member
-- maxRepetitions runs at most (below Config.Ads.maxRepetitions)
-- minInterval seconds at least between two runs
Config.Categories = {
{ id = 'jobs', label = 'Jobs', icon = 'briefcase', price = 0.9, priority = 2, review = false, maxRepetitions = 4, minInterval = 30 },
{ id = 'vehicles', label = 'Vehicles', icon = 'car', price = 1.15, priority = 1, review = false, maxRepetitions = 5, minInterval = 45 },
{ id = 'realestate', label = 'Real Estate', icon = 'home', price = 1.25, priority = 1, review = true, maxRepetitions = 4, minInterval = 60 },
{ id = 'services', label = 'Services', icon = 'wrench', price = 1.0, priority = 2, review = false, maxRepetitions = 5, minInterval = 30 },
{ id = 'events', label = 'Events', icon = 'party', price = 1.1, priority = 3, review = false, maxRepetitions = 5, minInterval = 30 },
{ id = 'other', label = 'Other', icon = 'pin', price = 1.0, priority = 0, review = false, maxRepetitions = 3, minInterval = 45 },
}
-- =============================================================================
-- 7. REVIEW
-- =============================================================================
Config.Review = {
-- Every ad waits for an admin or a staff member of the agency before it
-- runs. Admins switch this in the menu.
required = false,
-- Auto-Check: simple rules on your own server, no outside service. It
-- looks for shouting, links, phone number walls, repeated texts and spam
-- and holds such ads back for review. Admins see why.
autoCheck = {
enabled = true,
holdOnFlag = true, -- flagged ads wait for review
threshold = 4, -- penalty points that count as flagged
duplicateMinutes = 30, -- the same text again within this time is a repeat
duplicateLimit = 1, -- repeats allowed before it counts
links = { 'http://', 'https://', 'www.', 'discord.gg', 'bit.ly' },
suspicious = { '@everyone', 'free money', 'hack', 'exploit', 'cheap cash', 'real money' },
blocked = {}, -- ads with one of these words are refused outright
points = {
duplicate_message = 3, aggressive_frequency = 2, excessive_caps = 1, excessive_symbols = 1,
external_link = 2, contact_heavy = 1, suspicious_term = 2, long_copy = 1,
},
},
}
-- =============================================================================
-- 8. LIMITS PER PLAYER
-- =============================================================================
Config.Limits = {
cooldown = 45, -- seconds between two ads of one player
maxWaiting = 3, -- ads waiting for review
maxRunning = 4, -- ads running or scheduled
maxDrafts = 12,
staffBypass = true, -- admins are not limited
}
-- =============================================================================
-- 9. AD BANNERS
-- =============================================================================
-- Defaults for every player. Players change position, size, sound and the
-- categories they want to see in the app (tab Settings).
Config.Banner = {
position = 'middle-left', -- 'top-left' | 'top-right' | 'middle-left' | 'middle-right' | 'bottom-left' | 'bottom-right'
scale = 1.0, -- 0.8 to 1.3
sound = true,
width = 380, -- pixels
showAuthor = true, -- false hides who posted, on every ad
sounds = {
ad = { name = 'TEXT_ARRIVE_TONE', set = 'HUD_AWARDS' },
publish = { name = 'PURCHASE', set = 'HUD_LIQUOR_STORE_SOUNDSET' },
},
}
-- =============================================================================
-- 10. THE AD AGENCY (JOB)
-- =============================================================================
-- Staff of the agency get a panel (/alagency): the company account, what
-- the ads earn, and the review of waiting ads. The company earns a share of
-- every ad as it runs; the staff member who approved an ad gets a commission
-- on every run of it.
Config.Agency = {
enabled = true,
job = 'lifeinvader', -- job of the staff (QBCore, Qbox, ESX)
ace = 'agency.lifeinvader.staff', -- without a framework: players with this ACE are staff
grade = 0, -- lowest job grade that opens the panel
bossGrade = 3, -- grade that may take money out of the company account
review = true, -- staff may approve and reject waiting ads
revenue = 100, -- % of every ad's price that goes to the company account
commission = 10, -- % for the staff member who approved the ad, taken from the company share
account = 'lifeinvader', -- name of the company (society) account
-- 'auto' finds Renewed-Banking, qb-banking, qb-management, okokBanking and
-- esx_addonaccount (society_<account>). 'internal' keeps the money in
-- this script; bosses pay it out in the panel.
bank = 'auto',
payTo = 'bank', -- commission and payouts go to 'bank' or 'cash'
}
-- =============================================================================
-- 11. AGENCY PHONE AND AGENCY PAD
-- =============================================================================
-- When Agency Phone or Agency Pad (27.0.2 or newer) runs on the server,
-- Lifeinvader puts its own app on them by itself: the live feed, new ads,
-- my ads and drafts, right on the device. Nothing to set up.
Config.Devices = {
phone = true, -- app on Agency Phone
pad = true, -- app on Agency Pad
label = 'Lifeinvader',
installed = true, -- already on the home screen, not only in the App Store
-- Messages about your ads (approved, rejected, refunds) come as app
-- notifications on the phone while its app is there.
notifications = true,
}
-- =============================================================================
-- 12. ADMINS
-- =============================================================================
-- Admins: players with the ACE below, group.admin or group.superadmin, one of
-- the framework groups, or one of the identifiers.
Config.Admin = {
ace = 'agency.lifeinvader.admin',
groups = { 'admin', 'god', 'superadmin' },
identifiers = {
-- 'license:xxxxxxxx', 'discord:xxxxxxxx', 'steam:xxxxxxxx',
},
}
-- =============================================================================
-- 13. HISTORY
-- =============================================================================
Config.History = {
keepDays = 30, -- finished ads and admin log entries older than this are removed
feed = 30, -- ads in the live feed
mine = 20, -- a player's own ads in "My ads"
}
-- =============================================================================
-- 14. STANDALONE
-- =============================================================================
-- Without QBCore, Qbox or ESX:
-- money: 'auto' uses Agency-Banking when it runs, otherwise ads are free.
-- 'hooks' uses the functions below, 'free' never charges.
-- staff: players with Config.Agency.ace, admins by Config.Admin.
Config.Standalone = {
money = 'auto', -- 'auto' | 'banking' | 'hooks' | 'free'
-- getMoney = function(src, account) return 0 end, -- account: 'cash' | 'bank'
-- removeMoney = function(src, account, amount) return true end,
-- addMoney = function(src, account, amount) return true end,
-- getName = function(src) return GetPlayerName(src) end, -- the character name on ads
-- addCompanyMoney = function(account, amount) return true end, -- company account of the agency
}
-- =============================================================================
-- 15. YOUR OWN WORDING
-- =============================================================================
-- Any text of the language files can be replaced here and survives updates:
-- Config.Text = { ui_publish = 'Send it!', ad_published = 'Your ad is live.' }
Config.Text = {}
02SQL 文件
可选:资源启动时会自动创建这些数据表。只有在手动配置数据库时才需要导入此文件:
-- =============================================================================
-- Agency Lifeinvader 3.2: database tables (OPTIONAL)
-- -----------------------------------------------------------------------------
-- You do not need to run this file. With oxmysql the script creates these
-- tables on the first start and upgrades the tables of Lifeinvader V2 and V3
-- in place. Run it only if your server creates tables by hand.
-- =============================================================================
CREATE TABLE IF NOT EXISTS `lifeinvader_ads` (
`id` INT NOT NULL AUTO_INCREMENT,
`identifier` VARCHAR(100) NOT NULL,
`author_name` VARCHAR(100) DEFAULT NULL,
`message` TEXT NOT NULL,
`category` VARCHAR(50) DEFAULT 'other',
`anonymous` TINYINT DEFAULT 0,
`boosted` TINYINT DEFAULT 0,
`repetitions_total` INT DEFAULT 1,
`repetitions_left` INT DEFAULT 1,
`interval_seconds` INT DEFAULT 60,
`display_duration` INT DEFAULT 8,
`status` VARCHAR(16) NULL DEFAULT 'active',
`approved` TINYINT DEFAULT 1,
`approved_by` VARCHAR(100) DEFAULT NULL,
`rejected_reason` TEXT DEFAULT NULL,
`next_send_time` DATETIME DEFAULT NULL,
`scheduled_for` DATETIME DEFAULT NULL,
`review_requested_at` DATETIME DEFAULT NULL,
`reviewed_at` DATETIME DEFAULT NULL,
`review_decision` VARCHAR(32) DEFAULT NULL,
`queue_priority` INT DEFAULT 0,
`ai_score` INT DEFAULT 0,
`ai_flags` LONGTEXT DEFAULT NULL,
`admin_notes` LONGTEXT DEFAULT NULL,
`price_paid` INT DEFAULT NULL,
`paid_with` VARCHAR(16) DEFAULT NULL,
`refunded` INT DEFAULT 0,
`reviewer` VARCHAR(100) DEFAULT NULL,
`sent_count` INT DEFAULT 0,
`last_sent_at` DATETIME DEFAULT NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_identifier` (`identifier`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `lifeinvader_ad_drafts` (
`id` INT NOT NULL AUTO_INCREMENT,
`identifier` VARCHAR(100) NOT NULL,
`title` VARCHAR(120) DEFAULT NULL,
`message` TEXT NOT NULL,
`category` VARCHAR(50) DEFAULT 'other',
`anonymous` TINYINT DEFAULT 0,
`boosted` TINYINT DEFAULT 0,
`repetitions_total` INT DEFAULT 1,
`interval_seconds` INT DEFAULT 60,
`display_duration` INT DEFAULT 8,
`delay` INT DEFAULT 0,
`scheduled_for` DATETIME DEFAULT NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_identifier` (`identifier`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `lifeinvader_player_settings` (
`id` INT NOT NULL AUTO_INCREMENT,
`identifier` VARCHAR(100) NOT NULL,
`notification_position` VARCHAR(20) DEFAULT 'middle-left',
`notification_enabled` TINYINT DEFAULT 1,
`notification_scale` FLOAT DEFAULT 1.0,
`ui_transparency` FLOAT DEFAULT 0.55,
`accent_color` VARCHAR(20) DEFAULT NULL,
`sound_enabled` TINYINT DEFAULT 1,
`admin_panel_scale` FLOAT DEFAULT 1.0,
`muted_categories` VARCHAR(255) DEFAULT NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_identifier` (`identifier`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `lifeinvader_admin_logs` (
`id` INT NOT NULL AUTO_INCREMENT,
`admin_identifier` VARCHAR(100) DEFAULT NULL,
`admin_name` VARCHAR(100) DEFAULT NULL,
`action` VARCHAR(64) NOT NULL,
`ad_id` INT DEFAULT NULL,
`metadata` LONGTEXT DEFAULT NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_action` (`action`),
KEY `idx_ad_id` (`ad_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+值得了解
config.lua 包含 14 个带注释的部分,涵盖从框架到自定义文案的各项设置。价格、审核规则、推广和类别也可以在游戏内的 Admin 面板中修改,并对整个服务器生效。
- 常规设置和外观
- Config.Framework、Config.Locale、Config.Debug、Config.Storage 和 Config.Notify 分别用于选择框架、语言、调试模式、数据存储位置和消息显示方式。Config.UI 用于设置品牌名称、副标题、徽标、强调色和应用大小。
- 按键和命令
- Config.Keys 用于设置 F6 和直播动态的可选按键,Config.Commands 用于设置 /alad、/alfeed、/altest、/aladmin 和 /alagency 的名称。
- 广告和推广
- Config.Ads 用于设置时长、行数、播放次数、间隔、屏幕显示时长、启动延迟、匿名广告、排期、两条广告之间的间隔,以及屏幕同时显示的横幅数量。Config.Boost 用于设置价格系数,以及推广广告向前提升的幅度。
- 价格和付款
- Config.Pricing 用于设置基础价格和屏幕显示每秒的价格。Config.Money 用于设置银行账户和现金、货币、退款以及 Agency Pay。
- 类别
- Config.Categories 列出六个类别,并包含图标、价格系数、优先级、审核、播放次数和间隔。
- 审核
- Config.Review 用于决定是否需要审核每条广告,以及自动审核如何评估链接、全大写文本、符号、数字、重复内容、可疑词语和屏蔽词语。
- 限制
- Config.Limits 设置同一玩家两次发布广告之间的冷却时间、每位玩家等待中和正在发布的广告数量、草稿数量,以及是否限制管理员。
- 横幅、工作和设备
- Config.Banner 设置横幅的默认位置、尺寸、声音和宽度。Config.Agency 设置工作、等级、收入分成、佣金和公司账户,Config.Devices 设置 Agency Phone 和 Agency Pad 上的应用。
- 管理员、历史记录、独立模式和文案
- Config.Admin 设置管理员 ACE、群组和标识符,Config.History 设置广告的保留时间,Config.Standalone 设置不使用框架时的资金,Config.Text 用于替换任何文本,让自定义文案在更新后保留。
?常见问题
管理面板中的设置会更改什么?
审核规则、匿名广告、调试模式、价格、广告间隔、推广置顶和所有类别。这些设置会保存到整个服务器,并优先于 config.lua,直到按下 Reset to config.lua,或在控制台中运行 lifeinvader reset。
如何更改文本?
使用语言文件中的键将文本添加到 Config.Text 中,例如 Config.Text = { ui_publish = '发送!' }。更新后也会保留。
