Agency Docs
QBESXStandalone

Agency-Blackmarket V2 配置

一个鲜活的 FiveM 黑市,可运行在 QBCore、Qbox、ESX 上,也可完全独立运行(standalone)。贩子在城市中四处移动,只对附近的玩家现身;价格随市场波动,库存会卖光,限时特卖来来去去。玩家可以在小游戏里讲价,预订商品并.

v2.0.0付费6 页面

01配置

快速安装 · config.lua · Agency-Blackmarket V2

下载 config.lua

--[[ ============================================================================ AGENCY BLACKMARKET V2 · CONFIG ---------------------------------------------------------------------------- Every option in this file does something. Prices, levels, dealers, drop points and police behaviour are all set here; wording is set in the locales/ folder or, for your own text that survives updates, in Config.Text at the bottom. Coordinates: stand where you want a dealer or a drop and read your position with any /coords tool, or use the admin page of /ablackmarket, which saves spots in game without touching this file. ============================================================================ ]] Config = {} -- ============================================================================= -- 1. GENERAL -- ============================================================================= Config.Locale = 'en' -- en de fr es pt it nl pl cs ro tr ru uk sv da fi hu hr el bg hi ja ko zh ar Config.Debug = false -- extra lines in the server console and F8 -- 'auto' finds QBCore, Qbox or ESX by itself and runs standalone when none of -- them is installed. Force one with 'qbcore', 'qbox', 'esx' or 'standalone'. Config.Framework = 'auto' -- 'auto' | 'ox' | 'qs' | 'framework' (qb-inventory, ps, lj, jpr and ESX) Config.Inventory = 'auto' Config.Currency = '$' -- written before every amount -- Admins: the ACE agency.blackmarket, group.admin, or one of these groups. Config.AdminGroups = { 'admin', 'god', 'superadmin' } -- Messages: Agency-Notify when it runs, otherwise the menu's own cards. -- Set to false to always use the menu's cards. Config.UseAgencyNotify = true -- ============================================================================= -- 2. MENU, INTERACTION AND COMMANDS -- ============================================================================= Config.Menu = { -- The one command of the resource. Opens your contacts anywhere: level, -- orders with waypoints, runs, messages, the Companion app and, for -- admins, the admin page. command = 'ablackmarket', key = '', -- default key for the command, '' = none (players can bind one in the GTA settings) item = nil, -- an item needed to open it anywhere, e.g. 'burnerphone'; nil = no item scale = 1.0, -- size of the menu, 0.8 to 1.3 } Config.Interaction = { key = 38, -- E, see docs.fivem.net/docs/game-references/controls keyLabel = 'E', -- what the prompt shows distance = 2.2, -- metres to a dealer or a drop -- 'auto' uses ox_target or qb-target when one runs, the prompt otherwise. -- 'ox_target' | 'qb-target' | false (always the prompt) target = 'auto', } -- ============================================================================= -- 3. MONEY -- ============================================================================= Config.Money = { -- How dirty money exists on this server: -- 'auto' ESX: the account below. Qbox: the item below. QBCore: the -- item below when ox_inventory knows it, marked bills otherwise. -- Standalone: the script keeps it (see Config.Standalone). -- 'markedbills' QBCore marked bills, one item carrying its worth -- 'item' a plain item where one piece is one dollar -- 'account' an account of the framework (ESX black_money) -- 'wallet' kept by this script dirty = 'auto', markedItem = 'markedbills', item = 'black_money', account = 'black_money', -- What the dealers take, in this order. The player picks in the basket -- when more than one is allowed. 'dirty' | 'cash' | 'bank' buyWith = { 'dirty', 'cash' }, -- Agency Pay from Agency Phone. When the phone runs on this server, the -- basket offers Agency Pay as well, for buying and for orders: the phone -- opens, the player confirms the payment there and the money comes from -- his bank account. Nothing to set up; enabled = false hides it. -- resource the name of the Agency Phone resource -- timeout seconds the player has to confirm on the phone agencyPay = { enabled = true, resource = 'agency-phone', timeout = 90 }, } -- ============================================================================= -- 4. REPUTATION -- ============================================================================= -- Five levels by default. `rep` is the reputation a level starts at; the -- rest are the perks of that level: -- buy % off every purchase -- sell % more for everything sold -- launder % the laundry keeps -- orders open orders at the same time Config.Reputation = { levels = { { name = 'Street Punk', rep = 0, buy = 0, sell = 0, launder = 25, orders = 1 }, { name = 'Small Timer', rep = 50, buy = 5, sell = 3, launder = 22, orders = 1 }, { name = 'Regular', rep = 150, buy = 10, sell = 6, launder = 20, orders = 2 }, { name = 'Trusted', rep = 300, buy = 15, sell = 9, launder = 17, orders = 2 }, { name = 'VIP', rep = 500, buy = 20, sell = 12, launder = 15, orders = 3 }, }, -- One point per `per` dollars, at least `min` per deal. gain = { buy = { per = 1000, min = 1 }, sell = { per = 1000, min = 1 }, launder = { per = 2500, min = 1 }, pickup = 2, -- extra points for collecting an order }, -- Points lost for walking out on a dealer. loss = { refuseSurcharge = { 3, 8 }, -- said no when the dealer wanted more refuseCut = { 5, 12 }, -- said no when the fence wanted a cut }, } -- ============================================================================= -- 5. DEALERS -- ============================================================================= -- Every dealer has his own places, his own stock and his own services: -- buy the market (items from Config.Items in his categories) -- orders orders for pickup at a drop point -- sell buys stolen goods (Config.Sell) -- launder washes dirty money (Config.Launder) -- jobs hands out courier runs (Config.Jobs) -- `rotate` minutes until he moves to another of his places, 0 = never. -- `hours` { from = 20, to = 6 } for night dealers, false = always there. -- `blip` mode 'always' (everyone), 'known' (players who dealt with him), -- 'never'. Sprites and colours: docs.fivem.net/docs/game-references/blips Config.Dealers = { { id = 'vince', label = 'Vince', role = 'Dealer', services = { buy = true, orders = true, jobs = true }, categories = { 'pistols', 'smgs', 'shotguns', 'rifles', 'melee', 'ammo', 'armor', 'tools' }, ped = { model = 's_m_y_dealer_01', scenario = 'WORLD_HUMAN_DRUG_DEALER' }, rotate = 120, hours = false, blip = { mode = 'always', sprite = 110, color = 1, scale = 0.8, label = 'Contact' }, places = { vector4(-1318.80, -906.91, 11.31, 200.0), vector4(-58.95, -1230.97, 28.84, 43.6), vector4(134.53, -1276.06, 29.32, 291.3), }, }, { id = 'marlow', label = 'Marlow', role = 'Fence', services = { sell = true, launder = true, jobs = true }, ped = { model = 'a_m_m_og_boss_01', scenario = 'WORLD_HUMAN_CLIPBOARD' }, -- The washing machine next to him. offset: metres to his right, in -- front, up. false = laundering happens right where he stands. laundry = { model = 'prop_washer_01', offset = vector3(1.8, 0.2, 0.0) }, rotate = 180, hours = false, blip = { mode = 'known', sprite = 500, color = 1, scale = 0.8, label = 'Fence' }, places = { vector4(-1143.72, -1547.31, 4.38, 35.4), vector4(-894.70, -1516.03, 5.02, 109.8), }, }, } -- Dealers show up for a player when he is this close, and vanish again past -- the second value. Their positions never reach players further away. Config.StreamDistance = { show = 120.0, hide = 160.0 } -- ============================================================================= -- 6. THE MARKET -- ============================================================================= Config.Categories = { { id = 'pistols', label = 'Pistols', icon = 'pistol' }, { id = 'smgs', label = 'SMGs', icon = 'smg' }, { id = 'shotguns', label = 'Shotguns', icon = 'shotgun' }, { id = 'rifles', label = 'Rifles', icon = 'rifle' }, { id = 'melee', label = 'Melee', icon = 'melee' }, { id = 'ammo', label = 'Ammunition', icon = 'ammo' }, { id = 'armor', label = 'Armor', icon = 'armor' }, { id = 'tools', label = 'Tools', icon = 'tools' }, } -- item the item name on QBCore and ESX (weapons: weapon_...) -- ox the name in ox_inventory when it differs (ammo, armour) -- price base price, the market moves it up and down (Config.Prices) -- level reputation level needed to buy it -- stock pieces per dealer, false = unlimited. Refills with Config.Stock. -- order true = can be ordered for pickup, 'only' = order only (never over the counter) -- ammo standalone only: the ammo type a piece gives, and how many rounds Config.Items = { -- Pistols { item = 'weapon_snspistol', label = 'SNS Pistol', category = 'pistols', price = 2400, level = 1, stock = 8, order = true }, { item = 'weapon_pistol', label = 'Pistol', category = 'pistols', price = 3000, level = 1, stock = 8, order = true }, { item = 'weapon_pistol50', label = 'Pistol .50', category = 'pistols', price = 4200, level = 2, stock = 5, order = true }, { item = 'weapon_revolver', label = 'Heavy Revolver', category = 'pistols', price = 5200, level = 3, stock = 3, order = true }, -- SMGs { item = 'weapon_microsmg', label = 'Micro SMG', category = 'smgs', price = 6500, level = 2, stock = 4, order = true }, { item = 'weapon_minismg', label = 'Mini SMG', category = 'smgs', price = 7200, level = 3, stock = 3, order = true }, { item = 'weapon_smg', label = 'SMG', category = 'smgs', price = 8500, level = 3, stock = 3, order = true }, -- Shotguns { item = 'weapon_sawnoffshotgun', label = 'Sawed-Off Shotgun', category = 'shotguns', price = 7800, level = 3, stock = 3, order = true }, { item = 'weapon_dbshotgun', label = 'Double Barrel Shotgun', category = 'shotguns', price = 8600, level = 3, stock = 2, order = true }, { item = 'weapon_pumpshotgun', label = 'Pump Shotgun', category = 'shotguns', price = 9800, level = 4, stock = 2, order = true }, -- Rifles { item = 'weapon_compactrifle', label = 'Compact Rifle', category = 'rifles', price = 11000, level = 4, stock = 2, order = true }, { item = 'weapon_assaultrifle', label = 'Assault Rifle', category = 'rifles', price = 13500, level = 4, stock = 2, order = 'only' }, { item = 'weapon_carbinerifle', label = 'Carbine Rifle', category = 'rifles', price = 15000, level = 5, stock = 1, order = 'only' }, -- Melee { item = 'weapon_bat', label = 'Baseball Bat', category = 'melee', price = 350, level = 1, stock = 10, order = true }, { item = 'weapon_crowbar', label = 'Crowbar', category = 'melee', price = 400, level = 1, stock = 8, order = true }, { item = 'weapon_knife', label = 'Knife', category = 'melee', price = 550, level = 1, stock = 10, order = true }, { item = 'weapon_switchblade', label = 'Switchblade', category = 'melee', price = 750, level = 1, stock = 8, order = true }, { item = 'weapon_knuckle', label = 'Brass Knuckles', category = 'melee', price = 650, level = 2, stock = 6, order = true }, { item = 'weapon_machete', label = 'Machete', category = 'melee', price = 950, level = 2, stock = 6, order = true }, -- Ammunition { item = 'pistol_ammo', ox = 'ammo-9', label = 'Pistol Ammo', category = 'ammo', price = 80, level = 1, stock = 60, order = true, ammo = { type = 'AMMO_PISTOL', rounds = 12 } }, { item = 'shotgun_ammo', ox = 'ammo-shotgun', label = 'Shotgun Ammo', category = 'ammo', price = 110, level = 2, stock = 30, order = true, ammo = { type = 'AMMO_SHOTGUN', rounds = 8 } }, { item = 'smg_ammo', ox = 'ammo-45', label = 'SMG Ammo', category = 'ammo', price = 120, level = 2, stock = 40, order = true, ammo = { type = 'AMMO_SMG', rounds = 20 } }, { item = 'rifle_ammo', ox = 'ammo-rifle', label = 'Rifle Ammo', category = 'ammo', price = 180, level = 3, stock = 30, order = true, ammo = { type = 'AMMO_RIFLE', rounds = 30 } }, -- Armor { item = 'armor', ox = 'armour', label = 'Body Armor', category = 'armor', price = 1200, level = 1, stock = 10, order = true, armour = 50 }, { item = 'heavyarmor', label = 'Heavy Armor', category = 'armor', price = 2400, level = 3, stock = 5, order = true, armour = 100 }, -- Tools { item = 'lockpick', label = 'Lockpick', category = 'tools', price = 180, level = 1, stock = 20, order = true }, { item = 'advancedlockpick', label = 'Advanced Lockpick', category = 'tools', price = 650, level = 2, stock = 10, order = true }, { item = 'electronickit', label = 'Electronic Kit', category = 'tools', price = 1800, level = 2, stock = 6, order = true }, { item = 'drill', label = 'Drill', category = 'tools', price = 2600, level = 3, stock = 4, order = true }, { item = 'thermite', label = 'Thermite', category = 'tools', price = 3900, level = 4, stock = 3, order = true }, { item = 'trojan_usb', label = 'Trojan USB', category = 'tools', price = 4800, level = 4, stock = 2, order = 'only' }, } -- Items your inventory does not know are left out on start, with one line in -- the server console naming them. Set false to keep them in the menu anyway. Config.HideUnknownItems = true -- Where the menu takes item pictures from. 'auto' reads them from the -- inventory that runs (ox, qs, qb, ps, lj, jpr). A URL of your own works too, -- e.g. 'https://cdn.example.com/items/' (the file name is added), and false -- shows the category icons instead. Config.Images = 'auto' -- ============================================================================= -- 7. PRICES, STOCK AND FLASH SALES -- ============================================================================= Config.Prices = { enabled = true, interval = 20, -- minutes between two price moves spread = 15, -- a price stays within this % around its base step = 6, -- a price moves at most this % per interval } Config.Stock = { enabled = true, refill = 30, -- minutes between two refills of an item amount = 2, -- pieces per refill, never above the item's stock } Config.FlashSale = { enabled = true, chance = 15, -- % per price move that a flash sale starts items = { 1, 3 }, -- how many items are on sale discount = { 15, 35 }, -- % off minutes = 15, -- Who hears about it in game: 'known' (players who dealt with the dealer -- before), 'all' or 'none'. The Companion app hears it either way. notify = 'known', } -- ============================================================================= -- 8. HAGGLING -- ============================================================================= -- Before paying, a player can haggle once: a needle sweeps a bar and he has to -- stop it in the gold zone. Hitting the middle gives the full discount. Config.Haggle = { enabled = true, discount = { 4, 15 }, -- % off on a hit, the middle of the zone gives the top zone = 16, -- width of the gold zone in % of the bar at level 1 zoneLevel = 2, -- the zone grows by this % per level above 1 period = 1.1, -- seconds for the needle to cross the bar once miss = 8, -- % added to this deal after a miss, 0 = the dealer just says no cooldown = 10, -- minutes before a player may haggle with the same dealer again } -- Now and then a dealer wants more before he hands anything over. Config.Surcharge = { enabled = true, chance = 12, -- % of purchases percent = { 10, 25 }, -- % on top -- Walking away: reputation loss (Config.Reputation.loss), a chance of a -- police alert and a chance the dealer leaves his spot. alert = 25, leave = 20, } -- ============================================================================= -- 9. SELLING TO THE FENCE -- ============================================================================= Config.Sell = { -- What the fence pays with: 'dirty' or 'cash'. With cash he keeps `cut` %. payout = 'dirty', cut = 15, -- Now and then the fence wants a cut to keep quiet after a sale. extortion = { chance = 12, percent = { 10, 20 }, alert = 30 }, items = { { item = 'rolex', label = 'Rolex Watch', price = { 700, 1200 }, level = 1 }, { item = 'goldchain', label = 'Gold Chain', price = { 350, 700 }, level = 1 }, { item = '10kgoldchain', label = '10k Gold Chain', price = { 900, 1500 }, level = 1 }, { item = 'diamond_ring', label = 'Diamond Ring', price = { 1100, 1900 }, level = 2 }, { item = 'goldbar', label = 'Gold Bar', price = { 2000, 3200 }, level = 2 }, { item = 'laptop', label = 'Laptop', price = { 600, 1100 }, level = 1 }, { item = 'tablet', label = 'Tablet', price = { 450, 900 }, level = 1 }, { item = 'security_card_01', label = 'Security Card A', price = { 500, 900 }, level = 2 }, { item = 'security_card_02', label = 'Security Card B', price = { 900, 1500 }, level = 3 }, { item = 'cryptostick', label = 'Crypto Stick', price = { 2000, 3500 }, level = 4 }, }, } -- ============================================================================= -- 10. LAUNDERING -- ============================================================================= Config.Launder = { min = 500, max = 50000, -- per wash cooldown = 5, -- minutes between two washes of one player -- How long the machine runs: base seconds plus seconds per 1,000, capped. time = { base = 8, per1000 = 0.5, max = 45 }, -- The fee comes from the player's level (Config.Reputation.levels.launder). alert = 20, -- % police alert chance -- Now and then the fence wants a cut first to keep quiet. cut = { chance = 12, percent = { 10, 20 } }, } -- ============================================================================= -- 11. ORDERS AND DROP POINTS -- ============================================================================= Config.Orders = { enabled = true, prep = { 5, 12 }, -- minutes until an order waits at its drop expire = 90, -- minutes a drop waits before the goods are gone refund = 50, -- % of an expired order that comes back as dealer credit maxPieces = 10, -- pieces per order alert = 30, -- % police alert chance while collecting pickupSeconds = 3, -- Ordering without standing at the dealer (menu anywhere and the app) is -- possible from this level on. false = only at the dealer. remoteLevel = 2, -- The bag or crate the goods lie in. prop = 'prop_cs_heist_bag_02', -- Drop points. Admins add more in game (/ablackmarket, admin page). With -- an empty list the places of all dealers serve as drops, never the one a -- dealer stands at. drops = { -- vector4(x, y, z, heading), }, } -- ============================================================================= -- 12. RUNS AND MESSAGES -- ============================================================================= -- Dealers with the `jobs` service hand out courier runs: pick something up -- at one place and hand it to a contact at another before the time runs out. -- Paid in dirty money plus reputation. A run can draw the police, and a run -- that is dropped or too late costs reputation. Config.Jobs = { enabled = true, offers = 3, -- open runs per dealer at a time refresh = 20, -- minutes until an open run nobody took is replaced cooldown = 5, -- minutes between two runs of one player pickupMinutes = 15, -- time to get to the pickup after taking a run minutes = { 8, 12 }, -- time from the pickup to the contact, more for long routes seconds = 3, -- picking up and handing over take this long fail = 6, -- reputation lost for a run that is dropped or too late alert = { pickup = 10, deliver = 15 }, -- % police alert chance, times the kind's alert contact = { model = 'g_m_y_famca_01', scenario = 'WORLD_HUMAN_SMOKING' }, blips = { pickup = { sprite = 478, color = 5 }, deliver = { sprite = 280, color = 2 }, }, -- What there is to move. level = reputation level needed, pay = dirty -- money, rep = reputation, alert = police chance multiplier, dealers = -- who hands it out (leave it out for every dealer with `jobs`). -- A prop the game does not know is replaced by the bag of the drops. kinds = { { id = 'package', label = 'Package', prop = 'prop_cs_package_01', level = 1, pay = { 1200, 2200 }, rep = { 4, 7 }, alert = 1.0 }, { id = 'cash', label = 'Money bag', prop = 'prop_money_bag_01', level = 2, pay = { 2500, 4000 }, rep = { 6, 10 }, alert = 1.3, dealers = { 'marlow' } }, { id = 'crate', label = 'Weapon crate', prop = 'prop_box_guncase_01a', level = 3, pay = { 4500, 7000 }, rep = { 9, 14 }, alert = 1.6, dealers = { 'vince' } }, }, -- Where runs start and end: vector4 points of your own. Empty = the drop -- points (Config.Orders.drops, the ones added in game, or the dealers' -- free places). points = {}, minDistance = 300.0, -- metres between pickup and contact, where the points allow it } -- The Messages page of /ablackmarket: what the dealers write. Orders waiting -- at a drop, runs, dealers who moved, flash sales and raids, each with a -- waypoint where it helps. Config.Messages = { enabled = true, keep = 30, -- messages kept per player welcome = true, -- new players get a first message from a dealer with his spot } -- ============================================================================= -- 13. POLICE -- ============================================================================= Config.Police = { jobs = { 'police', 'sheriff', 'bcso', 'sasp', 'state', 'lspd' }, onDutyOnly = true, minOnline = 0, -- dealers only trade with at least this many officers on duty blockCops = true, -- officers get nothing from a dealer nearby = 60.0, -- a dealer leaves when an officer comes this close away = 15, -- minutes he stays away before he turns up at another place -- % chance of an alert per action. alerts = { buy = 10, sell = 15, launder = 20, pickup = 30 }, -- runs: Config.Jobs.alert -- 'auto' finds ps-dispatch, cd_dispatch, qs-dispatch, rcore_dispatch, -- core_dispatch, tk_dispatch, lb-tablet or origen_police. 'default' sends -- a map blip and a message to the officers. 'custom' calls customAlert -- below. 'none' turns alerts off. dispatch = 'auto', -- The title comes from the language file; add title = 'Your text' to set your own. alert = { code = '10-66', blip = { sprite = 51, color = 1, scale = 1.0, seconds = 120 } }, -- customAlert = function(coords, data) end, -- data = { code, title, message, kind, source } } -- Standalone: players with the ACE in Config.Standalone.policeAce count as officers. -- ============================================================================= -- 14. ACCESS -- ============================================================================= Config.Access = { jobs = {}, -- only these jobs may trade, empty = everyone items = {}, -- items a player must carry to talk to a dealer, e.g. { 'burnerphone' } } -- ============================================================================= -- 15. STANDALONE -- ============================================================================= -- Without QBCore, Qbox or ESX: -- works: dealers, prices, stock, haggling, reputation, orders, runs, -- messages, the app. Weapons, ammo and armour go straight to the -- player. -- money: 'auto' uses Agency-Banking when it runs, otherwise the script's -- own wallet (cash and dirty money, admins can top it up with -- /ablackmarket). 'hooks' uses the functions below. -- fill in: other items (tools, stolen goods) need the item hooks below; -- without them those items are left out of the menus. Config.Standalone = { money = 'auto', -- 'auto' | 'banking' | 'wallet' | 'hooks' policeAce = 'agency.police', -- players with this ACE count as officers adminAce = 'agency.blackmarket', -- getMoney = function(src, account) return 0 end, -- account: 'cash' | 'bank' | 'dirty' -- addMoney = function(src, account, amount) return true end, -- removeMoney = function(src, account, amount) return true end, -- itemCount = function(src, item) return 0 end, -- addItem = function(src, item, amount) return true end, -- removeItem = function(src, item, amount) return true end, } -- ============================================================================= -- 16. STORAGE -- ============================================================================= -- Reputation, stock, orders and the app's devices are saved in the database -- (table agency_blackmarket, created by itself) when oxmysql runs, otherwise -- in the server's own key value store. Reputation from V1 -- (blackmarket_reputation) is taken over once, automatically. Config.Storage = 'auto' -- 'auto' | 'mysql' | 'kvp' -- ============================================================================= -- 17. COMPANION APP -- ============================================================================= -- The Agency Companion app (iOS and Android) shows the market, prices, stock -- and the player's level, orders for pickup, finds the dealers -- and tells about moved dealers, ready orders, flash sales and raids. Config.Companion = { enabled = true, relay = 'https://api.agencyg.de', qrSeconds = 300, -- how long a pairing code stays valid maxDevices = 3, -- phones per player locateLevel = 1, -- from this level on the app (and the menu) can set a waypoint to a dealer (1 = everyone) } -- ============================================================================= -- 18. LOGS -- ============================================================================= Config.Logs = { webhook = '', -- a Discord webhook URL, '' = off console = false, -- also print every deal in the server console (admin actions always are) events = { buy = true, sell = true, launder = true, orders = true, jobs = true, admin = true }, } -- ============================================================================= -- 19. YOUR OWN WORDING -- ============================================================================= -- Any key from locales/en.lua, set here, beats every language file and -- survives updates. Example: Config.Text = { prompt_talk = 'Talk to {name}' } Config.Text = {}

02SQL 文件

可选:资源启动时会自动创建这些数据表。只有在手动配置数据库时才需要导入此文件:

-- Agency Blackmarket V2 -- The resource creates this table by itself when oxmysql runs. Run this file -- only if your database user may not create tables. CREATE TABLE IF NOT EXISTS `agency_blackmarket` ( `scope` VARCHAR(16) NOT NULL, `id` VARCHAR(96) NOT NULL, `data` LONGTEXT NOT NULL, `updated` INT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (`scope`, `id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- V1 kept reputation in `blackmarket_reputation`. V2 takes it over once on its -- first start; the old table can be dropped afterwards: -- DROP TABLE IF EXISTS `blackmarket_reputation`;

+值得了解

config.lua 中的每个选项都有作用,共 19 个部分,从贩子一直到你自己的文本。贩子地点和取货点也可以在游戏内的管理页面中添加,无需改动文件。

贩子
Config.Dealers 定义每个贩子:他的服务(buy、orders、sell、launder)、商品分类、人物模型及其场景动作、移动前的分钟数(rotate)、营业时间、地图标记模式(always、known 或 never)以及他的地点。收赃人旁边有一台洗衣机,按偏移量摆放。
物品、价格与库存
Config.Items 中的每个条目都有基础价格、所需等级、每个贩子的库存,以及是否可以预订(true,或 'only' 表示只能预订)。Config.Prices 决定价格多久变动一次、变动幅度多大,Config.Stock 决定库存补充的速度,Config.FlashSale 决定特卖多久开始一次、涉及多少物品以及折扣多少。
讲价与加价
Config.Haggle 设置折扣、金色区域的宽度及每升一级扩大多少、指针速度、失手后的加价,以及每个贩子的冷却时间。Config.Surcharge 设置贩子多久要求加价一次、加多少,以及玩家拒绝时报警或贩子离开的概率。
订单与取货点
Config.Orders 设置准备时间、取货点等候多久、以额度形式退回的比例、每单件数、报警概率、在任何地方预订所需的等级以及包的模型。取货点写在 drops 中;列表为空时,所有贩子的地点都可作为取货点,但绝不会是贩子正站着的那个地点。
警察
Config.Police 列出警察职业,并设置是否只计算在岗警员、需要多少警员在线、警察能否从贩子处买到东西、贩子在多远距离时离开以及离开多久、每种行为的报警概率,以及所用的 dispatch 系统。
Standalone
Config.Standalone.money 为资金选择 Agency-Banking、脚本自带的钱包或你自己的钩子。物品钩子可以接入任何背包。警察和管理员是拥有 policeAce 和 adminAce 中所设 ACE 的玩家。
跑腿任务与消息
Config.Jobs 设定每个贩子提供多少跑腿任务、多久更换一次、两次任务之间的间隔、到取货点和到接头人的时间,以及每种任务的报酬、名声和警察风险。Config.Dealers 中的 jobs 服务决定由谁派发任务。Config.Messages 控制消息页面、保留多少条消息以及给新玩家的第一条消息。
Agency Pay
Config.Money.agencyPay 用于开启或关闭 Agency Pay(默认开启),指定 Agency Phone 的资源名,并设定玩家在手机上确认的秒数,默认 90 秒。服务器上没有 Agency Phone 时,购物篮不会提供它。

?常见问题

如何在不编辑文件的情况下添加贩子地点?

以管理员身份打开 /ablackmarket,进入管理页面,在贩子处使用添加我的位置,或在取货点标签页中添加取货点。这些地点会被保存,重启后依然有效。

如何使用自己的文本?

把 locales/en.lua 中的任意键写入 Config.Text,例如 Config.Text = { prompt_talk = 'Talk to {name}' }。它优先于所有语言文件,更新后依然保留。

看完本页仍未解决?接下来由我们的支持团队接手。