Wysłany: 2024-01-29, 12:41
sabarupl
Wiek: 43 Na forum: 4825 dni Posty: 347
Piwa : 163
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?
-- Plik : spawn_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 ( file , data )
fileClose ( file )
end
end
function loadSpawnedVehicles ()
local file = fileOpen ( saveFileName )
if file then
local data = fileRead ( file , fileGetSize ( file ))
spawnedVehicles = {}
for line in string . gmatch ( data , "[^\r\n]+" ) do
local vehicleData = fromJSON ( line )
table . insert ( spawnedVehicles , vehicleData )
end
fileClose ( file )
end
end
function updateVehicleDataAndSave ( vehicle , player )
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 ( vehicle , true )},
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 i , data in ipairs ( spawnedVehicles ) do
if data . id == vehicleID then
spawnedVehicles [ i ] = vehicleData -- Używamy kopiowanych danych , nie referencji
saveSpawnedVehicles ()
updated = true
break
end
end
-- Jeżeli nie znaleziono , to dodaj nowe dane
if not updated then
table . insert ( spawnedVehicles , vehicleData )
saveSpawnedVehicles ()
end
end
function spawnVehicleForPlayer ( vehicleID )
local x , y , z = getElementPosition ( client )
local vehicle = createVehicle ( vehicleID , x , y , z )
-- Pobierz informacje o tuningowaniu pojazdu
local upgrades = getVehicleUpgrades ( vehicle )
local vehicleData = {
id = vehicleID ,
pos = { x , y , z },
rot = { getElementRotation ( vehicle )},
color = { getVehicleColor ( vehicle , true )},
upgrades = upgrades
}
table . insert ( spawnedVehicles , vehicleData )
saveSpawnedVehicles ()
warpPedIntoVehicle ( client , vehicle )
-- Dodaj zdarzenie do aktualizacji pozycji , obrót , koloru i tuningowania pojazdu , gdy gracz opuści pojazd
addEventHandler ( "onVehicleExit" , vehicle , function( _ , seat )
if seat == 0 then
updateVehicleDataAndSave ( vehicle , client )
end
end )
end
addEvent ( "onPlayerRequestVehicleSpawn" , true )
addEventHandler ( "onPlayerRequestVehicleSpawn" , root , spawnVehicleForPlayer )
function restoreSpawnedVehicles ()
loadSpawnedVehicles ()
for _ , vehicleData in ipairs ( spawnedVehicles ) do
local vehicle = createVehicle ( vehicleData . id , unpack ( vehicleData . pos ))
local rx , ry , rz = unpack ( vehicleData . rot )
setElementRotation ( vehicle , rx , ry , rz )
local r , g , b = unpack ( vehicleData . color )
setVehicleColor ( vehicle , r , g , b , r , g , b )
-- Dodaj komponenty tuningujące pojazd
for _ , upgrade in ipairs ( vehicleData . upgrades ) do
addVehicleUpgrade ( vehicle , upgrade )
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 pozycji , obrót , koloru i tuningowania pojazdu , gdy gracz opuści pojazd
addEventHandler ( "onVehicleExit" , vehicle , function( _ , seat )
if seat == 0 then
updateVehicleDataAndSave ( vehicle , client )
end
end )
end
end
addEventHandler ( "onResourceStart" , resourceRoot , restoreSpawnedVehicles )
[ 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ć?
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
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 = 200 , UID = 20 , description = "Opis dodanego jako pierwsza linia" },
{ vehicleID = 100 , UID = 2 , description = "Opis dodanego jako druga linia" },
{ vehicleID = 300 , UID = 17 , description = "Opis dodanego jako trzecia linia" },
}
function getNewMaxUID ()
local newUID = 0 ;
local usedUID = {};
for k , v in pairs ( savedData ) do
table . insert ( usedUID , v [ "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
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: