Jump to content

Skrypt rozwożenia towarów/paczek.


Guest Guest26901

Recommended Posts

Posted

Witam !!!

Dopiero zaczynam swoją przygodę z programowaniem lua. Umiem podstawy c++, więc łatwo mi się oswoić z lua.

Napisałem swój skrypt rozwożenia towarów, ale on nie działa. Blipy i markery na mapce się pokazują, ale po wjechaniu w nie, nic się nie dzieje. Bardzo proszę o szybką pomoc.

http://www.sendspace.pl/file/f8d6a543675a9e658555fac

Posted

Specem od lua nie jestem, no ale postaram się pomóc. Takie błędy jak w linii 49 chyba wiesz skąd się biorą? Oczywiście z powodu odwołania do zmiennej która nie istnieje.

Co do błędu z gui, to nie podoba mi się sposób stworzenia okienka. Radzę ci zrobić wszystkie elementy w funkcji, która będzie wywoływana przy onClientResourceStart. W tamtej twojej funkcji, nie tworzyć za każdym razem wszystkiego od nowa po najechaniu na marker, tylko zwyczajnie ustawić parametr visible okienka na true.

Event z buttonem dodaj bezpośrednio pod linie gdzie tworzysz ten button, w tej samej funkcji. Nie dam głowy że to ma znaczenie, ale tak robili na wiki, tak robię ja, no i tak mi działa.

Po za tym w towarTrociny widzę argument Player, a odwołując się do funkcji go nie przekazujesz.

addEventHandler( "onClientMarkerHit", markers, towary() )

Czy zamiast "markers" nie powinno być getRootElement()?

Posted

A ja jestem dopiero początkującym, więc napisz jakiej funkcji użyć.

Ok, będę używał event z buttonem bezpośrednio pod linię gdzie tworzę button, ponieważ kiedyś będzie mi lepiej odczytać skrypt. Proszę zrób mi gotowy kod tak jak mówiłeś wyżej, bo nie za bardzo wiem o co chodzi.

Znowu nie wiem o co chodzi.

Tak, tam powinno być getRootElement(). Poprawiłem już to.

PS. Staraj się tłumaczyć mi jak najwięcej.

Posted
source = getLocalPlayer() 
  
function onresourceStart () 
    outputChatBox("Skrypt wystartował",255,0,0) 
    -- gui 
    GUIEditor_Window = {} 
    GUIEditor_Button = {} 
    GUIEditor_Window[1] = guiCreateWindow(131,55,586,509,"",false) 
    GUIEditor_Button[1] = guiCreateButton(23,42,130,32,"Trociny   0 Pkt.",false,GUIEditor_Window[1]) 
    addEventHandler( "onClientGUIClick", GUIEditor_Button[1], towarTrociny ) 
    GUIEditor_Button[2] = guiCreateButton(18,383,550,54,"Zaladuj",false,GUIEditor_Window[1]) 
    GUIEditor_Button[3] = guiCreateButton(130,454,332,46,"Zamknij",false,GUIEditor_Window[1]) 
    guiSetVisible(GUIEditor_Window[1], false) 
  
 end 
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), onresourceStart) 
  
  
local markers = { 
            { -1725, -121, 2 },  
            {-1854, 1402, 6.1}, 
            {-2282, 2278, 4,5}, 
            {-367, 1547, 75,1}, 
            {345, 2534, 16,2}, 
            {1641, 2412, 10}, 
            {-2887, 503, 4}, 
            {-1515, 721, 6}, 
            {-683, 965, 12}, 
            {948, 2279, 11}, 
            {1488, 2146, 10}, 
            {1910, 2157, 10}, 
            {2242, 1977, 9}, 
            {-658, 2318, 138}, 
            {-2054, -2565, 30}, 
            {-1416, -1468, 101}, 
            {-605, -483, 25}, 
            {-55, -326, 5}, 
            {1077, -307, 75}, 
            {-2644, 1334, 7}, 
            {2481, 2796, 10}, 
            {-857, -1944, 15}, 
            {-87, -1574, 2}, 
            {-2264, -1688, 480}, 
            { -2029.1010742188, 172.45364379883, 27.35425567627 } 
          } 
  
           
local pmoney = getPlayerMoney(source) 
  
points = getElementData(getLocalPlayer(), "Pkt") 
  
local vehicle_ids = {[524] = true, [578] = true, [403] = true, [514] = true, [414] = true, [515] = true, [440] = true, [455] = true} 
-- Cement Truck, DFT-30, Linerunner, Tanker, Mule, RoadTrain, Rumpo, Flatbed 
  
local dest = markers[math.random(1, #markers)] 
  
for k, v in ipairs (markers) do 
    createMarker(v[1], v[2], v[3], "cylinder", 3, 255, 255, 0, 255) 
    createBlip(v[1],v[2],v[3], 51) 
end 
  
  
local towar = 0 
  
function towary(hitElement) 
    local v = getPedOccupiedVehicle(hitElement) 
     if v then 
        if vehicle_ids[getElementModel(v)] then 
            if towar == 0 and destblip ~= destmarker then 
                guiSetVisible(GUIEditor_Window[1], true) 
                showCursor(true) 
            else 
                rozladunek() 
            end 
        else 
            outputChatBox("To nie jest pojazd dostawczy!", 0, 255, 0)        
        end 
    else 
        outputChatBox("Aby załadować towar musisz mieć pojazd dostawczy!", 0, 255, 0) 
    end 
end 
  
function rozladunek() 
    if towar == 1 and destblip == destmarker then 
        setElementData(source,"Pkt",tonumber(Pkt + 1)) 
        rmoney = math.random(350,700) 
        givePlayerMoney ( source, rmoney ) 
    else 
        outputChatBox("To nie jest ten rozładunek!", 0, 255, 0) 
    end 
end 
  
function towarTrociny (player) 
    if points >= 0 and towar == 0 then 
        local towar = 1 
        outputChatBox("Załadowałeś trociny!", player) 
        local destblip = createBlip( dest[1], dest[2], dest[3], 41, 2, 255, 255, 0, 0, 100) 
    else 
        outputChatBox("Aby załadować ten towar musisz mieć minimum 0 punktów!", 0, 255, 0) 
    end 
end 
  
addEventHandler( "onClientMarkerHit", getRootElement(), towary ) 

Nie wszystko jest gotowe, bo nie rozumiem za bardzo logiki tego skryptu. Będziesz musiał do tego dojść sam, by działało tak jak zaplanowałeś w swojej głowie. Nie ma już błędów i waringów. Wykrywanie markera działa, i gdy wjade do niego tirem to wyskakuje "To nie jest ten rozładunek". Jeżeli to nie tak, to będziesz musiał pozmieniać kolejność w skrypcie.

Co do poprawek to po prostu porównaj sobie twój skrypt i moje poprawki. Moim zdaniem zrobiłeś to za szybko. Skoro nie masz wprawy w lua, tak samo jak ja, to rób wszystko małymi krokami. Najpierw marker - sprawdzasz czy działa. Potem gui - sprawdzasz czy działa. I tak krok po kroku wszystko łączysz i rozbudowujesz. Tym sposobem będziesz miał jeden błąd do rozmyślania, a nie 5 za jednym zamachem....

Pozdrawiam

PS czytaj dokładnie wiki i stosuj jej przykłady, bo moje poprawki polegały zwyczajnie na odwiedzeniu kilku podstron z danymi eventsami/funkcjami.

Posted

Bardzo dziękuję za ten kod. Czy możesz podać swoje gadu-gadu (jak masz) lub skype?

PS. Trzeba usunąć "and destblip ~= destmarker" z instrukcji warunkowej bo w przeciwnym razie, po wjechaniu pojazdem dostawczym w marker, skrypt wyświetli komunikat "To nie ten rozładunek!".

Posted

Proszę o zamknięcie tego tematu.

PS. To forum jest naprawdę dobre. Chętnie pomagają, a na niektórych forach, musiałem czekać tygodniami na odpowiedź.

Posted

Czyli na logike, problem jest z tym warunkiem, i to jego powinieneś prześledzić, i sprawdzić czy zmiennej towar przypisujesz odpowiednio wartości:

if towar == 0 then 

Nikt tu nie będzie za ciebie sprawdzał skryptu krok po kroku (ponownie), bo każdy ma swoje zajęcia ;) A nie, że dasz paczke i naprawcie...

Posted

Przypisywanie wartości zmiennej towar: setElementData(source,"towar",1)

Przypisywanie wartości zmiennej Pkt: setElementData(source,"Pkt",tonumber(Pkt + 1))

Raczej myślę, że przypisuje dobrze. Nie wiem z czym jest problem, więc piszę na forum.

"Nikt tu nie będzie za ciebie sprawdzał skryptu krok po kroku (ponownie), bo każdy ma swoje zajęcia ;) A nie, że dasz paczke i naprawcie..." - Od tego jest forum ;d

Posted
"Nikt tu nie będzie za ciebie sprawdzał skryptu krok po kroku (ponownie), bo każdy ma swoje zajęcia ;) A nie, że dasz paczke i naprawcie..." - Od tego jest forum ;d

Żartujesz prawda?

Przypisywanie wartości zmiennej towar: setElementData(source,"towar",1)

Przypisywanie wartości zmiennej Pkt: setElementData(source,"Pkt",tonumber(Pkt + 1))

Mówiłem ci żebyć czytał wiki.

Wartość zmiennej przypisujesz podobnie jak w prawie każdym języku programowania czyli "nazwa = wartość".

To co użyłeś to przechowywanie danych dla danego gracza, że np. możesz przypisać dla danego gracza punkty, zawartość kieszeni i co kolwiek innego, po czym możesz odwoływać się do tego z dowolnego miejsca między skryptami.

if towar == 0 then 

to odwołanie do zwykłej zmiennej w pamięci skryptu. Jeżeli chcesz się odwołać do danych przypisanych do gracza, to używasz getElementData.

Posted

Tak, to był żart.

Ok. Zrobiłem tak jak mówiłeś.

  
source = getLocalPlayer() 
  
function closegui() 
    guiSetVisible(GUIEditor_Window[1],false) 
    showCursor(false) 
end 
  
function onresourceStart () 
    outputChatBox("Skrypt wystartował!",255,0,0) 
    local towar = 0 
    if towar == 0 then 
        outputChatBox("Zmienna towar wynosi 0", 0, 255, 0) 
    else 
        outputChatBox("Zmienna towar nie wynosi 0.", 0, 255, 0) 
    end 
    GUIEditor_Window = {} 
    GUIEditor_Button = {} 
    GUIEditor_Window[1] = guiCreateWindow(131,55,586,509,"",false) 
    GUIEditor_Button[1] = guiCreateButton(23,42,130,32,"Trociny   0 Pkt.",false,GUIEditor_Window[1]) 
    GUIGetText = guiCreateLabel ( 0.45,0.48, 0.10, 0.04,"Trociny",true,GUIEditor_Window[1] ) 
        addEventHandler( "onClientGUIClick", GUIEditor_Button[1], towarTrociny ) 
    GUIEditor_Button[2] = guiCreateButton(18,383,550,54,"Zaladuj",false,GUIEditor_Window[1]) 
    GUIEditor_Button[3] = guiCreateButton(130,454,332,46,"Zamknij",false,GUIEditor_Window[1]) 
        addEventHandler( "onClientGUIClick", GUIEditor_Button[3], closegui ) 
    guiSetVisible(GUIEditor_Window[1], false) 
end 
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), onresourceStart) 
  
local markers = { 
                { -1725, -121, 2 }, 
                {-1854, 1402, 6.1}, 
                {-2282, 2278, 4,5}, 
                {-367, 1547, 75,1}, 
                {345, 2534, 16,2}, 
                {1641, 2412, 10}, 
                {-2887, 503, 4}, 
                {-1515, 721, 6}, 
                {-683, 965, 12}, 
                {948, 2279, 11}, 
                {1488, 2146, 10}, 
                {1910, 2157, 10}, 
                {2242, 1977, 9}, 
                {-658, 2318, 138}, 
                {-2054, -2565, 30}, 
                {-1416, -1468, 101}, 
                {-605, -483, 25}, 
                {-55, -326, 5}, 
                {1077, -307, 75}, 
                {-2644, 1334, 7}, 
                {2481, 2796, 10}, 
                {-857, -1944, 15}, 
                {-87, -1574, 2}, 
                {-2264, -1688, 480}, 
                { -2029.1010742188, 172.45364379883, 27.35425567627 } 
                } 
  
local pmoney = getPlayerMoney(source) 
  
points = getElementData(getLocalPlayer(), "Pkt") 
towar = getElementData(getLocalPlayer(), "towar") 
  
local vehicle_ids = {[524] = true, [578] = true, [403] = true, [514] = true, [414] = true, [515] = true, [440] = true, [455] = true} 
-- Cement Truck, DFT-30, Linerunner, Tanker, Mule, RoadTrain, Rumpo, Flatbed 
  
local dest = markers[math.random(1, #markers)] 
  
for k, v in ipairs (markers) do 
    destmarker = createMarker(v[1], v[2], v[3], "cylinder", 3, 255, 255, 0, 255) 
    createBlip(v[1],v[2],v[3], 51) 
end 
  
function towary(hitElement) 
local v = getPedOccupiedVehicle(hitElement) 
    if v then 
        if vehicle_ids[getElementModel(v)] then 
            if towar == 0 then 
                guiSetVisible(GUIEditor_Window[1], true) 
                showCursor(true) 
            else 
                rozladunek() 
            end 
        else 
            outputChatBox("To nie jest pojazd dostawczy!", 0, 255, 0)       
        end 
    else 
        outputChatBox("Aby załadować towar musisz mieć pojazd dostawczy!", 0, 255, 0) 
    end 
end 
addEventHandler( "onClientMarkerHit", getRootElement(), towary ) 
  
function rozladunek() 
    if towar == 1 and destblip == destmarker then 
        setElementData(source,"Pkt",tonumber(Pkt + 1)) 
        towar = 0 
        rmoney = math.random(350,700) 
        givePlayerMoney ( source, rmoney ) 
        outputChatBox("Rozładowałeś trociny!", player) 
    else 
        outputChatBox("To nie jest ten rozładunek!", 0, 255, 0) 
    end 
end 
  
function towarTrociny (player) 
    if points >= 0 and towar == 0 then 
        towar = 1 
        outputChatBox("Załadowałeś trociny!", player) 
        local destblip = createBlip( dest[1], dest[2], dest[3], 41, 2, 255, 255, 0, 0, 100) 
    else 
        outputChatBox("Aby załadować ten towar musisz mieć minimum 0 punktów!", 0, 255, 0) 
    end 
end 
  

Ale teraz gdy wjadę w marker pokazuje się komunikat, że to nie ten rozładunek, czyli zmienna towar jest ustawione wtedy na 1. Ale zrobiłem sprawdzenie przy starcie skryptu (patrz wyżej) i pokazuje się komunikat, że zmienna towar wynosi 0.

Posted

Nie rozumiem co ty tam kombinujesz. Jakim cudem zmienna towar ma wynosić 1 jeżeli jej tak nie ustawiłeś?

 towar = getElementData(getLocalPlayer(), "towar") 

Co ty tutaj pobierasz skoro nigdzie nie ustawiłeś nic o nazwie "towar"? Jak możesz pobierać wartość czegoś, czego nie utworzyłeś? Po raz setny - czytaj wiki. Albo jeszcze lepiej - zacznij od prostszego skryptu, bo się rzuciłeś na głęboką i toniesz...

Posted

Problem był z twoją funkcją onresourceStart (). Zrobiłem tak jak dawniej i działa (nie do końca).

Posted
  
source = getLocalPlayer() 
  
function closegui() 
    guiSetVisible(GUIEditor_Window[1],false) 
    showCursor(false) 
end 
  
outputChatBox("Skrypt wystartował!",255,0,0) 
local towar = 0 
if towar == 0 then 
    outputChatBox("Zmienna towar wynosi 0", 0, 255, 0) 
else 
    outputChatBox("Zmienna towar nie wynosi 0.", 0, 255, 0) 
end 
  
GUIEditor_Window = {} 
GUIEditor_Button = {} 
GUIEditor_Window[1] = guiCreateWindow(131,55,586,509,"",false) 
GUIEditor_Button[1] = guiCreateButton(23,42,130,32,"Trociny   0 Pkt.",false,GUIEditor_Window[1]) 
GUIGetText = guiCreateLabel ( 0.45,0.48, 0.10, 0.04,"Trociny",true,GUIEditor_Window[1] ) 
GUIEditor_Button[2] = guiCreateButton(18,383,550,54,"Zaladuj",false,GUIEditor_Window[1]) 
GUIEditor_Button[3] = guiCreateButton(130,454,332,46,"Zamknij",false,GUIEditor_Window[1]) 
    addEventHandler( "onClientGUIClick", GUIEditor_Button[3], closegui ) 
guiSetVisible(GUIEditor_Window[1], false) 
  
local markers = { 
                { -1725, -121, 2 }, 
                {-1854, 1402, 6.1}, 
                {-2282, 2278, 4,5}, 
                {-367, 1547, 75,1}, 
                {345, 2534, 16,2}, 
                {1641, 2412, 10}, 
                {-2887, 503, 4}, 
                {-1515, 721, 6}, 
                {-683, 965, 12}, 
                {948, 2279, 11}, 
                {1488, 2146, 10}, 
                {1910, 2157, 10}, 
                {2242, 1977, 9}, 
                {-658, 2318, 138}, 
                {-2054, -2565, 30}, 
                {-1416, -1468, 101}, 
                {-605, -483, 25}, 
                {-55, -326, 5}, 
                {1077, -307, 75}, 
                {-2644, 1334, 7}, 
                {2481, 2796, 10}, 
                {-857, -1944, 15}, 
                {-87, -1574, 2}, 
                {-2264, -1688, 480}, 
                { -2029.1010742188, 172.45364379883, 27.35425567627 } 
                } 
  
local pmoney = getPlayerMoney(source) 
  
points = getElementData(getLocalPlayer(), "Pkt") 
  
local vehicle_ids = {[524] = true, [578] = true, [403] = true, [514] = true, [414] = true, [515] = true, [440] = true, [455] = true} 
-- Cement Truck, DFT-30, Linerunner, Tanker, Mule, RoadTrain, Rumpo, Flatbed 
  
dest = markers[math.random(1, #markers)] 
  
for k, v in ipairs (markers) do 
    destmarker = createMarker(v[1], v[2], v[3], "cylinder", 3, 255, 255, 0, 255) 
    pozmark = v[1] 
    createBlip(v[1],v[2],v[3], 51) 
end 
  
function towary(hitElement) 
local vehicle = getPedOccupiedVehicle(hitElement) 
    if vehicle then 
        if vehicle_ids[getElementModel(vehicle)] then 
            if towar == 0 then 
                guiSetVisible(GUIEditor_Window[1], true) 
                showCursor(true) 
            else 
                rozladunek() 
            end 
        else 
            outputChatBox("To nie jest pojazd dostawczy!", 0, 255, 0)       
        end 
    else 
        outputChatBox("Aby załadować towar musisz mieć pojazd dostawczy!", 0, 255, 0) 
    end 
end 
addEventHandler( "onClientMarkerHit", getRootElement(), towary ) 
  
function rozladunek() 
    if towar == 1 and pozmark == pozblip then 
        setElementData(source,"Pkt",tonumber(Pkt + 1)) 
        towar = 0 
        rmoney = math.random(350,700) 
        givePlayerMoney ( source, rmoney ) 
        outputChatBox("Rozładowałeś trociny!", player) 
    else 
        outputChatBox("To nie jest ten rozładunek!", 0, 255, 0) 
    end 
end 
  
function towarTrociny() 
    if points >= 0 and towar == 0 then 
        towar = 1 
        outputChatBox("Załadowałeś trociny!", player) 
        destblip = createBlip( dest[1], dest[2], dest[3], 41, 2, 255, 255, 0, 0, 100) 
        pozblip = dest[1] 
    else 
        outputChatBox("Aby załadować ten towar musisz mieć minimum 0 punktów!", 0, 255, 0) 
    end 
end 
addEventHandler( "onClientGUIClick", GUIEditor_Button[1], towarTrociny) 
  

Proszę o pomoc, ponieważ załadując towar i wjeżdżając w wylosowany marker skrypt wypisuje "To nie jest ten rozładunek", a errorów i warning'ów nie ma.

Posted

  
addEventHandler( "onClientMarkerHit", getRootElement(), towary ) 
  

Powinno być zamienione na

  
addEventHandler( "onClientMarkerHit", resourceRoot, towary ) 
  

gdyż funkcja towary nie obsługuje nigdy markerów spoza tego zasobu.

Tak jak jest obecnie działa, ale jest mniej optymalnie.

  • 4 weeks later...
Posted
  
function zakup(hitElement) 
    if kupuj[1] then 
        outputChatBox("Załadowałeś towar o id 1!", hitElement) 
    end 
    if kupuj[2] then 
        outputChatBox("Załadowałeś towar o id 2!", hitElement) 
    end 
    if kupuj[3] then 
        outputChatBox("Załadowałeś towar o id 3!", hitElement) 
    end 
end  
  
oknotow = guiCreateWindow((x-500)/2,(y-350)/2,500,350,"System towarów",false) 
for k, v in ipairs (towary) do 
    towar = {} 
    kupuj = {} 
    info = guiCreateLabel (0.06,0.08,0.9,0.3,"Towar Ilość score Min. suma Max. suma", true, oknotow) 
        guiSetFont ( info, "default-bold-small" ) 
    towar[1] = guiCreateLabel (0.03,0.1+0.08*k,0.9,0.3,v[2],true,oknotow) 
    towar[2] = guiCreateLabel (0.27,0.1+0.08*k,0.9,0.3,v[3],true,oknotow) 
    towar[3] = guiCreateLabel (0.46,0.1+0.08*k,0.9,0.3,v[4].."$",true,oknotow) 
    towar[4] = guiCreateLabel (0.68,0.1+0.08*k,0.9,0.3,v[5].."$",true,oknotow) 
    kupuj[k] = guiCreateButton (0.8,0.095+0.08*k,0.13,0.06,"Załaduj",true,oknotow) 
        addEventHandler( "onClientGUIClick", kupuj[k], zakup) 
    zamknij = guiCreateButton (0.45,0.9,0.15,0.07,"Zamknij",true,oknotow) 
        addEventHandler( "onClientGUIClick", zamknij, closegui ) 
    guiSetVisible(oknotow, false) 
end 
  

Dlaczego tylko 3 button mi działa ? Inne po prostu się nie "świecą".

Posted

Wielkie dzięki za tą pomoc! Błąd rozwiązany. Od razu widać jaka grupa ludzi na tym forum jest głupia...

Posted

To, że nikt nie ma czasu, szczególnie w tak małym gronie jak polska sekcja, nie oznacza, że ludziom brakuje wiedzy.

Teraz też wiemy, że nie warto Tobie pomagać.

Posted

Gdyby polskich użytkowników było 20 to nie trzeba byłoby się dziwić, że nikt nie odpowie, ale nas jest przynajmniej ze 100, tak myślę.

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...