Pular para o conteúdo principal

Resolva problemas comuns

Hero Dark

Sobre o sistema

A proposta do Multi Characters é oferecer um sistema completo de múltiplos personagens com identidade visual, documentação (passaporte), cutscene de entrada e total integração com outros sistemas do servidor.

Visão Geral

Este guia cobre todos os arquivos config/main.lua e config/settings.lua. Objetivo:
  • Você entender exatamente o que cada opção muda.
  • Você conectar o sistema ao seu servidor sem precisar mexer no código-fonte.
  • Você configurar personagens, passaporte, banco de dados e integrações de forma independente.

Antes de Começar

  • Arquivos de configuração: config/main.lua (servidor) e config/settings.lua (compartilhado)
  • Depois de alterar a config: reinicie o resource (restart sqh_multicharacters)
  • Regra geral:
    • true = ativa a função
    • false = desativa a função

1) license

Credenciais de ativação do produto. Localizado no topo do config/main.lua.
CampoDescrição
EmailE-mail da conta Squash Codes que adquiriu o produto.
KeyChave de licença fornecida após a compra.
license = {
    ["Email"] = "[email protected]",
    ["Key"] = "SQUASH-XXXX-XXXX",
}

2) database

Configuração do banco de dados. Localizado em config/main.lua.
CampoDescrição
databaseTipo de conexão: "sqlite" ou "mysql".
sqlite_archiveCaminho do arquivo SQLite (ignorado se usar mysql).
mysqlparameters.hostnameIP ou hostname do servidor MySQL.
mysqlparameters.portPorta do MySQL.
mysqlparameters.usernameUsuário do banco.
mysqlparameters.passwordSenha do banco.
mysqlparameters.databaseNome do banco de dados.
database = {
    database = "mysql",
    mysqlparameters = {
        hostname = "127.0.0.1",
        port = "3306",
        username = "root",
        password = "suasenha",
        database = "nome_do_banco"
    },
    sqlite_archive = "assets/database/Database.db",
}

3) useCustomSquash

Define se o sistema de customização de personagens da Squash Codes será usado.
ValorEfeito
trueIntegra com o produto CustomSite para skin, skintone e roupas.
falseUsa o modelo padrão definido em setPedDefaultInfos.
useCustomSquash = false

4) serverConfig

Bloco principal de configuração do servidor. Localizado em config/main.lua.

pointsElementData

ValorEfeito
trueOs pontos do jogador são lidos/escritos via elementData.
falseOs pontos são gerenciados de outra forma (definida em getPointsPlayer).

blockChangeName

ValorEfeito
trueImpede que o jogador mude seu próprio nome pelo menu ESC do MTA.
falsePermite mudança de nome pelo ESC normalmente.

nameSeparator

Separador entre nome e sobrenome nos comandos /changenick e /deleteperson.
nameSeparator = "@", -- João@Silva
Com "@", o comando fica: /changenick João@Silva NovoNome@NovoSobrenome

functions

Funções de integração com o seu servidor. Você deve adaptá-las para o seu sistema.
FunçãoO que fazO que deve retornar
getPlayerID(player)Retorna o ID numérico do jogadornumber
getPlayerJob(player)Retorna o cargo/emprego do jogadorstring
getAccountMainIdentifier(player)Retorna o identificador principal da conta (normalmente o nome da conta MTA)string
getPointsPlayer(player)Retorna a quantidade de pontos/coins do jogadornumber
takePointsPlayer(player, points)Debita pontos do jogadorqualquer
getPlayerMoney(player)Retorna o dinheiro do jogadornumber
takePlayerMoney(player, amount)Debita dinheiro do jogadorqualquer
getLastSkin(player)Retorna a última skin do jogadornumber (model ID)
setPedDefaultInfos(player, pedElement)Define ped do lobby quando não há personagem criado
setPedInfos(player, pedElement, personData)Define ped do lobby com dados do personagem carregado
Exemplo de integração simples:
getPlayerJob = function(player)
    return getElementData(player, "trabalho") or "Desempregado"
end,
getPointsPlayer = function(player)
    return getElementData(player, "pontos") or 0
end,
takePointsPlayer = function(player, points)
    setElementData(player, "pontos", (getElementData(player, "pontos") or 0) - points)
end,

commands

Define os comandos administrativos disponíveis.

commands.changeName

Comando para alterar o nome de um personagem.
CampoDescrição
commandNameNome do comando (padrão: 'changenick').
permissionToUse(player)Função que retorna true se o jogador pode usar o comando.
Uso: /changenick Nome@Sobrenome_antigo NovoNome@NovoSobrenome

commands.deleteperson

Comando para deletar um personagem.
CampoDescrição
commandNameNome do comando (padrão: 'deleteperson').
permissionToUse(player)Função que retorna true se o jogador pode usar o comando.
Uso: /deleteperson Nome@Sobrenome

events

Callbacks disparados em momentos específicos do ciclo de vida dos personagens.
EventoQuando é chamadoParâmetros
onCreatePed(ped)Quando o ped do lobby é criadoped: element do ped criado
onLoginPlayer(player)Quando o jogador seleciona e carrega um personagemplayer
onFinishCutscene(player)Quando a cutscene de chegada terminaplayer
onBuyPerson(player, quantityPersons)Quando o jogador compra um novo slot de personagemquantityPersons: total de personagens após a compra
onCreatePerson(player, quantityPersons, personID, actualAccount)Quando o jogador cria um personagem (após preencher os dados)personID: ID gerado, actualAccount: conta MTA principal
onStartCreationCharacter(player)Quando o painel de personagens é abertoplayer
Exemplo:
events = {
    onLoginPlayer = function(player)
        setElementPosition(player, 1092, -794, 108)
        triggerClientEvent(player, 'carregarHUD', player)
    end,
    onCreatePerson = function(player, quantityPersons, personID, actualAccount)
        outputChatBox("Novo personagem criado! ID: " .. personID, player)
    end,
}

5) events (settings.lua — client-side)

Callbacks de abertura e fechamento do painel. Localizado em config/settings.lua.
CallbackQuando aconteceUso típico
onOpenPanel(player)Quando qualquer painel do sistema abreMostrar cursor, esconder chat
onClosePanel(player)Quando qualquer painel do sistema fechaEsconder cursor, mostrar chat
events = {
    onOpenPanel = function(player)
        showCursor(true)
        showChat(false)
    end,
    onClosePanel = function(player)
        showCursor(false)
        showChat(true)
    end
}

6) config.infobox

Define como as notificações do sistema são exibidas.
CampoLadoDescrição
serverServerFunção chamada para exibir infobox pelo servidor
clientClientFunção chamada para exibir infobox pelo client
Adapte para o seu sistema de infobox:
infobox = {
    ['server'] = function(source, message, type)
        exports["seu_infobox"]:addServerInfobox(source, message, type)
    end,
    ['client'] = function(source, message, type)
        exports["seu_infobox"]:addClientInfobox(message, type)
    end,
},

7) config.logs

Configuração dos logs de anti-cheat enviados ao Discord.
OpçãoDescrição
enabledtrue ativa os logs, false desativa.
webhookURLURL do webhook do Discord para receber os alertas.
logLanguageIdioma das mensagens: "pt", "en" ou "es".

8) Opções gerais (config)

Localizado em config/settings.lua.
Opçãotrue / valorfalse / efeito
maxPersonsNúmero máximo de personagens por jogador (ex: 7)
saveLastSkinPlayerSalva a skin do personagem ao sair para exibir no lobbyNão salva (use para Custom)
keyClosePassportTecla para fechar o passaporte (ex: 'backspace')
openCutsceneDefaulttrue exibe a cutscene automaticamente ao entrarfalse desativa cutscene automática
openPanelLogintrue abre o painel de personagens automaticamente ao logarfalse só abre via export
namePersonWithoutAccountMaintrue: conta MTA = "Nome@Sobrenome"false: conta MTA = "ContaPrincipal@Nome_Sobrenome_"
nameSeparatorSeparador entre nome e sobrenome em toda a geração de contas (ex: "@")

9) config.serverInfos

Informações do servidor exibidas no passaporte.
CampoDescrição
nameNome completo do servidor.
cityNome da cidade exibido no passaporte.
slugSigla/código do servidor (aparece como emissor no passaporte).
serverInfos = {
    name = "HAVANNA ROLEPLAY",
    city = "CIDADE DE HAVANNA",
    slug = "HVN",
},

10) config.persons_page

Configurações da tela de seleção de personagens.

camera

CampoDescrição
fromPosição inicial da câmera {x, y, z, lx, ly, lz}
toPosição final da câmera {x, y, z, lx, ly, lz}
timeAnimationTempo em segundos da animação da câmera ao entrar na tela

ped

CampoDescrição
positionPosição do ped de lobby {x, y, z}
rotationRotação do ped {x, y, z}
animationInfo.activetrue ativa animação no ped do lobby
animationInfo.type"random" ou "sequential"
animationInfo.animationsLista de animações: {block, anim, time}

musics

Lista de músicas tocadas no lobby. Cada item aceita:
  • musicLink (string): URL da música
  • name (string): nome da faixa
  • author (string): artista
  • album (string): álbum
  • musicImage (string ou false): URL da imagem da capa

persons

Configurações dos slots de personagem.
CampoDescrição
maxPersonsMáximo de slots de personagem visíveis no carrossel
pricePersonsTabela com o custo de cada slot adicional {0, 500, 1000, ...}

notifications

Lista de notificações exibidas na tela de lobby. Cada notificação aceita:
  • title (string): título da notificação
  • description (string): corpo do texto
  • type (string): tipo visual ("info", "warning", "success", etc.)

11) config.passport_emission

Configurações da criação do passaporte (primeira vez que o personagem é criado).
OpçãoDescrição
minNameDigitsMínimo de caracteres para o nome
maxNameDigitsMáximo de caracteres para o nome
minSurnameDigitsMínimo de caracteres para o sobrenome
maxSurnameDigitsMáximo de caracteres para o sobrenome
minAgeIdade mínima em anos para criar o personagem
secondsAssignSegundos que o jogador deve segurar para assinar o documento
expiresAfterValidade do passaporte em dias após a criação
cameraPlayerPositionPosição da câmera para a foto do rosto: {x, y, z, lx, ly, lz, w, h}

12) config.passport_renews

Configurações do sistema de renovação de passaporte.
OpçãoDescrição
priceCusto em dinheiro para renovar o passaporte
enableMarkerstrue cria markers no mapa para renovação
createBliptrue cria blip no mapa junto com o marker
blipElementDatafalse ou {chave, valor} para criar blip via elementData

allowedEditions

Define quais campos o jogador pode editar na renovação.
Campotruefalse
namePermite editar o nomeBloqueia edição do nome
surnamePermite editar o sobrenomeBloqueia edição do sobrenome
birthdayPermite editar a data de nascimentoBloqueia edição
nacionalityPermite editar a nacionalidadeBloqueia edição
naturalityPermite editar a naturalidadeBloqueia edição
genderPermite editar o gêneroBloqueia edição

markers

Lista de posições onde aparecerão os markers de renovação.
markers = {
    {x = 1503.0, y = 1126.7, z = 9.7, type = 'cylinder', size = 3, r = 255, g = 255, b = 0},
},

peds

Lista de peds que, ao serem clicados, abrem o painel de renovação.
peds = {
    {x = 1500.0, y = 1124.0, z = 10.0, rotation = 90, model = 56}
},

customMarkers

Função chamada após cada marker ser criado. Use para setar elementData ou customizar o marker.
customMarkers = function(marker)
    setElementData(marker, 'custom:marker', true)
end,

13) config.events (settings.lua — server-side)

Callback disparado após a cutscene terminar no client.
EventoQuando é chamado
onFinishCutscene(player)Quando a cutscene de chegada termina no client do jogador
events = {
    onFinishCutscene = function(player)
        -- reposicionar, dar boas vindas, etc.
        outputChatBox("Bem-vindo à cidade!", player)
    end
}

Boas Práticas

  • Altere uma seção por vez e teste no servidor.
  • As funções em serverConfig.functions devem ser adaptadas para o seu servidor — os valores padrão são apenas exemplos.
  • namePersonWithoutAccountMain afeta diretamente o nome das contas MTA geradas. Não mude essa opção após ter personagens já criados, pois as contas antigas não serão renomeadas.
  • Depois de salvar qualquer config: restart sqh_multicharacters