DRS Marketplace
Mercado entre jogadores: os jogadores põem itens à venda num NPC, procuram e compram itens de outros jogadores. Os anúncios ficam guardados na base de dados e todas as transações são validadas no servidor.
#Requisitos
| Recurso | Obrigatório |
|---|---|
qb-core | Sim |
qb-inventory | Sim |
oxmysql | Sim |
#Instalação
- Importa o SQL:
install.sql
-- drs_marketplace -- estrutura da base de dados
-- Corre isto uma vez na tua base de dados antes de iniciar o resource.
CREATE TABLE IF NOT EXISTS `drs_marketplace_listings` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`seller_citizenid` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`seller_name` varchar(120) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`anonymous` tinyint(1) NOT NULL DEFAULT '0',
`item_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`item_label` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`item_image` varchar(120) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`item_amount` int NOT NULL,
`item_weight` int DEFAULT '0',
`item_info` longtext COLLATE utf8mb4_unicode_ci,
`price` decimal(18,2) NOT NULL,
`status` enum('active','sold','cancelled') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'active',
`buyer_citizenid` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`buyer_name` varchar(120) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`sold_amount` decimal(18,2) DEFAULT NULL,
`collected` tinyint(1) NOT NULL DEFAULT '0',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`sold_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_seller` (`seller_citizenid`),
KEY `idx_status` (`status`),
KEY `idx_item_name` (`item_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;- Coloca
drs_marketplaceemresourcese adiciona aoserver.cfg:
server.cfg
ensure qb-core
ensure qb-inventory
ensure oxmysql
ensure drs_marketplace#Utilização
- Vai ao Mercado Público (ícone no mapa) e carrega em E perto do NPC.
- Vender: escolhe um item do inventário, a quantidade e o preço. O item sai do inventário e fica anunciado.
- Comprar: procura os anúncios de outros jogadores e compra. O item vai logo para o teu inventário.
- Receber: quando um item teu é vendido recebes um aviso (se estiveres online). Abre o mercado, separador Vendidos, e recolhe o dinheiro, já sem a taxa.
- Podes retirar os teus anúncios que ainda não foram vendidos — o item volta para ti.
#Taxas e limites
| Opção | Por defeito | Descrição |
|---|---|---|
Config.Account | 'bank' | Conta usada para comprar e receber |
Config.SellFeePercent | 10 | % cobrada ao vendedor, só quando o item é vendido |
Config.BuyFeeFixed | 200 | Taxa fixa cobrada ao comprador (0 = desligado) |
Config.MinPrice / Config.MaxPrice | 1 / 1 000 000 | Preço permitido por anúncio |
Config.MaxActiveListingsPerPlayer | 10 | Anúncios ativos por jogador |
Config.OneListingPerItemName | true | Impede dois anúncios do mesmo item ao mesmo tempo |
Config.Blacklist | dinheiro, documentos… | Itens que nunca podem ir para o mercado |
#Locais
config.lua
Config.NPCModel = `mp_m_shopkeep_01`
Config.ZoneRadius = 10.0
Config.NPCLocations = {
{ coords = vector4(-1101.0, -1685.0, 4.5, 210.0), label = 'Mercado Público' },
}Podes acrescentar quantos locais quiseres; cada um tem o seu NPC e blip (Config.Blip).
#Configuração completa
config.lua
Config = {}
-- Conta usada para comprar e para receber o dinheiro das vendas
Config.Account = 'bank'
-- % cobrada ao VENDEDOR sobre o preço, só quando o item é mesmo vendido
-- (evita o mercado ser usado como depósito grátis).
Config.SellFeePercent = 10
-- Taxa FIXA (não %) cobrada ao COMPRADOR, em cima do preço pedido, em
-- qualquer compra (0 = desligado).
Config.BuyFeeFixed = 200
Config.MinPrice = 1
Config.MaxPrice = 1000000
-- Máximo de anúncios ativos por jogador, e se pode ter 2 anúncios do
-- mesmo item ao mesmo tempo (o original não deixava, para não encher o
-- mercado de itens repetidos).
Config.MaxActiveListingsPerPlayer = 10
Config.OneListingPerItemName = true
-- Itens que nunca podem ir para o mercado -- dinheiro físico (o
-- qb-moneyitems já trata disso de outra forma), documentos/acesso, e
-- itens de posse única entregues por staff/VIP.
Config.Blacklist = {
cash = true,
markedbills = true,
dirtymoney = true,
id_card = true,
driver_license = true,
weaponlicense = true,
lawyerpass = true,
bank_card = true,
credit_card = true,
moneybag = true,
cryptostick = true,
}
-- Loja física -- sem comando. NPC no local + área à volta dele onde
-- aparece "pressiona E para abrir". Podes definir quantos locais quiseres.
Config.NPCModel = `mp_m_shopkeep_01`
Config.ZoneRadius = 10.0 -- metros
Config.NPCLocations = {
{ coords = vector4(-1101.0, -1685.0, 4.5, 210.0), label = 'Mercado Público' },
}
-- Blip no mapa (um por local em Config.NPCLocations)
Config.Blip = {
Enabled = true,
Sprite = 52, -- ícone de saco de dinheiro
Color = 5, -- amarelo
Scale = 0.8,
Label = 'Mercado Público',
}
-- Alertas Discord (staff) quando um item é comprado ou removido.
Config.Discord = {
Enabled = false,
WebhookUrl = '',
}#Segurança
O servidor valida preço, quantidade, inventário, dono do anúncio e saldo, impede comprar o próprio anúncio, devolve o item se o anúncio falhar e reembolsa o comprador se o item não puder ser entregue.