Jump to content

Citizen

Moderators
  • Posts

    1,803
  • Joined

  • Last visited

  • Days Won

    8

Everything posted by Citizen

  1. L'erreur veut tout simplement dire que tu as fait un triggerServerEvent("onGanadoSpawn", blabla, blablabla) du côté client mais que tu n'as jamais fait de addEvent("onGanadoSpawn", true) du côté serveur. Cordialement, Citizen
  2. Heureusement que j'avais dit de le mettre après chaque setPedSkin hein ! Mais au moins t'as réussi à corriger ton erreur sans mon intervention. Par contre respecte l'indentation ! (l'espacement du code par rapport à la marge de gauche): addEvent("26",true) addEventHandler("26",root, function() if ( getPlayerMoney (source) >= 5000 ) then takePlayerMoney(source, 5000) setPedSkin ( source, 47 ) local account = getPlayerAccount(source) setAccountData(account, "SkinShop", 47) end end) doit être addEvent("26",true) addEventHandler("26", root, function() if ( getPlayerMoney (source) >= 5000 ) then takePlayerMoney(source, 5000) setPedSkin ( source, 47 ) local account = getPlayerAccount(source) setAccountData(account, "SkinShop", 47) end end) C'est plus facile à lire et ça fait moins noob Cordialement, Citizen
  3. Ouai vas-y parce que là mon code de tête ne fonctionne pas totalement, y a un truc qui coince au niveau du reset du vote.
  4. Bah ... regarde dans la meta.xml de la ressource pour savoir. <script src="map_queue.lua" type="???"/> Mais en relisant vite fait le code, on peut voir qu'il y a un getResourceInfo qui est une fonction only server donc nan ça n'a pas l'air d'être du client-side. L'utilises-tu avec le gamemode Race ? parce que normalement, l'event onMapStarting devrait fonctionner Rajoute ça aussi en haut de clearVote (donc juste au-dessus de playerVoted = 0): outputDebugString("clearVote") Et regarde dans la console serveur le nombre de "clearVote" que tu y verras (normalement: une au démarrage de la ressource et une par démarrage de map). Si y en a aucun (ce qui, je pense, va être le cas vu l'erreur que t'as) alors on a un problème dont j'ignore totalement pour l'instant la cause.
  5. Ouai je sais que c'est cette ligne, l'erreur dit qu'il peut pas faire un +1 sur une variable qui n'existe pas. MAIS ! Cette variable est assignée à 0 dans clearVote qui est "normalement" éxécutée lorsque la ressource est démarrée (onResourceStart) et à chaque démarrage de map (onMapStarting). Mais apparemment, aucun des 2 events ne fonctionne. Peut tu me dire le nom du fichier dans lequel on se trouve, le nom de la ressource (race ?) et si c'est un fichier serveur ou client (serveur ?). J'ai comme l'impression qu'on est côté client pour pas que ces events ne fonctionnent. PS: Aussi, si tu pouvais utiliser les balises [lua ][/lua] pour coller ton code Lua au lieu d'utiliser , ça piquerait moins les yeux Cordialement, Citizen
  6. Ouai encore une erreur de copié collé, dsl, change ça: addEventHandler("onMapStarting", resourceRoot, clearVote) en ça addEventHandler("onMapStarting", root, clearVote) ça par contre c'est pas de notre côté vu qu'on a pas touché ce fichier. Et comme c'est un warning, tu peux l'ignorer même même si ça signifie que le serveur voulait output un message dans la chatbox et que ça n'a pas marché. Je pense qu'après cette dernière correction, ça devrait marcher (sauf si l'event "onMapStarting" ne fonctionne pas, mais j'en doute). Cordialement, Citizen
  7. Ouai une erreur dû au code qu'il y avait avant, j'ai changé le nom de la variable en changeant son rôle également et j'ai oublié d'inverser le if. Genre là c'est écrit: Si la map est en train d'être restarté, alors on autorise les votes, sinon on ne les autorise pas. if mapRestarting then -- On autorise les votes else -- On autorise pas end Alors qu'il fallait que j'écrive: Si la map n'est pas en train d'être restarté, alors on autorise les votes, sinon on ne les autorise pas. if not mapRestarting then -- On autorise les votes else -- On autorise pas end Donc je te laisse rajouter le "not" devant "mapRestarting". Cordialement, Citizen.
  8. A mettre à la fin du même fichier que pour mes 2 bouts de code de mon post précédent et après avoir fait le 1 et le 2 de mon post précédent: --- VR --- addEvent("onMapStarting", true) function clearVote() playersVoted = 0 mapRestarting = false for i,playersVR in ipairs(getElementsByType ("player")) do setElementData( playersVR, "hasVoted", "nope" ) end end addEventHandler("onClientResourceStart", resourceRoot, clearVote) addEventHandler("onMapStarting", resourceRoot, clearVote) function voteRedo(thePlayer) if mapRestarting then if (getElementData(thePlayer, "hasVoted" ) == "nope") then setElementData(thePlayer, "hasVoted", "voted" ) playersVoted = playersVoted + 1 local rr,gg,bb = 255,0,0 if playersVoted >= math.floor(getPlayerCount() /2 + 0.5) then rr,gg,bb = 0,255,0 end outputChatBox("' ["..playersVoted.."/".. math.floor(getPlayerCount() /2 + 0.5) .."] ' #1a5eaa~> #c1c1c1Voted For Redo ( #FFFFFF"..getPlayerNametagText(thePlayer).." #C1C1C1)", root, rr, gg, bb, true) if playersVoted >= math.floor(getPlayerCount() /2 + 0.5) then applyVoteRedo() mapRestarting = true outputChatBox ("#c1c1c1This Map Will Be Restarted By #1a5eaaVote", root, 255, 153, 0, true) end else outputChatBox("#c1c1c1You already #1a5eaaVoted #FFFFFFfor redo !", thePlayer, 255, 0, 0, true) end else outputChatBox("#440000Sorry#ffffff, #c1c1c1This map was restarted by #1a5eaaVote #FFFFFF!", thePlayer, 255, 0, 0, true) end end addCommandHandler("vr", voteRedo, false, false) addCommandHandler("voteredo", voteRedo, false, false) ------
  9. Et bim qu'est-ce que j'avais dit ? des boutons ... Le problème avec ce skin shop c'est que tu pourras jamais mettre à dispo un grand nombre de skin. Là par exemple, y en a que 26 mais si ça te convient, garde celui là. Donc tu dois mettre ça: local account = getPlayerAccount(source) setAccountData(account, "shop.skin", ) après chaque setPedSkin en remplaçant par celui du setPedSkin qui correspond. J'attends ton retour. Cordialement, Citizen
  10. Heuuu oui je pense que c'est ça, il utilise setPedSkin qui est une vielle fonction qui est maintenant en "deprecated", ça veut dire que pour l'instant elle existe encore pour que les scripts qui l'utilisent fonctionne toujours mais elle peut/va être supprimée dans une prochaine version de MTA. Ce que je trouve bizarre par contre c'est que genre l'id du skin est écrit en dur, genre c'est pas une variable qui change selon ce que le joueur à choisis comme skin. Tu pourrais me filer le lien vers ce skin shop ? on dirait que c'est genre 1 bouton pour 1 skin ou un truc similaire.
  11. Bon j'ai regardé de plus près et c'est effectivement pour l'auto-login (/enableauto et /disableauto). En regardant du côté serveur, on constate qu'il utilise bien les accounts de base: function registerPlayer(username,password,passwordConfirm) [...] if password == passwordConfirm then local account = getAccount (username,password) if (account == false) then local accountAdded = addAccount(tostring(username),tostring(password)) if (accountAdded) then triggerClientEvent(source,"hideRegisterWindow",getRootElement()) [...] end Ducoup il te faut faire 2 choses très simples: 1 - Modifier ton skin shop pour rajouter ces 2 lignes dans la fonction d'achat: local account = getPlayerAccount() -- on récup l'account du joueur setAccountData(account, "shop.skin", ) -- on save l'id du skin dans son compte sous le nom "shop.skin" En remplaçant: - par la variable qui contient le joueur achetant le skin. - par la variable qui contient l'id du skin. Pour t'aider à déterminer le nom des deux variables, tu dois sûrement trouver un: setElementModel(toto, blabla) Bah tu remplaceras par toto et par blabla. 2 - Modifier la fonction spawn dans broph.lua: function spawn(player) if not isElement(player) then return end if get("spawnreset") == "onSpawn" then spawnpoint = getRandomSpawnPoint() end exports.spawnmanager:spawnPlayerAtSpawnpoint(player,spawnpoint,false) local account = getPlayerAccount(player) -- on récup l'account du joueur local skin = getAccountData(account, "shop.skin") or 242 -- on récup la valeur pour "shop.skin" dans son compte, si y a pas, ça sera le 242 repeat until setElementModel(player, skin) fadeCamera(player, true) setCameraTarget(player, player) showChat(player, true) end Par contre tes 2 ressources doivent être dans le groupe Admin dans l'ACL pour être autorisées à manipuler les accounts: <acl> [...] <group name="Admin"> <acl name="Moderator"></acl> <acl name="SuperModerator"></acl> [...] <object name="resource.Play"></object> <object name="resource.nomDeLaRessourceSkinShop"></object> </group> [...] </acl> Et GaMeR60p, mis à part le fait que je n'ai pas compris l'utilité de ton intervention ni la raison de ton +1, je te conseil de changer d'avatar car c'est l'avatar d'un gros modérateur ici: 50p
  12. Il n'y avait qu'une meta à inspecter, c'était celle de la ressource de broph.lua et effectivement il n'y a pas la section des settings. A toi de la rajouter: <meta> <info author="Broph" type="script" /> <include resource="map" /> <include resource="spawnmanager" /> <map src="broph.map" /> <script src="broph.lua"/> <settings> <setting name="spawnreset" value="onSpawn" /> </settings> </meta> Heuu non je vois juste un vulgaire fichier xml mais on est dans du client-side donc j'espère que c'est juste pour l'auto-login et que genre y a pas les logins passwords de tous les joueurs dedans oO. Y a moyen d'avoir un lien vers ce login panel stp ? J'ai besoin de l'inspecter d'un peu plus près.
  13. Pas de soucis et bien joué pour les trigger client -> server et server -> client . Pourquoi tu n'as pas édité ton message pour virer [/b] et remettre [b][lua ][ /lua][/b] proprement ? Aussi tu peux faire [b][code= ][ /code][/b] genre: [b][code=lua ][ /code][/b] qui est pareil à [b][lua ][ /lua][/b] [b][code=xml ][ /code][/b] (en virant les espaces que j'ai du rajouté pour éviter qu'ils fonctionnent dans ce post)
  14. Ouaip c'est des fonctions serveurs car ça agit sur la bdd qui n'est accessible que via le serveur. Donc ouai il fallait faire un triggerServerEvent depuis le client pour ensuite exécuter une fonction côté serveur qui elle utilisera les fonctions d'enregistrements etc. Mais pour que ta ressource soit autorisée à utiliser ces fonctions, il te faut la mettre dans le groupe Admin de l'ACL. 1 - Coupe le serveur 2 - Ouvre acl.xml qui se trouve dans "...\MTA San Andreas 1.x\server\mods\deathmatch" avec notepad++/Sublime text (évite de l'ouvrir avec wordpad, notepad ou même word). 3 - Rajoute ta ressource dans le groupe "Admin": <acl> [...] <group name="Admin"> <acl name="Moderator"></acl> <acl name="SuperModerator"></acl> [...] <object name="resource.nomDeTaRessource"></object> </group> [...] </acl> 4 - Sauvegardes et relances ton serveur avec ta ressource. Cordialement, Citizen
  15. Oui donc justement, il faut que tu enregistres ça quelque part. Mais il faut que je sache comment les joueurs s'enregistrent et se connectent sur ton serveur, enfin ce qu'utilise ton système de compte (mysql ou account data ?). ça sert à rien que je te propose du code utilisant les account data si tout fonctionne en MySQL ou SQLite et inversement. Pour ton autre problème, déjà évite de mélanger plein de problèmes dans le même topic surtout lorsque le 1er n'est même pas encore résolu ! Fais en un autre pour le prochain pour éviter de perdre le fil. Ton problème est que, dans ta meta.xml, tu dois mettre la valeur de spawnreset à "onSpawn". Comment je le sais ? C'est écrit dans le code: function spawn(player) [...] if get("spawnreset") == "onSpawn" then -- là ! spawnpoint = getRandomSpawnPoint() -- Définit un nouveau spawnpoint end exports.spawnmanager:spawnPlayerAtSpawnpoint(player,spawnpoint,false) -- fait spawn sur [...] end Lorsque le serveur demande à faire spawn le joueur en appelant cette fonction, on "get" un "random spawn point" que si la valeur de du setting "spawnreset" vaut "onSpawn". Y avait vraiment rien de compliqué et normalement il devait y avoir un petit readme quand même ou des commentaires dans la meta.xml qui devait expliquer ça. Les différentes valeurs possibles du setting "spawnreset": - "onSpawn": Définira un nouveau spawnpoint à chaque fois que quelqu'un voudra spawn. - "onServerEmpty": Définira un nouveau spawnpoint lorsque le dernier joueur sur le serveur quitte ce serveur (quand on passe de 1 à 0 joueur sur le serveur). Je suppose donc que dans ta meta.xml ce setting est sur "onServerEmpty" au lieu de "onSpawn" Cordialement, Citizen
  16. Pour ton cas, il est peut être plus simple d'utiliser internal.db. Wiki: https://wiki.multitheftauto.com/wiki/Database Voici un exemple pour le register et le login: Register: function registerThePlayer ( thePlayer, pseudo, password ) -- On essaye de créer un nouveau compte via local accountAdded = addAccount( pseudo, password ) if ( accountAdded ) then -- La création à fonctionné, il est enregistré outputChatBox ( "Thank you " .. getPlayerName(thePlayer) .. ", you're now registed, you can login.", thePlayer ) else -- Il y a eu une erreur lors de la création outputChatBox ( "Error creating account, contact the server admin", thePlayer ) end end Login: function loginThePlayer( thePlayer, pseudo, password ) local account = getAccount ( pseudo, password ) -- Retourne le compte qui correspond au pseudo et password if account ~= false then -- S'il y a bien un compte qui correspond au pseudo et password logIn ( thePlayer, account, password ) -- On le login. outputChatBox ( "You have been successfully logged in !", thePlayer, 0, 200, 0 ) else outputChatBox ( "Wrong username or password !", thePlayer, 200, 0, 0 ) end end
  17. J'ai pas très bien compris pourquoi tu veux limiter la mapQueue à 1 on peut très bien faire un vote redo sans toucher à la mapQueue. Dans le 1er script, il n'y a rien à toucher, il n'y a rien d’intéressant. Par contre dans le 2ème, je te propose les modifications suivantes: 1 - Modifier la fonction updateMapQueueOnMapStart ligne 92 comme ceci (tu peux copier/coller) function updateMapQueueOnMapStart() randomMap = randomMap + 1 if randomMap ~= 4 then if #mapQueue ~= 0 then if not votedForRedo then table.remove(mapQueue, 1) end votedForRedo = false if #mapQueue > 1 then triggerEvent("onUserpanelWantNextmap", getRootElement(), mapQueue[1]) outputDebugString("Calling next map to race", 1, 255, 255, 255) end end else randomMap = 0 triggerEvent("onUserpanelWantNextmap", getRootElement(), 'Random map') end sentMapQueueToClients() end addEvent("onRaceCallNextMap", true) addEventHandler("onRaceCallNextMap", getRootElement(), updateMapQueueOnMapStart) 2 - Ajouter ce bout de code à la fin de ce fichier (donc juste après la fonction updateMapQueueOnMapStart): local votedForRedo = false addEvent("onVoteRedoSuccess", true) function applyVoteRedo() votedForRedo = true outputChatBox("[REDO] The map will be replayed !", 200, 0, 0) end addEventHandler("onVoteRedoSuccess", root, applyVoteRedo) Explications: L'éxécution de la fonction applyVoteRedo va passer le booléen votedForRedo à true et afficher un message à tout le monde. Ensuite lorsque le serveur appellera updateMapQueueOnMapStart pour connaître la map suivante, j'empêche cette fonction de supprimer la map actuelle si le votedForRedo est à true via ce bout de code: if not votedForRedo then table.remove(mapQueue, 1) end Je n'oublie pas ensuite de remettre votedForRedo à false et je laisse la fonction envoyer la 1ère map de la liste (qui est toujours la même map vu qu'on a évité sa suppression) grâce à cette ligne (qui était déjà là): triggerEvent("onUserpanelWantNextmap", getRootElement(), mapQueue[1]) Je ne sais pas ce que fait exactement l(es) handler(s) de l'event "onUserpanelWantNextmap" mais je suis quasi sûr à 100% que ça définit la map suivante. Donc voilà il ne te reste plus qu'à coder ton vote redo et en cas de succès ... - soit tu appelles directement la fonction applyVoteRedo si tu le codes dans le même fichier, - soit tu trigger l'event "onVoteRedoSuccess" et en cas d'echec (pas assez de vote) tu fais rien à part leur afficher un message comme quoi le vote n'a pas aboutit. Cordialement, Citizen
  18. L'achat de skin est-il déjà fonctionnel ? si oui, enregistres-tu cette donnée dans une base de donnée (les account datas ou mysql) ? Parce que toutes les données que tu ne sauvegardes pas dans une base de donnée sera obligatoirement perdu après un redémarrage du serveur. Pour déterminer la façon la plus simple de rajouter cette fonctionnalité, il me faudrait le register et le login (en enlevant les données sensibles du style login/mdp dans le cas d'une base de donnée en MySQL). Bah là c'est parce que la fonction addEventHandler nécessite 3 arguments et qu'on ne lui en donne que deux à savoir "onBotWasted" et getRootElement. (d'ailleurs c'est getRootElement() et non pas getRootElement). Les 3 arguments dont il a besoin sont: 1 - le nom de l'évenement (ici "onPedWasted") 2 - une sorte de filtre pour dire quel(s) élément(s) peuvent être à l'origine de cet événement (getRootElement() retourne l'élément racine de tous les éléments du jeu, donc ça veut dire tous les éléments peuvent en être à l'origine. En gros c'est pas filtré vu qu'on accepte tout). 3 - la fonction à exécuter lorsque cet événement est déclenché. (Donc là faut lui donner le nom de la fonction qui doit faire des choses lorsqu'un bot meurt). Si tu as décidé de supprimer la fonction, il faut aussi supprimer la ligne du addEventHandler. Voilà j'attends ton retour. Cordialement, Citizen
  19. L'auteur a délibérément compilé ce script pour éviter qu'on en modifie le code source. Donc ce n''est pas un bug, c'est fait exprès, et le script fonctionne très bien malgré tout. Il est juste compilé. Si tu veux également compiler TES scripts, il te faut utiliser le compilateur de MTA (qui rajoute une protection supplémentaire par rapport aux compilateurs normaux de scripts Lua). Cordialement, Citizen
  20. Citizen

    money park

    As DNL291 said, you need to fix the colshape: local ColMoney = createColRectangle ( 2057.1384277344, -1258.0145263672, -185, 110 ) It's actually not where you think it is.
  21. Citizen

    Hackers

    Element datas are synced between the two sides by default.
  22. Citizen

    money park

    Make sure the script file is in your meta.xml, and that it's a server sided script. Don't forget to restart the resource aswell. If everything is fine then you are NOT IN the colshape. Try this code and see the outputs to make sure everything is working and that you are actually inside that colshape: local ColMoney = createColRectangle ( 2057.1384277344, -1258.0145263672, -185, 110 ) addEventHandler("onColShapeHit", ColMoney, function(elem) outputChatBox("A "..getElementType(elem).." entered in the money colshape !") end) addEventHandler("onColShapeLeave", ColMoney, function(elem) outputChatBox("A "..getElementType(elem).." left in the money colshape !") end) addEventHandler( "onResourceStart", resourceRoot, function() setTimer(colShapeMoney, 1000, 0) outputChatBox("Resource started, timer is ticking ...") end ) function colShapeMoney() local players = getElementsWithinColShape(ColMoney, "player") outputChatBox(#players.." player(s) inside the colshape ...") for k, player in ipairs(players) do givePlayerMoney(player, 3) outputChatBox("Gave $3 to "..getPlayerName(player)) end end If the code doesn't say you entered in the colshape then there is no chance for you to get the money.
  23. Yes you are ! as you didn't understand that predefined variable like client and source are only available into functions that are handlers for events and that the value of source is different depending on the event it is handling. You asked again to tell you what is wrong so here is your answer: - You are trying to use undefined variables as arguments (source, theAccount and I can see ped aswell) You are obviously not understanding what you are doing so read and follow the tutorials from the wiki first: https://wiki.multitheftauto.com/wiki/Scr ... troduction Here is a working example I could make from your code: function changeMass(thePlayer, cmd, newMass) local account = getPlayerAccount(thePlayer) -- get his account local accName = getAccountName(account) -- get his account name local isAdmin = isObjectInACLGroup("user."..accName, aclGetGroup("Admin")) if isAdmin then local veh = getPedOccupiedVehicle(thePlayer) if veh then local oldMass= getVehicleHandlingProperty (veh, "mass") setVehicleHandling(veh, "mass", tonumber(newMass)) outputChatBox("The mass of the car changed from "..oldMass.." to "..newMass..".", thePlayer, 0, 200, 0) else outputChatBox("You must be in a car first !", thePlayer, 200, 0, 0) end else outputChatBox("You are not allowed to use this command !", thePlayer, 200, 0, 0) end end addCommandHandler("changeMass", changeMass, false, false) Use /changeMass 20 to set the vehicle's mass to 20.
  24. Totally pointless, it will do the exact same result. Here is the reason: When the setElementVisibleTo is called you (aliensky) get the "Criminal" team element with his members as children. So imagine you are "Player1" and you are not in the Criminal team, but there is "Player2" and "Player3" in the Criminal team, when this piece of code is called, it will set the visibility to true for only "Player2" and "Player3" and then it's over ! It won't update automatically if "Player1" joins the team ! So you have to set the visibility to true for anyone who will join this team, and to false for anyone who will leave that team. A good way to do that would be to listen for an event such as "onPlayerTeamChange" but this event doesn't exist. So I did this instead: -- Table that will store the teams that have elements only visible for their members. local teamVisibilityBindings = {} -- Copying the original setElementVisibleTo function into _setElementVisibleTo: local _setElementVisibleTo = setElementVisibleTo -- Replacing setElementVisibleTo function by our own for the whole resource: _G.setElementVisibleTo = function ( theElement, visibleTo, visible ) if isElement(visibleTo) and getElementType(visibleTo) == "team" then addTeamVisibilityBinding(visibleTo, theElement, visible) end end local function addTeamVisibilityBinding(team, element, visibility) local bindings = teamBindings[team] if not bindings then teamBindings[team] = {} bindings = teamBindings[team] end local notFound = true for elem, vis in pairs(bindings) do if elem == element then -- if there is already an entry for that team and element local notFound = false if vis ~= visibility then -- if we are changing the visibility teamBindings[team][elem] = visibility -- Update it refreshVisibility(true) end end end -- We checked all the bindings for that team if notFound then -- It's a new element to bind its visibility to a team teamBindings[team][element] = visibility -- Add it refreshVisibility(true) end end local teamMembersCache = {} function refreshVisibility( forced ) for team, bindings in pairs(teamVisibilityBindings) do local nbMembers = #getPlayersInTeam(team) if teamMembersCache[team] ~= nil or nbMembers ~= teamMembersCache[team] or forced then --if the number of members changed or we are forcing it for elem, vis in pairs(bindings) do _setElementVisibleTo(elem, root, not vis) _setElementVisibleTo(elem, team, vis) end end end end setTimer(refreshVisibility, 1000, 0) This should work but I didn't tested it (I can't for now). Here is what your code should now looks like: local crMarker = createMarker(1863.6999511719,-1598.6999511719,12.89999961853, 'cylinder', 2, 255, 0,0, 150) setElementVisibleTo (crMarker, getTeamFromName ("Criminal"), true)
×
×
  • Create New...