Jump to content

Les joueurs dans le véhicule prennent du dégâts


Recommended Posts

Bonjour,

J'essaye actuellement depuis quelques jours de résoudre un problème concernant un petit script permettant de tuer des gens en étant dans un véhicule sur le mods MTA:DayZ.

J'ai réussi à faire une base plus ou moins fonctionnel sauf que les joueurs dans le véhicule prennent également du dégâts lors du carkill. J'ai essayé pas moins d'une quinzaine de méthodes pour régler le problème, mais aucune n'a permis de corriger le soucis.

Voici le code dans sa première version :

function onPlayerAttackedByVehicle(attacker) 
  if getElementType(attacker) == "vehicle" then 
    local aBlood = getElementData(getLocalPlayer(), "blood") 
    setElementData(getLocalPlayer(), "blood", aBlood - math.random(3000,4000)) 
  end 
end 
addEventHandler("onClientPlayerDamage", getRootElement(), onPlayerAttackedByVehicle) 

En bref, j'aimerais que le joueur ayant été percuté par le véhicule reçoive les dégâts et que personne dans le véhicule ne prenne de dégâts hormis la victime. Sauf que je n'arrive absolument pas à parvenir au résultat voulu.

Merci d'avance pour l'aide, je reste à votre disposition en cas d'éventuelles questions.

Rémi.

Link to comment
As-tu bien utilisé l'évènement : onPlayerDamage au lieu de onClientPlayerDamage ?

Oui.

EDIT : Comme ça, cela devrait marcher non ?

  
function onPlayerAttackedByVehicle(attacker) 
  if getElementType(attacker) == "vehicle" then 
    local theVehicle = getPedOccupiedVehicle(attacker) 
    if theVehicle == false then 
        local aBlood = getElementData(getLocalPlayer(), "blood") 
        setElementData(getLocalPlayer(), "blood", aBlood - math.random(3000,4000)) 
    end 
  end 
end 
addEventHandler("onClientPlayerDamage", getRootElement(), onPlayerAttackedByVehicle) 
  

Link to comment
  • Moderators

Il y a toujours cette notion de client-serveur que tu ne maîtrises/comprends toujours pas.

Les scripts clients sont envoyés par le serveur à chaque joueur qui se connecte. Chaque pc/joueur qui se connecte au serveur reçoivent donc ces scripts, et les exécutent.

Lorsqu'un joueur (joueur 1) se prend des dégâts, tous les joueurs qui sont proche de cette victime (joueur 2 et joueur 3) (il y a une notion d'éléments "streamed in" et "streamed out" pour cet event à prendre en compte) vont aussi remarquer que joueur 1 s'est prit des dégâts. En conséquence tous les 3 vont déclencher l’événement "onClientPlayerDamage" avec en source : joueur 1

Ta fonction va donc s’exécuter chez les 3 joueurs donc il ne faut surtout pas retirer du "blood" à getLocalPlayer() mais au joueur qui est la source de cet event:

function onPlayerAttackedByVehicle(attacker, weapon, bodypart, loss) 
    if getElementType(attacker) == "vehicle" then 
        local aBlood = getElementData(source, "blood") 
        setElementData(source, "blood", aBlood - math.random(3000,4000)) 
    end 
end 
addEventHandler("onClientPlayerDamage", root, onPlayerAttackedByVehicle) 

Mais attention, là encore il y a un problème:

comme ce script est exécuté sur les 3 pc, le pc de joueur 1 va enlever du blood à joueur 1 mais joueur 2 va aussi lui en enlever et joueur 3 aussi.

Donc les dégâts sont infligé 3 fois au même joueur.

Pour régler ça, il suffit tout simplement de laisser le pc de joueur 1 lui infliger lui-même les dégâts en vérifiant que le joueur source correspond au joueur local (donc le joueur qui exécute le script):

function onPlayerAttackedByVehicle(attacker, weapon, bodypart, loss) 
    if getElementType(attacker) == "vehicle" and source == localPlayer then 
        local aBlood = getElementData(source, "blood") 
        setElementData(source, "blood", aBlood - math.random(3000,4000)) 
    end 
end 
addEventHandler("onClientPlayerDamage", root, onPlayerAttackedByVehicle) 

Et ça devrait très bien fonctionner.

Par contre tu devrai utiliser loss pour savoir combien lui retirer de blood. Ça sera plus pro et plus logique surtout. (Faudra surement le multiplier par 10 ou 100, je ne sais pas combien de blood un joueur a de base).

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

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