KariiiM Posted August 10, 2015 Share Posted August 10, 2015 (edited) salut les gars, jai essayé de faire la distance de prix entre les positions et des marqueurs, mais jai échoué, pour devenir plus cleir, Entre le marqueur et marqueur, il ya une distance, donc je veux utiliser cette distance que numéros et je le remplace le comme une prix. --Part of my code: local markerlocations = { [1]={x=2220.43, y=2469.49, z=10.82}, [2]={x=1625.00, y=1850.43, z=10.82}, [3]={x= 1718.26, y=1484.68, z=10.82} } local theTable = { [1]={"LV", 2220.43, 2469.49, 11.82}, [2]={"LS", 1625.00, 1850.43, 11.82}, [3]={"SF", -2682.52, 574.32, 15.67} } addEventHandler("onResourceStart",resourceRoot, function () local px, py, pz = getElementPosition(source) local miniumDistance = 2000 for index, pos in pairs(markerlocations) do local marker = createMarker(pos.x, pos.y, pos.z-1, "cylinder", 1.3, 247,187, 7, 120) local x, y = pos[1], pos[2] local distance = getDistanceBetweenPoints2D(px, py, x, y) if (distance < miniumDistance) then miniumDistance = distance end end end) Cordialement, KariM Edited August 17, 2015 by Guest Link to comment
Moderators Citizen Posted August 10, 2015 Moderators Share Posted August 10, 2015 Bonsoir, Je t'avais dit de poster dans cette section par MP car je pensais que tu parlais le français et que tu aurais pu mieux expliquer ton problème dans cette section et ainsi avoir une meilleur aide et compréhension. Mais visiblement, tu ne parles pas français et tu as simplement utilisé google translate pour traduire ton post. Néanmoins, je pense avoir compris ce que tu veux faire: local markerlocations = { [1]={x=2220.43, y=2469.49, z=10.82}, [2]={x=1625.00, y=1850.43, z=10.82}, [3]={x= 1718.26, y=1484.68, z=10.82} } local theTable = { [1]={"LV", 2220.43, 2469.49, 11.82}, [2]={"LS", 1625.00, 1850.43, 11.82}, [3]={"SF", -2682.52, 574.32, 15.67} } function spawnMarkers(thePlayer, cmd) for index, pos in ipairs(markerlocations) do local marker = createMarker(pos.x, pos.y, pos.z - 1, "cylinder", 1.3, 247, 187, 7, 120) setElementVisibleTo(marker, root, false) -- on cache le marker pour tout le monde setElementVisibleTo(marker, thePlayer, true) -- mais on le remontre que pour le joueur qui a tapé la commande -- On pourrait aussi créer un blip pour qu'il s'affiche sur le radar ? addEventHandler("onMarkerHit", marker, calculateEarning) -- on appelle calculateEarning lorsque le marker sera hit par quelque chose ou quelqu'un setElementData(marker, "forPlayer", thePlayer) -- on stock le joueur dans le marker avec la clé "forPlayer" local px, py, pz = getElementPosition(thePlayer) setElementData(thePlayer, "startedFromPos", {px, py, pz}) -- on stock la position actuelle du joueur end outputChatBox("Go to the markers and earned money") end addCommandHandler("smarkers", spawnMarkers, false, false) function calculateEarning(hitElement, matchingDimension) local forPlayer = getElementData(source, "forPlayer") -- on récupère le joueur qu'on a stocké dans ce marker if hitElement == forPlayer then -- on vérifie que le joueur qui est entré dans le marker soit bien celui qui a créé ce marker local sPos = getElementData(hitElement, "startedFromPos") -- on récupère la position de départ du joueur local mx, my, mz = getElementPosition(source) -- on récupère la position du marker (la source du onMarkerHit c'est le marker qui s'est fait hit) local distance = getDistanceBetweenPoints2D(sPos[1], sPos[2], mx, my) local earnings = distance*0.5 -- 0.5$ par metres parcourus if earnings >= 1 then -- on s'assure qu'il va gagner au moins 1$ distance = math.round(distance) earnings = math.round(earnings) givePlayerMoney(hitElement, earnings) outputChatBox("You traveled "..distance.." meters and earned "..earnings.."$.") destroyElement(source) -- on détruit le marker -- peut être mettre a jour la position de départ ? décommente si oui: -- local px, py, pz = getElementPosition(hitElement) -- setElementData(hitElement, "startedFromPos", {px, py, pz}) end end end -- source: [url=https://wiki.multitheftauto.com/wiki/Math.round]https://wiki.multitheftauto.com/wiki/Math.round[/url] function math.round(number, decimals, method) decimals = decimals or 0 local factor = 10 ^ decimals if (method == "ceil" or method == "floor") then return math[method](number * factor) / factor else return tonumber(("%."..decimals.."f"):format(number)) end end J'ai testé le code et il fonctionne comme suit: - Le joueur tape /smarkers et les markers apparaissent que pour le joueur sur la map. - Sa position actuelle est aussi récupéré et mise de côté afin de l'utiliser plus tard. - Lorsque le joueur rentre dans un marker, on récupère la position mise de côté au début et on calcul la distance avec la position de ce marker. - On multiplie la distance par 0.5$ qu'on arrondit ensuite et cela nous donne la récompense en dollar du trajet. - On détruit juste le marker dans lequel il est rentré et il peut aller chercher les autres markers. Cordialement, Citizen Link to comment
KariiiM Posted August 10, 2015 Author Share Posted August 10, 2015 Merci pour ton aidé, je suis marocan,ma deuxième langue ces't francais apres anglais, mais malheureusement il est long temps je n'ai pas etude la langue mais je comprend tres bien. De toute façon,merci beaucoup pour ton aide et votre temps.. Link to comment
KariiiM Posted August 10, 2015 Author Share Posted August 10, 2015 EDIT: Après ça, J'ai essayé de faire une bus system avec une distance prix comme ton example mais je reçois d'une erreur dans le debug, aussi la gui et invisible quant je hit le marker car cette error Error: attempt to compare boolean with nil -Line 20 J'espère que tu comprends mon problem, --server side: local markerlocations = { [1]={name="(1)", x=2220.43, y=2469.49, z=10.82, bx=2221.24, by=2468.76, blip=8, dim=0, int=0}, [2]={name="(2)", x=1625.00, y=1850.43, z=10.82, bx=1625.00, by=1850.43, blip=8, dim=0, int=0}, [3]={name="(3)", x= 1718.26, y=1484.68, z=10.82, bx= 1718.26, by=1484.68, blip=8, dim=0, int=0} } local theTable = { --locations, areas, prices,x,y,z [1]={"LVPD", "The Emerald Isle", tonumber(earnings), 2220.43, 2469.49, 11.82}, --ici ,je veux laisser le price 'earnings' visible dans la gridlist, mais je ne suis pas sure,si cette facon et correct comme je crois [2]={"LV General Hospital", "Las Venturas Airport", tonumber(earnings), 1625.00, 1850.43, 11.82}, [3]={"LV Airport", "Las Venturas Airport", tonumber(earnings), 1718.26, 1484.68, 10.82} } addEventHandler("onResourceStart",resourceRoot, function (thePlayer,pos) for index, pos in pairs(markerlocations) do local marker = createMarker(pos.x, pos.y, pos.z-1, "cylinder", 1.3, 247,187, 7, 120) local blp = createBlip(pos.bx, pos.by, 100, pos.blip, 2, 255, 255, 255, 255, 0, 400) local x, y = theTable[pos][4], theTable[pos][5] local distance = getDistanceBetweenPoints2D(px, py, x, y) if (distance < miniumDistance) then miniumDistance = distance setElementInterior(busmarker, pos.int) setElementDimension(busmarker, pos.dim) addEventHandler("onMarkerHit",busmarker,onBusMarkerHit) setElementData(busmarker,"busName",pos.name) setElementData(marker, "forPlayer", thePlayer) local px, py, pz = getElementPosition(thePlayer) setElementData(thePlayer, "startedFromPos", {px, py, pz}) end end end) function onBusMarkerHit(hitPlayer, dim) if not dim then return end local forPlayer = getElementData(source, "forPlayer") if hitElement == forPlayer then local x, y, z = getElementPosition ( source ) local loc = getZoneName ( x, y, z ) local busName = getElementData(source,"busName") local sPos = getElementData(hitElement, "startedFromPos") local mx, my, mz = getElementPosition(source) local distance = getDistanceBetweenPoints2D(sPos[1], sPos[2], mx, my) local earnings = distance*0.5 if earnings >= 1 then distance = math.round(distance) earnings = math.round(earnings) triggerClientEvent(hitPlayer,"bus:show",hitPlayer,busName,theTable) end end end addEvent ("bus:warpplayer",true) addEventHandler ("bus:warpplayer",root, function (cityname,earnings,id) local x, y, z = theTable[id][4], theTable[id][5], theTable[id][6] if ( getPlayerMoney ( source ) < tonumber(earnings) ) then outputChatBox("You need ".. tonumber(earnings).."$ to use this service.", source, 255,0,0) else takePlayerMoney (source, tonumber(earnings)) fadeCamera(source, false) setTimer(fadeCamera, 5000, 1, source, true) setTimer(setElementPosition, 5000, 1,source, x,y,z) end end) function math.round(number, decimals, method) decimals = decimals or 0 local factor = 10 ^ decimals if (method == "ceil" or method == "floor") then return math[method](number * factor) / factor else return tonumber(("%."..decimals.."f"):format(number)) end end Link to comment
Moderators Citizen Posted August 11, 2015 Moderators Share Posted August 11, 2015 J'ai beaucoup de mal à comprendre ce que tu veux faire, explique moi clairement ce que ton script est censé faire. Est-ce que tu fais un script de chauffeur de bus conduit par un joueur ? ou est-ce que c'est un système de bus automatique et le joueur rentre dans le bus et choisit ça destination ? A quoi servent exactement les 2 tables markerlocations et theTable ? Explique bien étape par étape le fonctionnement de ce que tu veux faire. Merci d'avance. Cordialement, Citizen Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now