-
Posts
1,803 -
Joined
-
Last visited
-
Days Won
8
Everything posted by Citizen
-
Two brothers playing MTA on the same computer will have the same serial (even if they are not using the same user session)
-
Hi, The problem is that dxDrawText is not waiting for a size at the 4th and 5th argument, but its expecting for the absolute coordinate of the bottom right corner of the box in which it will write the text. So here is what you should write instead: dxDrawText( mbut.text, mbut.x, mbut.y, mbut.x + mbut.w, mbut.y + mbut.h, tocolor(0, 0, 0), sw/1600, "bankgothic", "center", "center") It should work as expected. Regards, Citizen
-
addEventHandler("onPlayerWasted",root,function() local veh = getElementData(source, "mafiaVeh") if(veh)then if(isElement(veh))then destroyElement(veh) setElementData(source,"mafiaVeh",nil) end end end ) Can be shortened by puting "if veh then" and "if isElement(veh) then" into a single if condition like this: addEventHandler("onPlayerWasted", root, function() local veh = getElementData(source, "mafiaVeh") if veh and isElement(veh) then destroyElement(veh) setElementData(source, "mafiaVeh", nil) end end)
-
You know how ternary works in lua and you know how to use them but you can't do that simple task ??? oO server side: function vehicle1() local playerTeam = getPlayerTeam ( source ) local teamName = ( playerTeam and getTeamName ( playerTeam ) or "" ) if teamName == "LV MAFIA" then local prevVeh = getElementData(client, "mafiaVeh") -- get the element stored in mafiaVeh for the player if prevVeh and isElement(prevVeh) then -- if it exist and if it's an element then destroyElement(prevVeh) -- destroy it end local veh = createVehicle( 580, 1927.6, 1309.8, 9.4, 0, 0, 270 ) -- creating the vehicle setElementData(client, "mafiaVeh", veh) -- storing the vehicle in "mafiaVeh" for the player else outputChatBox("You can't spawn a vehicle here, you're not a LV MAFIA member", client, 200, 0, 100) end end addEvent("spawn1", true) addEventHandler("spawn1", root, vehicle1) function vehicle2() local playerTeam = getPlayerTeam ( source ) local teamName = ( playerTeam and getTeamName ( playerTeam ) or "" ) if teamName == "LV MAFIA" then local prevVeh = getElementData(client, "mafiaVeh") if prevVeh and isElement(prevVeh) then destroyElement(prevVeh) end local veh = createVehicle( 463, 1928.1, 1313.1, 8.9, 0, 0, 270 ) setElementData(client, "mafiaVeh", veh) else outputChatBox("You can't spawn a vehicle here, you're not a LV MAFIA member", client, 200, 0, 100) end end addEvent("spawn2", true) addEventHandler("spawn2", root, vehicle2)
-
Yeah indeed, the code doesn't even try to store the wins from what you pasted. You just pasted a piece of code that loads the winners ordered by number of wins for the current map and send the whole table to the client-side to be displayed I guess. If you don't have any other function to show us, then you are not asking for help, but you are currently asking for someone to make it for you. And I'm sorry but it will likely not happen.
-
[Résolu] Problème sur mon script ? Je débute !
Citizen replied to Valentin3526's topic in French / Français
Cool ça fait plaisir à entendre et merci d'avoir pris la peine de donner quelques feedbacks -
[Résolu] Problème sur mon script ? Je débute !
Citizen replied to Valentin3526's topic in French / Français
Bonsoir dfigfjf, (jamais vu un ratio de voyelles aussi bas dans un pseudo lol) Oh oui y en a pas mal et c'est sûrement parce que tu as fais des copiés collés sans comprendre.Déjà je vais juste te proposer une autre écriture plus simple que ceci: addEventHandler("monEvent", gensConcernés, function (param1, param2, etc) outputChatBox("monEvent à été déclenché !") end ) Ce code écrit dans la chatbox "monEvent à été lancé !" à chaque fois que l'event "monEvent" est déclenché et pour chaque joueur qui compose la variable gensConcernés. Si tu mets root ce bout de code fonctionnera pour tous les joueurs présent sur le serveur. Mais c'est une écriture avancée que je déconseille fortement pour débuter. Donc voici la même chose écrit plus simplement: function maFonction(param1, param2, etc) outputChatBox("monEvent à été lancé !") end addEventHandler("monEvent", gensConcernés, maFonction) Ici on déclare d'abord tranquillement la fonction qui sera attachée à l'event puis on l'attache via la fonction addEventHandler Enfait, la fonction addEventHandler attends une fonction en 3ème argument. Donc: - soit on lui donne le nom d'une fonction qu'on a déjà déclaré: maFonction (cf.écriture simplifié) - soit on déclare la fonction dans le 3ème argument (cf. écriture complexe). Mais quand on utilise là 2ème possibilité (l'écriture complexe), il ne faut pas donner de nom à ta fonction. On appelle cette fonction une fonction anonyme (qui existe dans d'autres langages). Dans le bouts de codes que tu nous a montré, tu commences presque tout le temps le 3ème arguement par du code genre: local oldAllowed = wasAllowedList[player] Donc commençons par le message de salutations, la version corrigée: function salutationsOnJoin() local oldAllowed = wasAllowedList[source] local newAllowed = isPlayerAllowedHere(source) wasAllowedList[source] = newAllowed if newAllowed and not oldAllowed then outputChatBox("Bienvenue sur GuilAndreas", source, 25, 45, 35, false) else outputChatBox("Salut, "..getPlayerName(source).." content de te revoir !", source, 35, 45, 25, false) end end addEventHandler("onPlayerJoin", root, salutationsOnJoin) On repère tout de suite l'écriture simplifiée qui ne doit pas te poser de problème si t'as bien compris ce que j'ai dit plus haut. Ensuite si on lit la page wiki de onPlayerJoin on lit que la source de cet event est le joueur qui est à l'origine de cet event (donc le joueur qui vient de join). Hors dans ton code, tu utilises la variable player partout: Un petit extrait de ton code: local oldAllowed = wasAllowedList[player] local newAllowed = isPlayerAllowedHere(player) wasAllowedList[player] = newAllowed La variable player n'a pas été définie dans ta fonction et vaut donc nil. A la place de player, il faut utiliser la variable source. Mais je ne vois pas non plus la définition de la variable source dans ton code C'est une bonne remarque effectivement. La variable source est une sorte de variable invisible que notre addEventHandler se charge de remplir. Et on viens à l'instant de voir que pour onPlayerJoin source contient le joueur qui vient de join. C'est pour ça que j'ai mis source de partout. Ensuite tu avais cette potion de code: if oldAllowed and not newAllowed then function outputChatBox(joueur) outputChatBox("Salut, "..getPlayerName(joueur).." content de te revoir !", value, 35, 45, 25, false) end end Là par contre c'est pas juste une petite erreur de variable, c'est carrément le temple du copier/coller foireux ^^ Donc tu veux afficher "Salut dfigfjf", content de te revoir !" si oldAllowed vaut true et si newAllowed vaut false ou nil. Je ne suis pas sûr que ça soit tout à fait ça que tu voulais faire, mais c'est du moins ce qui est écrit. Et vu que c'est exactement la même condition que celle d'avant, les deux outputChatBox vont toutes les deux afficher leur message en même temps ... Ce qui, j'en suis sûr, une erreur de ta part. C'est soit l'un, soit l'autre, donc c'est pour ça que j'ai mis un else à la place de t'a deuxième condition. if newAllowed and not oldAllowed then outputChatBox("Bienvenue sur GuilAndreas", source, 25, 45, 35, false) else outputChatBox("Salut "..getPlayerName(source)..", content de te revoir !", source, 35, 45, 25, false) end Traduction du code en français: [b]Si [/b]newAllowed vaut true et si oldAllowed vaut nil ou false [b]alors[/b] Afficher "Bienvenue sur GuilAndreas" au joueur [b]Sinon[/b] Afficher "Salut <nom du joueur>, content de te revoir !" au joueur [b]Fin[/b] Message de connexion function showLogin() outputChatBox(getPlayerName(source).." s'est connecté !", root, 0, 255, 0, true) end addEventHandler('onPlayerLogin', root, showLogin) Bon là même chose pour source, c'est source qui contient le joueur. Et par contre j'ai mis root en 2ème argument pour outputChatBox parce que je veux l'afficher à tout le monde présent sur le serveur. Ensuite tu as écrit ceci: ..getPlayerName(joueur).."s'est connécté !" Donc petit cours de concatenation. Concaténation: ce terme désigne le fait de mettre bout à bout deux chaines (=textes). en Lua on concatène avec deux points à la suite => x..y Ici j'ai joint la variable x à la variable y Voici pleins d'exemples de concaténation qui produit le même message: ----------------------------------------- local text = "Bonjour ".."dfigfjf ! Joueur numéro 2" ----------------------------------------- local text = "Bonjour".." ".."dfigfjf ! Joueur numéro 2" ----------------------------------------- local playerName = "dfigfjf" local text = "Bonjour "..playerName.." ! Joueur numéro 2" ----------------------------------------- local playerName = "dfigfjf" local nbJoueur = 2 local text = "Bonjour "..playerName.." ! Joueur numéro "..nbJoueur ----------------------------------------- local bonjourBonsoir = "Bonjour " local playerName = "dfigfjf" local exclamation = " ! " local joueurNumero = "Joueur numéro " local nbJoueur = 2 local text = bonjourBonsoir..playerName..exclamation..joueurNumero..nbJoueur Dans tous les cas, les deux points à la suite sont TOUJOURS entouré par une variable, un texte ou un chiffre, tu peux pas avoir: local text = ..playerName.." s'est connecté !" car les premiers deux points n'ont rien sur leur gauche. Il faut écrire à la place: local text = playerName.." s'est connecté !" Là ça marchera. Au passage, évite les couleurs en full 255, là t'as mis 255 sur la couleur verte, et crois en mon expérience, ça pique les yeux En général 200 rends bien à l'écran, le 255 c'est genre le vert fluo d'un stabilo . Message de déconnexion function showQuit() outputChatBox(getPlayerName(joueur).." à quitté le serveur !", source, 255, 0, 0, true) end addEventHandler('onPlayerQuit', root, showQuit) Plus besoin d'expliquer pourquoi j'ai mis source maintenant Message de connexion Je te laisse corriger Message de déconnexion Je te laisse corriger Voilà je te conseil très fortement de suivre l'intégralité de cette Introduction à la programmation dispo sur le wiki FR de MTA. Et pour info, pour coller du code sur le forum, utilise les balises [ lua][ /lua] sans les espaces genre: [ lua]outputChatBox("Salut")[ /lua] sans les espaces donne outputChatBox("Salut") ça pique moins les yeux, y a la coloration syntaxique et en plus ça garde l'indentation. Voilà j'espère que tu as maintenant tout compris et que tu apprécieras le temps que je t'ai accorder pour te répondre avec le maximum d'explications et d'exemples possibles. Cordialement, Citizen -
Userpanel problème de map queue avec le /vr + question
Citizen replied to naotriix's topic in French / Français
Envoi-moi un lien de téléchargement en PM que je regarde un peu comment ça se passe. Un php loader implique la création d'un serveur web et qui devait sûrement contenir un site web pour le serveur avec une section pour gérer les maps. Le plus simple sera sûrement de modifier la ressource pour le faire revenir à un système basique (toutes les maps sont stockées dans leur propre ressource et sont démarrer pour les charger). J'ai pas beaucoup de temps de dispo mais je vais quand même regarder pour voir combien de temps ça prendrait. EDIT: Ah oui et pour le vote redo ! ^^ Comme tu peux le voir, j'avais bien raison mais c'est bizarre que ça ne marche pas comme il faut vu qu'il a bien fait attention que ça ne remplace pas la map suivante car il fait ceci avant: for i=#mapQueue,1 do mapQueue[i+1] = mapQueue[i] end Ce qui à pour effet de décalé toutes les maps de la mapQueue d'un cran vers le bas pour libérer et remplacer sans problème la 1ère place dans cette mapQueue. En gros il a recoder ce que fait: table.insert(mapQueue, mapName, 1) Donc je reste très perplexe. Donc voilà ma version, techniquement c'est EXACTEMENT la même chose mais écrit différemment: --- VR --- local playersVoted = 0 local sistaredando = 0 function Votaredo(thePlayer) local currentMap = exports.mapmanager:getRunningGamemodeMap() local mapName = getMapName(currentMap) if getElementData( thePlayer, "havotato" ) == false then if not redo[mapName] then if sistaredando == 0 then playersVoted = playersVoted + 1 outputChatBox("[VR] "..getPlayerName(thePlayer).." #FFFFFFvoted for a redo. ["..playersVoted.."/".. math.floor(getPlayerCount() /2 + 0.5) .."]",getRootElement(),0,136,255, true) setElementData( thePlayer, "havotato", true) if playersVoted >= math.floor(getPlayerCount() /2 + 0.5) then redo[mapName] = setTimer(function(mapName) redo[mapName] = false end,900000,1,mapName) outputChatBox ("[VoteRedo] #FFFFFFThis map will be restarted by vote", thePlayer,0,136,255,true) sistaredando = 1 table.insert(mapQueue, mapName, 1) triggerEvent("onUseranelWantSetMap", getRootElement(), mapQueue[1]) callClientFunction(getRootElement(),"updateMapQueueList",mapQueue) end else showServerMsg(thePlayer,"Voteredo","This map will be redone.") end else showServerMsg(thePlayer,"Voteredo","This map has been already redone.") end else showServerMsg(thePlayer,"Voteredo","You already voted.") end end addCommandHandler ( "vr", Votaredo ) D'après ce que je lis, ça devrait très bien marché, mais ça aurait aussi dû marcher avec le code d'origine. Est-tu bien sûr que ce vote redo remplace la map qui devait venir après ? Ou n'est-ce pas en réalité un problème d'update de la liste des maps du côté client ? Pour ça vérifie bien que la map qui se lance après ne soit pas celle qui devait normalement être jouée s'il n'y avait pas eu de voteredo. -
Userpanel problème de map queue avec le /vr + question
Citizen replied to naotriix's topic in French / Français
Nan c'est débile, pourquoi pas faire plus simple et juste corriger ce bug qui vient de la commande /vr ??? C'est débile parce que si tu fais ça, c'est le plus rapide qui aura le droit d'acheter une map. Autant te dire que ça frustrera pas mal de joueur s'ils sont à chaque fois trop lent. Montre moi la commande /vr. Est-ce que c'est un vote ? (on dirai vu que vr veut sûrement dire vote restart). Si c'est un vote je veux également la partie (qui doit sûrement ce trouver dans une autre fonction) qui se charge de valider le vote et qui se charge également de rajouter la map à la map queue. Cette partie là doit sûrement faire mapQueue[1] = mapName ce qui change la valeur de la là 1ère ligne du tableau par la valeur de mapName et donc remplace la map qui devait suivre. Il faudrait plutôt faire comme ceci: table.insert(mapQueue, mapName, 1) le 3ème argument qui est optionnel précise là position à laquelle elle doit être insérée (ici en 1ère position). Et après ça le vr fonctionnera sans problème. Tu aurais dû faire un autre topic pour ça. Mais personne ici ne va travailler pour toi gratuitement (le travail étant de coder un map loader en php et qui doit être compatible avec "ton" multigamemode). Idem, un autre topic normalement car rien à voir avec le titre de ce dernier. Et heuuu je vois pas de question dans cette phrase. Comment ils font ? Bah tout simplement en évitant de mettre un nom de map déjà connu (sur d'autre serveurs). Une map étant une ressource (normalement, mais vu que y a un loader php, je pense que ce n'est pas le cas), elle possède un nom. Lorsqu'un joueur charge cette map pour la 1ère fois, il télécharge cette ressource (qui contient les scripts clients, les sons, les images etc) et le stock dans le dossier de cache de MTA. Si le joueur va sur un autre serveur qui lui fait télécharger une ressource qui porte le même nom que ta ressource (la map en question) qui n'est exactement la même, MTA va donc télécharger cette ressource en remplaçant ta map qui était stockée dans le cache de son jeu. Ce qui fait que s'il revient sur ton serveur, et que cette map revient, ça va encore ! la télécharger. En gros faudrait prefixer toutes tes ressources par 2 ou 3 lettres qui représente ton serveur. Genre si ton serveur s'appel "My Awesome Server" tu préfixes toutes tes ressources par "mas_" comme ça si une map s'appelle "hunterrace", tu la renommes en "mas_hunterrace". Avec ce prefix tu peux être sûr que tes joueurs ne téléchargera tes ressources qu'une seule fois. Cordialement, Citizen -
- Are you trying to run it on Windows or Linux based OS ? - Did you install a MySQL server and did you imported the database in it ? - Are the settings for the MySQL connection correct ?
-
What part isn't working ? Whar errors do you see ?
-
Here is a better version of your code. (I didn't touch the functions/commands which i didn't understand the purpose. local GAS_R, GAS_G, GAS_B, GAS_A = 255, 255, 0, 150 local gasStations = { -- { x, y, z, size } { 1007.04, -940.34, 41.17, 3 }, { 652.58, -570.38, 15.33, 3 }, { 2120.91, 929.10, 9.82, 3 }, { -1609.28, -2718.38, 48.53, 3 }, { -1673.30, 404.30, 6.17, 3 }, --{ -1329.11, 2671.99, 49.06, 3 }, -- { 1595.68, 2197.25, 9.82, 3 }, { -1376.40, -239.16, 14.14, 10 }, { 64, 1220, 19, 3 }, { 2194, 2480, 11, 3 }, { 1479.74, 1813.42, 10.81, 10 }, { 1590, 2196, 11, 3 }, { 2142, 2740, 11, 3 }, { -1329, 2671, 50, 3 }, { -1680, 412, 7, 3 }, { -2413, 970, 11, 3 }, { -2244, -2561, 313, 3 }, { 653, -570, 16, 3 }, { -94, -1161, 3, 3 }, { 1945, -1771, 13, 3 }, { 1008, -939, 42, 3 }, { -1600, -2706, 49, 3 }, { -2023, 157, 28, 3 }, { 1378.5, 458.5, 20, 3 } } for k, i in ipairs( gasStations ) do createMarker(i[1], i[2], i[3], "cylinder", i[4], GAS_R, GAS_G, GAS_B, GAS_A) setElementDimension(i, 11000) end function takeMoneyFueling (player, money) takePlayerMoney (player, money) end addEvent ("tkf", true) addEventHandler ("tkf", root, takeMoneyFueling) function loadBinds () for key, player in ipairs (getElementsByType("player")) do bindKey(player, "space", "down", gasolina) end end addEventHandler("onResourceStart", resourceRoot, loadBinds) function gasolina (player) if getElementType(player) == "player" then if isPlayerInGasStation(player) then triggerClientEvent (player, "gasReload", player) end end end function isPlayerInGasStation(player) for k, i in ipairs (gasStations) do if isElementWithinMarker(player, i) then return true end end return false end function markerEn (hitElement) if isPlayerInGasStation( hitElement ) and getElementType( hitElement ) == "player" and isPedInVehicle( hitElement ) then outputChatBox ("Welcome to refill your vehicle, type /motor to turn off the engine", hitElement, 0, 255, 0) end end addEventHandler ("onMarkerHit", root, markerEn) local timer = {} function onPlayerLogggin () timer[source] = setTimer(sendMech, 2500, 0, source) bindKey(source, "space", "down", gasolina) end addEventHandler ("onPlayerLogin", root, onPlayerLogggin) function onPlayerQuitt () if isTimer(timer[source]) then killTimer (timer[source]) end end addEventHandler ("onPlayerQuit", root, onPlayerQuitt) function detect (player) if isPedInVehicle (player) then if getElementData(getPedOccupiedVehicle(player), "fuel") or 0 <= 0 then smtm (getPlayerName( player ).." needs a mechanic in "..getZoneName(getElementPosition(player)).."", 255, 255, 0) end end end function isVehicleTankEmpty (vehicle) if vehicle then local fuel = getElementData (vehicle, "fuel") or 0 if tonumber(fuel) <= 0 then return true end return false end end function refill () for key, vehicle in ipairs (getElementsByType("vehicle")) do local driver = getVehicleOccupant( vehicle, 0 ) local fuel = getElementData (vehicle, "fuel") or 0 if tonumber(fuel) > 0 then local driver = getVehicleOccupant ( vehicle, 0 ) if driver then toggleControl ( driver, "accelerate", true ) toggleControl ( driver, "brake_reverse", true ) end end end end setTimer(refill, 2000, 0) function smtm ( message, color1, color2, color3 ) local mechs = getTeamFromName ("Mechanic") if mechs then local playersMech = getPlayersInTeam ( mechs ) for key, mech in ipairs ( playersMech ) do outputChatBox ( message, mech, color1, color2, color3 ) end end end - Why did you put markers in dimension 11000 ? are everything in dimension 11000 or did you just want them to be invisible ? in this case, you should put the alpha of the marker to 0 instead. - What /tkf was supposed to do ? Because what I see is a command that everyone can use to get free money ! i.e: /tkf -5000 will gives me $5000. - Learn about table and use them when you can (as I just did for the gas stations). Have a look at my isPlayerInGasStation function and see how it reduced the amount of code in your functions like gasolina. I can add a new gas station easily as I just need to add a row to gasStations tabl, no need to modify the rest of the code.
-
... he wants objects to be visible in multiple dimensions ... not an object following one player's dimension ... @launemax: as Saml1er you need to duplicate those objects and set a new dimension on them (I guess you should make a function to load your mapping and duplicate everything with a different dimension)
-
Just use it in the client-side and boom it works. (if isElementAttachedToBone is defined on client-side too)
-
No sir, #camerasSelection returns the number of rows of the camerasSelection table which is 3. Did you even tested it ? I guess not
-
Juste pour dire que ça sert à rien de "up" un topic dans ce forum, aucun joueur ne parcours cette section du forum. Il n'y a que des codeurs donc ils ont forcément un projet de leur côté (bah oui sinon ils n'auraient pas appris à coder sur MTA). T'auras plus de chance sur Britania par exemple si ce n'est pas déjà fait. Merci de ne plus "up" ce topic.
-
Yeah exactly: local camerasSelection = { {2296.2890625, -1395.05761718, 694.02215576172, 2308.077148437, -1410.1640625, 688.58026123047}, -- DM {2262.1308593, -1402.44628906, 699.66162109375, 2271.508789062, -1421.4033203, 691.99346923828}, -- DD {2248.1074218, -1400.54296875, 695.64147949219, 2232.736328125, -1411.4306640, 696.97576904297} -- HT } local currentSelection = 1 -- means it will be DM by default function updateCameraSelection() local c, i = camerasSelection, currentSelection -- making temp aliases so it's shorter local x, y, z = c[i][1], c[i][2], c[i][3] local tx, ty , tz = c[i][4], c[i][5], c[i][6] setCameraMatrix( x, y, z, tx, ty, tz ) end function nextSelection() currentSelection = currentSelection + 1 if currentSelection > #camerasSelection then currentSelection = 1 end updateCameraSelection() end function prevSelection() currentSelection = currentSelection - 1 if currentSelection < 1 then currentSelection = #camerasSelection end updateCameraSelection() end addEventHandler("onClientResourceStart", resourceRoot, function() bindKey("arrow_l", "down", prevSelection) -- bind when just joined the server bindKey("arrow_r", "down", nextSelection) -- bind when just joined the server updateCameraSelection() end) addEventHandler("onClientPlayerSpawn", localPlayer, function() if getKeyBoundToFunction(nextSelection) ~= "arrow_r" then return end -- prevent unbinding if already unbound unbindKey("arrow_l", "down", prevSelection) -- unbound when spawning unbindKey("arrow_r", "down", nextSelection) -- unbound when spawning end)
-
Here is an example of what you could do: Becarefull ! It's a client-side script ! client-side: local camerasSelection = { {2296.2890625, -1395.05761718, 694.02215576172, 2308.077148437, -1410.1640625, 688.58026123047}, -- DM {2262.1308593, -1402.44628906, 699.66162109375, 2271.508789062, -1421.4033203, 691.99346923828}, -- DD {2248.1074218, -1400.54296875, 695.64147949219, 2232.736328125, -1411.4306640, 696.97576904297} -- HT } local currentSelection = 1 -- means it will be DM by default function updateCameraSelection() local c, i = camerasSelection, currentSelection -- making temp aliases so it's shorter local x, y, z = c[i][1], c[i][2], c[i][3] local tx, ty , tz = c[i][4], c[i][5], c[i][6] setCameraMatrix( x, y, z, tx, ty, tz ) end function nextSelection() currentSelection = currentSelection + 1 if currentSelection > #camerasSelection then currentSelection = 1 end updateCameraSelection() end addEventHandler("onClientResourceStart", resourceRoot, function() bindKey("arrow_r", "down", nextSelection) -- bind when just joined the server updateCameraSelection() end) addEventHandler("onClientPlayerSpawn", localPlayer, function() if getKeyBoundToFunction(nextSelection) ~= "arrow_r" then return end -- prevent unbinding if already unbound unbindKey("arrow_r", "down", nextSelection) -- unbind when spawned end) I have tested it and it works ! So make sure you copy-paste correctly (and in the right file). Regards, Citizen
-
Lol what a ______ ! You wanna be paid for doing such simple command ?! Shame on you ! function songRequest(thePlayer, cmd, ...) local songName = table.concat( {...}, " " ) -- This will handle song names which contains spaces if not songName or songName == "" then outputChatBox("USAGE: /song ", thePlayer, 200, 0, 0) return end -- here we have have song name local requester = getPlayerName( thePlayer ) for k, player in ipairs( getElementsByType( "player" ) ) do local accName = getAccountName( getPlayerAccount( thePlayer ) ) if isObjectInACLGroup( "user."..accName, aclGetGroup( "Staff" ) ) then outputChatBox("A song has been requested by "..requester..". Requested Song: "..songName..".", player, 0, 200, 0) end end end addCommandHandler("song", songRequest, false, false) I didn't test it but I'm pretty sure it should work as requested. (It also handle song names with spaces in them) Regards, Citizen
-
Si tu avais ouvert le code de cette petite et simple ressource, tu aurais pu/dû trouver la fonction appelé lorsque quelqu'un ou quelque chose va sur le pickup: addEventHandler("onPickupHit",getRootElement(), function (thePlayer) if (matchDimensionInterior(thePlayer, source)) then -- if the pickup and the player are in the same dimension, so you can make in different dimensions if (getElementData(source,"isItInfoPickup") == 1) then -- if the pickup it's really a pickup local text = getElementData(source,"text") ... outputSpace(thePlayer) end cancelEvent() end end ) Tu peux voir un appel à la fonction cancelEvent qui permet de dire "l'event à été traité et ne doit donc plus être propagé". Un rappel sur les event: On peut ajouter une fonction à exécuter lorsque un event se produit grâce à la fonction <strong>addEventHandler</strong>. La fonction est donc un handler de l’événement spécifié. Toutes les ressources peuvent ajouter des handlers sur n'importe quel événement et tous les handlers pour chaque événement sont stockés par le serveur au moment de l’exécution dans un ordre non spécifique. Lorsque l'event (onPlayerPickupHit) est déclenché, le serveur appel tous les handlers de cet event dans l'ordre dans lequel ils sont arrivés. Imaginons cet liste d'handler pour onPlayerPickupHit: 1 - handler1 resource race 2 - handler2 resource race 3 - handler resource infopickups 4 - handler1 resource spawn-teams 5 - handler2 resource spawn-teams ... Le serveur va donc appelé le 1 (il fait sont bazar) puis le 2 (il fait aussi son bazar) puis il arrive au 3, il va aussi faire son bazar MAIS! Si le pickup est dans la même dimension et dans le même intérieur que le joueur alors il y aura forcément un appel à cancelEvent et la le serveur s'arrêtera de propager l'event (= de continuer d'appeler les handlers). J'ai essayé de comprendre pourquoi le développeur à mit ce cancelEvent mais je ne vois absolument pas (en tout cas pas dans ce if). Par contre si le cancelEvent était dans le second if if (getElementData(source,"isItInfoPickup") == 1) then ... cancelEvent() end Ça ne bloquerai pas les pickups des autres ressources et ça empêcherai certaines ressources (tout dépends de l'ordre) d'être au courant qu'un joueur (ou qqchose) est entré dans un pickup. Mais ça reste toujours débile/inutile. Solution: Supprimer le cancelEvent() ligne 64, sauvegarder et relancer la ressource. Et oui c'est tout ce qu'il y avait à faire. Cordialement, Citizen PS: Évite les double posts (t'as fait un joli triple là), surtout si c'est pour corrigé une faute, il y a le bouton pour éditer en haut à droite
-
Même celui qui est en rouge bordeaux.
-
J'aime bien le thème choisi mais voici mes remarques: - Le background du header étant d'un bleu foncé, le logo devrait être écrit en blanc (question de contraste) - Le logo du teamspeak pourrait être mieux détouré (ça doit pouvoir se trouver sur internet) - Annonce est mise à jour => Annonces et mises à jour* - Règles général => Règles générales - Tutoriel => Tutoriels (pas une faute mais il y aura forcément plus d'un tutoriel) - "Modifier par Tom_Anderson" => Modifié* Dans le bloc des news: * "Bienvenue chere amie." Heuuu what ? Je mettrai plutôt "Bienvenue sur Los Santos Roleplay" ou "Bienvenue cher/chère ami(e)" * "Notre serveur et en cours de maintenance." => est* Ça fait quand même beaucoup de fautes sur une seule page. EDIT: Ah bah le logo à changer le temps de rédiger. Vous avez passé le nom du serveur en blanc, c'est ok mais il faudrait aussi passer la description.
-
Vu que je suis une des rares personnes à suivre activement cette section FR de ce forum MTA, je te confirme en disant que ça ne m'intéresse pas. À ta place j'aurai d'abord regardé l'activité de cette section, qui n'est pas terrible. Et seulement 4 petites heures pour avoir une réponse ne sont pas suffisantes ici.
-
Ce script sql doit être importer dans ton serveur MySQL (qui vient avec wamp ou easyPHP sur windows) via phpMyAdmin (http://localhost/phpMyAdmin). Ton login panel doit être configurer avec l'adresse, le port, l'identifiant et le mot de passe de pour accéder à ce serveur MySQL. Par défaut ça devrait être ceci: Adresse: "localhost" Port: 3306 Identifiant: "root" Password: "" <= vide Mais étant donné que c'est un simple login panel, je pense qu'il ne sauvegardera pas les skins, armes, l'argent et autres.
-
La ressource modloader est une ressource à part qui à pour seul but de charger et remplacer des models et des skins sur un serveur sans avoir à coder. https://forum.multitheftauto.com/viewtopic.php?f=108&t=36481 Etant donné que ce n'est qu'une simple ressource comme les autres et que tu n'as pas utilisé un logiciel afin de remplacer ces models/skins dans ton GTA SA, il va de soit que ces models/skins ont été remplacés lorsque tu t'es simplement connecté à ton serveur (avec le chargement des fichiers au début). Et donc que ça le fera aussi pour n'importe quel autre joueur.