Jump to content

Citizen

Moderators
  • Posts

    1,803
  • Joined

  • Last visited

  • Days Won

    8

Everything posted by Citizen

  1. Bonsoir Paurek, Des erreurs de traductions ? Parles-tu de TES tentatives de traductions en lisant le wiki anglais ou nos traductions des tutos dans la section FR ? La section FR: https://wiki.multitheftauto.com/index.p ... /Main_Page Regarde la section de droite "Programmer" et de préférence dans l'ordre. Ces tutos t'apprendront les fondamentaux dont la nuance compliqué des scripts client et serveur. Bonne lecture et soit patient, ne saute pas certains fondamentaux qui pourrait te faire perdre énormément de temps ensuite pour comprendre d'où vient un problème qui aurait pu être évité de base. Bon code !
  2. Et les objets apparaissent ils quand tu te rapproches des objets ? Quand tu t'éloignes ? Pourrait tu nous donner 3 ou 4 ids des objets concernés qu'on puisse vérifier ?
  3. Still, you have to delete it as anyone can use it ... You released the script to the public, you had to remove all the test commands and debug outputs before doing so.
  4. Merci de laisser la section française à ceux qui savent réellement parler en français ... Aussi, vous devez supprimer les commandes /testdevokill and /testdevokills du fichier killmessages_client.lua
  5. Remove /testdevokill and /testdevokills commands from killmessages_client.lua
  6. Oui ce code devrait marcher mais à condition que les utilisateurs peuvent s'enregistrer (/register) sur ton serveur et se connecter à leur compte (/login). En fait non, ça ne fonctionnera pas, j'ai lu un peu vite ton code. Dans la partie enregistrement de la team, tu enregistres le nom de la team en faisant un getTeamName sur la team du joueur puis un setAccountData. Puis dans la partie "restauration" de la team, tu récupères la donnée enregistrée, c'est à dire le nom de la team, puis tu essayes de faire un setPlayerTeam en utilisant le nom de cette team. Hors ce n'est pas possible. Il faut d'abord récupérer la team via son nom en utilisant getTeamFromName, puis appeler setPlayerTeam avec la team trouvée. function playerLogin (thePreviousAccount, theCurrentAccount, autoLogin) if not (isGuestAccount (theCurrentAccount)) then local teamName = getAccountData (theCurrentAccount, "team") -- Le nom de la team if (teamName) then local team = getTeamFromName(teamName) -- La team via son nom if (team) then setPlayerTeam(source, team) -- Replacement dans la team end end end end addEventHandler ("onPlayerLogin", getRootElement(), playerLogin) En ce qui concerne les 2 fonctions onQuit et onLogout, comme c'est le même code à l’intérieur et que tu n'utilises pas les paramètres de ces fonctions dans le code, tu peux le faire en une seule fonction avec les deux addEventHandler qui appellent cette seule fonction: function savePlayerTeam() if not (isGuestAccount (getPlayerAccount (source))) then local account = getPlayerAccount (source) if (account) then local team = getPlayerTeam(source) local teamname = getTeamName(team) setAccountData (account, "team", teamname) end end end addEventHandler ("onPlayerQuit", getRootElement(), savePlayerTeam) addEventHandler("onPlayerLogout", getRootElement(), savePlayerTeam) Concernant la partie sur le drift, peux-tu me passer le lien vers le téléchargement de cette ressource drift ? Je pensais que l'event onVehicleDriftEnd était appelé à chaque fois que tu terminais un drift, mais ça n'a pas l'air d'être le cas. Il faut que je regarde plus en détail cette ressource pour comprendre son fonctionnement.
  7. Oui ce code devrait marcher mais à condition que les utilisateurs peuvent s'enregistrer (/register) sur ton serveur et se connecter à leur compte (/login). Ça ne fonctionnera pas la team pour un joueur n'étant pas connecté à un compte. Heuu oui sauf qu'il ne faut pas faire de retours à la ligne en plein milieu de la définition d'un tag (). Le serveur te sortira une erreur sinon et ne te chargera pas la ressource (impossible de la lancer). Pour ton scoredrift, je me demande vraiment pourquoi tu tiens à utiliser un fichier xml, c'est système de stockage plus lent, moins fiable et demande plus de ressources CPU que SQLite. Si c'est pour pouvoir consulter les records et/ou les modifier, il suffit d'utiliser SQLite Browser et tu ouvres le fichier internal.db. Sinon pour que ça annonce un nouveau record n'importe quand sur ton freeroam, je pense qu'il suffit d'ajouter cette ligne dans ton drift.lua à la fin de ce que tu m'as montré (après les 2 autres addEventHandler) addEventHandler("onVehicleDriftEnd", root, checkPuntaje) Citizen
  8. Problème #1 Bah en fait c'est le comportement normal Si tu veux faire ça, il faut le coder: 1 - Lorsque le joueur se déconnecte, tu essayes de récupérer sa team 2 - S'il en a une, tu la stock quelque part avec son nom pour être capable de récupérer la bonne team s'il se reconnecte 3 - Lorsqu'un joueur se connecte, tu récupères son nom et tu vérifies si t'as stocké une team pour ce nom là 4 - Si c'est le cas assigner la team, (sinon afficher le menu de sélection de team ?) Problème #2 Je n'ai pas trouvé de problème avec ce script mais en tout cas ça ne stock rien en xml, ça se sauvegarde dans la base de données sqlite registry.db qui se trouve dans ton dossier deathmatch. S'il y a un nouveau record de drift sur une map, il sera annoncé à la fin de la map (je sais pas si t'as bien attendu avant de dire que ça marchait pas). Sinon il me faut les erreurs serveurs ET clients car il doit sûrement y en avoir. Pour avoir les 2 types d'erreurs il te faut te login en tant qu'administrateur et taper dans ta console (F8) debugscript 3
  9. Mouai bah je sais pas quoi te dire, tes erreurs ne suivent aucune logique visible et je ne suis pas compétent pour t'aider sur ce problème. Installe la version la plus récente qui fonctionne chez toi et restes-y
  10. Ok alors je pense avoir identifié le problème au niveau d'une modification qui a été apporté le 26/02/2016 donc je vais te demander un petit effort pour tester (dans l'ordre) ces 2 versions de 1.5.2: Après la modification: mtasa-1.5.2-full_rc-7877-20160226.exe => Tu devrais avoir l'erreur à nouveau. Avant la modification: mtasa-1.5.2-full_rc-7870-20160223.exe => Le jeu devrait fonctionner normalement. Pour infos, c'est les liens que tu peux trouver sur le site nightly de mta (donc officiel) dans la catégorie 1.5 - Current release version > Windows full installer et en cliquant sur Show older files. La modification qui a été apportée ne devrait pourtant pas produire cette erreur mais c'est la raison possible que j'ai trouvé. J'attends ton retour. Si tu confirmes mon hypothèse, je contacterai la team pour qu'ils regardent. Effectivement, la version que tu télécharges sur le site de MTA correspond au dernier build de la 1.5 (donc le plus récent dans 1.5 - Current release version > Windows full installer du site nightly) et donc tous les installeurs de la 1.5 téléchargés depuis la page d'accueil du site MTA après le 26 Février 2016 contiennent déjà le patch.
  11. C'est un problème avec la validation du certificat du .exe le fichier doit être signé et je sais pas si wine permet de garder l'intégrité du certificat (je pense que oui si tu l'as déjà fait tourner sur Mac). Essaye d'abord d'installer le certificat sur ton Mac. Sinon désinstalle et essaye d'installer la version 1.5.1 pour voir. Sinon aurais-tu un windows sur lequel tester (en utilisant les même fichiers que sur ton Mac) ?
  12. Citizen

    security

    They don't see it as Gravestone said (Try with a friend and you will check by yourself).
  13. Citizen

    set timer

    onClientResourceStop ?
  14. Your english doesn't let me understand what you are trying to do with the ped. Maybe you should ask your question into your regional sub-forum: Poland / Polski Calling destroyElement on the ped will make it disapear for ever. You should probably do this ?: setElementPosition(ped, 0, 0, 0)
  15. I don't understand, can you explain it better ?
  16. You didn't save or restarted your resource. The warning should have gone.BUT ! The problem here is that the t1 variable is not available inside of the scope of the anonymous function the timer is calling (it's another fuction and is then called outside of TurfAktif function. Same goes for player and PlayerClan variables but those variables can be sent with the setTimer (but t1 can't as a setTimer can't send itself to the function it is calling. Here is the fix for t1 (I let you do the same for t2): (Please read my comments in the correct order to understand the modifications I made. Numbers are going from 1. to 9.) function TurfAktif(player) local PlayerClan = getElementData(player,"Clan") if not getElementData(resourceRoot,"ClanTurf1") then setElementData(resourceRoot,"ClanKisi",getElementData(resourceRoot,"ClanKisi")+1) setElementData(resourceRoot,"ClanTurf1",tostring(PlayerClan)) setRadarAreaFlashing ( Turf1Rectangle, true ) local t1 = setTimer(function(player, PlayerClan) -- 3.I'm receving player and PlayerClan the setTimer sent -- 4.Here player and PlayerClan has values thanks to the setTimer extra arguments local t1 = getElementData(player, "t1_timer") -- 5.getting the timer from the player's element data -- 6.Here t1 is has a value and is the timer you created if getElementData(player,"Turf1")==true then TurfPercent = TurfPercent+10 _outputChatBox("Turf Yüzdesi: %"..TurfPercent.."", player, 0, 255, 0, true ) if TurfPercent >= 100 then _outputChatBox("Turf Yüzdesi: %100 | Turfu Kazandınız", player, 0, 255, 0, true ) setRadarAreaFlashing ( Turf1Rectangle, false ) setElementData(resourceRoot,"ClanTurf1",tostring(PlayerClan)) setElementData(resourceRoot,"Clan2Turf1","Bos") setElementData(resourceRoot,"WinnerClan",tostring(PlayerClan)) if isTimer(t1) then -- 7.Making sure it's a valid and a still running timer killTimer(t1) end return -- 8.this return is useless end end end, 5000, 0, player, PlayerClan) -- 1.I'm sending player and PlayerClan variables to the function -- 2.Here t1 is defined and now I can ... setElementData(player, "t1_timer", t1) -- ... save it into the player element using an element data elseif getElementData(resourceRoot,"Clan2Turf1")=="Bos" then -- 9.Do the same for t2
  17. This code has the exact same behavior, you changed nothing ...____________________________________________________________________________________ @Matevsz: The 1st argument your bound function receive is not the keyState but the name of the key you pressed (here your "keyState" value will be "backspace"). Naming the 1st argument keyState won't make it get the keyState value, only the position matters. Fixed code (I only modified line 7): addEventHandler("onClientResourceStart", resourceRoot, function() gridlist = guiCreateGridList(1350, 383, 236, 293, false) guiSetVisible(gridlist, false) end) function CloseGUI(key, keyState) if keyState == "down" then showCursor(false) guiSetVisible(gridlist, false) setCameraTarget(getLocalPlayer(), getLocalPlayer()) end end bindKey("backspace", "down", CloseGUI) PS: Also please indent your code correctly so it's easier for us to read your code (and especially for you if you need to read that code later). Regards, Citizen
  18. Citizen

    Skin

    First, as ViRuZGamiing pointed out, you added an extra " at line 12 which is breaking your entire script. You can see that the syntax highlighting after is not okay. So do yourself a favor and use a proper IDE/script editor for Lua. I'm using Notepad++ with the MTA plugin . To do what you want, you need to save the player's current skin when he is starting the job (so in the else part) and then use the value of that skin you saved when he stops working (so in the if part). To do that you could just use a global variable as it is a client sided script, but I'm gonna introduce you with the element datas. To stay simple, element datas are like sticky notes with a name and a value you can paste/attach onto elements like vehicles, players etc. You can add an element data to a player with: setElementData(player, "theDataName", "theDataValue") and then, when you need it, you can get the value back by doing: local value = getElementData(player, "theDataName") -- value = "theDataValue" So here is your code using element datas to remember the skin before he started the job: clothes = createPickup(-1886.7001953125, 2142.7001953125, 1.7999999523163, 3, 1275, 2000) function Job(hitElement) local skin = getElementModel(localPlayer) if skin == 97 then local oldSkin = getElementData(localPlayer, "oldSkin") setElementModel(localPlayer, oldSkin) outputChatBox("Finished job.", localPlayer) else setElementData(localPlayer, "oldSkin", skin, false) setElementModel(localPlayer, 97) outputChatBox("Started job.", localPlayer) end end addEventHandler("onClientPickupHit", clothes, Job) If you are looking closely, you should notice at line 10 I added a 4th argument (false). Here false means that I don't want that element data to be synchronized with the other script side (here your code is running on the client-side so I don't want it to be available using a getElementData on the server-side). Using false here is optional and is just saving some bandwidth because I don't need to know that value on the server-side. Hope it helps you. Regards, Citizen
  19. Actually you should use the event onMarkerHit directly on the marker instead of getting the colshape of it and then use onColShapeHit on that colshape: theMarker = createMarker( 2492.1240234375, -1670.7578125, 12.3, "cylinder", 1.5, 0, 255, 0, 80 ) function onmarkerhit( hitElement ) if getElementType( hitElement ) == "player" then triggerClientEvent(hitElement, "showGUI", hitElement) end end addEventHandler ("onMarkerHit", theMarker, onmarkerhit) onColShapeHit was meant to be used with colshapes you created with these colshapes functions: createColCircle createColCuboid createColRectangle createColSphere createColTube createColPolygon But yeah adding an onColShapeHit on a maker's colshape should works too, this bug needs to be investigated.
  20. Well according to this diagram, both events are rendered "too late" to move an object. On both events the vehicle's position will be visually updated at the next frame and both events are triggered at the same frequency so onClientRender is totally fine.
  21. Chaque zone est définit comme suit: {x = 1611, y = -1721, z = 15, width = 20, depth = 15, height = 30}, x: La position x de l'angle sud-ouest de la zone y: La position y de l'angle sud-ouest de la zone z: La position z du sol de la zone width: La largeur de la zone depth: La profondeur de la zone height: La hauteur de la zone Pour remplir ces champs, il faut que tu prennes 2 positions (x, y, z) sur ta map qui vont correspondre aux 2 angles opposés de ta zone: Les calculs à faire: x = x1 y = y1 z = z1 width = x2-x1 depth = y2-y1 height = z2-y2 Remarque: Comme tu prendras les positions au sol, z2 sera égal ou très proche de z1 il faudra que tu donnes une hauteur toi même. 20 me paraît une bonne valeur pour commencer. Cordialement, Citizen
  22. Ok alors j'ai réussi à ajouter ta map dans le gamemode "tactics". Il faut 3 choses: - Le nom du dossier/zip d'une map doit respecter ce format: dm- (exemple: dm-map1) - Spécifier les gamemodes auxquelles elle est destinée dans la meta: meta.xml: <meta> <info gamemodes="deathmatch,tdm" type="map" version="1.0.0"></info> <map src="Deathmatch_mapv1.map" dimension="0"></map> ... </meta> - Et enfin que la map possède des spawnpoints: Deathmatch_mapv1.map: <map edf:definitions="editor_main"> <object id="object (vegasNbball1) (1)" breakable="true" interior="0" alpha="255" model="6959" doublesided="false" scale="1" dimension="0" posX="2512" posY="-2391.3999" posZ="2283.6001" rotX="0" rotY="0" rotZ="0"></object> <object id="object (vegasNbball1) (2)" breakable="true" interior="0" alpha="255" model="6959" doublesided="false" scale="1" dimension="0" posX="2512" posY="-2431.3999" posZ="2283.6001" rotX="0" rotY="0" rotZ="0"></object> ... <spawnpoint id="spawnpoint (1)" skin="30" dimension="0" interior="0" posX="2511" posY="-2384.7" posZ="2280" rotX="0" rotY="0" rotZ="220" /> <spawnpoint id="spawnpoint (2)" skin="31" dimension="0" interior="0" posX="2889" posY="-1444.8" posZ="2280" rotX="0" rotY="0" rotZ="220" /> </map> Cordialement, Citizen
  23. Bonsoir, Je n'arrive pas à trouver un lien de téléchargement qui fonctionne pour ce gamemode. Pouvez-vous nous créer une archive du gamemode avec au moins une map qui fonctionne, votre map, et nous uploader cette archive quelque part ? (mediafire par exemple) Cordialement, Citizen
  24. Pour faire court, la réponse est non ! Il n'est pas encore possible de rajouter des ids et donc des armes. Cette demande récurente fait déjà l'objet d'une tâche mais qui est tellement énorme à réaliser en terme de travail/code pour la team MTA que personne ne s'y est encore attaqué. La demande: https://bugs.mtasa.com/view.php?id=7728 (créée en 2011) Sous-tâche qui devra être réalisée avant même de pouvoir penser à réaliser la précédente: https://bugs.mtasa.com/view.php?id=6571 (crée en 2013) La fonction createWeapon permet de spawn une arme comme si tu spawnais un objet avec createObject mais que tu peux contrôler via le script (comme faire tirer l'arme via setWeaponState(weapon, "firing")). L'arme n'est donc pas portée par un joueur ou un NPC et tu peux l'attacher sur un capot de voiture par exemple. L'arme est donc comme un objet et tu ne peux pas non plus la ramasser car ce n'est pas un pickup. Par contre, il me semble que c'est possible "de faire comme ci". En effet une solution possible serait de remplacer un objet dont l'id n'est pas utilisé par GTA. Liste des ids non utilisé par GTA: http://gtaforums.com/topic/488464-free- ... 1060756540 Mais dans la version 1.6 de MTA, ils ont pris certains de ces ids pour rajouter des skins (236 nouveaux skins au total) et donc il ne faut que t'utilises un id qui n'est pas dans cette liste: https://wiki.multitheftauto.com/wiki/Character_Skins Une fois un id trouvé, tu le remplaces entièrement via les fonctions suivantes: -- Texture engineImportTXD engineLoadTXD -- Model engineLoadDFF engineReplaceModel -- Collision (n'en load pas pour des armes, c'est pas utile et ça peut faire glitcher/buguer) engineSetModelLODDistance -- Si jamais la distance d'affichage est trop courte Ensuite pour utiliser cette nouvelle "arme", tu donnes une arme qui existe déjà au joueur et qui correspond à la nouvelle arme (genre si ta nouvelle arme est un m4a4 qui se prend donc à 2 mains, tu donneras un ak et pas un uzi), tu remplaces sa texture par une texture invisible (y a moyen de le faire via les shaders, ou tout simplement les engineImportTXD et engineLoadTXD) et ensuite tu crées l'arme via le createObject et l'id choisit et tu l'attaches à la main droite du joueur (utilise la ressource bone_attach). Il y aura le problème du son et tu pourras aussi changer les dégats de l'arme en codant un peu dans onClientPlayerDamage. Avec tout ça on devrait avoir quelque chose de potable mais ça demande un peu de boulot. Cordialement, Citizen
  25. Bonsoir RegMan, Désolé de la réponse tardive mais le forum ne me notifie apparemment plus lors de la création d'un nouveau sujet. J'ai effectivement rarement vu un gamemode/une ressource aussi compliqué à mettre en place en plus d'être mal expliquée quant à sa mise en place mais j'ai finit par y arriver. Installation 1- Mise en place des dossiers/fichiers - Commence par supprimer tout le contenu de ton dossier resources - Télécharge le gamemode depuis Github - Extrait les 4 dossiers ([maps], [misc], [resources] et [traffic]) dans ton dossier resources 2- Modification du mtaserver.conf - Ouvre ton mtaserver.conf (dans notepad++ et en mettant le langage XML afin de ne pas se ruiner les yeux) - Descends tout en bas et supprime (ou commente avec Ctrl+Maj+Q) tous les - Et colle ceci à la place: 3- Modification du acl.xml - Ajoute ces lignes juste après la fermeture du groupe Everyone (après le ):- Ajouter la resource GTWcore à dans le groupe Admin: 4- Accorder les derniers droits spécifiques - Démarre le serveur et attends que ça se stabilise - Tape les commandes suivantes (tu ne peux pas copier coller sur la console windows): aclrequest list GTWaccounts aclrequest allow GTWaccounts all aclrequest list GTWgui aclrequest allow GTWgui all aclrequest list GTWupdates aclrequest allow GTWupdates all 5- Autres informations - Les erreurs de connexions à la base de données sont normales; il tente d'abord d'utiliser MySQL ce qui produit une erreur si t'as rien configuré puis s'il n'a pas réussi, il utilise SQLite. - Pour utiliser une base de données MySQL il suffit de renseigner les informations dans .../resources/[resources]/GTWcore/data/settings.xml (mais dans ce cas là, il ne sera plus normal d'avoir une erreur de connexion à la base de donnée. Chez moi le serveur à l'air de bien fonctionner. N'hésite pas si tu as d'autres problèmes. Cordialement, Citizen
×
×
  • Create New...