Tātad, iesākumā daram tā, kā rakstīts šajā miniblogā. https://coding.lv/say/29176/2946050-tiem-kas-gribeja-paspeleties-ar

Kad tas viss ir sagatavots, un pārbaudīts, ka strādā (nesakiet man, ka nestrādā. Divreiz pārbaudiju. Strādā.), atveram mtaserver.conf failu un pievienojam sekojošu rindu:

<resource src="sistēmas_nosaukums_šeit" startup="1" protected="0" />

Tālāk, zem resources/ izveidojam mapi ar sistēmas nosaukumu. Tajā mapē izveidojam 3 failus. meta.xml, points.lua un trucking.lua

meta.xml failam būtu jāizskatās aptuveni šādi:

<meta>
    <info author="Svens Jansons" type="script" description="Preču piegādātāja sistēma." />
    
    <script src="points.lua" />
    <script src="trucking.lua" />
 
</meta>

Principā, meta.xml fails satur informāciju par to, kādi faili šai sistēmai jāielādē, secīgi, protams.

Tālāk, points.lua fails. Manā gadijumā tur stāv tikai trīsdimensiju masīvs ar koordinātām, kur atradīsies markeri, kuros jāiebrauc, proti

markers = { {-1971.482421875, -2446.470703125, 30},
{ -2110.046875, -379.9853515625, 35},
{-2023.9189453125, 157.1767578125, 28},
{-1556.2568359375, 1173.40625, 7},
{-862.427734375, 1555.513671875, 23},
{-1488.66015625, 1860.7216796875, 32},
{-1477.3125, 2653.640625, 55},
{-226.9052734375, 1041.7978515625, 19},
{313.2333984375, -237.4931640625, 1},
{-74.0673828125, -1123.7666015625, 1},
{-1566.61328125, -2747.1533203125, 48},
}

Koodrinātas tiek padotas x, y. z formātā. Nekas cits tur nav vajadzīgs.

Tālāk, ķeramies klāt pie paša skripta.

trucking.lua fails. Šeit jau vajadzēs daudz vairāk skaidrojumu. Visas šeit izmantotās funkcijas (izņemot tās, kuras šeit tiek definētas, un mySQL), ir iebūvētas MTA serverī.

--[[

(c) Svens Jansons, 2013
Skripts izstrādāts RP.EXS.LV MTA serverim, Kreiss frakcijai.

]]--

mysql = exports.mysql -- Importējam mySQL, datubāzes savienojumam.

local startBlip = createBlip(-1549.9873046875, -2762.40625, 48, 51, 2, 0, 0, 0, 0, 0, 999999) -- Izveidojam ikonu kartē, kura parādīsies visiem.


--[[
Pirmā funkcija. Inicializējam darbu. Pārbaudam, vai spēlētājs ir frakcijas Nr. 79 biedrs, un ja ir, tad piešķiram visas vajadzīgās vērtības, kuras tiek pārbaudītas nākamajā funkcijā, pie reizes nodzēšot paša darba izveidotos Blipus (punkti kartē) un Markerus (tie lielie riņķi, kuros var iebraukt), ja tādi ir, lai pēc komandas ierakstīšanas viss vienkārši neturpinātos, tādejādi paverot iespēju buggot naudu. Izdrukājam arī spēlētājam tekstu, ka nākamā funkcija tiks izsaukta iekāpjot jebkurā transportlīdzklī.
]]--
function trucking_init(thePlayer, commandname)
    if getElementData(thePlayer, "faction") == 79 then
        setElementData(thePlayer, "trucking", 0)
        setElementData(thePlayer, "truckingprofit", 0)
        setElementData(thePlayer, "truckingMarkerVisible", 0)
        outputChatBox("Iekāp automašīnā, lai redzētu sākumpunktu.", thePlayer)
        destroyElement(startMarker)
        destroyElement(jobMarker)
        destroyElement(jobBlip)
    end
end
addCommandHandler("kreiss", trucking_init, false, false) -- izveidojam komandu /kreiss, kas izsauks šo funkciju.

--[[
Nākamā funkcija. Šī izveido sākuma marķieri, kurā iebraucot darbs sāksies. Atkal, pārbaudam, vai spēlētājs ir 79. frakcijā, bet šoreiz ir vel 2 pārbaudes. Pārbaudam, vai vērtības, kuras tika uzstādītas 1. solī, eksistē. (Jo ja 2 spēlētāji atrodas vienā automašīnā, marķieris ieskaitās abiem. Visur jāpārbauda, vai spēlētājs ir 79. frakcijā.
Tātad, ja viss ok, izveidojam sākuma marķieri, kuru redz tikai spēlētājs. [!]Marķieris pastāv visiem, tikai pārējiem tas ir neredzams. Tādēļ pārbaudes.[!], pievienojam eventu, kas izsauks nākamo funckiju, tiklīdz spēlētajs iebrauc marķierī.
]]--

function showStartMarker(thePlayer)
    if (getElementData(thePlayer, "faction") == 79 and getElementData(thePlayer, "trucking") == 0 and getElementData(thePlayer, "truckingMarkerVisible") ~= 1) then
            startMarker = createMarker (-1549.9873046875, -2762.40625, 48, "cylinder", 4.0, 255, 0, 0, 150, thePlayer)
            addEventHandler("onMarkerHit", startMarker, startTrucking)
            setElementData(thePlayer, "truckingMarkerVisible", 1)
    end
end
addEventHandler("onVehicleEnter", getRootElement(), showStartMarker) -- lai izsauktu šo funckiju, nav komanda, bet gan notikums. Šajā gadijumā, funkcija tiek izsaukta spēlētājam iekāpjot transportlīdzklī. Tā kā šo ierobežot ir diezgan liels čakars, funkcija būtībā tiek izsaukta visiem, taču pārbaude, kas ir pašā funckijas sākumā liedz veikt jebkādas darbības tiem, kas nav ierakstijši /kreiss komandu, un neatrodas 79. frakcijā.

--[[
Šo funckiju izsauca no iepriekšējās, brīdī, kad spēlētājs iebrauca marķierī. Šeit jau ir drusku sarežģītākas pārbaudes.
1. Pārbaudam, vai spēlētājs atrodas 79. frakcijā. Ja neatrodas (kā jau teicu, ja kāds grib mēģināt pabuggot, var iekāpt vienā mašīnā ar cilvēku, kas actually dara šo darbu, un redzēt paziņojumu "Tikai Kreiss frakcijas biedriem ir iespēja izmantot šo darbu!" sarkanā krāsā.
2. Pārbaudam, vai automašīnas modeļa ID ir 403 (Linerunner). Ja nav, izdrukājam tekstu sarkanā krāsā, ka ir jāatrodas Linerunner markas fūrē.
3. Pārbaudam, vai fūrei ir piekabināts treileris. Ja nav, izdrukājam tekstu, ka jāpiekabina treileris.
4. Ja viss ir kārtībā, izdrukājam tekstu zaļā krāsā "Sākam darbu...", uzstādam darba progresa atzīmi uz "1", un izsaucam truckJob funkciju, kā argumentu padodot pašu spēlētāju. (Vēlāk sapratīsiet, kapēc.)
]]--

function startTrucking(thePlayer)
    if (getElementData(thePlayer, "faction") == 79) then
        theVehicle = getPedOccupiedVehicle (thePlayer)
        vehicleID = getElementModel(theVehicle)
        if vehicleID == 403 then
            if getVehicleTowedByVehicle(theVehicle) then
                outputChatBox("Sākam darbu...", thePlayer, 0, 255, 0)
                setElementData(thePlayer, "trucking", 1)
                truckJob(thePlayer)
            else
                outputChatBox("Piekabini treileri, lai sāktu darbu.", thePlayer, 255, 0, 0)
            end
        else
            outputChatBox("Tev ir jāatrodas Linerunner markas automašīnā!", thePlayer, 255, 0, 0)
        end
    else
        outputChatBox("Tikai \"Kreiss\" frakcijas biedriem ir iespēja izmantot šo darbu!", thePlayer, 255, 0, 0)
    end
end

--[[
Esam tikuši līdz pašiem darba marķieriem. Ierakstās pārbaudes. Vai spēlētājs atrodas 79.frakcijā, un vai treileris ir piekabināts. (Principā, vajadzētu arī pārbaudīt, vai spēlētājs joprojām atrodas linerunner fūrē, bet nau verc. Tikai fūrēm var piekabināt treilerus, un getVehicleTowedByVehicle() atgriež true vel tikai tajā gadijumā, ja pie Towtruck ir piekabināta cita mašīna. Principā, bugs.
Ja viss ok, un progresa līmenis ir 1, izdzēšam sākuma marķieri, un no mūsu iepriekš izveidotā masīva lasam nākamo koordinātas.
Kad koordinātas ielasītas, pārbaudam, vai progresa līmenis ir mazāks vai vienāds ar 11 (jo manā markeru indeksā ir tik vērtības). Ja ir lielāks par 11, izsaucam darba beigšanas funckiju, un pārtraucam šīs izpildi. Ja nē, tad izveidojam blipu kartē ar punktu, kur atrodas nākamais marķieris, un protams, pašu marķieri, pie reizes pievienojot velvienu eventu, kas izsauc nākamo funckiju brīdī, kad spēlētajs iebrauc marķierī.
]]--

function truckJob(thePlayer)
    theVehicle = getPedOccupiedVehicle (thePlayer)
    if getElementData(thePlayer, "faction") == 79 then
        if getVehicleTowedByVehicle(theVehicle) then
            local progress = getElementData(thePlayer, "trucking")
            if progress == 1 then
                destroyElement(startMarker)
            end
            marker = markers[tonumber(progress)]
            if marker then
                x = marker[1]
                y = marker[2]
                z = marker[3]
            end
            if progress <= 11 and progress > 0 then
                jobMarker = createMarker(x, y, z, "cylinder", 4.0, 255, 102, 51, 150, thePlayer)
                jobBlip = createBlip(x, y, z, 0, 4, 255, 102, 51, 255, 0, 999999, thePlayer)
                addEventHandler("onMarkerHit", jobMarker, timerIncreaseJob)
            else
                destroyElement(jobMarker)
                destroyElement(jobBlip)
                endJob(thePlayer)
                return
            end
        else
            outputChatBox("Tev nav piekabināts treileris!", thePlayer, 255, 0, 0)
        end
    else
        outputChatBox("Nav pieejams!", thePlayer, 255, 0, 0)
    end
end

--[[
Nākamā funckija. Šeit mēs liekam spēlētājam uzgaidīt 10 sekundes, līdz nākamā marķiera parādīšanai, pie reizes uzliekot rokasbremzi gan fūrei, gan treilerim. Protams, ierastās pārbaudes neizpaliek.
Izdrukājam tekstu, ka jāuzgaida 10 sekundes, un uzstādam taimeri, kas pēc 10 sekundēm (laiks jānorāda milisekundēs), izsauc nākamo funckciju.
]]--

function timerIncreaseJob(thePlayer)
    theVehicle = getPedOccupiedVehicle (thePlayer)
    if getElementData(thePlayer, "faction") == 79 then
        if getVehicleTowedByVehicle(theVehicle) then
            truck = getPedOccupiedVehicle(thePlayer)
            trailer = getVehicleTowedByVehicle(theVehicle)
            setElementFrozen(truck, true)
            setElementFrozen(trailer, true)
            outputChatBox("Uzgaidiet, kamēr jūsu fūre tiek izkrauta." , thePlayer, 255, 102, 51)
            setTimer(increaseJob, 10000, 1, thePlayer)
        else
            outputChatBox("Tev nav piekabināts treileris!", thePlayer, 255, 0, 0)
        end
    else
        outputChatBox("Nav pieejams!", thePlayer, 255, 0, 0)
    end
end

--[[
Nākamā funckija. Šī ir tā, kur mēs norēķinamies ar šofera frakciju, palielinam progresu, un atgriežamies pie truckJob() funckijas (principā, veidojam loopu. Tā kā progress tiek paaugsintāts, tā funckija zin, kuru marķieri rādīt, un vai darbs nav jābeidz), protams, arī šeit liekam ierastās pārbaudes.
Te ir arī mySQL kverijs, kas pieskaita šofera frakcijai naudu par piegādātu kravu (šoferim vel nē), un izdrukā pāriz paziņojumus, piemēram, kura piegāde veikta, un cik frakcija par to saņēma.
]]--

function increaseJob(thePlayer)
    theVehicle = getPedOccupiedVehicle (thePlayer)
    if getElementData(thePlayer, "faction") == 79 then
        if getVehicleTowedByVehicle(theVehicle) then
            truck = getPedOccupiedVehicle(thePlayer)
            setElementFrozen(truck, false)
            setElementData(thePlayer, "truckingprofit", getElementData(thePlayer, "truckingprofit") + 80)
            outputChatBox("Jūs veicāt savu "..getElementData(thePlayer, "trucking")..". piegādi šajā fūrē.", thePlayer, 255, 255, 255)
            --outputChatBox("Jūs nopelnijāt $80. [Kopā: $"..getElementData(thePlayer, "truckingprofit").."]" , thePlayer, 255, 255, 255)
            outputChatBox("Frakcija par to saņēma $1600." , thePlayer, 255, 255, 255)
            mysql:query_free("UPDATE `factions` SET `bankbalance` = `bankbalance` + 1600 WHERE `id` = 79")
            setElementData(thePlayer, "trucking", getElementData(thePlayer, "trucking") + 1)
            destroyElement(jobMarker)
            destroyElement(jobBlip)
            truckJob(thePlayer)
        else
            outputChatBox("Tev nav piekabināts treileris!", thePlayer, 255, 0, 0)
        end
    else
        outputChatBox("Nav pieejams!", thePlayer, 255, 0, 0)
    end
end

--[[
Darba beigšanas funkcija. Šī tiek izsaukta no truckJob() funckijas brīdī, kad visi 11 marķieri ir izbraukti. Ierastās pārbaudes, un tad atjaunojam spēlētāja vērtības uz defaultajām, izdzēšam marķierus, pasakam spēlētājam, cik frakcija saņēma (frakcija maksās viņiem algas), un iedodam pašam spēlētājam $1500 prēmiju par pabeigtu maršrutu. Viss.
]]--

function endJob(thePlayer)
    theVehicle = getPedOccupiedVehicle (thePlayer)
    if getElementData(thePlayer, "faction") == 79 then
        if getVehicleTowedByVehicle(theVehicle) then
            exports.global:giveMoney(thePlayer, 1500)
            outputChatBox("Darbs pabeigts. Atgriezies bāzē. Frakcija saņēma: $"..getElementData(thePlayer, "trucking")*1600 ..".", thePlayer, 0, 255, 0)
            outputChatBox("Lai strādātu atkal, raksti /kreiss", thePlayer)
            outputChatBox("Tu saņem $1500 prēmiju par pabeigtu darbu!", thePlayer)
            setElementData(thePlayer, "trucking", 0)
            setElementData(thePlayer, "truckingprofit", 0)
        else
            outputChatBox("Tev nav piekabināts treileris!", thePlayer, 255, 0, 0)
        end
    else
        outputChatBox("Nav pieejams!", thePlayer, 255, 0,0)
    end
end

N.B. Neprasiet man pa PM nekādu palīdzību saistībā ar MTA skriptingu. Tam šeit ir miniblogi, un no sākuma izmantojat MTA Wiki un pagūglējat. Varbūt kāds jūsu problēmu jau ir atrisinājis.

Papildu pievienošu linkus uz servera/klienta funckijām un eventiem.

Laboja SJohnson, labots 2x