Pular para o conteúdo

Elementos

Compartilhada

Praticamente tudo que existe no mundo do MTAX é um elemento: jogadores, veículos, peds, objetos, blips, colshapes e também os elementos “vazios” que você mesmo cria com createElement.

Os elementos vivem numa árvore. No topo fica o elemento raiz, disponível na global root. Cada resource também ganha o seu próprio nó, disponível na global resourceRoot; tudo que o resource cria nasce pendurado nele e é destruído junto quando ele para.

Quase toda função desta página recebe um elemento como primeiro argumento. Se você passar algo que não é um elemento vivo, a maioria delas devolve false e registra um aviso no console de debug — elas não interrompem o script. As exceções são hasElementData, setElementOnFire, isElementOnFire e setLowLODElement no cliente: nelas um argumento inválido lança um erro Lua que interrompe o código chamador, e que você pode capturar com pcall.

Onde a documentação pedir x, y, z, você também pode passar um Vector3 no lugar dos três números. Isso vale para setElementPosition, setElementRotation, setElementVelocity, setElementAngularVelocity, setElementAttachedOffsets, setElementInterior, attachElements, createVehicle e getElementsWithinRange.

Estas 69 funções existem no servidor e no cliente. Você pode usá-las em scripts declarados em server_files, client_files ou shared_files.

Veja também as funções de Elementos exclusivas do servidor.

Dados de elemento são pares chave/valor guardados junto do elemento. São a forma mais simples de anexar informação a qualquer coisa e, dependendo do modo de sincronização, essa informação chega aos clientes automaticamente.

Chaves com mais de 128 caracteres são cortadas nesse limite; o cliente também registra um aviso quando isso acontece. Uma string vazia é uma chave válida.

Uma escrita feita no cliente chega ao servidor, por padrão, e dali aos outros jogadores. Ela é um pedido, não uma ordem: quem decide se atende é o servidor.

sincronizarO que acontece
true (padrão)A escrita é enviada ao servidor, que a aplica e repassa — se a chave permitir escrita de cliente.
falseO valor fica nesta máquina e nada é enviado.

Um elemento que o próprio cliente criou é local de qualquer forma: não há elemento do lado do servidor para escrever, então nada é enviado.

A confiancaDoCliente é definida por elemento e por chave, e é contra ela que uma escrita de cliente é conferida:

ValorEfeito
"allow"Clientes podem escrever nesta chave deste elemento.
"deny"Clientes nunca podem escrever nela.
"default"Limpa a definição, devolvendo a chave ao critério do sv_elementDataWhitelist.

Uma chave sem nada definido segue o sv_elementDataWhitelist: recusada quando a lista branca está ligada, permitida quando está desligada. Remover uma chave limpa a confiança dela junto.

Uma escrita recusada nunca é aplicada. O servidor a registra, dispara o onPlayerChangesProtectedData no jogador e devolve o valor verdadeiro àquele cliente para que a cópia dele pare de divergir.

Podem ser guardados números, strings, booleanos, elementos, resources e tabelas (inclusive aninhadas, com elementos dentro). Uma tabela que referencia a si mesma, ou que contém a mesma tabela duas vezes, mantém essas referências. Guardar nil, uma função ou uma corrotina guarda nil: a chave continua existindo, getElementData devolve nil para ela e hasElementData devolve true. Dentro de uma tabela, os pares com esses valores são descartados. Uma tabela com mais de 16 níveis de profundidade ou mais de 4096 entradas em um mesmo nível é recusada e a função devolve false; no cliente esses limites só valem para escritas enviadas ao servidor.

Exemplo

-- servidor
setElementData(jogador, "dinheiro", 5000)
setElementData(jogador, "senhaHash", hash, false) -- nunca sai do servidor
setElementData(veiculo, "chaves", { jogador1, jogador2 })
-- servidor: deixa o próprio cliente manter esta chave em dia
setElementData(jogador, "sensibilidadeMira", 1.0, true, "allow")
-- servidor: garante que ele nunca possa
setElementData(jogador, "dinheiro", 5000, true, "deny")
-- cliente: uma preferência local, que não vai para a rede
setElementData(localPlayer, "hudCompacto", true, false)
-- cliente: uma escrita que o servidor permitiu
setElementData(localPlayer, "sensibilidadeMira", 1.4)

Objetos e edifícios podem ter uma versão simplificada, exibida de longe. Ligar os dois com setLowLODElement faz o cliente trocar automaticamente de um para o outro conforme a distância.

Vários setters desta página não param no elemento que você passou: eles percorrem a árvore em profundidade e se aplicam também aos descendentes. É o que faz setElementHealth(root, 100) curar todo mundo de uma vez. A propagação pode ser desligada por elemento. Desligá-la no alvo impede a chamada de chegar aos filhos; desligá-la em um descendente ainda deixa esse nó receber a alteração, mas corta tudo que estiver abaixo dele.

SetterClienteServidor
setElementPosition, setElementVelocity, setElementAngularVelocitySimSim
setElementRotationSimNão
setElementMatrixSimSó a posição
setElementHealth, setElementModelSimSim
setElementInterior, setElementDimensionSimSim
setElementAttachedOffsets, setElementAlpha, setLowLODElementSimSim
attachElements, detachElementsSimNão
setElementOnFire, setElementFrozen, setElementDoubleSidedNãoSim

Tipos de descendente incompatíveis são ignorados. O retorno da função descreve a aplicação no elemento informado, não garante que cada descendente aceitou a propriedade.