Jump to content

Citizen

Moderators
  • Posts

    1,803
  • Joined

  • Last visited

  • Days Won

    8

Everything posted by Citizen

  1. Et là t'as eu le temps de lire ?! Ne me dis pas le contraire ! Je t'ai demandé 3 fois de répondre à ma question que je t'ai posé, ici: Clique sur sur lien ! ==> https://forum.multitheftauto.com/viewtopic.php?f=128&t=68697&p=642275#p642275
  2. Oui donc dans ce cas, mon code est correct et suffisant, à part qu'il faut renommer l'event en "buyInvisible2" en "buyInvisible" que ce soit du côté client ou du côté serveur. Il n'y aura qu'un seul triggerServerEvent "attaché" à un seul bouton. Je te remet le code côté serveur au cas où (j'ai déjà remplacé le nom de l'event): addEvent("buyInvisible",true) function startInvisible() setElementData(source, "invVEH", true) local sourceVeh = getPedOccupiedVehicle(source) setElementAlpha(source, 0) setElementAlpha(sourceVeh, 0) --on appel stopInvisible après 70 secondes en lui donnant le joueur en argument 1 setTimer(stopInvisible, 70000, 1, source) end addEventHandler("buyInvisible", root, startInvisible) function stopInvisible( thePlayer ) setElementAlpha(thePlayer, 255) setElementData(thePlayer, "invVEH", false) local veh = getPedOccupiedVehicle(thePlayer) setElementAlpha(veh, 255) end Pour cacher le nametag, le gamemode race ne te fournit aucune fonction pour le faire, il va falloir que tu édites toi même le gamemode. Pour t'orienté, il va falloir que tu rajoute une 3ème condition à la ligne 41 du fichier nametags.lua qui devrait ressemblé à cela: if not isPedInVehicle(player) or isPlayerDead(player) then break end L'instruction break permet d'arrêter la boucle while juste au-dessus et permet donc de passer directement au joueur suivant. Donc cette ligne de code signifie: Si le joueur n'est pas dans un véhicule OU s'il est mort alors, on passe au joueur suivant (donc on n'affiche pas son nametag avec sa barre de vie qui sont les instructions qui suivent). Donc toi il te faut rajouter un 2ème "OU" pour que ça fasse en français: Si le joueur n'est pas dans un véhicule OU s'il est mort OU s'il est invisible alors, on passe au joueur suivant. Mais tu ne feras ça que lorsque notre code fonctionnera correctement. Tiens moi au courant. Cordialement, Citizen
  3. Ça ne m'aide absolument pas ! J'ai besoin de l'erreur complète ! Et je t'annonces que je ne vais plus t'aider jusqu'à nouvel ordre !! Pourquoi ?! Qu'est-ce que t'as fais ?! Tu viens poser tes "demandes d'aide" sans même nous montrer ce que tu as tenté (évidemment, tu n'as même pas essayé). T'arrives comme ça et tu demandes, "comment on fait pour faire ceci ou cela ?" alors que si t'avais suivis les tutos, tu saurais le faire. Ensuite, tu ne lis pas les réponses qu'on te donne, tu lis à la volée et tu copies colle bêtement le code sans chercher à comprendre. Je t'ai demandé expressément de me répondre sur ton sujet/topic précédent car je suis toujours sans réponse de ta part ! Je t'ai même relancé: Mais nooooooon ! Monsieur n'en a rien a battre, il est passé à autre chose et donc il va juste ignorer les questions de Citizen ! Si t'as laissé tombé pas de soucis, mais laisse un message pour prévenir ! Je suis désolé de te l'apprendre, mais ce forum n'est pas remplit d'esclaves où il suffit de demander un truc et on te le fait gratos ! C'est un forum d'entraide ! Répare tes erreurs et je t'aiderai à nouveau. Si tu as lu attentivement (cette fois ci) tu as 2 trucs à faire, voir même 3 si t'es quelqu'un de normal. Citizen
  4. Hummmm, juste pour être sûr, on est bien d'accord que le joueur appuis sur un bouton et ça le rend invisible lui ET sa voiture en même temps et pour seulement 70 secondes ? oui ? Sinon est-ce qu'il y a 2 boutons différents, l'un pour le joueur et l'autre pour le véhicule ? Si oui quel est l'intérêt de rendre l'un ou l'autre invisible séparément alors que c'est un serveur Race ?! Merci de m'éclaircir sur ce point.
  5. La moindre des politesses c'est de répondre aux personnes qui t'aides avec tes problèmes, et de les remercier la ou les personnes qui t'ont aider à résoudre ton problème. Allez reviens par ici: viewtopic.php?f=128&t=68667#p641806 Je regarde ce problème en attendant. ___________________________________________________________________________________________ EDIT: Server: (Voir de la ligne 1 à la ligne addEventHandler( "onPlayerJoin", root, function () local accName = getAccountName( getPlayerAccount( source ) ) if isObjectInACLGroup( "user."..accName, aclGetGroup ( "Admin" ) ) then setElementData( source, "isAdmin", true ) end end ) addEvent("sniperTakeDecision", true) addCommandHandler("sniper", function(thePlayer, command) local x, y, z = getElementPosition(thePlayer) local int = getElementInterior(thePlayer) local ped = createSniperPed(x, y, z) setElementInterior(ped, int) end ) setTimer( function() for i, peds in ipairs(getElementsByType("ped")) do if getElementData(peds, "type") == "ped.sniper.npc" and getElementHealth(peds) > 0 then setPedWeaponSlot(peds, 6) giveWeapon(peds, 31, 10000, true) end end end , 50, 0) function createSniperPed(x, y, z) local ped = createPed(120, x, y, z) setTimer( function() if isElement(ped) then giveWeapon(ped, 31, 10000, true) setPedWeaponSlot(ped, 6) setElementData(ped, "type", "ped.sniper.npc") setElementFrozen(ped, true) end end , 5000, 1) return ped end addEventHandler("sniperTakeDecision", getRootElement(), function(sniperPedID, aimPlayer) setElementData(sniperPedID, "target", aimPlayer) triggerClientEvent("sniperTakeDecisionClient", getRootElement(), sniperPedID, aimPlayer) end ) Client: (Voir la ligne 41) function isMyPingTheLowest() local players = getElementsByType("player") local yes = true for i, player in ipairs(players) do if getPlayerPing(getLocalPlayer()) > getPlayerPing(player) then yes = false end end if yes == true then return true else return false end end function findRotation(x1,y1,x2,y2) local t = -math.deg(math.atan2(x2-x1,y2-y1)) if t < 0 then t = t + 360 end return t end addEventHandler("onClientPedDamage", getRootElement(), function(attacker) if getElementData(source, "type") == "ped.sniper.npc" and getElementData(attacker, "type") == "ped.sniper.npc" then cancelEvent() end end ) setTimer( function() if isMyPingTheLowest() then for i, peds in ipairs(getElementsByType("ped")) do if getElementData(peds, "type") == "ped.sniper.npc" and getElementHealth(peds) > 0 then local x, y, z = getElementPosition(peds) local lowest = 9999 local player = nil for i, players in ipairs(getElementsByType("player")) do local px, py, pz = getElementPosition(players) local dist = getDistanceBetweenPoints3D(x, y, z, px, py, pz) if dist < lowest and not getElementData( source, "isAdmin" ) then lowest = dist player = players end end if isElement(player) then triggerServerEvent("sniperTakeDecision", getRootElement(), peds, player) end end end end end , 1500, 0) addEvent("sniperTakeDecisionClient", true) addEventHandler("sniperTakeDecisionClient", getRootElement(), function(sniperPedID, aimPlayer) local x, y, z = getElementPosition(sniperPedID) local px, py, pz = getElementPosition(aimPlayer) setPedAimTarget(sniperPedID, px, py, pz) local rotZ = findRotation(x, y, px, py) setPedRotation(sniperPedID, rotZ) setPedControlState(sniperPedID, "aim_weapon", true) setPedControlState(sniperPedID, "fire", true) setTimer( function() if isElement(sniperPedID) then setPedControlState(sniperPedID, "fire", false) setPedControlState(sniperPedID, "aim_weapon", false) end end , 500, 1) end )
  6. Alors dans ce cas, pourquoi c'est seulement maintenant que tu nous en informe ?? On ne connait pas ton code je te le rappel ! Et pourquoi en avoir fait 2 différents ?! 1 seul trigger suffit largement. J'ai donné un code pour l'event "buyInvisible2" qui est censé parfaitement marcher.
  7. Ouai alors j'aimerai que vous fassiez plus attentions à ce que vous faites Je vous avez dit de garder le client tel qu'il était alors que vous avez changé cette ligne (client-side): triggerServerEvent("buyInvisible2",getLocalPlayer()) en ceci: triggerServerEvent("buyInvisible",getLocalPlayer()) et tout ça sans me prévenir ni réfléchir aux conséquences. Je suis d'accord pour renommer l'event mais dans ce cas il faut aussi le renommer server-side ... Enfin moi ça me parait logique perso. Donc renommer les 2 occurrences du côté serveur pour que mon code soit bien exécuté. Vous pouvez aussi utiliser la variable cachée localPlayer du côté client uniquement. C'est la même chose que de faire getLocalPlayer(). triggerServerEvent("buyInvisible", localPlayer) Voici une liste des variables prédéfinis disponibles dans les fichiers du côté client (client only), du côté serveur (server only) ou des deux côtés (shared): https://wiki.multitheftauto.com/wiki/Pre ... ables_list
  8. Hummm ce n'est pas normal du tout, car le wiki spécifie bien: Est-ce que c'est bien un véhicule du jeu ou un véhicule moddé ? (je ne suis pas sûr qu'il y ait un lien) Si c'est un véhicule moddé, essayez avec un véhicule normal du jeu. Si vous avez activé des shadders qui influent sur la brillance des textures (eau, sol, véhicules etc), essayez de les désactiver. J'ai aussi oublié dans ma correction de mettre l'alpha du joueur à 0, mais il semblerai qu'il prenne automatiquement l'alpha de son parent. Essayez donc ceci et dites moi ce qui s'affiche dans la chatbox (F8 pour pouvoir copier/coller): addEvent("buyInvisible2",true) function startInvisible() setElementData(source, "invVEH", true) local sourceVeh = getPedOccupiedVehicle(source) setElementAlpha(source, 0) --oublié mais surement sans importance setElementAlpha(sourceVeh, 0) testingParentAlpha(sourceVeh) --on appel stopInvisible après 70 secondes en lui donnant le joueur en argument 1 setTimer(stopInvisible, 70000, 1, source) end addEventHandler("buyInvisible2", root, startInvisible) function stopInvisible( thePlayer ) setElementAlpha(thePlayer, 255) setElementData(thePlayer, "invVEH", false) local veh = getPedOccupiedVehicle(thePlayer) setElementAlpha(veh, 255) end function testingParentAlpha( elem ) outputChatBox( "== testingParentAlpha ==" ) do outputChatBox( "elem: "..tostring(getElementType( elem )) ) outputChatBox( "alpha: "..tostring(getElementAlpha( elem )) ) elem = getElementParent() outputChatBox( "==" ) while (elem ~= nil) outputChatBox( "== Fin ==" ) end
  9. Depuis quand un addEventHandler accepte ces arguments après la fonction ? 70000, 1, true Vous êtes dans la même situation que RoRo76 en ce moment. Vous essayez d'utiliser une forme avancée de coding qui permet d'utiliser des fonctions anonymes mais vers la fin, vous êtes complètement perdu et mettez n'importe quoi. Voici la définition du addEventHandler sous sa forme minimale (sans les arguments optionnels): Il lui faut donc: en argument 1 => le nom de l'event (ici buyInvisible2) en argument 2 => qui peut être la source de cet event pour exécuter la fonction en argument 3 (ici root , qui équivaut à "tout") et en argument 3 => la fonction à exécuter lorsque cet event sera appelé/lancé. On peut lui donner soit le nom de la fonction, soit la fonction directement (en lui donnant la fonction directement, on doit lui donner une fonction anonyme). Voici 2 codes équivalents mais seul le second utilise une fonction anonyme: function maFunction() --Instructions ici end addEventHandler( "buyInvisible2", root, maFonction) addEventHandler( "buyInvisible2", root, function () --Instructions ici end) Cette deuxième notation est plus complexe et déroutante que la première plus lisible. Je vous conseil donc de n'utiliser que cette première version. Après 4 ans, j'utilises toujours cette notation car plus lisible est donc plus facile à reprendre/maintenir par la suite. Je n'utilise la 2ème que si la fonction est vraiment petite (en nombres d'instructions). Dans votre code, tout part en cacahuète après la ligne 9. Visez toujours la lisibilité, n'hésitez pas à séparer en plusieurs fonctions. Voici la correction que je propose (vous pouvez gardez le client tel qu'il est): addEvent("buyInvisible2",true) function startInvisible() setElementData(source, "invVEH", true) local sourceVeh = getPedOccupiedVehicle(source) setElementAlpha(sourceVeh, 0) --on appel stopInvisible après 70 secondes en lui donnant le joueur en argument 1 setTimer(stopInvisible, 70000, 1, source) end addEventHandler("buyInvisible2", root, startInvisible) function stopInvisible( thePlayer ) setElementAlpha(thePlayer, 255) setElementData(thePlayer, "invVEH", false) local veh = getPedOccupiedVehicle(thePlayer) setElementAlpha(veh, 255) end N'hésitez pas si vous avez d'autres question où si je n'ai pas été assez précis sur certains points évoqués dans ce topic.
  10. Question: Pourquoi tu t'obstines avec cette notation avancée que tu ne maîtrises absolument pas. Je t'ai donné le code final, pourquoi ne pas l'avoir essayé ????
  11. T'as tenté quelque chose ? Rappel toi ce que j'ai dit sur ton post précédent ... Alors détaillons un peu ce qu'on a. On à le bout de code que t'as copié quelque part (très bien si c'est depuis le wiki): local accName = getAccountName ( getPlayerAccount ( source ) ) if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Admin" ) ) then -- notre "if" --Instructions à exécuter s'il est admin end Et on a les instructions que tu veux réserver qu'aux admins: if tor_s_op == "zu" then moveObject(tor_op, 2000, 1525.64 , 122.0486 , 83) tor_s_op = "auf" else moveObject(tor_op, 2000, 1525.64 , 122.0486 , 90.2) tor_s_op = "zu" end Donc si tu devines correctement, il te suffit de mettre toutes ces instructions à l'intérieur de notre "if": local accName = getAccountName ( getPlayerAccount ( source ) ) if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Admin" ) ) then -- notre "if" --Instructions à exécuter s'il est admin if tor_s_op == "zu" then moveObject(tor_op, 2000, 1525.64 , 122.0486 , 83) tor_s_op = "auf" else moveObject(tor_op, 2000, 1525.64 , 122.0486 , 90.2) tor_s_op = "zu" end end (Bien sûr tu peux supprimer les commentaires) Maintenant il suffit de prendre tout ça et de le mettre dans notre commande. Je te montre ici une "autre façon" de créer une commande. C'est exactement la même mais c'est plus lisible et donc plus simple à comprendre pour ceux qui commencent. (J'utilise toujours cette façon après 4 ans donc ... ) function ouvrirPorte(thePlayer, cmdName) if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Admin" ) ) then -- notre "if" --Instructions à exécuter s'il est admin if tor_s_op == "zu" then moveObject(tor_op, 2000, 1525.64 , 122.0486 , 83) tor_s_op = "auf" else moveObject(tor_op, 2000, 1525.64 , 122.0486 , 90.2) tor_s_op = "zu" end end end addCommandHandler("op", ouvrirPorte) Donc comme tu peux le voir, il faut donc nommer la fonction pour ensuite le donner à notre addCommandHandler La version que tu nous a montré juste avant, est une forme avancée qui permet d'utiliser ce qu'on appelle une fonction anonyme. Le gain de performance est minime et négligeable. Mais attention, ce code ne peux pas encore fonctionner. En effet, si tu regardes bien cette ligne: local accName = getAccountName ( getPlayerAccount ( source ) ) On utilise la variable source dans la fonction getPlayerAccount mais cette variable n’existe pas. Note sur la variable source: Cette variable est une variable "cachée" qui est disponible dans les fonctions ont un addEventHandler et il n'est pas disponible avec un addCommandHandler. Si on regarde bien la page du wiki du addCommandHandler, on peut voir qu'il donne au minimum 2 arguments à la fonction qu'on lui donne: le joueur ayant tapé la commande et le nom de la commande tapée que je récupère respectivement dans les variables thePlayer et cmdName Donc pour que le script marche (car getPlayerAccount prends un joueur en arguement), je le corrige en lui donnant thePlayer. Code final: function ouvrirPorte(thePlayer, cmdName) local accName = getAccountName ( getPlayerAccount ( thePlayer ) ) if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Admin" ) ) then -- notre "if" --Instructions à exécuter s'il est admin if tor_s_op == "zu" then moveObject(tor_op, 2000, 1525.64 , 122.0486 , 83) tor_s_op = "auf" else moveObject(tor_op, 2000, 1525.64 , 122.0486 , 90.2) tor_s_op = "zu" end end end addEventHandler("op", ouvrirPorte) N'hésite pas à demander si tu n'as pas compris quelque chose.
  12. Aucun problème ! N'hésite pas à revenir sur ce topic si tu rencontres des soucis avec cette porte de garage. Mais si tu veux demander de l'aide pour autre chose, il est obligatoire de créer un nouveau topic. Cordialement, Citizen
  13. Quand tu dis problème de moveObject, est-ce que cela veut dire que tu as tenté quelquechose ? Si oui il serait bien de nous montrer ce que tu as tenté car ici on n'aime pas les "coders" qui demandent de l'aide sans avoir essayé eux-même. De plus, il nous faut les 2 positions et rotations de cette porte de garage pour qu'o puisse t'aider. Mais sinon le principe est simple. Supposons que les positions et les rotations de la porte du garage soient: Fermée: Position: 1200, -560, 10 Rotation: 90, 90, 0 Ouverte: Position: 1200, -560, 14 Rotation: 90, 0, 0 Il faudra faire comme ceci: (4000 ms = 4 secs) Pour fermer le garage: moveObject(door, 4000, 1200, -560, 10, 90, 90, 0) Pour l'ouvrir: moveObject(door, 4000, 1200, -560, 14, 90, 0, 0) Il n'y a donc rien de compliqué et je pense même que tu aurais pu trouver tout seul. Cordialement, Citizen
  14. Non comme je l'ai déjà dit précédemment: Je ne vois pas en quoi ma version y changera quelque chose mais je l'ai prise tout à l'heure sur modb donc ça m'étonnerait que ce soit la dernière version: http://www.moddb.com/mods/mtadayz/downl ... 056-stable Je ne sais pas où trouvé la version 0.7 donc j'avais pris celui vite fait pour voir le readme.
  15. Je ne sais pas quelle version du mod tu possèdes car sur celle que j'ai pu trouvé sur internet, je n'ai pas de setElementModel dans le login. Le login system que t'utilises est celui fourni avec le mod ? Et pour l'erreur de la ressource admin, elle n'a rien avoir avec MTA DayZ mais n'est pas censé arrivé pour un joueur legit.
  16. Mouai c'est bizarre, as-tu remplacé ton internal.db par celui fourni dans l'archive ?
  17. Et du coups ce que tu ne nous dit pas si tu as toujours l'erreur lorsque t'enlèves la dernière ressource. <resource src="dayz" startup="1" protected="0"/> Ça change quelque chose ? Les logs consoles sont ils différents ? As-tu des erreurs client-side ? (C:\Program Files (x86)\MTA San Andreas 1.3\MTA\clientscript.log dans les dernières lignes) EDIT: Je n'accepterai pas ta demande de contact skype. Je ne vais pas ajouter tous ceux que j'essaye d'aider. De plus, si quelqu'un à le même problème, il ne connaîtra jamais la solution.
  18. Bonjour Clément, Premièrement, dans ta configuration, tu dis au serveur de lancer 2 fois la ressource dayz mais je ne sais pas sur que ce soit le problème. Je pense que ton dayz fonctionne très bien (du moins d'après les logs), l'erreur doit surement apparaître lorsque le serveur essaye de le lancer une deuxième fois. En revanche je trouve bizarre que le serveur affiche seulement: alors qu'il y a évidemment bien plus de tables à créer pour qu'il fonctionne donc il se pourrait qu'il y ai un autre problème mais pas sûr. Mais as-tu au moins essayé de te connecter au serveur même avec cette erreur ? Car sinon c'était une des 1ère choses à faire. Cordialement, Citizen
  19. Bonjour kofty, Après plusieurs heures de recherches et de tests, j'ai réussi (avec l'aide de Cadu12, une personne que j'ai rencontré sur l'irc de MTA qui à trouvé une alternative moins compliqué que ce que je tentais) à faire le système que tu désirais. Cette version ne fonctionnera que pour une seule ressource, c'est-à-dire que si tu as une autre ressource qui tourne en même temps et qu'elle fournit des commandes pour les joueurs, elles ne seront pas détectées par le système. Ces commandes seront fonctionnelles, mais le système dira que la commande n’existe pas alors qu'elle a pourtant fonctionnée. Crée un fichier cmd.lua: -------------------------------------------------- --- Custom commands system by Cadu12 & Citizen --- --- Error message if the cmd doesn't exists --- -------------------------------------------------- _addCommandHandler = addCommandHandler _removeCommandHandler = removeCommandHandler MTACommands = {"help","exit","quit","ver","time","showhud","binds","serial","vid","window","load","unload","connect","reconnect","bind","unbind","copygtacontrols","screenshot","saveconfig","cleardebug","chatscrollup","chatscrolldown","debugscrollup","debugscrolldown","test","showmemstat","showframegraph","fakelag","aclrequest","sfakelag","debugjoinflood","debugdb","reloadmodule","loadmodule","unloadmodule","whowas","debugscript","reloadbans","whois","sudo","aexec","shutdown","chgpass","delaccount","addaccount","chgmypass","logout","login","nick","me","msg","asay","teamsay","say","check","upgrade","stopall","stop","info","refreshall","info","restart","refresh","start"} _commands = {} function cmdExists(command) for k, cmd in ipairs(_commands)do local name, case = cmd.name, cmd.isCaseSensitive if case and name==command then return true end if not case and name:lower() == command:lower() then return true end end return false end function addCommand(command, func, case) if case == nil then case = false end table.insert(_commands, {name=command, func=func, isCaseSensitive=case}) end for k, cmd in ipairs(MTACommands)do addCommand(cmd, nil) end function addCommandHandler(command, func, restricted, case) if restricted == nil then restricted = false end if case == nil then case = true end if _addCommandHandler(command, func, restricted, case) then addCommand(command, func, case) return true end return false end function removeCommandHandler(command, func) if _removeCommandHandler(command, func) and cmdExists(command) then for k, cmd in ipairs(_commands) do if func == nil or cmd.func == func then table.remove(_commands, k) end end end end addEventHandler("onPlayerCommand", root, function(command) if not cmdExists(command) then outputChatBox("[ERROR] Command not found.") end end) Et rajoute le en premier script dans ta meta.xml: <meta> .... <script src="cmd.lua" type="server" /> <script src="autrescript.lua" type="X" /> .... </meta> J'ai testé et c'est fonctionnel. Cordialement, Citizen
  20. Bonsoir kofty, Qu'entends tu par "commande incorrecte" ? Une commande qui n’existe pas ou une commande qui existe mais dont les arguments n'ont pas été renseignés (du genre: "SYNTAXE: /tppos [x] [y] [z]"). Si tu veux afficher un message d'erreur lorsque le joueur tape une commande qui n’existe pas (), ça risque d'être un peu compliqué voir impossible, je n'est pas encore regarder de comment on pourrait faire ça, mais on a aucun contrôle sur l'exécution d'une commande, on peut juste ajouter des commandes au serveur. Je regarderai voir si c'est possible en trouvant une astuce. Mais je ne promet rien.
  21. 2 - J'ai besoin des erreurs antérieure à ceux que tu me montres. Il serait plus pratique que tu copies-colles les erreurs clients depuis ton clientscript.log qui se trouve par défaut dans: C:\Program Files (x86)\MTA San Andreas 1.3\MTA Il se peut que le fichier soit trop volumineux pour être ouvert dans un éditeur de texte classique, dans ce cas, supprimes carrément le fichier et tu retourne sur ton serveur afin de reprovoquer l'erreur. Avec le peu d'information que j'ai dans ces erreurs, il semblerai que imagecount vaut autre chose que nil, 0 ou false et que du coups, il ne recrée pas le static image en pensant qu'il existe toujours alors qu'il à été détruit. Essaye de rajouter un imagecount = nil juste après le destroyElement.
  22. 1: Bah nan faut que tu gères quand le criminel quitte le serveur. 2: J'avais mis sz au lieu de sy. imagecount = guiCreateStaticImage (x, y, sx, sy, img, false) 3: Désolé, je n'ai pas de tuto sous la main, mais après c'est des requêtes SQL classiques que tu fais grâce à la fonction executeSQLQuery (à utiliser après dbConnect évidemment). Sur la page du executeSQLQuery il y a des exemples de requêtes dont les 4 principaux (SELECT, UPDATE, INSERT et DELETE). Regarde bien les exemples pour comprendre en gros ce que ça fait. Après tu peux toujours regarder un tuto sur les bases du SQL, ce n'est pas utiliser que pour MTA donc tu peux très bien aller sur des sites qui n'ont rien à voir avec MTA pour ça.
  23. 1: Pas la première fois, c'est impossible ! Mais effectivement j'ai pas pensé à remettre isCriminel à false une fois le criminel tué ... function MortCriminel () if ( getElementData(source, "isCriminel") == true ) then destroyElement ( getElementData(source, "attachedBlip") ) destroyElement ( getElementData(source, "attachedPickup") ) outputChatBox ("Le Criminel "..getPlayerName(source).." a été éliminé.", getRootElement(), 0, 255, 0, true) setElementData(source, "isCriminel", false ) end end addEventHandler ("onPlayerWasted", getRootElement(), MortCriminel) 2: Remplace cette ligne: local x, y, sx, sy = 450, 150, 250, 200 par local x, y = 450, 150 local sx, sy = 250, 200 3: Apparemment, game-host fait bien les bases de données MySQL mais c'est en option. Mais MTA possède déjà une base de données. Ce n'est pas une DB MySQL mais une DB SQLite, les requêtes sont les mêmes mais elle est stocké dans un fichier .db Pour créer/modifier une base de donnée SQLite, tu peux télécharger sqlitebrowser: http://sourceforge.net/projects/sqlitebrowser/
  24. 1: Nan je viens de vérifier et c'est bien marqué sur le wiki quels types d'éléments sont accepté pour la fonction attachElements et les pickups n'en font pas parti. Markers</p>\n<p>Blips</p>\n<p>Objects</p>\n<p>Players</p>\n<p>Vehicles</p>\n<p>Sounds</p>\n<p>Colshapes Ducoups remplace juste le createPickup par un createObject vu que tu n'utilises pas les propriétés des pickups. C'est juste que la tête de mort ne tournera pas, tu peux rajouter un bout de code pour le faire tourner toutes les 50 millisecondes. 2: Ah ! alors si t'as donné le code complet c'est sûr que ça ne va pas marcher car t'as rien pour réceptionner l'event. (Pourtant le message d'erreur dit que l'event n'est pas accessible "remotely" alors que s'il n'existait pas, il sortit une erreur comme quoi l'event n'existe pas clientside) Bon alors admettons que tu n'avais aucun addEvent("DEBUTcompteur"... ni aucun addEventHandler("DEBUTcompteur", ... (vérifie quand même dans tes autres fichiers car ça me paraît bizarre) dans ce cas, pour receptionner l'event et éxécuter le compte à rebour, il faut faire comme ceci: local x, y, sx, sy = 450, 150, 250, 200 function Countdown( number ) if not number then number = 3 end if number > 0 then local img = "images/"..number..".png" if not imagecount then imagecount = guiCreateStaticImage (x, y, sx, sz, img, false) else guiStaticImageLoadImage( imagecount, img ) end setTimer(Countdown, 1000, 1, number-1) elseif number == 0 then guiStaticImageLoadImage( imagecount, "images/GO.png" ) guiSetSize( imagecount, sx+70, sy) --pour mettre sx à 320 setTimer(Countdown, 3000, 1, number-1) else destroyElement( imagecount ) end end addEvent("DEBUTcompteur", true) addEventHandler("DEBUTcompteur", root, Countdown) Le addEvent te permet de gérer l'event dans ce fichier lua et le addEventHandler te permet d'éxécuter la fonction de ton choix lorsqu'il se fait "triggered". 3: Nan t'as pas compris ... Dans le script/mod que tu utilises: https://wiki.multitheftauto.com/wiki/Resource:Exp_system Tu est censé avoir 5 fichiers: client.lua level_up.mp3 levels.xml meta.xml server.lua Si tu n'as pas le levels.xml, retélécharge le, t'as du le supprimer sans faire exprès. Si tu l'as, ouvre le et modifie le comme dans mon exemple et supprimes/comment tout ton code perso que t'as essayé de faire. Ça devrait très bien marcher, le soucis c'est que t'est obligé de rentrer à la main tous les levels. Je te conseil de te faire un système de level perso plutôt que d'utiliser ce mod car tu dois "casser" son comportement pour "insérer" ton système. Maintenant que tu sais comment utiliser les elements data, ça devrait être relativement simple. Faudra juste que tu sauvegardes son XP et son level en base de données et les récupérer quand il se reconnecte. Comportement: 1 - le joueur se connecte à ton serveur et on essaye de trouver son XP et son Level en base de données. 2 - Si on les trouve, on fait un setElementData( joueur, "XP", xpEnDB ) et un setElementData( joueur, "Level", levelEnDB ) 3 - Si on ne les trouve pas, on fait un setElementData( joueur, "XP", 0) et un setElementData( joueur, "Level", 0) 4 - Il joue et reçoit de l'XP en faisant je ne sais quoi. (fait des fonctions genre setXP et setLevel pour modifier l'XP et le level et des fonctions get aussi). On met à jour les valeurs en DB. 5 - Il se déconnecte (les valeurs sont déjà sauvegarder en DB donc rien à faire) Je te conseil de faire aussi une fonction giveXP( thePlayer, amount) dans laquelle: - si thePlayer est bien un joueur et si amount est positif. - tu récupères la valeur actuel de l'XP et tu lui ajoutes amount - si le nouvel XP est supérieur ou égal à 1000 - tu récupères son level actuel - tu lui set son level+1 - tu remets son XP à 0 - tu fais autre chose comme jouer un son de level up - fin si -fin si Voilà tiens nous au courant.
×
×
  • Create New...