DRS Marketplace

v1.0.0 QBCore drs_marketplace
Ver na loja

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

RecursoObrigatório
qb-coreSim
qb-inventorySim
oxmysqlSim

#Instalação

  1. 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;
  1. Coloca drs_marketplace em resources e adiciona ao server.cfg:
server.cfg
ensure qb-core
ensure qb-inventory
ensure oxmysql
ensure drs_marketplace

#Utilização

  1. Vai ao Mercado Público (ícone no mapa) e carrega em E perto do NPC.
  2. Vender: escolhe um item do inventário, a quantidade e o preço. O item sai do inventário e fica anunciado.
  3. Comprar: procura os anúncios de outros jogadores e compra. O item vai logo para o teu inventário.
  4. 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.
  5. Podes retirar os teus anúncios que ainda não foram vendidos — o item volta para ti.

#Taxas e limites

OpçãoPor defeitoDescrição
Config.Account'bank'Conta usada para comprar e receber
Config.SellFeePercent10% cobrada ao vendedor, só quando o item é vendido
Config.BuyFeeFixed200Taxa fixa cobrada ao comprador (0 = desligado)
Config.MinPrice / Config.MaxPrice1 / 1 000 000Preço permitido por anúncio
Config.MaxActiveListingsPerPlayer10Anúncios ativos por jogador
Config.OneListingPerItemNametrueImpede dois anúncios do mesmo item ao mesmo tempo
Config.Blacklistdinheiro, 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.