pRemi Posted August 5, 2014 Share Posted August 5, 2014 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
TheCapn Posted August 7, 2014 Share Posted August 7, 2014 Salut, La seule chose qui me vient à l'esprit c'est : est-ce qu'il ne faudrait pas plutôt executer ce code du côté serveur ? Link to comment
pRemi Posted August 8, 2014 Author Share Posted August 8, 2014 Salut, La seule chose qui me vient à l'esprit c'est : est-ce qu'il ne faudrait pas plutôt executer ce code du côté serveur ? Malheureusement même côté serveur la problématique persiste. Link to comment
TheCapn Posted August 10, 2014 Share Posted August 10, 2014 As-tu bien utilisé l'évènement : onPlayerDamage au lieu de onClientPlayerDamage ? Link to comment
pRemi Posted August 10, 2014 Author Share Posted August 10, 2014 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 Citizen Posted August 14, 2014 Moderators Share Posted August 14, 2014 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now