DRS Gift Codes
Códigos de oferta para eventos, sorteios e recompensas: cada código dá dinheiro, itens e até veículos, com proteção contra abusos.
Códigos de oferta para eventos, sorteios e recompensas. Cada código pode dar dinheiro no banco, itens e veículos. Os admins criam códigos dentro do jogo e os jogadores resgatam numa janela própria.
#Requisitos
| Recurso | Obrigatório |
|---|---|
qb-core | Sim |
oxmysql | Sim |
#Instalação
- Importa o SQL (cria as tabelas de códigos e resgates, com um código de teste):
drs_giftcodes.sql
-- DRS Gift Codes
CREATE TABLE IF NOT EXISTS `drs_giftcodes` (
`id` INT NOT NULL AUTO_INCREMENT,
`code` VARCHAR(32) NOT NULL,
`uses_remaining` INT NOT NULL DEFAULT 1,
`last_username` VARCHAR(64) DEFAULT NULL,
`bank_money` INT NOT NULL DEFAULT 0,
`item` VARCHAR(64) DEFAULT NULL,
`item_amount` INT NOT NULL DEFAULT 1,
`vehicle` VARCHAR(64) DEFAULT NULL,
`allow_repeat` TINYINT(1) NOT NULL DEFAULT 0,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_drs_giftcodes_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `drs_giftcode_redemptions` (
`id` INT NOT NULL AUTO_INCREMENT,
`gift_id` INT NOT NULL,
`citizenid` VARCHAR(64) NOT NULL,
`player_name` VARCHAR(64) NOT NULL,
`redeemed_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_drs_gcr_gift_citizen` (`gift_id`, `citizenid`),
CONSTRAINT `fk_drs_gcr_gift` FOREIGN KEY (`gift_id`) REFERENCES `drs_giftcodes`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Código de teste / Test code: 12345678 (5000 no banco + 2 águas)
INSERT IGNORE INTO `drs_giftcodes` (`code`, `uses_remaining`, `bank_money`, `item`, `item_amount`)
VALUES ('12345678', 1, 5000, 'water', 2);- Coloca
drs_giftcodesemresourcese adiciona aoserver.cfg:
server.cfg
ensure qb-core
ensure oxmysql
ensure drs_giftcodes#Comandos
| Comando | Quem | O que faz |
|---|---|---|
/codigo | Todos | Abre a janela para resgatar um código |
/criarcodigo [dinheiro] [item] [quantidade] [veículo] [usos] | Admin | Cria um código novo e mostra-o |
Usa - quando não queres item ou veículo:
exemplos
/criarcodigo 10000 - 1 adder 5 → 10 000 no banco + um Adder, 5 usos
/criarcodigo 0 water 10 - 1 → 10 águas, 1 uso
/criarcodigo 5000 - 1 - 50 → 5 000 no banco, 50 usosOs veículos vão diretamente para a garagem Config.VehicleGarage.
#Segurança
- Cada jogador só resgata cada código uma vez.
- Máximo de
Config.MaxAttemptsPerMinutetentativas por minuto; quem passar fica bloqueadoConfig.LockoutMinutesminutos. - O código é consumido de forma atómica na base de dados — dois jogadores ao mesmo tempo nunca gastam o mesmo uso.
- Todos os resgates ficam registados na tabela
drs_giftcode_redemptions.
#Opções principais
| Opção | Por defeito | Descrição |
|---|---|---|
Config.Command | codigo | Comando para resgatar |
Config.AdminCommand | criarcodigo | Comando para criar |
Config.AdminPermission | admin | Permissão QBCore para criar |
Config.CodeLength / Config.CodeCharset | 8 dígitos | Formato dos códigos gerados |
Config.VehicleGarage | pillboxgarage | Garagem dos veículos oferecidos |
#Configuração completa
config.lua
Config = {}
-- Idioma / Language: 'pt' ou 'en'
Config.Locale = 'pt'
-- Comando para abrir a janela de resgate / Command that opens the redeem window
Config.Command = 'codigo'
-- Comando de admin para criar códigos / Admin command to create codes
-- /criarcodigo [dinheiro] [item] [quantidade] [veiculo] [usos]
Config.AdminCommand = 'criarcodigo'
Config.AdminPermission = 'admin' -- permissão QBCore / QBCore permission
-- Formato dos códigos gerados / Generated code format
Config.CodeLength = 8
Config.CodeCharset = '0123456789' -- ex.: 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789' para alfanumérico
-- Proteção contra força bruta / Brute-force protection
Config.MaxAttemptsPerMinute = 5
Config.LockoutMinutes = 10
-- Garagem onde ficam os veículos oferecidos / Garage for gifted vehicles
Config.VehicleGarage = 'pillboxgarage'
-- Moeda nas mensagens / Currency in messages
Config.Currency = '€'#Resolução de problemas
"Table 'drs_giftcodes' doesn't exist" — importa o SQL.
O veículo não aparece — confirma que o nome da garagem em Config.VehicleGarage existe no teu script de garagens.