Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Bardzo zawansowane API.
Forum PHP.pl > Inne > Hydepark
php'master
Witam,

Jestem w trakcie pisania dużgo projektu,serwera do gry. Zakładam osiągnięcie więcej niż 550 graczy w jednej chwili. Jest problem dlatego, że niestety MUSZĘ mieć około 100 kolumn w bazie. Do tego powinno dojść około 700 postaci, bo nie każdy gra w jednej chwili ale tam są te 'Postacie graczy'.

Dlatego podczas uruchamiania serwera, zamykania, crashingu, wychodzenia gracza z serwera, wchodzenia gracza na serwer muszę jakoś umiejętnie pobrać te dane. Przy starcie i zamknięciu serwera dane wszystkich osób z serwera co są aktywne. Ale jak gracz wchodzi na serwer to mogę tylko jego.

Myślałem nad czymś takim:

?Wczytywanie wszystkich graczy

  1. local gracze = exports.sql:query_assoc_single( "SELECT * FROM postacie WHERE graczID = " .. tonumber( userID ) .. " AND postacID = " .. tonumber( charID ) )
  2.  
  3. p[ source ].money = gracze.Pieniadze
  4. p[ source ].characterName = gracze.NazwaPostaci
  5.  
  6. ...i tak około 100 kolumn.


Potem przypisuję postacID do stałej player by skrypty wiedziały o którego gracza chodzi. Jeżeli chodzi o inne skrypt to zamierzam się odwoływać w sposób p[ source ].Coś_co_chce. Działać na takiej tablicy i jak serwer zostanie zamknięy, gracz wyjdzie czy coś to całą zrzucić do bazy zapytaniem.

Jak ktoś wie jak to zoptymalizować albo coś zmienić to będę wdzięczny.

http://lua-users.org/wiki/TablesTutorial

smile.gif.
bim2
Przy starcie nie masz co pobierać danych graczy. Pobierz tylko przy logowaniu się gracza na serwer i dopisz do listy, a jak się wylogowuje uaktualniasz bazę danych i czyścisz go z listy. Do tego dla bezpieczeńśtwa co pare min. robisz zapis całego stanu gry.

Bardzo niekonsekwentnie nazywasz sobie zmienne.
Kod
p[ source ].characterName = gracze.NazwaPostaci

Tak po angielsku a w bazie po polsku. Łatwiej dla ciebie będzie przypisywać sobie tak jak masz w bazie.
Ogólnie dbać musisz o pamięć, 100 kolumn to w miarę dużo. Może powiesz czego gra będzie dotyczyć?
php'master
Odwzorcowywania realnego świata/roleplay w grze. Czyli normalnie, możesz mieć samochód, dom itd. ale nie odrazu, musisz na to zapracować.


Mam jeszcze pytanko małe, aby sprawdzić czy jakiś gracz jest Adminem... to trzeba iterować wszystkich ?
  1. function sluzbaAdmna()
  2. for i,player in ipairs(getElementsByType("player")) do
  3. if(getElementData(player, "gracze.JestAdminem") == "1") then


Sorry, że na forum PHP, ale ten język wogóle nie jest w Polsce rozwinięty no i zna go około 15 osób.
Pawel_W
sorry za offtop, ale zdziwiłbyś się ile osób zna lua, OTS'y do Tibii są na nim oparte wink.gif
php'master
Aha, ale mało osób zna funkcje bardziej rozwinięte np. interpolacje.

A więc jak gracz wchodzi to pobieram jego dane i wrzucam do tablicy, a jak chce komuś zmienić życie to pobieram jego Nick po czym iteruję tablicę pętlą for by znaleść identyczny nick? ...czy jest jakieś lepsze rozwiązanie.
Mephistofeles
15 osób? Fajnie, jestem dość wyjątkowy biggrin.gif. Język jak język, normalny skryptowy, ja tam widzę tylko niewielkie różnice. Używam w Homeworld 2.
bim2
Kolegów moich dwóch właśnie do OTSów robi skrypty w lua smile.gif Nie jest z tym językiem tak źle właśnie ze względu na Tibię. :]

Co do sprawdzania czy ktoś jest adminem. Ja przy wczytywaniu danych gracza sprawdziłbym czy jest adminem i wrzucił do osobnej tablicy adminów jego id np. I pamiętaj, jak wczytujesz graczy do tablicy to najlepszym wyjściem będzie jako klucz wrzucić id gracza.
Speedy
Cytat(php'master @ 26.02.2011, 16:25:35 ) *
[...]
Jest problem dlatego, że niestety MUSZĘ mieć około 100 kolumn w bazie.
[...]


Wiesz, co to jest normalizacja?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.