Tuex Posted April 23, 2024 Share Posted April 23, 2024 (edited) 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 April 25, 2024 by Lord Henry Script editado a pedido do autor. Link to comment
Other Languages Moderators Lord Henry Posted April 25, 2024 Other Languages Moderators Share Posted April 25, 2024 (edited) 2 coisas que vc precisa estar atento: 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). 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 April 25, 2024 by Lord Henry (removido item equivocado) Link to comment
Tuex Posted April 25, 2024 Author Share Posted April 25, 2024 (edited) a 20 minutes ago, Lord Henry said: 3 coisas que vc precisa estar atento: setVehicleWheelStates deve ser usado server-side se você quiser que os outros jogadores vejam o pneu estourado também. 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). 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 April 25, 2024 by Lord Henry Link to comment
Other Languages Moderators Lord Henry Posted April 25, 2024 Other Languages Moderators Share Posted April 25, 2024 onClientVehicleCollision não funciona server-side só funciona client-side. Link to comment
Other Languages Moderators Lord Henry Posted April 25, 2024 Other Languages Moderators Share Posted April 25, 2024 (edited) 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 April 25, 2024 by Lord Henry Link to comment
Tuex Posted May 1, 2024 Author Share Posted May 1, 2024 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
Recommended Posts