Pular para o conteúdo

Armas

Cliente

Uma arma de cliente é uma arma que existe por conta própria. Ela nasce numa posição do mundo, mira sozinha, atira sozinha e tem munição própria — ninguém a segura e ninguém puxa o gatilho. É com isso que se monta torreta, armadilha, canhão de veículo e qualquer coisa que precise disparar sem um dono.

Isso é diferente da arma que está no inventário de um personagem. Aquela pertence ao ped, anda com ele, aparece no HUD e existe também no servidor. Uma arma de cliente é um elemento do tipo weapon, vive só na tela de quem a criou e nunca chega ao servidor.

Toda arma criada por script é um elemento: aparece em getElementType como "weapon", aceita setElementPosition e setElementRotation, some com destroyElement e é destruída automaticamente quando o resource que a criou para.

Quando um argumento inválido é passado — um elemento que não é arma, uma arma já destruída, um nome de estado ou de flag que não existe — a função devolve false e escreve o motivo no console de debug. A única que gera erro de Lua é setWeaponRenderEnabled, quando recebe algo que não seja booleano.

Estas 19 funções existem somente no cliente. Chamá-las de um script de servidor resulta em erro de valor nulo.

Veja também as funções de Armas compartilhadas, que trabalham com nomes, IDs e propriedades das armas nos dois lados.

createWeapon aceita qualquer tipo que tenha modelo, mas só estas onze disparam de verdade. As outras viram um modelo parado no mundo, que você pode posicionar e destruir normalmente, e nada mais.

IDArmaNome
22Colt 45pistol
23Silencedsilenced
24Deagledeagle
28Uziuzi
29MP5mp5
30AK-47ak-47
31M4m4
32Tec-9tec-9
33Riflerifle
34Snipersniper
38Minigunminigun

Exemplo — o ciclo completo de uma torreta: criar, configurar, mirar, atirar e destruir.

local torreta
addCommandHandler("torreta", function()
if torreta then return end
local x, y, z = getElementPosition(localPlayer)
torreta = createWeapon("m4", x + 5, y, z + 1)
if not torreta then
outputDebugString("nao foi possivel criar a torreta")
return
end
-- 1. configure antes de ligar
setWeaponFiringRate(torreta, 150) -- um tiro a cada 150 ms
setWeaponClipAmmo(torreta, 60)
setWeaponFlags(torreta, "instant_reload", true) -- sem pausa para recarregar
setWeaponFlags(torreta, "shoot_if_out_of_range", true)
-- 2. escolha o alvo
setWeaponTarget(torreta, localPlayer)
-- 3. um tiro avulso agora, e depois fogo contínuo
fireWeapon(torreta)
setWeaponState(torreta, "firing")
-- 4. desliga e limpa depois de 10 segundos
setTimer(function()
if torreta then
setWeaponState(torreta, "ready")
destroyElement(torreta)
torreta = nil
outputDebugString("torreta removida")
end
end, 10000, 1)
end)

O estado é o que decide o que a arma faz a cada quadro.

EstadoO que significa
readyParada. Não atira sozinha.
firingAtirando. A cada intervalo da cadência sai um tiro.
reloadingRecarregando. O motor coloca a arma neste estado sozinho quando o pente acaba, e devolve o estado anterior quando termina.
out_of_ammoAceito por setWeaponState, mas o motor nunca coloca a arma nele e não muda o comportamento por causa dele.
melee_madecontactMesma coisa: aceito, guardado e devolvido por getWeaponState, sem nenhum efeito.

Na prática só firing e reloading mudam o que a arma faz. Os outros dois são valores que você pode usar como marcação sua.

Sem alvo, a arma atira em linha reta para a frente, a partir da boca do cano, até o alcance dela. Com alvo, ela gira sozinha a cada quadro para acompanhar.

A arma tem dois números de munição: o pente, que é o que ela gasta tiro a tiro, e a reserva, de onde o pente é reabastecido.

A cadência é o intervalo mínimo entre dois tiros automáticos, em milissegundos: quanto menor o número, mais rápido a arma atira. Ela só vale para o estado firing — fireWeapon ignora esse intervalo.

Um elemento arma carrega a própria cópia dos atributos que o tipo de arma usaria normalmente. Mudá-los aqui afeta aquela arma e mais nada — o tipo de arma em si fica intacto, e todas as outras armas do mesmo tipo também.

Flags são chaves liga/desliga do comportamento da arma. Todas começam desligadas.

FlagPadrãoO que faz quando ligada
shoot_if_out_of_rangefalseA arma atira mesmo com o alvo além do alcance dela. Desligada, ela segura o tiro.
shoot_if_target_blockedfalseO tiro vale mesmo quando a bala para em outra coisa no caminho. Desligada, o impacto é descartado quando a bala não chega no alvo. Só tem efeito quando o alvo é um elemento.
disable_modelfalseEsconde o modelo da arma. Ela continua atirando normalmente, só fica invisível.
instant_reloadfalseEnche o pente na hora, sem tempo de recarga e sem passar pelo estado reloading.
flags—Nome especial: em vez de um booleano só, trabalha com os oito testes de linha de visão do tiro de uma vez.

Quando a flag é flags, os oito booleanos vêm nesta ordem, tanto para escrever quanto para ler:

PosiçãoO que controlaPadrão
1A bala testa prédios.true
2A bala testa pneus de veículo.true
3A bala testa bonecos.true
4A bala testa objetos.true
5A bala testa peds.true
6A bala testa veículos.true
7A bala enxerga através de materiais transparentes.false
8A bala atravessa materiais perfuráveis.false

Estas duas são globais e não têm nada a ver com as armas criadas por createWeapon: elas ligam e desligam o desenho das armas que os personagens seguram. Não recebem elemento nenhum.

Para esconder o modelo de uma arma criada por script, use a flag disable_model.