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

Wysłany: 2020-05-12, 15:24


Gorn5







Wiek: 25
Na forum: 4276 dni
Posty: 22
Nick w MP: Rayzer

Piwa: 6

Respekt: 100
Respekt: 100

Cze??.

Nie ukrywam, ?e jestem osob? pocz?tkuj?c? w LUA. Mam du?e ambicje i plany na przysz?o??, sporo rzeczy ju? umiem, wi?kszo?? zawdzi?czam g??wnie moim umiej?tno?ciom kombinowania, jednak i one zawodz?, gdy na drodze do realizacji planu zaczynaj? pojawia? si? problemy i po wielu godzinach wci?? nie jestem w stanie sobie z nimi poradzi?. Chcia?em wszystko zrobi? sam, ale dzi? musz? prosi? o pomoc, bo nie mam ju? si?y do tych pier... tablic. Do rzeczy.

Tworz? system grup. Skrypt ?aduje grupy z bazy danych i przechowuje ich warto?ci w dw?ch tablicach. Jedna przechowuje dane og?lne dot. grup, druga grupy, w kt?rych znajduje si? posta? gracza.
addEventHandler("loadPlayerGroups"root, function(player)
    local characterUID getElementData(player"character:UID")
    local qh exports["x_db"]:Query("SELECT * FROM x_character_groups WHERE character_uid=?"characterUID)

    if qh then
        for keyvalue in ipairs(qh) do
            playerGroups[characterUID] = value
        end
    else
        return false
    end
end)

Generalnie, w kodzie wszystko dzia?a, jednak jak do cholery zrobi?, by te warto?ci z bazy by?y przechowywane pod indeksem [player][uid grupy], czyli tak:
        for keyvalue in ipairs(qh) do
            playerGroups[player][value.group_uid] = value
        end

Pr?bowa?em na milion sposob?w i nie jestem w stanie tego dobrze zrobi?, nie rozumiem do ko?ca jak te indeksy w przypadku tablic wielowymiarowych dzia?aj?, jak je p??niej w p?tli poprawnie wydoby?. Gdy daj? jeden indeks, np. [characterUID] lub [value,group_uid] to wszystko ?miga, gdy chc? to wrzuci? pod dwa, nie dzia?a.

Struktura w bazie:





Postaw piwo autorowi tego posta
 

 
Wysłany: 2020-05-12, 16:00


Pawel5321

Szkrypter






Wiek: 36
Na forum: 3810 dni
Posty: 237
Nick w MP: Pawell

Piwa: 2315

Respekt: 240
Respekt: 240Respekt: 240

Gorn5, tablice wielowymiarowe to tablice, kt?re przechowuj? w sobie tablice, wi?c je?eli chcesz przypisa? co? w ten spos?b

       for keyvalue in ipairs(qh) do
            playerGroups[player][value.group_uid] = value
        end

to element playerGroups[player] musi by? tablic?, spr?buj zrobi? tak

       for keyvalue in ipairs(qh) do
            playerGroups[player]={}
            playerGroups[player][value.group_uid] = value
        end


Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 1 piw(a):
Gorn5
Wysłany: 2020-05-12, 16:29


Gorn5







Wiek: 25
Na forum: 4276 dni
Posty: 22
Nick w MP: Rayzer

Piwa: 6

Respekt: 100
Respekt: 100

Okej, a jak teraz si? dosta? do ?rodka tej tablicy? W przypadku kiedy w p?tli for podam indeks [player] nic si? nie wy?wietla, to samo po u?yciu funkcji inspect i podania indeksu, kt?ry odpowiada UID grupy.

addCommandHandler("test", function(playercmd)
    for keyvalue in pairs(playerGroups[player]) do
        outputChatBox("k: "..key.." | v: "..valueroot)
    end
end)


//Edit
W ten spos?b?
addCommandHandler("oks", function(playercmd)
    for keyvalue in pairs(playerGroups) do
        for kv in pairs(value) do
            outputChatBox(inspect(v), root)
        end

    end
end)


Postaw piwo autorowi tego posta
 

 
Wysłany: 2020-05-12, 16:35


Pawel5321

Szkrypter






Wiek: 36
Na forum: 3810 dni
Posty: 237
Nick w MP: Pawell

Piwa: 2315

Respekt: 240
Respekt: 240Respekt: 240

Gorn5, value w takim przypadku to tablica, musisz u?y? zagnie?d?onej p?tli

addCommandHandler("test", function(playercmd)
    for keyvalue in pairs(playerGroups[player]) do
        for k,v in pairs(value) do
            outputChatBox("k: "..key.." | {["..k.."]="..v.."}"root)
        end
    end
end)


Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 1 piw(a):
Gorn5
Wysłany: 2020-05-12, 16:58


Gorn5







Wiek: 25
Na forum: 4276 dni
Posty: 22
Nick w MP: Rayzer

Piwa: 6

Respekt: 100
Respekt: 100

Ostatnia kwestia, bli?ej zwi?zana z baz? danych, tak przynajmniej mi si? wydaje. P?tla wy?wietla tylko jeden wynik pobrany z bazy, a powinny by? dwa.

local qh exports["x_db"]:Query("SELECT * FROM x_character_groups WHERE character_uid=?"characterUID)

Ustawiam UID w?asnor?cznie przez elementdat?, w bazie jest tak:


Jak wida?, character_uid w obu kolumnach ma warto?? 1. ?aduj? do tabeli:
    if qh then
        for keyvalue in ipairs(qh) do
            playerGroups[player] = {}
            playerGroups[player][value.group_uid] = value
        end
    else
        return false
    end


I wywo?uj?:
addCommandHandler("oks", function(playercmd)
    for keyvalue in pairs(playerGroups) do
        for kv in pairs(value) do
            outputChatBox(v.group_nameroot)
        end

    end
end)


Czemu wy?wietla si? tylko jeden wynik? Nie wiem w czy w bazie danych jest to poprawnie zrobione, jeszcze si? nie uczy?em MySQL. Generalnie z tego co wiem, ka?da tabela musi mie? unikaln? kolumn?, by m?c edytowa? warto?ci itd. W przypadku tabeli przechowuj?cej dane postaci w grupie, musia?bym zrobi? pust? kolumn?, kt?ra by?aby tylko po to, by by?a t? unikaln?, ?ebym m?g? edytowa? warto?ci. Jednak, gdzie? zobaczy?em, ?e jest opcja zrobienia dw?ch kolumn primary, wtedy (chyba) ich warto?ci w jednej z nich mog? by? takie same. To ju? mi si? przyda, bo np. jedna posta? nie mo?e by? w tej samej grupie dwa razy, ale mo?e by? w innych grupach (a wi?c warto?? w kolumnie np. character_uid b?dzie si? powtarza?). Nie wiem czy rozumiesz o co mi chodzi.

Wygl?da to tak:

I teraz chc? wiedzie?, czy to dzia?a w ten spos?b, ?e warto?ci w kolumnie primary z character_uid mog? si? powtarza? (bo posta? mo?e by? w kilku grupach), ale zestaw character_uid + group_uid ju? nie b?dzie m?g? si? powt?rzy?. No i czy to wp?ywa w jaki? spos?b na to, ?e p?tla wy?wietla tylko jeden wynik.

Postaw piwo autorowi tego posta
 

 
Wysłany: 2020-05-12, 17:59


Pawel5321

Szkrypter






Wiek: 36
Na forum: 3810 dni
Posty: 237
Nick w MP: Pawell

Piwa: 2315

Respekt: 240
Respekt: 240Respekt: 240

Gorn5, w tej p?tli
for keyvalue in ipairs(qh) do
            playerGroups[player] = {}
            playerGroups[player][value.group_uid] = value
        end

co powt?rzenie polu playerGroups[player] przypisywana jest pusta tablica, wi?c przechowuje tylko dane z ostatniego powt?rzenia p?tli, jak dasz playerGroups[player] = {} ponad p?tl?, to b?dzie dzia?a? poprawnie.

Co do bazy danych, to prawid?owym rozwi?zaniem by?oby stworzenie relacji wiele do wielu, aby przypisa? postaci kilka grup, zamiast wpisywa? kilka razy t? sam? posta? do bazy.

Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 1 piw(a):
Gorn5
Wysłany: 2020-05-12, 18:36


Gorn5







Wiek: 25
Na forum: 4276 dni
Posty: 22
Nick w MP: Rayzer

Piwa: 6

Respekt: 100
Respekt: 100

Jeste? wielki, bardzo dzi?kuj? za pomoc :)

Postaw piwo autorowi tego posta
 

 
Tagi: tablice :: wielowymiarowe :: indeksy
Anonymous





Na forum: 245 dni
Posty: 1



Anonymous Koniecznie zajrzyj na:






Skocz do:  
Wyświetl posty z ostatnich:   
GTAONLINE.PL » JĘZYKI PROGRAMOWANIA » LUA Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi

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