Jump to content

Citizen

Moderators
  • Posts

    1,803
  • Joined

  • Last visited

  • Days Won

    8

Everything posted by Citizen

  1. For teams, you can use the internal team system from MTA (as Bonsai suggested) because they are synced on both sides. But more generally, if you want to send a copy of a variable to the other side, you will have to use: triggerClientEvent --to send to the client triggerServerEvent --to send to the server You also can use this trick: You can use setElementData(resourceRoot, "myData", myValue) The element datas are synced between both sides. You can get the value of "myData" by doing: getElementData(resourceRoot, "myData") Regards, Citizen
  2. Citizen

    Solved

    No problem, don't forget to remove the "Not" from "Not solved :/" Regards, Citizen
  3. What do you mean by custom sound ? - Engine sound ? - Horn sound ? - Sirens sound ? Thanks to be more clear when you are asking for help. Regards, Citizen
  4. Maybe another resource is overriding that skin ? Try to add the "local" keyword in front of the txd variable (but I'm pretty sure that's not the problem): local txd = engineLoadTXD("285.txd") Also check if you added that txd file to your meta.xml (but I think you did). Any client-side error ? Maybe the txd file contains errors or isn't a valid one so mta rollback to the default skin ? Regards, Citizen
  5. Citizen

    Solved

    Hi, The "cashHave" variable is defined inside the "if ( account ) then" scope (line 5) and it doesn't exist anymore out of this scope (when the code reaches the "end" keyword of that scope) So here is a better implementation: -- Buy next map function buyMap(player, command, ...) local account = ( ( getPlayerAccount( player ) and not isGuestAccount( getPlayerAccount( player ) ) ) and getPlayerAccount( player ) or false ) if ( account ) then local cashHave = tonumber( getAccountData( account, "cash" ) ) if g_ForcedNextMap then outputChatBox( 'Next map is ' .. getMapName( g_ForcedNextMap ), player ) return end local query = #{...}>0 and table.concat({...},' ') or nil if not query then if g_ForcedNextMap then outputChatBox( 'Next map is ' .. getMapName( g_ForcedNextMap ), player ) else outputChatBox( 'Next map is not set', player, 255, 0, 0 ) end return end local map = findMap(query) if not map then outputChatBox(errormsg, player) return end if ( cashHave ) and ( cashHave >= 1 ) then if lastmap_B == map then outputChatBox( 'That map has been played too much recently.', player, 255, 0, 0 ) else g_ForcedNextMap = map outputChatBox(getPlayerName(player).. " bought map '" ..getMapName(g_ForcedNextMap).. "' for $1. (/bm)", g_Root, 0, 240, 0) setAccountData( account, "cash", cashHave - 1 ) lastmap_B = g_ForcedNextMap end else outputChatBox("You don't have enough money. ($1)", player, 255, 0, 0) end end end addCommandHandler('bm', buyMap) addCommandHandler('buymap', buyMap) So now the condition is in the same scope as the variable. Tips: - Take care with indentation - Parenthesis are optional (they just are used for priorities) if ( cashHave ) and ( cashHave >= 1 ) then can be written like this: if cashHave and cashHave >= 1 then Best regards, Citizen
  6. Hi, try this: local headline = {} local gridlistItems = {} local buttonItems = {} local Inventario = {} inventoryWindows = guiCreateWindow(0.15, 0.28, 0.72, 0.63, "", true) headline.loot = guiCreateLabel(0.06, 0.05, 0.34, 0.09, "GEAR", true, inventoryWindows) guiLabelSetHorizontalAlign(headline.loot, "center") guiSetFont(headline.loot, "default-bold-small") headline.inventory = guiCreateLabel(0.6, 0.05, 0.34, 0.09, "INVENTÁRIO", true, inventoryWindows) guiLabelSetHorizontalAlign(headline.inventory, "center") guiSetFont(headline.inventory, "default-bold-small") if getElementData(getLocalPlayer(), "Pizza") < 1 then Inventario[1] = guiCreateStaticImage(0.01, 0.03, 1.99, 100, "images/pp.png",true,inventoryWindows) guiSetAlpha(Inventario[1],0.-- s8) --> guiSetProperty(Inventario[1],"Disabled","true") then elseif getElementData(getLocalPlayer(), "Pizza") == 1 then Inventario[2] = guiCreateStaticImage(0.01, 0.03, 1.99, 100, "images/p1.png",true,inventoryWindows) guiSetAlpha(Inventario[2],1) guiSetProperty(Inventario[2],"Disabled","true") elseif getElementData(getLocalPlayer(), "Pizza") == 2 then Inventario[3] = guiCreateStaticImage(0.01, 0.03, 1.99, 100, "images/p2.png",true,inventoryWindows) guiSetAlpha(Inventario[3],1) guiSetProperty(Inventario[3],"Disabled","true") end guiSetVisible(inventoryWindows,false) function showInventory(key, keyState) if getElementData(getLocalPlayer(), "logedin") and keyState == "down" then guiSetVisible(inventoryWindows, not guiGetVisible(inventoryWindows)) showCursor(not isCursorShowing()) refreshInventory() if guiGetVisible(inventoryWindows) == true then onClientOpenInventoryStopMenu() else hideRightClickInventoryMenu() end if isPlayerInLoot() then local col = getElementData(getLocalPlayer(), "currentCol") local gearName = getElementData(getLocalPlayer(), "lootname") refreshLoot(col, gearName) end end end bindKey("j", "down", showInventory) Tips: - Learn Lua 1st (it's: "elseif condition here then" and not "else condition here then", and an if else statement must end with the "end" keyword). - Look at the client logs to check errors (/debugscript 3 if logged as admin, check acl.xml). - Learn to properly indent your code. - Stealing code, won't make u better but reading and understanding do. Note: This code won't trow errors if the following functions are defined and working somewhere in your code: - refreshInventory() - onClientOpenInventoryStopMenu() - hideRightClickInventoryMenu() - isPlayerInLoot() - refreshLoot(arg1, arg2) Regards, Citizen
  7. Heureusement que j'ai demandé avec le lien sinon tu ne me l'aurais pas donné. Oh wait ... T'avais testé avant ? Parece qu'en 10 mins, ça me paraît bien rapide pour vérifier si le serveur crash. Tu l'as dit toi même, ça crash de façon irrégulière. Ou alors ça veut dire que ton serveur crash très rapidement avec le mod qui utilise le module mysql ?? Une alternative au module MySQL serait d'utiliser les fonctions natives de MTA: SQL Functions Car tu peux aussi te connecter à une base MySQL: my_db = dbConnect( "mysql", "dbname=emilio;host=1.2.3.4", "username", "password") J'attends donc le lien du tuto et la backtrace.
  8. Bonjour Emilio, Alors ce que tu nous as donné ne nous sert strictement à rien. Il nous faut au minimum la backtrace afin d'avoir plus d'infos et localiser le problème. Pour l'obtenir, il te faudra le debugger gdb qui est contenu dans le package du même nom. Suit les instructions de cette page: How to obtain the backtrace J'aimerai aussi savoir quel tuto (avec le lien) as-tu suivi pour installer ton serveur sur ta debian, quels mods sont lancés avec ton serveur et si ça crash aussi juste avec la ressource play ou freeroam. Là au moins avec ces infos, on pourra avancer ... Cordialement, Citizen
  9. le HUD et le radar ne sont pas des textures à proprement parler. Dans MTA les textures sont les images qui s'appliquent sur des objets 3D comme pour les véhicules, les personnages etc. Pour le HUD, il te suffit de bidouiller dans le code du gamemode race. Pour le radar, il doit y a pas mal de ressources que tu peux trouver ici: https://community.multitheftauto.com/index.php?p=resources Mais que tu connais déjà. Cordialement, Citizen EDIT (31/01 13h20): T'as pu tenter des trucs du coup ? La ressource marche t'elle encore pour la version actuelle de MTA (1.3.4) ? Merci de nous expliquer où tu en es pas rapport à ça Cordialement, Citizen
  10. Non désolé, peut être que quelqu'un d'autre en aura, mais comme je code tout de A à Z, j'en ai aucun à te proposer. Je réponds seulement pour pas que reste sans réponse et que tu n'es pas l'impression qu'on t'ignore. Mais il n'y a pas beaucoup de personnes dans la section française
  11. Bonsoir Phoenix, J'avoue ne pas trop comprendre ta question, le gamemode race prends déjà en charge les maps DD/DM, c'est les maps qui définissent si c'est une course classique ou si c'est un DD/DM. Pour les images/textures, libre à toi de les remplacer directement dans le dossier du gamemode ou de les remplacer via un script qui va passer par-dessus. J'attends tes éclaircissements. Cordialement, Citizen
  12. C'est un forum ici tout le monde à le droit de réagir. Si personne n'était censé réagir, il ne fallait pas faire votre annonce sur un forum. Certes votre annonce est peut être sincère et que peut-être vous êtes un honnête commerçant. Mais on ne vie pas dans le pays des bisounours ! Lorsqu'il s'agit de dépenser de l'argent, les clients juge d'abord sur l'aspect général du site ou de la personne avec qui il marchande. Un site moche n'aura aucune chance de concurrencer un site avec un jolie design et des couleurs bien choisit. En effet, les couleurs sont aussi importantes, le bleu est une des premières couleurs car elle inspire la confiance (Skype, Facebook, Twitter, Outlook, Dropbox, online.net etc). Toutes ces notions sont censé être connu des personnes qui souhaite se lancer dans le commerce en ligne. JAMAIS je n’achèterais/louerais quelque chose à quelqu'un que je ne connais pas, qui ne m'offre aucune garantie, qui ne parle pas bien la langue dans laquelle il discute avec les potentiels clients et dont le moyen de contact est un vulgaire Skype. Je ne vous salue pas. Citizen
  13. Je n'avais aucune raison de vous contacter par le simple fait que je ne suis pas du tout intéressé. J'essayais juste d'éclaircir cette offre très succinte pour ceux qui liraient votre annonce. De plus vous vous exprimer dans un français approximatif qui me laisse penser que le français n'est pas votre langue natale. Pour donner plus de crédibilité à votre offre, il aurait fallut que votre offre soit bien présenté et dans un français impeccable. Les fautes de français plus (+) Skype en tant que moyen de contact montre que vous êtes un amateur et qu'on ne peut donc pas vous faire confiance à cent pourcent. (Attention, je n'ai pas dit que vous alliez nous arnaquer/voler, seulement que votre annonce et vos "techniques" de marketing sont déplorables.) Pour finir, le serveur que je loue doit avoir a peu près les même performances et me coûte bien moins cher TTC. Cordialement, Citizen
  14. Déjà, "avoir son propre hébergeur" ne veut rien dire (son propre serveur, là oui). Deuxièmement, c'est quoi l'arnaque dans tout ça ? Offrir = Gratuit et ça m'étonnerait que ça soit le cas si ? Quels sont les contreparties dans ce cas ?
  15. Il faut utiliser les positions relatives (en pourcentage d'écran) et non pas en absolus (en pixels). Cette notion est abordée dans le deuxième "chapitre" du wiki: https://wiki.multitheftauto.com/wiki/FR/ ... _et_Absolu Il faudra donc privilégier les positions/tailles relatives dans 90% des cas. Si t'as déjà fait des gui en absolu que tu n'as pas envie de refaire, il est possible de transformer les positions/tailles en relatif très facilement. Je peux t'expliquer comment si tu le souhaites (tu me passeras un de tes gui ici pour avoir un exemple concret, et il me faudra également la résolution de ton jeu). Bon codage !
  16. Bonsoir, Page principale: https://wiki.multitheftauto.com/index.ph ... /Main_Page Introduction à la programmation: https://wiki.multitheftauto.com/wiki/FR/ ... grammation Pour les pages non traduites et/ou inéxistante (rouge), tu peux toujours allez sur les pages anglaises: https://wiki.multitheftauto.com/wiki/Main_Page
  17. Le lien est le lien de téléchargement des ressources nécessaires pour avoir les véhicules et les piétons. Il y a un fichier texte qui doit expliquer comment l'installer et comment le démarrer. Oui je suis sûr à 90% que tous les joueurs verront la même chose puisque le code doit être essentiellement côté serveur. Mais le mieux c'est quand même de tester nan ? Pour les instructions qui sont évidemment en anglais, un petit coups de ggle trad et c'est réglé.
  18. Bonsoir et bienvenue. Il n'est pas possible d'activer les bots du solo, mais quelqu'un à fait une ressource magnifique qui permet d'avoir le traffic (piétons et véhicules) du solo: Download: http://crystalmv.net84.net/files/traffic.zip Oui c'est facile de traduire, à condition que les mods que tu télécharges ne soient pas compilés.
  19. Effectivement, tu vas faire un truc de ce genre mais pour faire plus pro, je te conseil de faire une fonction à part que tu va nommer isTruck qui va se charger de retourner true si c'est un camion ou false sinon et qui prendra en paramètre le véhicule dont tu souhaites vérifier, je te l'écris le contenu de cette fonction mais en français (tu devras donc traduire en Lua) Une fois que t'as fais cette fonction, tu vas pouvoir utiliser cette fonction dans ta fonction buyBarrel comme ceci: addEvent ("buyBarrel", true) function buyBarrel() local vehicle = getPedOccupiedVehicle( source ) local x, y, z = getElementPosition( vehicle ) local barrel = createObject ( 1225, x, y, z ) local distance = 8 -- distance par défaut if isTruck( vehicle ) then -- si isTruck renvoit true distance = 15 -- on change la distance pour un nombre plus élevé. end setElementPositionOnLocalAxes( barrel, vehicle, 180, distance ) end addEventHandler("buyBarrel", root, buyBarrel) Hummmm ouai faudra que je regarde comment on peut virer le respawn. Oui j'avais remarqué, mais comme c'était insignifiant, j'ai pensé que ça n'avais pas d'importance, surtout que si la voiture est en pente (vers l'avant ou vers l'arrière) le centre de rotation du baril sera à la même hauteur que le centre de rotation de la voiture. A toi de voir, mais si tu veux vraiment pouvoir le mettre au sol, je te file cette nouvelle version de ma fonction setElementPositionOnLocalAxes qui cette fois-ci prends en plus un offsetZ (pour l'ajuster en hauteur, l'axe des Z): function setElementPositionOnLocalAxes( element, reference, angle, distance, offsetZ ) local x, y, z = getElementPosition( reference ) local _, _, rz = getElementRotation( reference ) local a, distance = math.rad(rz+angle), distance/100 x = x + distance*math.deg(math.sin(-a)) y = y + distance*math.deg(math.cos(-a)) setElementPosition( element, x, y, z+(offsetZ or 0) ) end Donc tu remplaces l'ancienne par celle-ci et dans ta fonction buyBarrel, tu l'utilise comme ceci (c'est un exemple): setElementPositionOnLocalAxes( barrel, vehicle, 180, 8, -1) (J'ai mis 8 en distance mais si t'as fait le truc avec la fonction isTruck, tu remet bien la variable distance.) Ici j'ajuste la hauteur finale en lui enlevant une unité sur l'axe des Z. Tu peux aussi utiliser des chiffres à virgule comme 0.5 (si -1 l'enfonce trop dans le sol). Et bien sur, si le baril avait été dès le départ un peu dans le sol, on lui aurai donné un nombre positif. Voilà bon codage ! Cordialement, Citizen
  20. Alors soit c'est une erreur de coordonnées donc une erreur dans mes calculs, soit le model que t'utilise n'est pas le bon et est peut être invisible. Tu vois le baril nul part ? t'as bien regardé ? Je vais tester de mon côté et voir ce qu'il se passe. (Mais réponds quand même a mes question ^^) EDIT: Alors si je commente cette ligne: setElementPositionOnLocalAxes( barrel, vehicle, 180, 5 ) Le baril apparaît bien au-dessus du véhicule c'est donc mon calcul de trigo qui est erroné, je vais corriger ça EDIT 2: C'était bien un problème dans ma fonction Premièrement, je n'utilisais pas l'argument angle qu'on lui donnait, donc le baril spawnait toujours devant le véhicule peut importe l'angle qu'on lui donnait. Et deuxièmement, la distance qu'on lui donnait n'était pas interprété en mètres, donc j'ai divisé par 100 et ça a l'air de correspondre aux mètres dans le jeu. Donc pour résumer, ma fonction déplaçait le baril toujours droit devant le véhicule et en plus à 500 mètres environ (donc super loin). addEvent ("buyBarrel", true) function buyBarrel() local vehicle = getPedOccupiedVehicle( source ) local x, y, z = getElementPosition( vehicle ) local barrel = createObject ( 1225, x, y, z ) setElementPositionOnLocalAxes( barrel, vehicle, 180, 8 ) end addEventHandler("buyBarrel", root, buyBarrel) function setElementPositionOnLocalAxes( element, reference, angle, distance ) local x, y, z = getElementPosition( reference ) local _, _, rz = getElementRotation( reference ) local a, distance = math.rad(rz+angle), distance/100 x = x + distance*math.deg(math.sin(-a)) y = y + distance*math.deg(math.cos(-a)) setElementPosition( element, x, y, z ) end PS: J'ai aussi un peu augmenté la distance, je l'ai mise à 8 unités car dans le jeu c'est plutôt court, dans mes tests, j'étais en moto et c'était trop près. Donc en voiture, j'aurais fait explosé le baril direct !
  21. Essaye ça et dit moi si le message "barrel spawned !" s'affiche dans la chatbox (le barril devrait peut être spawn au-dessus de ta voiture aussi) addEvent ("buyBarrel", true) function buyBarrel() local vehicle = getPedOccupiedVehicle( source ) local x, y, z = getElementPosition( vehicle ) local barrel = createObject ( 1225, x, y, z+2 ) outputChatBox( "barrel spawned !" ) setElementPositionOnLocalAxes( barrel, vehicle, 180, 5 ) end addEventHandler("buyBarrel", root, buyBarrel)
  22. Ah nan ! C'est une fonction que tu dois utiliser comme si c'était une fonction MTA comme le createObject par exemple Donc remet ma fonction comme je te l'ai donné, et ne modifie rien à l'intérieur ! Je te la redonne ici: function setElementPositionOnLocalAxes( element, reference, angle, distance ) local x, y, z = getElementPosition( reference ) local _, _, rz = getElementRotation( reference ) local a = math.rad(rz) x = x + distance*math.deg(math.sin(-a)) y = y + distance*math.deg(math.cos(-a)) setElementPosition( element, x, y, z ) end Tu colles cette fonction dans n'importe quel fichier Lua du côté serveur (car c'est de ce côté que tu vas en avoir besoin) Voici un exemple d'utilisation de ma fonction qui je pense dois convenir parfaitement pour ton code: addEvent ("buyBarrel", true) function buyBarrel() local barrel = createObject ( 1225, 0, 0, 0 ) local vehicle = getPedOccupiedVehicle( source ) setElementPositionOnLocalAxes( barrel, vehicle, 180, 5 ) end addEventHandler("buyBarrel", root, buyBarrel) Voilà, c'est pas compliqué et c'est une fonction que tu pourras réutiliser si jamais tu as besoin Cordialement, Citizen
  23. Il sort d'où ce message ?! Trouve lequel il s'agit dans ton code en essayant de modifier le texte et colle moi la fonction dans laquelle il est. Car effectivement, dans mon code que je t'ai passé, il n'y a aucune gestion de l'argent etc. Donc si tu veux lui retirer l'argent à l'achat et l'empêcher d'acheter quand il n'as plus assez d'argent, c'est dans la fonction startInvisible() qu'il faut le faire et pas ailleurs ! Il doit y avoir qu'un seul addEventHandler( "buyInvisible", ... dans tout ton code serveur. Pour ta deuxième question, il faut utiliser de la trigonométrie afin de passer du repère terrestre (de la map de gta) au repère du véhicule. (Je te laisse vérifier sur google ce qu'est un repère en 3D) Mais en gros tu dois positionner le baril à -5Y (environ) sur le repère local du véhicule et non pas sur le repère de la map qui lui ne bouge jamais. Je t'ai fait une petite fonction avec du code que j'ai retrouvé dans mes affaires: function setElementPositionOnLocalAxes( element, reference, angle, distance ) local x, y, z = getElementPosition( reference ) local _, _, rz = getElementRotation( reference ) local a = math.rad(rz) x = x + distance*math.deg(math.sin(-a)) y = y + distance*math.deg(math.cos(-a)) setElementPosition( element, x, y, z ) end Son utilisation est simple: Arguments: element - l’élément que tu veux placer à un certains endroit (ici ton baril) reference - l’élément qui va servir de référence (ici ton véhicule) angle - la rotation en degré qui va définir vers ou déplacer l’élément en argument 1 (0=vers l'avant, 90=vers la droite, 180=vers l'arrière et 270=vers la gauche). Donc pour toi 180 distance - bah tout simplement la distance qui doit séparer le milieu de la reference (ici, du véhicule) et l'element que tu places.Si tu mets 0, le baril va se placer en plein milieu du véhicule ce qui n'est pas une bonne idée Donc essaye 5 et puis si c'est trop court, augmente un peu. En tout cas prends bien en compte les longs véhicules, histoire qu'ils ne se retrouvent pas avec un baril en plein dans le coffre . En attendant ta réponse. Cordialement, Citizen
×
×
  • Create New...