Jump to content

Citizen

Moderators
  • Posts

    1,803
  • Joined

  • Last visited

  • Days Won

    8

Everything posted by Citizen

  1. Donc c'est un problème de collision ou alors t'as un panel de connexion ou un truc du genre ?
  2. Hmmm normalement le code devrait faire spawn les zombie sur la map et pas en-dessous à condition que le joueur soit sur la map et pas en-dessous (et que la map a bien une collision pour le sol à l'endroit du spawn (random autour du joueur)). Si le joueur ne spawn pas tout de suite sur la map et que pendant ce laps de temps le joueur est considéré comme en-dessous de la map (genre un panel de login ou autre), les zombies vont spawn sous la map.
  3. Bonjour, Il me faudrait la fonction complète qui fait un triggerClientEvent("Spawn_Placement" blabla) La solution rapide (mais dégueulasse) serait de remplacer la dernière fonction par: addEvent( "Spawn_Placement", true ) function Spawn_Place(xcoord, ycoord) local x,y,z = getElementPosition( getLocalPlayer() ) local gz = getGroundPosition ( x, y, z+100 ) triggerServerEvent ("onZombieSpawn", getLocalPlayer(), x, y, gz+10 ) end addEventHandler("Spawn_Placement", getRootElement(), Spawn_Place) Mais ça va faire tomber le zombie sur la tête du joueur donc il faudrait comprendre à comment sont calculés xcoord et ycoord. C'est peut-être des spawn prédéfinis que tu peux peut-être modifier.
  4. Bonjour, Ici, nous évitons d'aider sur des scripts/ressources volés. Valhalla est un gamemode volé qui a fuité sur internet, ses auteurs originaux n'ont jamais souhaités le rendre publique. Cordialement, Citizen
  5. La ressource concernée n'as pas les droits nécessaires. Rajoute la dans le groupe Admin de l'acl (serveur éteint) puis réessaye.
  6. Peux-tu être plus précis ? Si tu n'as pas de factions en BDD, ta dropdown list sera vide.
  7. La seule raison pour que ça arrive c'est que le gars spawn dans le marker à ce moment là. Si ce n'est pas le cas, c'est que ce n'est pas mon code qui l'affiche mais un autre que tu aurais oublié quelque part. Pour en être sûr modifie le message dans le code que je t'ai passé en rajoutant un "LOL C'EST MOI" (par exemple) à la fin du message, relance le GM, reconnecte toi et vérifie. Si le message n'a pas changé c'est que c'est un code autre part qui l'affiche
  8. @Gordon_G L'erreur portait sur le 1er code plutôt que le 2ème
  9. Tu n'as absolument rien changé au code, t'as juste changé la fonction anonyme en fonction concrète et tu as remis le addCommandHandler alors qu'il demande justement de ne plus l'exécuter via une commande. De plus tu ne lui as même pas corrigé son problème de scope des variables Wlevel et Mlevel (rajouter le keyword local devant). Il manque l'entête de la fonction, la ligne du Wlevel qui ne sert pas (ne cause pas d'erreur celui là) et le fait qu'il faille utiliser 'source' plutôt que thePlayer: addEventHandler( "onPlayerWasted", getRootElement(), function () setPlayerWantedLevel(source, 0) setPlayerTeam(source, getTeamFromName("Citizens")) end) Pour payer son amende via un marker: local ammendeMarker = createMarker(0, 0, 3) -- Modifie le marker comme bon the semble function payerAmmende(thePlayer) local Wlevel = getPlayerWantedLevel(thePlayer) -- scope corrigé (la variable n'est accessible que dans cette fonction et n'est pas modifible en-dehors) local Mlevel = getPlayerMoney(thePlayer) -- pareil if Wlevel == 1 and Mlevel >= 500 then setPlayerMoney (thePlayer,Mlevel - 500) setPlayerWantedLevel(thePlayer, 0) setPlayerTeam (thePlayer, getTeamFromName("Citizens")) elseif Wlevel == 2 and Mlevel >= 1000 then setPlayerMoney (thePlayer,Mlevel - 1000) setPlayerWantedLevel(thePlayer, 0) setPlayerTeam (thePlayer, getTeamFromName("Citizens")) elseif Wlevel == 3 and Mlevel >= 1500 then setPlayerMoney (thePlayer,Mlevel - 1500) setPlayerWantedLevel(thePlayer, 0) setPlayerTeam (thePlayer, getTeamFromName("Citizens")) elseif Wlevel == 4 and Mlevel >= 2000 then setPlayerMoney (thePlayer,Mlevel - 2000) setPlayerWantedLevel(thePlayer, 0) setPlayerTeam (thePlayer, getTeamFromName("Citizens")) elseif Wlevel == 5 and Mlevel >= 2500 then setPlayerMoney (thePlayer,Mlevel - 2500) setPlayerWantedLevel(thePlayer, 0) setPlayerTeam (thePlayer, getTeamFromName("Citizens")) elseif Wlevel == 6 and Mlevel >= 3000 then setPlayerMoney (thePlayer,Mlevel - 3000) setPlayerWantedLevel(thePlayer, 0) setPlayerTeam (thePlayer, getTeamFromName("Citizens")) elseif Wlevel == 0 then outputChatBox("You don't need to pay! (Você não precisa pagar!)", thePlayer) else outputChatBox("You don't have money enough! (Você não tem dinheiro o bastante!)", thePlayer) outputChatBox("Pay $500 for wanted level! (Pague $500 por nível de procurado)", thePlayer) end end addEventHandler("onMarkerHit", ammendeMarker, payerAmmende) Qu'on peut optimiser comme suit: local amendeMarker = createMarker(0, 0, 3) -- Modifie le marker comme bon the semble function payerAmende( thePlayer ) local Wlevel = getPlayerWantedLevel(thePlayer) if Wlevel == 0 then outputChatBox("You don't need to pay! (Você não precisa pagar!)", thePlayer) return -- On empêche la fonction de continuer end local Mlevel = getPlayerMoney(thePlayer) local needToPay = 500 * Wlevel -- 500$ par niveau de recherche (ex: 5 * 500 = 2500) if Mlevel < needToPay then outputChatBox("You don't have money enough! (Você não tem dinheiro o bastante!)", thePlayer) outputChatBox("Pay $500 for wanted level! (Pague $500 por nível de procurado)", thePlayer) return -- On empêche la fonction de continuer end setPlayerMoney (thePlayer, Mlevel - needToPay) setPlayerWantedLevel(thePlayer, 0) setPlayerTeam (thePlayer, getTeamFromName("Citizens")) end addEventHandler("onMarkerHit", amendeMarker, payerAmende)
  10. Il se peut que via MTA, le jeu se lançait sur le chipset plutôt que ta carte grapique. Le fait d'avoir réinstallé/mis à jour les drivers de ta carte nvidia a peut-être permit de le refaire basculer sur ta CG. Ça dépasse mes connaissances mais je reste sur mon idée comme quoi MTA ne le faisait plus lancer sur la CG jusqu'à ce que tu réinstalles les drivers, ça a dû remettre la CG par défaut. Content que tu ais résolu ton problème
  11. Je vois que c'est toujours le même serveur sur tes screenshots, as-tu essayé un autre serveur ? (Tente le Map Editor aussi). Le lien ne marche pas pour nous (le résultat est peut-être restreint à ton ordi/ip/browser. Je sais que tu peux créer un fichier en détection offline. On pourra l'importer sur le site si tu nous le fait parvenir). Ok voilà ce que tu peux changer juste pour tester: Résolution: 800x600x32 Mode fenêtré coché Distance d'affichage: 100% Qualité des effets: au minimum Décocher les 3 cases en bas La mémoire de streaming est au max sur l'autre screenshot donc c'est bon. (Je tenterai également de jouer avec le Filtrage anisotrope car c'est un algo graphique qui touche directement aux textures).
  12. Peux-tu également nous faire un screen des paramètres Video et Avancé ?
  13. Pour moi, d'après les screenshots, le problème est différent car il ne semble pas avoir de problème pour charger les éléments 3D mais il (son pc) n'arrive pas à les afficher correctement. Si c'était un problème de stream, il manquerait des éléments entiers alors qu'on peut clairement voir qu'un véhicule est correctement streamé car le véhicule est bien là mais le moteur graphique se chie dessus pour l'afficher correctement. (Je sais pas si ça à du sens pour vous) EDIT: Comment realise tu tes tests, sur un serveur en local ? As-tu essayé sur un autre serveur aléatoire ?
  14. Je comprends pas bien si c'est un problème qui ne se produisait pas avant ou si c'est pour dire que c'est okay. Peux tu préciser ? As-tu le problème sur le solo ? Essaye de jouer avec les paramètres graphiques en désactivant/activant, réduire/augmenter des choses. (Oui je n'ai aucune idée quoi essayer précisément). Réduis la résolution / les graphismes pour tenter d'utiliser moins de mémoire vidéo et voir si ça s'affiche mieux. Ton pc, as-t'il une carte graphique ? ou juste un chipset ? EDIT: Un vieux post d'un admin/developpeur MTA Towncivilian propose également de supprimer D3DX9_42.dll et D3D9.dll dans le dossier MTA
  15. Bonsoir, Il y a plusieurs choses que tu peux essayer: Si tu as la version steam, essaye de vérifier l'intégrité des fichiers du jeu. (Certains fichiers de map sont peut-être endommagés) Mais vu qu'on voit des morceaux de véhicules, ça ne semble pas être dû à ça (c'est soit il y a le fichier et on le voit entièrement, soit il est endommagé et on ne le voit pas du tout). Je pense plus à un problème graphique. Installer les derniers drivers pour ta carte graphique (avec un redémarrage de l'ordi, ça ne fera pas de mal) Installer/Réparer DirectX 9.0 via ce lien Microsoft: https://www.microsoft.com/en-us/download/details.aspx?id=35 (avec un redémarrage de l'ordi aussi) On réfléchira à d'autres possibilités en fonction de ton retour si le problème persiste.
  16. Bonjour, Pas possibles via les fonctions standards: engineLoadXXX engineReplaceXXX En revanche il est possible d'avoir plusieurs mods dur un même véhicule en même temps via des shaders spéciaux: Je pense qu'on peut trouver le script quelque part mais c'est pas facile sur le téléphone tente avec les mots clefs "per entity shaders". Je pense que le serveur en question devait utiliser cette technique.
  17. if isElement(GUIEditor_Label[5]) then destroyElement(GUIEditor_Label[5]) end GUIEditor_Label[5] = guiCreateLabel(706,159,63,13,text,false) guiSetFont ( GUIEditor_Label[5], "default-bold-small" ) Hmmm alors oui ça fonctionne mais non c'est pas la logique que j'avais indiqué. Le soucis (non visible) avec ce code c'est que tu supprimes le label s'il existe déjà pour reconstruire le même label avec la même font et tout mais juste avec le texte qui change. Et pour changer juste le texte, il y a guiSetText ... Je m'attendais plus à un truc comme ça: if not isElement(GUIEditor_Label[5]) then GUIEditor_Label[5] = guiCreateLabel(706,159,63,13,text,false) guiSetFont ( GUIEditor_Label[5], "default-bold-small" ) else guiSetText( GUIEditor_Label[5], text ) end Oui, il suffit de remplacer les nombres exprimés pixels par leur correspondance en pourcentage d'écran. Pour ça il suffit d'appliquer un calcul basique. Admettons que tu l'as bien positionné (706, 159 => position absolue car en pixels) sur ton écran et que tu as une résolution de 1920x1080, pour le mettre en position relative (pourcentage) il faut faire comme suit: guiCreateLabel(706,159,63,13,text,false) On veut répondre à la question: 706 pixels, c'est combien de pourcent de 1920 ? => Réponse: 706/1920 = 0.36770833333333333333333333333333 qu'on peut arrondir => 0.368 (3 chiffres après la virgule est suffisamment précis même si un joueur à un écran 4K (1.12 pixels de différence donc LARGE niveau précision)) guiCreateLabel(0.368,159,63,13,text,false) Ensuite on veut répondre à la question: 159 pixels, c'est combien de pourcent de 1080 ? => Pareil: 159/1080 = 0.14722222222222222222222222222222 qu'on peut arrondir => 0.147 guiCreateLabel(0.368,0.147,63,13,text,false) On fait pareil pour 63, 13 => 0.033, 0.012 on remplace et on change l'argument relative à true guiCreateLabel(0.368,0.147,0.033,0.012,text,true) Et voilà ton label devrait s'afficher en fonction de la résolution de l'écran du joueur.
  18. Non, le problème c'est qu'à chaque changement de level (ligne 50 à 56) tu crées un nouveau label à l'écran (ligne 45), sans vérifier qu'il peut déjà y en avoir un d'affiché/créé. Pour corriger il suffit de remplacer la ligne 45 en appliquant la logique suivante: Si GUIEditor_Label[5] ~= nil alors je crée le label et je le stocke dans GUIEditor_Label[5] (ligne 45 à récupérer) puis je lui set sa police (ligne 46 à récupérer) Sinon je lui change son texte via guiSetText Je pensais te le corriger directement, mais je pense qu'avec le code en français (mes 2 petits points du dessus), tu verrais la logique et comment le retranscrire dans ton code (ça doit se passer ligne 45 du coup).
  19. Ok alors j'ai reçu une notif par mail du message de Wumbaloo mais pas pour celui de LawrenceKnight de Jeudi ... Désolé de ne pas t'avoir répondu du coup. Bon du coup on dirait une vieille version du mode DayZ mais j'ai réussi à trouver des traces de codes sur des forums et en gros il y a une fonction qui s'appelle RanSpawn_Z qui crée le zombie via un local zomb = createPed( tonumber( ZombiePedSkins[randomZskin] ), gx, gy, gz ) Puis il fait un setElementData ( zomb, "zombie", true ) Peux-tu confirmer que tu es bien ça de ton côté ? Si c'est bien le cas, notre test devrait être bon et notre outputChatBox(tostring(getElementData (source, "zombie"))) aurait dû nous afficher true plutôt que false dans la chatbox. Peux-tu refaire le test avec ce code modifié (histoire de lever tout doute sur qui affiche quoi ?): function killp ( attacker, weapon, bodypart ) outputChatBox("weapon ? "..weapon) -- là if weapon == 5 then outputChatBox("zombie ? "..tostring(getElementData (source, "zombie"))) -- et là if (getElementData (source, "zombie") == true) then outputChatBox("yes ok instakill it !") killPed(source, attacker, weapon, bodypart) end end end addEventHandler ( "onClientPedDamage", getRootElement(), killp ) ######################################## Pour le son des sabres lasers, je pense que ceci devrait marcher: -- Server function jedi ( player ) local weaponID = getPedWeapon ( player ) if ( weaponID == 15 and isControlEnabled ( "fire" ) ) then triggerClientEvent ( "onLaserSaberSwing ", player ) end end -- Exécuté au démarrage du gamemode pour tous les joueurs déjà co: for _, player in pairs(getElementsByType("player")) do bindKey ( player, "fire", "down", jedi ) end -- Exécuté pour chaque joueur qui se connecteront plus tard: addEventHandler("onPlayerJoin", root, function () bindKey ( source, "fire", "down", jedi ) end) -- Client local JediSound = { "a.mp3", "b.mp3", "c.mp3" } function onLaserSaberSwingFunc ( ) local muzzleX, muzzleY, muzzleZ = getPedWeaponMuzzlePosition ( source ) local sound = playSound3D ( JediSound[ math.random( 1,#JediSound ) ], muzzleX, muzzleY, muzzleZ, false ) setSoundMaxDistance ( sound, 40 ) end addEvent( "onLaserSaberSwing ", true ) addEventHandler( "onLaserSaberSwing ", root, onLaserSaberSwingFunc ) Et pour un zombie, il faudra modifier le code de ton DayZ à l'endroit qui le fait attaquer et faire ceci en testant d'abord qu'il a bien le sabre laser en main: triggerClientEvent ( "onLaserSaberSwing ", laVariableDuZombie )
  20. Non je cherchais à voir la fonction qui spawn les zombies et d'après la ligne 28, il y a une fonction qui s'appelle SpawnZombie oui
  21. Effectivement, ton raisonnement est bon du coup mais il y a visiblement un truc qui cloche. Les element data ne sont pas cloisonnés par ressource, c'est à dire l'ajout/modification d'un element data dans la ressource zombie est assurément visible/récupérable dans une autre ressource donc ça aurait dû marcher. La seul possibilité que je vois actuellement c'est que tu regardes le code d'une ressource zombie qui n'est pas celle qui tourne sur ton serveur. Mais je pense que tu n'en as pas 36 milles... Peux-tu trouver et copier le code du spawn zombie ? On va vérifier qu'il le met bien cet element data à true et on va rajouter un outputChatBox pour vérifier ingame que c'est bien cette fonction (et donc cette ressource) qui spawn actuellement les zombies sur ton serveur.
  22. La version server de cette fonction doit prendre un joueur en 1er argument, rajoute le. Tu vois pas le problème ?? 7 = tu as tapé avec la canne (on s'en fou) 5 = tu a tapé avec la batte mais false = pas un zombie. Si tu as vraiment tapé un zombie, ton test pour savoir si c'est un zombie n'est pas bon. Peux-tu montrer le code que t'as trouvé dans la ressource zombie qui t'a indiqué que ça serait bon ? (Si tu veux que ça oneshot tout le monde (zombies, autres joueurs) retire juste ce test).
  23. Ouai en fait il faut se reconnecter et je pense que ça devrait marcher. J'ai oublié le cas où on restart la ressource et que des joueurs restent sur le serveur. Le bindKey n'est rejoué vu qu'il n'est que sur le onPlayerJoin. Pour le 2 je pensais à ça: function killp ( attacker, weapon, bodypart ) outputChatBox(weapon) -- là if weapon == 5 then outputChatBox(tostring(getElementData (source, "zombie"))) -- et là if (getElementData (source, "zombie") == true) then killPed(source, attacker, weapon, bodypart) end end end addEventHandler ( "onClientPedDamage", getRootElement(), killp )
  24. Arf j'avais zappé que la version server du bindKey doit avoir un argument player obligatoire en 1er (je le pensais optionnel). Fait le bind lorsque le joueur se connecte: addEventHandler("onPlayerJoin", root, function () -- root = raccourci de getRootElement(), et je donne la fonction directement en argument en même temps que je la défini, donc elle ne peut pas porter de nom (on parle de fonction anonyme) bindKey ( source, "fire", "down", jedi ) end) Pour le 2 il faut débuguer, as-tu une erreur affichée via /debugscript 3 ? Si tu outputChatBox weapon, quel valeur s'affiche dans le chat ? La même chose pour getElementData (source, "zombie") (pour afficher un boolean, il faut le passer à la fonction tostring d'abord, ce qui n'est pas nécessaire pour les nombres) ?
×
×
  • Create New...