Jump to content

One more problem


Recommended Posts

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 by Guest
Link to comment
  • Moderators

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...