XPMOD Core [nVault/SQLx]
TheDarkDez
20.02.2015
Opis:
Co tu dużo mówić, zwyczajny xpmod(nabijamy poziomy :D). A tak na serio, to liczenie poziomu jest zaczerpnięte z Call of Duty Mod - QTM_Peyote. Cały mod ma własną walutę (Monety), status w HUD (aktualny poziom, procent doświadczenia, stan posiadanych monet). Doświadczenie/monety możemy zdobywać za: kill'a, kill'a z HS, kill'a z noza, zemstę, asystę, podłożenie/rozbrojenie bomby, uratowanie zakładnika/zakładników, wygranie rundy.
Natywy:
xpmod_add_xp - dodaje graczowi określona liczbę doświadczenia xpmod_get_xp - zwraca zdobyta przez gracza ilość doświadczenia xpmod_take_xp - zabiera graczowi określoną liczbę doświadczenia, jeśli operacja się powiedzie zwróci true a jeśli nie to zwróci false xpmod_add_coins - dodaje graczowi określona liczbę monet xpmod_get_coins - zwraca zdobyta przez gracza ilość monet xpmod_take_coins - zabiera graczowi określoną liczbę monet, jeśli operacja się powiedzie zwróci true a jeśli nie to zwróci false xpmod_get_lvl_xp - zwraca potrzebna ilość doświadczenia do awansu z podanego poziomu (parametr) na następny xpmod_check_lvl - sprawdza czy gracz ma wymagana ilość doświadczenia do awansu xpmod_load_data - ląduje dane gracza, w wersji nVault z pliku, a w wersji SQLx z bazy danych xpmod_save_data - zapisuje dane gracza, w wersji nVault do pliku, a w wersji SQLx do bazy danych
Cvary:
// zdobywanie doswiadczenia xpmod_kill_xp "10" // ilosc doswidczenia zdobywana podczas morderstwa innego gracza, jesli ustawimy 0 wylaczymy zdowywanie doswiadczenia xpmod_kill_hs_xp "15" // ilosc doswidczenia zdobywana podczas morderstwa innego gracza strzalem w glowe, jesli ustawimy 0 wylaczymy zdowywanie doswiadczenia xpmod_kill_knife_xp "20" // ilosc doswidczenia zdobywana podczas morderstwa innego gracza nozem, jesli ustawimy 0 wylaczymy zdowywanie doswiadczenia xpmod_vengeance_xp "5" // ilosc doswidczenia zdobywana gdy zemscimy sie na graczu, jesli ustawimy 0 wylaczymy zdowywanie doswiadczenia xpmod_assist_xp "5" // ilosc doswidczenia zdobywana gdy asystujemy przy morderstwie, jesli ustawimy 0 wylaczymy zdowywanie doswiadczenia xpmod_bomb_xp "40" // ilosc doswidczenia zdobywana gdy podlozymy bombe, jesli ustawimy 0 wylaczymy zdowywanie doswiadczenia xpmod_host_xp "10" // ilosc doswidczenia zdobywana gdy uratujemy zakladnika, jesli ustawimy 0 wylaczymy zdowywanie doswiadczenia xpmod_team_win_xp "5" // ilosc doswidczenia zdobywana przez team wygrywajacy runde, jesli ustawimy 0 wylaczymy zdowywanie doswiadczenia // zdobywanie monet xpmod_kill_coins "0" // ilosc monet zdobywana podczas morderstwa innego gracza, jesli ustawimy 0 wylaczymy zdowywanie monet xpmod_kill_hs_coins "1" // ilosc monet zdobywana podczas morderstwa innego gracza strzalem w glowe, jesli ustawimy 0 wylaczymy zdowywanie monet xpmod_kill_knife_coins "2" // ilosc monet zdobywana podczas morderstwa innego gracza nozem, jesli ustawimy 0 wylaczymy zdowywanie monet xpmod_vengeance_coins "0" // ilosc monet zdobywana gdy zemscimy sie na graczu, jesli ustawimy 0 wylaczymy zdowywanie monet xpmod_assist_coins "0" // ilosc monet zdobywana gdy asystujemy przy morderstwie, jesli ustawimy 0 wylaczymy zdowywanie monet xpmod_bomb_coins "4" // ilosc monet zdobywana gdy podlozymy bombe, jesli ustawimy 0 wylaczymy zdowywanie monet xpmod_host_coins "1" // ilosc monet zdobywana gdy uratujemy zakladnika, jesli ustawimy 0 wylaczymy zdowywanie monet xpmod_team_win_coins "0" // ilosc monet zdobywana przez team wygrywajacy runde, jesli ustawimy 0 wylaczymy zdowywanie monet // ustawienia moda xpmod_min_players "4" // minimalna ilosc graczy na serwerze, aby moc zdobywac doswiadczenie i monety za podkladanie/rozbrajanie bomb, uratowanie zakladnika i wygrana runde xpmod_max_lvl "100" // maksymalny poziom jaki mozemy zdobyc w grze xpmod_ratio_xp "25" // mnoznik poziomu, im wiekszy tym ciezej sie zdobywa poziomy xpmod_save_type "1" // rodzaj zapisu danych graczy, 0 - zapis wylaczony, 1 - nick gracza, 2 - steam gracza, 3 - ip gracza, 4 - nick gracza + ip xpmod_assist_dmg "25" // minimalna ilosc jaka musimy zadac graczu, aby byc liczonym do asysty xpmod_prefix "XPMOD" // prefix wiadomosci wyswietlanych przez moda // dane bazy danych, jesli uzyjemy wersji z zapisem do bazy danych xpmod_sql_host "localhost" // definuje serwer na ktorym znajduje sie baza danych, cvar dostepny tylko na wersji z zapisem danych do bazy xpmod_sql_user "root" // definuje urzytkownika przypisanego do bazy danych, cvar dostepny tylko na wersji z zapisem danych do bazy xpmod_sql_pass "" // definuje haslo urzytkownika, cvar dostepny tylko na wersji z zapisem danych do bazy xpmod_sql_name "xpmod" // definuje nazwe bazy danych, cvar dostepny tylko na wersji z zapisem danych do bazy
Changelog:
v0.9.0(nieudostępniona): pierwsza działająca wersja moda v0.9.1 - v0.9.5(nieudostępnione): naprawa błędów, ogólne poprawki, optymalizacja v0.9.6: podział na dwie wersje z różny zapisem danych graczy [nVault/SQLx]
Uwagi:
Jeśli wybierzecie wersję z zapisem do bazy, trzeba pamiętać aby podać adres serwera gry lub wstawić znak % w ?(nie pamiętam jak się to nazywało, ale chodziło o to żeby serwer miał pozwolenie na połączenie się z bazą danych). Po każdej zmianie jakiegokolwiek cvara trzeba zatrzymać serwer, a następnie uruchomić ponownie(nie wystarczy restart mapy). Jeśli mod nie będzie wczytywał/zapisywał danych gracza(SQLx), wtedy w konsoli serwera pojawią się odpowiednie komunikaty.
Pliki:
Biblioteka Mod'a:
xpmod.inc 2,1 KB
171 Ilość pobrań
Silnik Mod'a (zapis nVault, do pliku na serwerze):
xpmod_core_nvault.sma 21,93 KB
188 Ilość pobrań
Silnik Mod'a (zapis SQLx, do bazy danychy):
xpmod_core_sqlx.sma 25,98 KB
178 Ilość pobrań
Propozycję:
Jeśli ktoś będzie miał, jakieś fajne i przemyślane propozycję, które mogły by ulepszyć tą modyfikację proszę żeby pisały posty w tym temacie.
ParadisO
26.04.2015
3 sprawy, dlaczego dałeś zapis sqlx/nvault w osobnych plikach ? Myślę, ze lepiej by było zrobić wybór cvarem sposób zapisu.
Druga sprawa: Przy używaniu zapytań do sql, szczególnie INSERT/UPDATE/DELETE zawsze używaj WHERE. W tym momencie Twój mod przy zapisie sql robie wpisy jednego gracza, tzn
Jeżeli mamy na serwerze np 6 graczy to zrobi 6 wpisów z player_authorization i player_data = danym pierwszego gracza.
Trzecia sprawa w bazie danych po to są kolumny, żeby ich używać Rozbij poziom, doświadczenie i monety na 3 kolumny.
P.S.
Zawsze warto jest nadawać w tabeli jakieś ID AI
TheDarkDez
26.04.2015
3 sprawy, dlaczego dałeś zapis sqlx/nvault w osobnych plikach ? Myślę, ze lepiej by było zrobić wybór cvarem sposób zapisu.
Druga sprawa: Przy używaniu zapytań do sql, szczególnie INSERT/UPDATE/DELETE zawsze używaj WHERE. W tym momencie Twój mod przy zapisie sql robie wpisy jednego gracza, tzn
Jeżeli mamy na serwerze np 6 graczy to zrobi 6 wpisów z player_authorization i player_data = danym pierwszego gracza.
Trzecia sprawa w bazie danych po to są kolumny, żeby ich używać
Rozbij poziom, doświadczenie i monety na 3 kolumny.
P.S.
Zawsze warto jest nadawać w tabeli jakieś ID AI
Co do 1. to było dla mnie lepiej oddzielić te dwa zapisy, niż pisać je razem.
Po 2. to chyba nie rozumiesz kodu dla zapisu do bazy danych, ten public zawierający zapytanie INSERT/UPDATE/DELETE nie potrzebuje tego ponieważ public wyżej jest użyte WHERE.
A co do 3. to jest to specjalnie tak zrobione, nie musiałem zbytnio zmieniać kodu i w przyszłości miał być dostępny konwerter pomiędzy nVault a SQLx.
sebul
26.04.2015
I jeszcze:
1. A niby czemu lepiej? I co w tym trudnego, żeby dwa typy zapisów były w jednym pliku?
2. To co napisałem wyżej, taki sposób jak to jest zrobione, jest po prostu nie dopuszczalny.
3. Nawet jeśli ma być jakiś konwerter, to tutaj większa ilość kolumn na pewno w tym nie przeszkodzi.
plx211
26.04.2015
Baza aż prosi się o to:
http://pl.m.wikipedi...a_(bazy_danych)
Pisane z fona
ParadisO
26.04.2015
Przy insert where? Raczej nie
Yyy... mała pomyłka
Po 2. to chyba nie rozumiesz kodu dla zapisu do bazy danych, ten public zawierający zapytanie INSERT/UPDATE/DELETE nie potrzebuje tego ponieważ public wyżej jest użyte WHERE.
W takim razie wyjaśnij mi proszę tego screena
TheDarkDez
26.04.2015
Po co ci cvar skoro trzeba restartowaćrestartować server?
Baza aż prosi się o to:
http://pl.m.wikipedi...a_(bazy_danych)
Powiem tyle, testowałem cały mod na dwóch tabelach, w jednej był przypadkowo wygenerowany ciąg znaków(klucz/identyfikator), a w drugiej dane gracza przypisane do tego klucza/identyfikatora z pierwszej tabeli.
W drugiej tabeli były trzy kolumny, w pierwszej był klucz gracza, w drugiej informacja co zawiera trzecia kolumna(czy to ilość monet, exp'a, itd), a w ostatniej była sama liczba.
Takie rozwiązanie było poprawne ale mało efektywne,(do testów w bazie wygenerowałem 30000 wpisów, to tak jakby było zapisanych 10000 graczy) ponieważ przy 6+ graczach zaczęły się lagi serwera, a przy 11-12+ serwer zaczął się wieszać.
Dlaczego tak się działo? Bo hostingi na jednej maszynie fizycznej, tworzą kilka lub kilkanaście maszyn wirtualnych, a na dodatek baza danych dla takiego serwera będzie na jeszcze innym serwerze niż serwer gry.
Sprawa ta ma się inaczej, gdy jesteśmy w posiadaniu serwera VPS, gdzie na jednej maszynie fizycznej stoi jeden serwer gry + baza danych, tutaj nie ma prawa zauważyć jakiegokolwiek laga, ale i tutaj trzeba byłoby zmienić rodzaj zapytań już w samym modzie.
Więc w tym przypadku nie widzę sensu stosować się do tego co podałeś w linku.
P.S.
Zawsze warto jest nadawać w tabeli jakieś ID AI
Sprawdź czy da się w tabeli "auto_increment".
ParadisO, jaki typ zapisu ustawiłeś?
Użytkownik TheDarkDez edytował ten post 26.04.2015 12:54
ParadisO
26.04.2015
ParadisO, dnia 26 Kwie 2015 - 09:53, napisał:
P.S.
Zawsze warto jest nadawać w tabeli jakieś ID AI
Sprawdź czy da się w tabeli "auto_increment".
ParadisO, jaki typ zapisu ustawiłeś?
A czemu miało by się nie dać ustawić AI na nową kolumnę ?
Wszystkie ustawienia zostawiłem standardowe.
TheDarkDez
26.04.2015
A czemu miało by się nie dać ustawić AI na nową kolumnę ?
Wszystkie ustawienia zostawiłem standardowe.
Jakby się dało to bym wstawił, ale wywalało błędy.
ParadisO
26.04.2015
Proszę
CREATE TABLE IF NOT EXISTS `xpmod_players_data` (`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `player_authorization` VARCHAR(128), `player_data` VARCHAR(128))
plx211
26.04.2015
zrób tak jak pardise +
INSERT INTO xpmod_players_data VALUES(DEFAULT, '{authorizate}', '{player_data}')
gdzie {} - to zmienne dajesz
TheDarkDez
26.04.2015
zrób tak jak pardise +
INSERT INTO xpmod_players_data VALUES(DEFAULT, '{authorizate}', '{player_data}')gdzie {} - to zmienne dajesz
WTF? Do czego ty to dałeś?
plx211
26.04.2015
formatex(sqlQuery, sizeof(sqlQuery), "INSERT INTO `xpmod_players_data` (`player_authorization`, `player_data`) VALUES ('%s', '%i-%i-%i')", sqlPlayerAuthorization, corePlayerData[id][playerLevel], corePlayerData[id][playerXP], corePlayerData[id][playerCoins]);na
formatex(sqlQuery, sizeof(sqlQuery), "INSERT INTO `xpmod_players_data` VALUES (DEFAULT, '%s', '%i-%i-%i')", sqlPlayerAuthorization, corePlayerData[id][playerLevel], corePlayerData[id][playerXP], corePlayerData[id][playerCoins]);teraz lepiej?
TheDarkDez
26.04.2015
ahhhhh, ja kumam o co ci biega, tylko dziwi mnie to że ja post wyżej pisze że się AI nie da użyć, a ty piszesz mi coś takiego!
P.S.
Umiem modyfikować zapytania do bazy, o to się nie martw.
plx211
26.04.2015
To może innym sposobem (bez auto_increment):
Daj przy tworzeniu tabeli UNIQUE + ON CONFLICT REPLACE dla authorize
https://dev.mysql.co...-duplicate.html
Użytkownik plx211 edytował ten post 26.04.2015 14:26
TheDarkDez
26.04.2015
To może innym sposobem (bez auto_increment):
Daj przy tworzeniu tabeli UNIQUE + ON CONFLICT REPLACE dla authorize
Dzięki, ale to rozwiązanie jest mi nie przydatne ponieważ musiałbym zrobić nową tabelę, dodatkowe zapytanie i gdzieś musiałbym zapisać ID.