Jump to content

Citizen

Moderators
  • Posts

    1,803
  • Joined

  • Last visited

  • Days Won

    8

Everything posted by Citizen

  1. dayum ! no one saw it ! nice catch A copy paste of the 1st line would have save you minutes if it not hours
  2. Try to output textFrom and see if it outputs the value you are waiting for ?
  3. u put a comma between the text and the variable you want to concatenate with: dxDrawText ( "Kinézet "..skin, x/3.6, y/3.2, x, y, tocolor ( 255, 255, 255, 255 ), 1, "clear" )
  4. Hi, I did some modifications and commented well so you will understand why I did it this way: -- Client side function markerToUnlock (player, seat) local vehicle = source if seat == 0 then -- if he was the driver (the passengers won't create the marker) if isVehicleLocked(pojazd) then -- Are you sure you can get out of the vehicle when it is locked ? local x, y, z = getElementPosition(vehicle) local lx = x+5 -- WARNING: it will do +5 on the world's x axis, not the vehicle's x axis and some vehicles will need more or less than +5 local pojazdlockmarker = createMarker(lx, y, z, "cylinder", 1, 255, 0, 0, 0) setElementData(pojazdlockmarker, "willUnlockVehicle", vehicle) -- We say that this marker will unlock the vehicle stored in vehicle variable addEventHandler("onClientMarkerHit", pojazdlockmarker, inMarkerUnlockVehicle) -- We say that an onMarkerHit event on pojazdlockmarker will call inMarkerUnlockVehicle function addEventHandler("onClientMarkerLeave", pojazdlockmarker, outMarkerUnlockVehicle) -- We say that an onMarkerHit event on pojazdlockmarker will call outMarkerUnlockVehicle function end end end addEventHandler("onClientVehicleExit", localPlayer, markerToUnlock) -- you are on the client side so use getLocalPlayer() or localPlayer function inMarkerUnlockVehicle(hitElement) if hitElement == localPlayer then -- making sure it's the local player setElementData(localPlayer, "isInMarkerUnlock", source) -- We say that the local player is in the marker stored in the source variable end end function outMarkerUnlockVehicle(hitElement) if hitElement == localPlayer then -- making sure it's the local player setElementData(localPlayer, "isInMarkerUnlock", nil) -- We say that the local player is no in a markerUnlock anymore end end function keyUnlock() local markerUnlock = getElementData(localPlayer, "isInMarkerUnlock") if markerUnlock then local vehicle = getElementData(markerUnlock, "willUnlockVehicle") if vehicle then setVehicleLocked(vehicle, false) -- unlock setElementData(localPlayer, "isInMarkerUnlock", nil) -- not in a markerUnlock anymore destroyElement(markerUnlock) -- delete the marker outputChatBox("Otworzyłeś swój pojazd używając kluczyków!", localPlayer, 0, 255, 0) -- message success end end end bindKey("l", "down", keyUnlock) Best regards, Citizen
  5. Or you can show us what you added and where to spawn that maverick ? Because saying "hey I added something to spawn a maverick somewhere" but not showing us what you did is not really helpfull for us.
  6. You really need to know what you are doing if you want to script things by yourself. You just copied paste some code you found somewhere. You had to put the original code of msg function between the if blablabla admin blabla then and the end that closes that if statement: Server: function msg(thePlayer, cmd, ...) -- '...' will catch all words you wrote after the command if (isObjectInACLGroup ( "user." .. accName, aclGetGroup ( "oneradmin" ) ) or isObjectInACLGroup ( "user." .. accName, aclGetGroup ( "Head.Admin" ) ) or isObjectInACLGroup ( "user." .. accName, aclGetGroup ( "Console" ) ) or isObjectInACLGroup ( "user." .. accName, aclGetGroup ( "big.Admin" ) ) ) then -- the "if admin" statement local message = table.concat({...}, " ") -- so it will catch your sentence but without spaces, need to concat all words with a space between them if #message == 0 then -- if there is no message outputChatBox("[ERROR] You must specify a message with that command !", thePlayer, 200, 0, 0) else if message == "Delete" then -- if the message is exactly Delete then ask for all clients to stop rendring the message triggerClientEvent("hideAdminMessage", thePlayer) else -- else it's a real message so ask them to get it and start rendering it triggerClientEvent("showAdminMessage", thePlayer, message) end end -- end of the "if admin" statement end addCommandHandler("admin", msg)
  7. désolé mais j'avais clairement dit que tu devais mettre la valeur à true après le login et non à 1 Et ducoup mon if aurait fonctionné parce que if isLoggedIn then c'est la même chose que d'écrire if isLoggedIn == true then donc c'est sure que si je récupère 1 au lieu de true dans isLoggedIn, 1 n'est pas égal à true donc ça passe pas.
  8. Hi, So first, you need to be on the server side to then send the message to all players, and then their client scripts will render the message on their screen. I'm not sure what you did on the server side so here is how you can do it: -- server: function msg(thePlayer, cmd, ...) -- '...' will catch all words you wrote after the command -- need to check if he is admin here local message = table.concat({...}, " ") -- so it will catch your sentence but without spaces, need to concat all words with a space between them if #message == 0 then -- if there is no message outputChatBox("[ERROR] You must specify a message with that command !", thePlayer, 200, 0, 0) else if message == "Delete" then -- if the message is exactly Delete then ask for all clients to stop rendring the message triggerClientEvent("hideAdminMessage", thePlayer) else -- else it's a real message so ask them to get it and start rendering it triggerClientEvent("showAdminMessage", thePlayer, message) end end addCommandHandler("admin", msg) Note that you need to check if he is admin -- client: local adminMsg = {adminName, message} -- this struct will store our admin's name and his message -- SHOW addEvent("showAdminMessage", true) function showAdminMessage(theMessage) local theAdminName = getPlayerName(source) -- I triggered that event with the player who used the command so source is our admin adminMsg = {adminName=theAdminName, message=theMessage} -- updating the struct addEventHandler("onClientRender", getRootElement(), dx) -- start rendering end addEventHandler("showAdminMessage", root, showAdminMessage) -- root is the same as getRootElement() -- HIDE addEvent("hideAdminMessage", true) function hideAdminMessage() removeEventHandler("onClientRender", getRootElement(), dx) -- stop rendering end addEventHandler("hideAdminMessage", root, hideAdminMessage) -- root is the same as getRootElement() -- RENDER function dx() local theAdmin = adminMsg.adminName local theMessage = adminMsg.message dxDrawText("* [ Admin ] : #FFFFFF"..theMessage, 22, 202, 180, 250, tocolor(150,0,0), 1.3, "default", "left", "top", false, false, true, true, false) dxDrawText(theAdmin, 32, 225, 206, 250, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, true, true, false) end -- bindKey("u", "down", "chatbox", "AM") -- Won't work, what did u try to do ? And please use a real script editing tool like Notepad++ which is free and use tabs to keep your code indeted properly. Best regards, Citizen
  9. J'ai beaucoup de mal à comprendre ce que tu veux faire, explique moi clairement ce que ton script est censé faire. Est-ce que tu fais un script de chauffeur de bus conduit par un joueur ? ou est-ce que c'est un système de bus automatique et le joueur rentre dans le bus et choisit ça destination ? A quoi servent exactement les 2 tables markerlocations et theTable ? Explique bien étape par étape le fonctionnement de ce que tu veux faire. Merci d'avance. Cordialement, Citizen
  10. Bonsoir, C'est effectivement une bonne idée d'utiliser un element data sur le joueur pour savoir s'il est en mode connecté ou non. Donc du côté serveur, j'imagine qu'une fois le login passé côté serveur, tu fais un petit: setElementData(thePlayer, "connecter", true) Et côté client, il suffit de se mettre dans onClientRender pour draw le hud mais avec un if pour vérifier qu'il soit logué: function drawHud() local isLoggedIn = getElementData(localPlayer, "connecter") if not isLoggedIn then return end -- S'il n'est pas connecté, on arrête l'exécution de la fonction -- On draw le hud ici: end addCommandHandler("onClientRender", root, drawHud) INFO: les scripts client et serveur possèdent des variables prédéfinies comme le localPlayer ou le root qui sont respectivement équivalent à getLocalPlayer() et getRootElement() Une liste complète des variables prédéfinies est disponible ici: viewtopic.php?f=91&t=39678#p403110 (déroule les spoilers) Sinon merci d'avoir posté dans la section FR pour la rendre un peu plus active. PS: Ton post ? Un Pavé ? T'as pas dû voir mes réponses à certains posts. Cordialement, Citizen
  11. Bonsoir, Je t'avais dit de poster dans cette section par MP car je pensais que tu parlais le français et que tu aurais pu mieux expliquer ton problème dans cette section et ainsi avoir une meilleur aide et compréhension. Mais visiblement, tu ne parles pas français et tu as simplement utilisé google translate pour traduire ton post. Néanmoins, je pense avoir compris ce que tu veux faire: local markerlocations = { [1]={x=2220.43, y=2469.49, z=10.82}, [2]={x=1625.00, y=1850.43, z=10.82}, [3]={x= 1718.26, y=1484.68, z=10.82} } local theTable = { [1]={"LV", 2220.43, 2469.49, 11.82}, [2]={"LS", 1625.00, 1850.43, 11.82}, [3]={"SF", -2682.52, 574.32, 15.67} } function spawnMarkers(thePlayer, cmd) for index, pos in ipairs(markerlocations) do local marker = createMarker(pos.x, pos.y, pos.z - 1, "cylinder", 1.3, 247, 187, 7, 120) setElementVisibleTo(marker, root, false) -- on cache le marker pour tout le monde setElementVisibleTo(marker, thePlayer, true) -- mais on le remontre que pour le joueur qui a tapé la commande -- On pourrait aussi créer un blip pour qu'il s'affiche sur le radar ? addEventHandler("onMarkerHit", marker, calculateEarning) -- on appelle calculateEarning lorsque le marker sera hit par quelque chose ou quelqu'un setElementData(marker, "forPlayer", thePlayer) -- on stock le joueur dans le marker avec la clé "forPlayer" local px, py, pz = getElementPosition(thePlayer) setElementData(thePlayer, "startedFromPos", {px, py, pz}) -- on stock la position actuelle du joueur end outputChatBox("Go to the markers and earned money") end addCommandHandler("smarkers", spawnMarkers, false, false) function calculateEarning(hitElement, matchingDimension) local forPlayer = getElementData(source, "forPlayer") -- on récupère le joueur qu'on a stocké dans ce marker if hitElement == forPlayer then -- on vérifie que le joueur qui est entré dans le marker soit bien celui qui a créé ce marker local sPos = getElementData(hitElement, "startedFromPos") -- on récupère la position de départ du joueur local mx, my, mz = getElementPosition(source) -- on récupère la position du marker (la source du onMarkerHit c'est le marker qui s'est fait hit) local distance = getDistanceBetweenPoints2D(sPos[1], sPos[2], mx, my) local earnings = distance*0.5 -- 0.5$ par metres parcourus if earnings >= 1 then -- on s'assure qu'il va gagner au moins 1$ distance = math.round(distance) earnings = math.round(earnings) givePlayerMoney(hitElement, earnings) outputChatBox("You traveled "..distance.." meters and earned "..earnings.."$.") destroyElement(source) -- on détruit le marker -- peut être mettre a jour la position de départ ? décommente si oui: -- local px, py, pz = getElementPosition(hitElement) -- setElementData(hitElement, "startedFromPos", {px, py, pz}) end end end -- source: [url=https://wiki.multitheftauto.com/wiki/Math.round]https://wiki.multitheftauto.com/wiki/Math.round[/url] function math.round(number, decimals, method) decimals = decimals or 0 local factor = 10 ^ decimals if (method == "ceil" or method == "floor") then return math[method](number * factor) / factor else return tonumber(("%."..decimals.."f"):format(number)) end end J'ai testé le code et il fonctionne comme suit: - Le joueur tape /smarkers et les markers apparaissent que pour le joueur sur la map. - Sa position actuelle est aussi récupéré et mise de côté afin de l'utiliser plus tard. - Lorsque le joueur rentre dans un marker, on récupère la position mise de côté au début et on calcul la distance avec la position de ce marker. - On multiplie la distance par 0.5$ qu'on arrondit ensuite et cela nous donne la récompense en dollar du trajet. - On détruit juste le marker dans lequel il est rentré et il peut aller chercher les autres markers. Cordialement, Citizen
  12. Je pense avoir deviné (oui parce qu'avec la quantité de détails que tu nous as donné, on ne peut qu'essayer de deviner) ce que tu veux faire. Je pense que tu veux rajouter des sections dans 2 menus de la ressource freeroam qui permettent de faire spawn une voiture ou changer de skins. As-tu au moins essayé d'ouvrir les scripts de la ressource freeroam afin d'y chercher les 2 menus que tu veux modifier ? A ta place j'aurai au moins essayé de trouver ces 2 menus dans les scripts puis j'aurais ensuite tenté de les modifier moi-même et que si ça marche pas, je serai venu demandé de l'aide. Donc dézip la ressource freeroam et tente de la modifier toi-même. Comme je n'utilise pas la ressource freeroam et que je n'en suis pas le créateur je vais aussi devoir chercher. Donc pendant cette période, tu peux tenter de ton côté. Il faut néanmoins savoir qu'il n'est pas possible de rajouter des voitures et des skins, tu peux seulement en remplacer par d'autres. Cela signifie que tu vas devoir certes créer tes 2 catégories mais que tu vas devoir enlever des voitures et des skins de leur catégories pour les mettre dans les nouvelles catégories. Par exemple, si tu remplaces l'infernus par une autre voiture téléchargée sur internet, tu vas devoir retirer l'infernus de sa catégorie pour la mettre dans la catégorie "Modified cars" et la renommer avec le nom de la voiture téléchargée. Je reviens vers toi plus tard. Cordialement, Citizen EDIT: Ok ... après avoir juste dézipé la ressource freeroam on peut y trouver skins.xml et vehicles.xml Il suffit des les ouvrir avec Notepad++ par exemple et tu pourras les modifier ce qui modifiera les menus en jeu. Voici un extrait de vehicles.xml: <catalog> ... <group name="SUVs and Wagons"> ... <vehicle id="561" name="Stratum" /> </group> </catalog> Si je veux créer la catégorie "Modified vehicles" et y mettre la Stratum que j'ai remplacé par une Aston Martin, je vais le modifier comme ceci: <catalog> ... <group name="SUVs and Wagons"> ... </group> <group name="Modified vehicles"> ... <vehicle id="561" name="Aston Martin" /> </group> </catalog> (Les "..." ne sont pas a mettre, ils servent juste à indiquer que j'ai coupé/supprimé une partie du fichier en le collant ici afin de mieux voir) J'ai donc créé le groupe "Modified vehicles" puis j'ai déplacé et renommé la Stratum dont l'id est 561. Y a rien de plus simple puisqu'il n'y a même pas besoin de modifier les scripts comme j'ai pensé au départ. Tu modifieras de la même façon pour ton skins.xml. Cordialement, Citizen
  13. Bonjour dfigfjf, Il y a des erreurs dans ton script qu'on ne doit normalement plus faire si on a suivi de façon attentive les tutoriels (disponible en français) sur le wiki. Anglais: https://wiki.multitheftauto.com/wiki/Scr ... troduction Français: https://wiki.multitheftauto.com/wiki/FR/ ... grammation Je parle notamment de ta variable name que tu essayes d'utiliser un peut partout. Cette variable n'existe pas dans ton code, ce qui provoque les erreurs. Voici ma version corrigée avec le maximum de commentaires pour que tu comprennes bien: --PEDS-- function pedCopLS ( startedResource ) -- onResourceStart donne à la fonction la ressource qui démarre et non pas le ped que tu vas créer dans cette fonction --LS local garde = createPed ( 280, 1544.3, -1632, 13.4, 270 ) --(garde) setElementData( garde, "pedtType", "garde" ) -- on demande à ce ped de retenir pour nous le mot "garde" sous le nom "pedType" setPedWeaponSlot ( garde, 3, 1) setPedWeaponSlot ( garde, 22, 2) end addEventHandler ( "onResourceStart", getResourceRootElement(), pedCopLS) function deadCopCty ( totalAmmo, killer, killerWeapon, bodypart, stealth ) local deadPed = source -- le ped qui est mort est la source de l'event local pedType = getElementData( deadPed, "pedType" ) -- on demande au ped mort de nous rappeler le mot qu'on lui a peut-être demandé de retenir sous le nom "pedType". if ( pedType == "garde" ) then -- s'il nous réponds "garde" alors ça veut dire que le ped mort était un garde. local level = getPlayerWantedLevel ( killer ) if ( level == 0 ) then -- s'il n'est pas encore recherché setPlayerWantedLevel ( killer, 2 ) -- le tueur du ped se prends 2 étoiles d'un seul coup else if ( level == 2 ) then -- s'il a déjà 2 étoiles setPlayerWantedLevel ( killer, 3 ) -- il s'en prends une 3ème (qui est le maximum d'étoiles qui peut se prendre en tuant des gardes) end end end addEventHandler ( "onPedWasted", getRootElement(), deadCopCty) -- ici on utilise getRootElement pour dire que tout le monde peut déclencher la fonction deadCopCty si onPedWasted est déclenché sur lui. -- Mais comme onPedWasted n'est déclenché que sur les peds, deadCopCty sera déclenché si n'importe quel ped meurt. -- Question: Oui mais moi je veux que deadCopCty se déclenche que si c'est un garde ! -- Réponse: Bonne remarque mais c'est pour ça qu'on vérifie que l'elementdata "pedType" soit bien égal à "garde", sinon on ne fait rien. Le tutoriel explique très bien les bases de la programmation sur MTA avec l'explication du fonctionnement des events et des elementdatas qu'on a utilisé ici. N'hésite pas à demander des explications supplémentaires. Cordialement, Citizen
  14. Bonsoir, Oui tu peux facilement l'enlever mais d'abord j'explique ce que c'est. La map qui s'affiche quand tu rejoins ton serveur est affiché par la ressource "freeroam" qui est indirectement démarrée par la ressource "play". La ressource "play" est une ressource qui permet d'avoir tout de suite un serveur jouable où l'on fait ce qu'on veut. Il faut donc changer les paramètres du serveur. Tout le paramétrage du serveur se fait dans le fichier mtaserver.conf En descendant TOUT en bas, on peut voir les ressources qui doivent se lancer au démarrage (les 3 petits points veulent dire que j'ai coupé volontairement une partie de la config): <config> ... <resource src="votemanager" startup="1" protected="0" /> <resource src="webadmin" startup="1" protected="0" /> <!-- play is the default freeroam gamemode. Remove the following line to prevent it from starting. --> <resource src="play" startup="1" protected="0" /> </config> Il faut donc supprimer ou commenter cette ligne pour pas que la ressource "play" se lance avec le serveur et comme on est dans un fichier avec la syntaxe xml, on fait un commentaire comme ceci: <!-- Ceci est un commentaire --> Un commentaire est ignoré pendant la lecture du fichier donc pour commenter le lancement de la ressource "play" il suffit de faire comme ceci: <config> ... <resource src="votemanager" startup="1" protected="0" /> <resource src="webadmin" startup="1" protected="0" /> <!-- play is the default freeroam gamemode. Remove the following line to prevent it from starting. --> <!-- <resource src="play" startup="1" protected="0" /> --> </config> Sauvegarde ce fichier et lance ton serveur. Tu ne devrais plus avoir cette map s'afficher lorsque tu rejoins ton serveur. Cordialement, Citizen
  15. Présentation plutôt intéressante mais ça fait toujours plus pro si celle-ci ne contient pas ou peu d'erreurs/fautes. Je pense également que les explications des commandes étaient en trop dans la présentation du serveur. Vous pouvez expliquer les systèmes que possède votre serveur mais expliquer comment les utiliser (exemple: appuyez sur F2, cliquez sur le PNJ etc) ne devrait pas faire partie de la présentation du serveur. Ce genre d'explications doivent apparaître dans le forum ou dans une fenêtre d'aide sur le serveur. Le fait d'expliquer ce qu'est MTA en postant dans la section française du forum officiel de MTA c'est comment dire ... totalement inutile. J'imagine bien que c'est une présentation que tu as collé un peu partout. Oui en effet ça serait pas mal pour pour un serveur MTA d'avoir un scripteur Si vous avez un bug, le forum est fait pour ça, créez un topic, affichez nous l'erreur et le bout de script en question (pas juste la ligne toute seule, la fonction entière est demandée pour en comprendre la raison (vous pouvez évidement couper du code qui n'a pas de rapport direct avec l'erreur si ce code est du style mega-privé, mega-innovant, genre méga-exclue). Cordialement, Citizen
  16. Mouai c'est vraiment bizarre, et c'est pas un bug courant (je n'ai pas trouvé de post avec un bug de chargement du loader.dll) Si tu es disponible demain après-midi et si tu es d'accord, on fera une session TeamViewer (il te faudra donc l'installé si ce n'est pas déjà fait) et je regarderai ça de plus près. J'espère qu'on trouvera la solution, parce que je suis autant déçu que toi qu'on ne trouve pas la solution Je te donnerai mon Skype par MP histoire d'avoir une méthode plus rapide de communication. Cordialement, Citizen
  17. Pour tester avec PSExplorer: - Lance ton MTA en administrateur puis - Attends que l'erreur: "Error 32: Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus." s'affiche et ne touche à rien (laisse l'erreur affichée) - Dans PSExplorer, fait Ctrl+F et tape loader.dll puis clique sur "Search" - Attends qu'il ait finit de rechercher (le bouton "Search" n'est plus grisé et ait à nouveau disponible) - Montre nous un screen de cette fenêtre de recherche une fois finit (même s'il n'a rien trouvé) Cordialement, Citizen PS: Pense bien à lancer PSExplorer en tant qu'administrateur pour être sûr.
  18. Faudra que je regarde quand je rentrerai chez moi parce que justement, je ne suis pas chez moi. Heuuu non il était pas missing avant, il était utilisé par un autre processus. L'erreur aurait donc changé ? Cette fameuse dll était présente lors de tes premières installations ? Et maintenant, est-elle toujours présente ? Je t'ai proposé 2 manipulations et tu me donnes qu'une réponse oO. Ok exactement comme moi et j'ai pas eu le soucis la dernère fois que je l'ai installé. Aurais-tu accès à un autre pc (voir une Virtual Machine sur virtual box) sur lequel tu pourrais essayé ? Je ferai des tests chez moi demain pour essayer d'identifier le problème. Si la dll existe, pourrais-tu tester quel processus l'utilise et la bloque avec "Process Explorer" par exemple ou un autre utilitaire sur internet. Cordialement, Citizen
  19. Apparemment tu as un réel problème de gestion des droits. De bases quand tu lances l'installeur de MTA en tant que non administrateur, il va réclammer les droits admins à Windows qui est d'accord que si l'utilisateur (toi) est d'accord, donc Windows t'affiches une fenêtre qui te demande si oui on non tu autorises l'installeur de run avec les droits admins (requis pour lire et écrire dans le dossier Program Files et Program Files (x86). Si tu n'as jamais eu cette fenêtre c'est que t'as dû installer un logiciel style antivirus ou autre qui prend en charge la gestion des droits des applis. Ou t'as dû désactiver des choses dans windows. (Je vois pas trop comment on peut obtenir la même situation dans laquelle tu te trouves actuellement). Pourrais-tu nous indiquer les détails de ton OS (xp, vista, win7, win 8, win10, 64 ou 32 bits) ? En attendant je te propose (juste pour tester) d'installer en tant qu'admin MTA à la racine de ton disque dûr (par exemple: C:/MTA San Andreas 1.4/) et avec ton antivirus de désactiver le temps des tests. Si ça fonctionne, essaye de réinstaller normalement MTA avec le dossier par défaut mais toujours avec ton antivirus de désactivé. Si ça marche, le problème vient de ton antivirus et il faudra le configurer pour ignorer le dossier MTA. Sinon, c'est qu'il y a un problème avec la gestion des droits avec ton Windows actuel (comme je le disais, soit c'est windows, soit c'est une appli qui se charge lui même de la gestion des droits. Je me souviens d'avoir eu des problèmes avec Comodo par exemple, mais jamais comme le tien) Essaye tout ça et dit nous tes résultats. Cordialement, Citizen
  20. Bonjour RoRo76, Pour commencer, ce script ne peut pas fonctionner tel que tu nous l'a collé car il y a un end en trop. Tu as peut être supprimé un if au-dessus de if ( not state ) then qu'on ne devait pas voir ou parce que c'était un test. Je vais le laisser parce qu'on va effectivement rajouter un if au-dessus donc ça évitera de replacer le end en bas parce que les codeurs sont flemmards Pour résoudre ton problème, il suffit juste de calculer la distance qui sépare le joueur tapant la commande et le portail. Pour cela rien de plus facile, il te faut: - getter la position x, y, z du joueur - getter la position x, y, z du portail - calculer la distance entre ces 2 positions - ajouter un if pour vérifier que cette distance soit inférieur à une distance que tu auras définit. local gate = createObject ( 980, -1364.5552978516, -517.26147460938, 15.5, 0, 0, 298.96350097656 ) local state = false addCommandHandler ( "gr", function ( thePlayer ) local px, py, pz = getElementPosition(thePlayer) -- Position du joueur local gx, gy, gz = getElementPosition(gate) -- Position de la gate local distance = getDistanceBetweenPoints3D(px, py, pz, gx, gy, gz) -- Calcul de la distance if ( distance <= 20 ) -- Check si cette distance est inférieur à 20 (j'ai mis 20 mais tu peux évidemment changer) if ( not state ) then outputChatBox("Gate open", thePlayer, 0, 166, 237) moveObject ( gate, 2500, -1364.5552978516, -517.26147460938, 22, 0, 0, 0 ) else moveObject ( gate, 2500, -1364.5552978516, -517.26147460938, 15.5, 0, 0, 0 ) outputChatBox("Gate close", thePlayer, 143, 0, 0) end state = ( not state ) else outputChatBox("You are too far to open the gate !", thePlayer, 143, 0, 0) -- Erreur que je ne pense pas nécessaire end end ) Par rapport au message d'erreur s'il est trop loin, je ne pense pas que ce soit une bonne idée de l'afficher parce que lorsque tu auras 20+ gates, le joueur se fera spammer dans la chatbox. Soit il te faudra trouver une solution pour qu'il ne s'affiche qu'une fois, soit tu le supprimes carrément, ce qui ne me choquerait pas en tant que joueur. Aussi, j'ai vu que tu mettais true en dernier argument de tes outputChatBox mais cela ne sert que si tu veux faire utiliser des "colorCodes" dans ton message pour l'afficher avec plusieurs couleurs différentes dedans. Exemple (provenant du wiki d'ailleurs): outputChatBox ( "#FF0000Hello #00FF00World", getRootElement(), 255, 255, 255, true ) ce qui affichera: Hello World dans la chatbox, ce qui n'est pas possible de faire avec les arguments r, g et b de la fonction. Cordialement, Citizen
  21. Bonjour, L'erreur n'indique pas un problème de fichiers ou redistribuables manquants comme le pensait anumaz. L'erreur indique clairement que MTA n'arrive pas à charger loader.dll et ça peut venir de 2 choses (mais la 2ème je pense pas que tu es fait ça, je le mettrait entre parenthèse quand même): - 1. Tu as essayé de démarrer MTA mais il ne s'est rien passé, tu l'as donc lancé une seconde fois et tu as cette erreur à chaque fois. Il faut ouvrir le gestionnaire de tache, aller dans les processus et Terminer tous les processus MTA que tu pourrais trouver. Essaye ensuite de le relancer en tant qu'administrateur. Si tu as la même erreur, tu peux essayer de juste redémarrer l'ordi et voir si le problème persiste. ( - Ou 2. Tu as réellement un processus autre que MTA qui utilise déjà cette dll, cela pourrait être dû à un cheat par exemple. Attention, ceci n'est pas une accusation/supposition, c'est juste une possibilité ) Une autre solution serait de retenter d'installer MTA. J'attends ton retour. Cordialement, Citizen
  22. Ah bah j'étais justement en train de rédiger de nouvelles question à savoir: - Peux-tu nous copier ton addCommandHandler("buymap" et - Peux tu nous montrer la fonction qui fait le triggerServerEvent("triggerbuyMap" du côté client de ton userpanel. Maintenant que c'est résolu, il me vient une nouvelle question: - Pourquoi il te demande de choisir une map depuis la liste alors qu'il te dit ensuite que t'as bien set la map oO: C'est toi qui avait oublié de sélectionner la map avant de buy ? Ou est-ce que t'as toujours ce message d'erreur qui s'affiche même si ça marche actuellement ? Si y a toujours cette erreur, il faut la réparer également (Je suspecte 2 appels à triggerServerEvent("triggerbuyMap" dans le userpanel dont 1 foireux.) Cordialement, Citizen
  23. Ok alors on va reprendre ... J'ai besoin que tu nous screen seulement les messages du debugscript 3 ET de la chatbox qui s'affiche lorsque t'achètes une map. Donc voici les étapes: 1 - Rejoins le serveur, tape /login blabla, puis /debugscript 3 puis attends qu'une map démarre. 2 - Une fois la course démarrée, attends un peu (2 ou 5 secondes, pas besoin d'être précis, faut juste que le debugscript 3 reste stable). 3 - Achète une map normalement et fait un screen des nouveaux messages dans la chatbox et dans le debugscript 3 et SEULEMENT les nouveaux ! 4 - Poste ensuite tes deux screens ici. Parce que là avoir tous les messages du debugscript 3 ne m'aide pas à déterminer lesquels sont en rapport direct avec le buymap ou s'ils ont tous rien à voir. En plus tu ne m'as pas montré les messages de la chatbox comme je te l'avais demandé. Ça m'aidera à trouver quel "if" ne passe pas et donc localiser plus précisément le problème. En espérant avoir les bon screens et plus rapidement que la dernière fois. Cordialement, Citizen
  24. Bonsoir, J'ai besoin des erreurs serveurs et des erreurs côté client. J'ai également besoin de tous les messages de la chatbox qui s'affichent quand tu fais l'achat d'une map. Le code d'achat de map (si tous les 'if' passent va faire exécuter la commande /buymap au joueur donc si tu as [userpanel] =KOG= Rouche set a map for 2000$ qui s'affiche, le problème vient de la fonction exécutée par "/buymap" donc il faut que tu nous la colle ici. executeCommandHandler("buymap", source, mapName) Et puis elle ne marche plus après avoir fait quoi ? Après avoir récemment ajouté une nouvelle ressource ? Après avoir mis à jour le serveur ? Un code ne peut pas s'abîmer avec le temps. Y a forcément une cause externe. Cordialement, Citizen
  25. Hmmmm on dirait plus un problème de droit sur les fichiers qu'un problème d'encodage. Va dans un dossier dans lequel il y a des fichiers qui marchent et fait un ls -l pour lister les fichiers/dossiers avec les droits. Note le résultat des fichiers qui fonctionnent et refait la même chose avec un fichier qui ne fonctionne pas. Tu compares les 2 et tu devrais trouver une différence. Problème de owner, groupe ou droit qu'il faut corriger. Cordialement, Citizen
×
×
  • Create New...