←  Nowości

AMXX.pl: Support AMX Mod X i SourceMod

»

Inny
XPMOD Core [nVault/SQLx]

  • +
  • -
TheDarkDez - zdjęcie 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: Załączony plik  xpmod.inc   2,1 KB   171 Ilość pobrań

Silnik Mod'a (zapis nVault, do pliku na serwerze): Załączony plik  xpmod_core_nvault.sma   21,93 KB   188 Ilość pobrań

Silnik Mod'a (zapis SQLx, do bazy danychy): Załączony plik  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.
Odpowiedz

  • +
  • -
ParadisO - zdjęcie 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 :)

Odpowiedz

  • +
  • -
TheDarkDez - zdjęcie 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.

Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 26.04.2015

Przy insert where? Raczej nie, ale tak jak wyżej, ch*owy kod sql, popraw bo na to patrzeć się nie da.
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.
Odpowiedz

  • +
  • -
TheDarkDez - zdjęcie TheDarkDez 26.04.2015

sebul co jest w moim kodzie takiego ch****ego?

Odpowiedz

  • +
  • -
plx211 - zdjęcie plx211 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)

Pisane z fona
Odpowiedz

  • +
  • -
ParadisO - zdjęcie 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

Załączone miniatury

  • Bez
Odpowiedz

  • +
  • -
TheDarkDez - zdjęcie 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
Odpowiedz

  • +
  • -
ParadisO - zdjęcie 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.

Odpowiedz

  • +
  • -
TheDarkDez - zdjęcie 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.

Odpowiedz

  • +
  • -
ParadisO - zdjęcie 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))
Odpowiedz

  • +
  • -
TheDarkDez - zdjęcie TheDarkDez 26.04.2015

Ja wiem jak to zadeklarować tylko że to nie działa.

Odpowiedz

  • +
  • -
plx211 - zdjęcie plx211 26.04.2015

zrób tak jak pardise +

INSERT INTO xpmod_players_data VALUES(DEFAULT, '{authorizate}', '{player_data}')

gdzie {} - to zmienne dajesz 

Odpowiedz

  • +
  • -
TheDarkDez - zdjęcie 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ś?

Odpowiedz

  • +
  • -
plx211 - zdjęcie plx211 26.04.2015

to co paradise +

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?
Odpowiedz

  • +
  • -
TheDarkDez - zdjęcie 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. :)

Odpowiedz

  • +
  • -
plx211 - zdjęcie plx211 26.04.2015

czemu niby nie da się użyć?

 

Odpowiedz

  • +
  • -
TheDarkDez - zdjęcie TheDarkDez 26.04.2015

Normalnie, nie da się, wywala błąd i koniec!

Odpowiedz

  • +
  • -
plx211 - zdjęcie 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
Odpowiedz

  • +
  • -
TheDarkDez - zdjęcie TheDarkDez 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

 

Dzięki, ale to rozwiązanie jest mi nie przydatne ponieważ musiałbym zrobić nową tabelę, dodatkowe zapytanie i gdzieś musiałbym zapisać ID.

Odpowiedz