Jump to content

[Ajuda] Sistema de furar os pneus a cada batida.


Recommended Posts

Boa tarde, estava tentando criar um script que a cada batida do player a mais de 70 km/h um pneu do veiculo estourava, e tinha uma chance de 40% disso acontecer, mais o script não funcionou, Podem me ajudar em como resolver o erro?

 

local TIRE_FRONT_LEFT = 0
local TIRE_FRONT_RIGHT = 1
local TIRE_BACK_LEFT = 2
local TIRE_BACK_RIGHT = 3

function burstTire(vehicle, tireIndex)
    setVehicleWheelStates(vehicle, tireIndex, 0, 0, 0, 0, false, false)
end

function onVehicleCollision(hitElement, force, bodyPart, x, y, z, nx, ny, nz)
    if getElementType(hitElement) == "vehicle" then
        local vehicleSpeed = getElementSpeed(source)
        if vehicleSpeed > 70 then
            local randomChance = math.random(1, 100)
            if randomChance <= 40 then
                local tireIndex = math.random(0, 3)
                burstTire(source, tireIndex)
            end
        end
    end
end
addEventHandler("onVehicleCollision", root, onVehicleCollision)

 

Edited by Lord Henry
Script editado a pedido do autor.
Link to comment
  • Other Languages Moderators

2 coisas que vc precisa estar atento:

  1. Você declarou os parâmetros do setVehicleWheelStates incorretamente. Da forma que você fez, ele vai definir um estado aleatório do pneu dianteiro esquerdo, os demais nunca serão alterados pois sempre estarão no estado 0 (inflados).
  2. Esteja ciente de que onClientVehicleCollision não detecta colisões caso o objeto do cenário que o veículo bateu seja destruído. Ou seja, não detecta ao destruir postes, nem cercas ao colidir.
Edited by Lord Henry
(removido item equivocado)
Link to comment

a

20 minutes ago, Lord Henry said:

3 coisas que vc precisa estar atento:

  1. setVehicleWheelStates deve ser usado server-side se você quiser que os outros jogadores vejam o pneu estourado também.
  2. Você declarou os parâmetros do setVehicleWheelStates incorretamente. Da forma que você fez, ele vai definir um estado aleatório do pneu dianteiro esquerdo, os demais nunca serão alterados pois sempre estarão no estado 0 (inflados).
  3. Esteja ciente de que onClientVehicleCollision não detecta colisões caso o objeto do cenário que o veículo bateu seja destruído. Ou seja, não detecta ao destruir postes, nem cercas ao colidir.

Poderia editar? Tentei editar e ficou dessa forma. Caso não esteja certo, faça alterações por favor, O script está no Server-side

(código movido para a primeira mensagem)

Edited by Lord Henry
Link to comment
  • Other Languages Moderators

Aqui está: (client-side)

-- Obs: Essa função ativa mesmo com o veículo blindado.
-- Obs2: Essa função ativa mesmo que não haja dano no veículo, por exemplo ao arranhar o assoalho do veículo em algo.
-- Se quer que a função ative somente ao dar dano no veículo, utilize onClientVehicleDamage (não ativará se o veículo estiver blindado)
addEventHandler("onClientVehicleCollision", root, function()
    if source == getPedOccupiedVehicle(localPlayer) then -- Se o veículo que bateu for o que o localPlayer estiver dentro, então:
        local sx, sy, sz = getElementVelocity (source) -- Obtém a velocidade x, y, z do veículo.
        local kmhs = math.floor(((sx^2 + sy^2 + sz^2)^(0.5)*(1.61))*100) -- Calcula e converte a velocidade em km/h
        if kmhs >= 70 then -- Se estava a 70 km/h ou mais quando colidiu, então:
            local random = math.random(100) -- Gera um número pseudo-aleatório entre 1 e 100.
            print("Bateu com força. Random gerado: "..random)
            if random <= 40 then -- Se o número gerado for menor ou igual a 40, então: (40% de chance)
                local fl, rl, fr, rr = getVehicleWheelStates (source) -- Obtém o estado de todos os pneus do veículo.      
                local pneus = {fl, rl, fr, rr} -- Cria uma tabela com os estados de cada pneu.
                local tire = math.random(4) -- Gera um número pseudo-aleatório entre 1 e 4. Vai determinar qual pneu será furado.
                if pneus[tire] == 0 then -- Se o estado do pneu escolhido for inflado, então:
                    pneus[tire] = 1 -- Muda esse estado para furado.
                    outputChatBox("Pneu "..tire.." do seu carro furou!")
                end
                setVehicleWheelStates (source, pneus[1], pneus[2], pneus[3], pneus[4]) -- Seta o novo estado dos pneus.
            end
        end
    end
end)

Obs: Uma batida pode furar vários pneus, pois essa função é ativada várias vezes numa única batida. Se quiser evitar, adicione um timer anti-spam na função para não funcionar durante X segundos após furar um pneu.

Edited by Lord Henry
Link to comment
On 25/04/2024 at 14:03, Lord Henry said:

Aqui está: (client-side)

-- Obs: Essa função ativa mesmo com o veículo blindado.
-- Obs2: Essa função ativa mesmo que não haja dano no veículo, por exemplo ao arranhar o assoalho do veículo em algo.
-- Se quer que a função ative somente ao dar dano no veículo, utilize onClientVehicleDamage (não ativará se o veículo estiver blindado)
addEventHandler("onClientVehicleCollision", root, function()
    if source == getPedOccupiedVehicle(localPlayer) then -- Se o veículo que bateu for o que o localPlayer estiver dentro, então:
        local sx, sy, sz = getElementVelocity (source) -- Obtém a velocidade x, y, z do veículo.
        local kmhs = math.floor(((sx^2 + sy^2 + sz^2)^(0.5)*(1.61))*100) -- Calcula e converte a velocidade em km/h
        if kmhs >= 70 then -- Se estava a 70 km/h ou mais quando colidiu, então:
            local random = math.random(100) -- Gera um número pseudo-aleatório entre 1 e 100.
            print("Bateu com força. Random gerado: "..random)
            if random <= 40 then -- Se o número gerado for menor ou igual a 40, então: (40% de chance)
                local fl, rl, fr, rr = getVehicleWheelStates (source) -- Obtém o estado de todos os pneus do veículo.      
                local pneus = {fl, rl, fr, rr} -- Cria uma tabela com os estados de cada pneu.
                local tire = math.random(4) -- Gera um número pseudo-aleatório entre 1 e 4. Vai determinar qual pneu será furado.
                if pneus[tire] == 0 then -- Se o estado do pneu escolhido for inflado, então:
                    pneus[tire] = 1 -- Muda esse estado para furado.
                    outputChatBox("Pneu "..tire.." do seu carro furou!")
                end
                setVehicleWheelStates (source, pneus[1], pneus[2], pneus[3], pneus[4]) -- Seta o novo estado dos pneus.
            end
        end
    end
end)

Obs: Uma batida pode furar vários pneus, pois essa função é ativada várias vezes numa única batida. Se quiser evitar, adicione um timer anti-spam na função para não funcionar durante X segundos após furar um pneu.

Ficou muito bom, ajudou bastante, fiz a edição para que o pneu fure somente quando o carro capote e com o anti spam para isso

Link to comment
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...