Zaloguj się by uzyskać pełen dostęp. Nie masz jeszcze konta? Założ je już teraz w kilka sekund.

Wysłany: 2024-01-29, 12:41


sabarupl







Wiek: 43
Na forum: 4825 dni
Posty: 347

Piwa: 163

Respekt: 230
Respekt: 230Respekt: 230

Mam tu skrypt, który potrafi zapisać pozycje pojazdu (czyli gdzie został zostawiony), obrót, color i tunig. Jednak z nim jej taki problem że poprawnie zapisuje tylko pierwszy pojazd, a jak już się zeszpawnuje drugi o takim samy ID to po przemieszczeniu tego drugiego pojazdu już nie potrafi uaktualnić danych. Pamięta tylko gdzie został zeszpawnowany ten drugi pojazdu.

Ktoś może wie co jest nie tak?

-- Plikspawn_vehicle_server.lua

local spawnedVehicles = {}
local saveFileName "spawned_vehicles.json"

function saveSpawnedVehicles()
    local data ""
    for _vehicleData in ipairs(spawnedVehicles) do
        local line toJSON(vehicleData)
        data data .. line .. "\n"
    end

    local file fileCreate(saveFileName)

    if file then
        fileWrite(filedata)
        fileClose(file)
    end
end

function loadSpawnedVehicles()
    local file fileOpen(saveFileName)

    if file then
        local data fileRead(filefileGetSize(file))
        spawnedVehicles = {}

        for line in string.gmatch(data"[^\r\n]+") do
            local vehicleData fromJSON(line)
            table.insert(spawnedVehiclesvehicleData)
        end

        fileClose(file)
    end
end

function updateVehicleDataAndSave(vehicleplayer)
    local vehicleID getElementModel(vehicle)

    -- Pobierz informacje o tuningowaniu pojazdu
    local upgrades getVehicleUpgrades(vehicle)

    local vehicleData = {
        id vehicleID,
        pos = {getElementPosition(vehicle)},
        rot = {getElementRotation(vehicle)},
        color = {getVehicleColor(vehicletrue)},
        upgrades upgrades
    }

    outputDebugString("updateVehicleDataAndSave - ID: " .. vehicleID .. ", Pos: " .. table.concat(vehicleData.pos", ") .. ", Rot: " .. table.concat(vehicleData.rot", ") .. ", Color: " .. table.concat(vehicleData.color", ") .. ", Upgrades: " .. table.concat(upgrades","))

    local updated false
    for idata in ipairs(spawnedVehicles) do
        if data.id == vehicleID then
            spawnedVehicles[i] = vehicleData  -- Używamy kopiowanych danychnie referencji
            saveSpawnedVehicles()
            updated true
            break
        end
    end

    -- Jeżeli nie znalezionoto dodaj nowe dane
    if not updated then
        table.insert(spawnedVehiclesvehicleData)
        saveSpawnedVehicles()
    end
end

function spawnVehicleForPlayer(vehicleID)
    local xygetElementPosition(client)
    local vehicle createVehicle(vehicleIDxyz)

    -- Pobierz informacje o tuningowaniu pojazdu
    local upgrades getVehicleUpgrades(vehicle)

    local vehicleData = {
        id vehicleID,
        pos = {xyz},
        rot = {getElementRotation(vehicle)},
        color = {getVehicleColor(vehicletrue)},
        upgrades upgrades
    }

    table.insert(spawnedVehiclesvehicleData)
    saveSpawnedVehicles()

    warpPedIntoVehicle(clientvehicle)

    -- Dodaj zdarzenie do aktualizacji pozycjiobrótkoloru i tuningowania pojazdugdy gracz opuści pojazd
    addEventHandler("onVehicleExit"vehicle, function(_seat)
        if seat == 0 then
            updateVehicleDataAndSave(vehicleclient)
        end
    end)
end
addEvent("onPlayerRequestVehicleSpawn"true)
addEventHandler("onPlayerRequestVehicleSpawn"rootspawnVehicleForPlayer)

function restoreSpawnedVehicles()
    loadSpawnedVehicles()

    for _vehicleData in ipairs(spawnedVehicles) do
        local vehicle createVehicle(vehicleData.idunpack(vehicleData.pos))

        local rxryrz unpack(vehicleData.rot)
        setElementRotation(vehiclerxryrz)

        local rgunpack(vehicleData.color)
        setVehicleColor(vehiclergbrgb)

        -- Dodaj komponenty tuningujące pojazd
        for _upgrade in ipairs(vehicleData.upgrades) do
            addVehicleUpgrade(vehicleupgrade)
        end

        outputDebugString("restoreSpawnedVehicles - ID: " .. vehicleData.id .. ", Pos: " .. table.concat(vehicleData.pos", ") .. ", Rot: " .. table.concat(vehicleData.rot", ") .. ", Color: " .. table.concat(vehicleData.color", ") .. ", Upgrades: " .. table.concat(vehicleData.upgrades","))

        -- Dodaj zdarzenie do aktualizacji pozycjiobrótkoloru i tuningowania pojazdugdy gracz opuści pojazd
        addEventHandler("onVehicleExit"vehicle, function(_seat)
            if seat == 0 then
                updateVehicleDataAndSave(vehicleclient)
            end
        end)
    end
end

addEventHandler("onResourceStart"resourceRootrestoreSpawnedVehicles)


[ Dodano: 2024-01-30, 19:58 ]
Może tu ktoś będzie wiedział. Zauważyłem że z tym skryptem jest jeszcze inny błąd. Podczas wczytywania pliku savedPositions.json w konsoli pojawia się błąd unexpected symbol near '['. Choć dodam że tutaj pojazd normalnie się wczytuje.
Próbowałem to naprawić ale za każdym razem jest ten błąd. Wydaje się że problem leży po stronie samego pliku savedPositions.json. Co bym w nim nie wpisał to zawsze występuj komunikat unexpected symbol near. Nawet jak same liczby abc zostawię to wywala unexpected symbol near abc. Jedynie się nie pojawia ten komunikat jak zostawię go pustego.
Czy ten plik trzeba jakoś specjalnie kodować?

Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 1 piw(a):
borsuk
Wysłany: 2024-01-31, 23:17


kamison

Przyszły programista .lua






Wiek: 25
Na forum: 3302 dni
Posty: 391
Nick w MP: kamison

Piwa: 594

Respekt: 205,3
Respekt: 205,3Respekt: 205,3

To tak, parząc na kod to wychodzi na to, że aktualizujesz pojazdy na podstawie getElementModel czyli jak masz jeden samochod np. o ID 200 i drugi 200 to nigdy nie będzie on wpisywany jako drugi bo masz ten warunek
Kod:

if data.id == vehicleID then

Czyli, jesli masz juz jeden pojazd o ID 200 i drugi o id 200 to on w tym id 200 bedzie zamienial parametry.

Potrzebujesz nadac tym pojazdom jakies unikalne ID zebys mogl pozniej zrobic cos takiego

Kod:


if (data.UID == vehicleUID then)


Inaczej nie masz mozliwosci namierzenia poszczegolnego auta, ewentualnie zrobic tak, ze nie mozesz tworzyc pojazdu o istniejacym juz ElementModel.

Mozesz to wykonac w taki sposob:

Przy tworzeniu pojazdu i zapisywaniu go w pliku .json

1. Tworzysz pojazd, zapisujesz go do .json ALE dodajesz jeden parametr wlasnie np. UID czyli masz wtedy
Kod:


local vehicleData = {
id = vehicleID,
uid = newUID,
pos = {getElementPosition(vehicle)},
rot = {getElementRotation(vehicle)},
color = {getVehicleColor(vehicle, true)},
upgrades = upgrades
}

2. Do utworzenia nowego UID wykorzystujesz petle for, sprawdzasz w aktualnie juz zapisanych maksymalne uid i tworzysz nowa linie w .json
3. W celu pozniejszej weryfikacji ktory pojazd ma jakie UID przypisujesz je za pomoca, setElementID, setElementData lub przypisujesz w tablicy do elementu pojazdu(ale to troche wiecej pisania kodu)
4. przy zapisie czy odswiezaniu pojazdow, pobierasz wtedy UID przypisane do pojazdu i porownujesz w petli do lini z takim samym UID w pliku .json
5. Petla na maksymalne UID:
local savedData = {
  {vehicleID 200UID 20description "Opis dodanego jako pierwsza linia"},
  {vehicleID 100UID 2description "Opis dodanego jako druga linia"},
  {vehicleID 300UID 17description "Opis dodanego jako trzecia linia"},
  
}

function getNewMaxUID()
    local newUID 0;
    local usedUID = {};
    for k,v in pairs savedData) do
      table.insert(usedUIDv["UID"])
    end
    
    table.sort(usedUID)
    oldUID usedUID[#usedUID] -- do usuniecia - przyklad
    newUID usedUID[#usedUID] + 1
    
    --do usuniecia przyklad
    for k,v in pairs savedData ) do
      if (v.UID == usedUID[#usedUID]) then
        print("Stare najwieksze UID: ".. oldUID .. "\nOPIS: " .. v.description) 
      end
    end
    --do usuniecia przyklad
    
    return newUID
end

local newUID getNewMaxUID()
print("\nNowe najwieksze UID: ".. newUID)



[ Dodano: 2024-01-31, 23:20 ]
Co do "unexpected symbol near" to pewnie źle tworzysz tabele

Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 2 piw(a):
sabarupl, borsuk
Tagi: skrypt :: nie :: zapisuje :: poprawnie :: pozycji :: drugiego :: pojazdu.
Anonymous





Na forum: 245 dni
Posty: 1



Anonymous Koniecznie zajrzyj na:






Skocz do:  
Wyświetl posty z ostatnich:   
GTAONLINE.PL » JĘZYKI PROGRAMOWANIA » LUA » Skrypt nie zapisuje poprawnie pozycji drugiego pojazdu. Odpowiedz do tematu

Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Dodaj temat do Ulubionych
Wersja do druku