Przegląd skryptów genialnych #3 – xNova

Witajcie, w kontynuacji dawno zaczętej serii, w której przyglądam się największym „perełkom” pośród skryptów PHP. Dzisiaj pod nóż pójdzie coś specjalnego, prawdziwy as wśród asów. Drodzy Państwo, przywitajcie xNovę.

Najpierw krótko o samym skrypcie. xNova to skrypt, który ma umożliwić tworzenie gier MMO via WWW wyglądających dokładnie jak OGame (mówimy tutaj o starej wersji, bo od czasu wydania ocenianej wersji skryptu, OGame doczekał się całkowitej przebudowy interfejsu).

Ciężko jest nawet powiedzieć jaką wersję będę opisywał, bo xNova od wieków nie posiada oficjalnej strony/forum/bloga. Tak więc namnożyło się bez liku wersji (najczęściej po prostu przeróbek prywatnych osób, które połatały 3% bugów i zoptymalizowały kilka zapytań). Wersja którą mam, była opisana jako „xNova 0.3 Multilanguage”, ale zdefiniowana wewnątrz skryptu stała VERSION miała wartość 0.8, więc mamy niezły rozrzut.

W związku z ilością bugów oraz masą amatorsko tworzonych „nowych wersji” najczęstszymi poradami na bugi zamieszczonymi na „profesjonalnych suportach xNovy” nie są wcale poprawki błędnej linijki, tylko zdanie „podmień sobie plik z wersji 1.1A/5.5/x.x by Ktośtam” – to też bardzo skutecznie tworzy chaos w plikach.

No, ale przejdźmy do właściwej części wpisu:

    1. Już patrząc w strukturę katalogów możemy mieć pewne pojęcie o skrypcie. W katalogu głównym umieszczono foldery scripts i js. Oba zawierają skrypty JavaScripts, część z nich jest identyczna i po analizie można dojść do tego, że około 12 z plików nie jest nigdzie używanych.
    2. Wygląd skryptu opiera się na dwóch folderach: templates, w którym leżą pliki dla systemu szablonów i skins, w którym leżą obrazki i pliki CSS. Bardzo piękne założenie, szkoda tylko , że poza tymi folderami w katalogu głównym mamy jeszcze foldery css i images, więc zmiana szablonu nie daje możliwości pełnej modyfikacji wyglądu bez modyfikacji zawartości tych folderów. Ponadto wg mnie pliki JavaScript też powinny być zależne od wybranego theme’u, a więc leżeć w jego katalogu.
    3. Przejdźmy do instalacji. Uruchamiam folder z xNovą a tam bardzo prosty do zdiagnozowania błąd. Skrypt wymaga włączonej dyrektywy short_open_tag Wracamy po szybkim restarcie serwera :)
    4. Po zmianie konfiguracji próbuję jeszcze raz i co widzę? Błąd połączenia z bazą danych zamiast instalatora. W pliku index.php jest odpowiednia instrukcja, która przekierowuje do instalatora jeśli config.php jest pusty. Niestety, ktoś udostępniając tą paczkę ludziom nie pomyślał i zostawił swojego wypełnionego configa. Tak więc poprawmy jego błędy i wyczyśćmy plik config.php. Do trzech razy sztuka...
    5. Próbujemy jeszcze raz i oto naszym oczom ukazuje się przepiękny instalator… po francusku. Szkoda tylko, że silnik posiada możliwość zmiany języka w całej grze, w instalatorze także. Niestety nikt nie pomyślał nad możliwością wyboru języka instalacji.
    6. Lecąc na czuja wypełniamy tabelkę z danymi do DB, standardowy układ jak w każdym skrypcie. Ukazuje nam się podstrona z pociesznym napisem „La base de donnée a bien été installée!”. Szkoda tylko, że ktoś jej pożarł całego CSS-a.
    7. Styl powraca, tworzymy konto admina i mamy rejestrację z głowy. Czas się zalogować.
    8. Bez problemu loguję się do gry, a tam wszystko po… tak, zgadliście, po francusku. Instalator z automatu ustawia adminowi język na francuski. Trzeba go przestawić w opcjach konta/w bazie danych.
    9. Teraz, kiedy gra już działa, przyjrzyjmy się plikom: widać wyraźnie, że każda z podstron najpierw dołącza plik common.php, a więc to jemu przyjrzymy się na początku. Co my tam mamy? Widać, że istnieje możliwość ustawienia własnych ścieżek do kilku folderów oraz domyślnego języka gry. Tylko dlaczego to nie jest w configu? Potem widzimy dołączanie kilku plików, w tym todofleetcontrol.php.
    10. Ten plik jest na tyle wyjątkowy, że zdecydowałem się go pokazać w całości:

      ```php

      ```

      Co my tu mamy? Bezmyślne dołączanie 78 plików za każdym wywołaniem strony. Nawet gdy się logujemy, rejestrujemy, oglądamy podstronę kontakt itd. silnik ładuje 78 plików potrzebnych tylko w grze.

    11. Kolejnym plikiem ładowanym w common.php jest plik /includes/db.php. On też jest w pewien sposób wyjątkowy: jedyne co robi to include’uje kolejny (jeden) plik. Gdzie tu logika?
    12. Wymieniony wyżej plik includes/db.php dołącza plik db/mysql.php. Jego zawartość też jest warta przytoczenia:

      ```php
      error(mysql_error()."
      $query","SQL Error");

      mysql_select_db($dbsettings["name"]) or $debug->error(mysql_error()."
      $query","SQL Error");
      mysql_query("SET NAMES latin2");
      echo mysql_error();}

      $sql = str_replace("{{table}}", $dbsettings["prefix"].$table, $query);
      $sqlquery = mysql_query($sql) or
      $debug->error(mysql_error()."
      $sql
      ","SQL Error");

      unset($dbsettings);
      $numqueries++;
      $arr = debug_backtrace();
      $file = end(explode('/',$arr[1]['file']));
      $line = $arr[1]['line'];
      $debug->add("
      Query $numqueries:$query$file($line)$table$fetch

      ");

      if($fetch)
      {$sqlrow = mysql_fetch_array($sqlquery);
      return $sqlrow;
      }else{return $sqlquery;}}
      ?>
      ```

      Pierwszą rzeczą jaka rzuciła mi się w oczy poza genialnym układem kodu był fakt, że przy każdym zapytaniu jest dołączany config.php. No ktoś tam nie ma mózgu… nie można po prostu dołączyć go w common.php? Tak samo ewentualne łączenie powinno się odbywać nie funkcji wykonującej zapytania tylko tam.

    13. W folderze includes znajduje się plik databaseinfos.php, który na pierwszy rzut oka jest używany do tworzenia tabel przez instalator, a krótka analiza wykazuje, że używany jest tylko tam. W takim wypadku, czy nie logiczniej byłoby go usunąć automatycznie po zakończeniu instalacji (tak jak zresztą cały skrypt). Ponadto prościej byłoby chyba, gdyby znajdował się po prostu w folderze install.
    14. Samo nazewnictwo plików jest lekko mówiąc dziwne. Czy to mówiąc o sposobie zapisu (add_moon.php, ale już activeplanet.php), czy o języku (errors.php, paneladmina.php, verband.php). Do wyboru, do koloru!
    15. Jeśli chodzi o bazę danych, to widać jak na dłoni, że była dorabiana po kawałku zależnie od konieczności. Jednak nikt nie zadał sobie trudu, aby spojrzeć na nią całościowo, przeprojektować i choćby pousuwać zbędne pola z tabel czy ustawić bardziej optymalne typy dla pól. Jako najlepszy przykład można podać fakt, że informacje o występujących w grze Księżycach są trzymane w dwóch tabelach, przy czym jedna zawiera po prostu część danych z pierwszej tabeli. Niestety, aby to poprawić trzeba dokonać dość mocnej przeróbki skryptu, a mało kto ma tyle zawzięcia.

Powyższy skrypt jest bardzo wymownym przykładem na to jak nie powinno się tworzyć jakichkolwiek aplikacji. Zero organizacji pracy i początkowych założeń daje właśnie takie efekty. Można tylko współczuć ludziom którzy z wielkim zapałem chcą zrobić "super wypasionom grem na xNovie" nie zaglądając nawet do "jej wnętrza".

10 komentarzy do “Przegląd skryptów genialnych #3 – xNova

  1. Bo liczy się tanie wykonanie i duży zysk :D Szkoda tylko, że potem trzeba przerabiać tak jak to było w przypadku demotywatorów bo skrypt nie dał rady obrobić takiej ilości requestów. Powszechna praktyka – nic dodać i nic ująć.

    • Sobak pisze:

      Jak dobrze pamiętam, to z NK.pl było tak samo :)

      Bo liczy się tanie wykonanie i duży zysk :D

      Podejście zazwyczaj niestety prawdziwe, choć tu chodzi raczej o lenistwo i podejście zbyt „na luzie”, bo to skrypt freeware.

    • Sobak pisze:

      Akurat robię w nim powiedzmy kilka „grubszych spraw”, tak więc niedługo można spodziewać się kolejnego wpisu i w nim kilkunastu kolejnych fragmentów z kodu, które dużo powiedzą o tym skrypcie :)

  2. Bland Nanite Faktory jak i comandera
    Witam jestem na etapie testowym servera xNova Revolution 5.8 i wszystko dziala prawie jak nalezy ale napodkalem bland ktorego nie potrafie jakos rozwiazac i kieruje swoja prozbe do bardziej doswiadczonych osob :

    Napodkany bland to Nanite Faktory przy rozbudowie na 22 lvl i rozbudowie stoczni na 34 lvl czas rozbudowy statkow jak i obrony pozostaje w stanie martwym 32,24 min i to jest bardzo dramatyczne szukajac w silniku tak bardzo to nie wiem gdzie szukac tego blendu .

    2 co zauwazylem to np. jak mozna zwiekrzyc Comandera bo jak nie ma sie go wlaczonego mozna robic 1 badanie a jak sie go wlaczy to mozna tylko 2 szukajac w silniku napodkalem sie tylko na taki skrypt :
    if ( $Officier == 600 ) { $offname = „commander”;}
    if ( $Officier == 601 ) { $offname = „geologe”;}
    if ( $Officier == 602 ) { $offname = „admiral”;}
    if ( $Officier == 603 ) { $offname = „engineer”;}
    if ( $Officier == 604 ) { $offname = „technocratic”;}
    $db->query(„UPDATE „.USERS.” SET `”.$offname.”` = ‚1’ WHERE `id` = ‚”.$USER[‚id’].”‚;”);
    $db->query(„UPDATE „.USERS.” SET `”.$offname.”_time` = ‚”.$newEndTime.”‚ WHERE `id` = ‚”.$USER[‚id’].”‚;”);
    $db->query(„UPDATE „.USERS.” SET `darkmatter`=darkmatter-„.$darkprice.” WHERE id=”.$USER[‚id’].””);
    if ( $Officier == 604 && $USER[‚technocratic’] == 0 ) { $db->query(„UPDATE „.USERS.” SET `spy_tech`=spy_tech+2 WHERE id=”.$USER[‚id’].””);}

    Szukajac dalej to juz na nic wiecej sie nie nadpokalem z jakims innym skryptem odpowiednim za jakie kolwiek badania

    Prosze o pomoc w uleprzeniu silnika dla Servera ktory mysle ze odzywi gre xNova
    Z pozdrowieniami
    Mlodygniewny24

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *