Dni mijają jak godziny…
Dokładnie tak, a godziny jak minuty. Szczególnie ostatnio, kiedy to chciałem zapiąć update na serwerze na ostatni guzik.
Do kontroli zrodel stworzylem repozytorium, wiadoma sprawa, latwiej mi bedize cos odkrecic a wszystkie zmiany beda logowane, porzadek przede wszystkim.
Update zaczal sie tym, ze mielismy pomysl na usprawnienie blessow na serwerze. Stary system byl za prosty i powiedzmy sobie szczerze nie nadawal sie na dluzsza mete. Ot gracz majacy kase (tibiowa) szedl do NPC w celu kupienia amuletu, jak juz mial amulet to wlos mu z glowy nie spadal, ani zaden skill, exp czy inny magic level.
Sam pomysl byl juz dawno rzucony, ale z braku czasu, checi i umiejetnosci zostaw gdzies w zakamarkach forum. Ostatnio jednak, majac sporo do czynienia z kodem silnika, postanowilem wziac sie sam do pracy.
Na poczatku wzialem sie za wkurzajacy party system, ktory od 2 lat wywalal ciagle wiadomosc ze ktos dolaczyl do party i tym razem jakos mi to problemu juz nie stwarzalo, problem usuniety. Kolejna rzecz – yellow skulle. Po kilku dniach prob i testow wreszcie udalo sie osiagnac cel, banal.
Kilka dni pozniej zalogowalem sie w celu inwigilacji, co jeszcze moze byc nie tak w obecnych systemach. Na niewidce za graczem podarzajac dostalem hit z exori mas (jeden z lepszych czarow na naszym serwerze, jego zaleta jest to, ze moze laczyc sie w comba). Zdenerwowany tym, ze zostalem zdekonspirowany odpalilem zrodla w poszukiwaniu odpowiedzialnych linijek. Zwykly warunek wystarczyl, dodatkowo jeszcze maly fix zeby nie uderzac w gracza w pz i gra gitara. A dla graczy maly dodatek – liczenie combo z czaru.
Kolejna sprawa, viplista – sa chyba ze 2 funkcje w yurotsie, ktore warunki dodawania siebi lub osoby ktora juz jest na liscie neguja. Ale co z tego skoro nie sa wykorzystane w protocol76. W kadym razie, zrobione. Fajno, przydaloby sie zabrac za bless.
Dzialanie kodu jest banalnie proste. Sa dwie itemki blessowe i 5 leveli blessingu. Jedna itema dodaje +2, druga +1. Gracze PACC maja jeszcze gratis +2 do blessingu.
Prosta niby rzecz, tutaj fromSlot() i toSlot() wykorzystamy, przy logowaniu sprawdzimy czy gracz ma itemki blessowe, przy logoucie odbierzemy mu blessing z PACC, zeby przy relogu mu sie nie dodawalo, wszystko gra i buczy, nowe DIEPERCENTY zdefiniowane, dorzucam do config.lua.
Dziala. Super.
To co by tu jeszcze… a dodam ze jak gracz zalozy amulet to dostanie ladny message – zrobione. Wsio dziala.
Loguje sie kalik do testowania, rzuca amulet na ziemie, ja z ziemi do slota go wrzucam i crash… Co jest, przeciez dzialalo, hmm siedze w players.cpp. Cholera chyba wiem zamiast sendTextMessage zrobie this->sendTextMessage, moze z dwoma playerami ma problem jesli ten drugi tez ma taka itemke na sobie. Dupa to samo.
Godzina, jedna druga no nic chyba to zostawie i zajme sie dopieszczeniem blessa, bo widze ze diepercenty nie dzialaja jak trzeba przy zrzucaniu expa.
W koncu po wielu meczarniach udaje sie zrobic z expem jak i z messege dla graczy.
Ddam jeszcze przy deadzie ile gracz stracil % skilli i mgc levela, bedize ciekawiej, ok zrobione. Dalsze mniej znaczne poprawki, w stylu zjadanie itemek blesowych po smierci, jedna dziala jak aol, druga nie etc. To tam nic.
Przyszedl czas na wrzecenie tego na serwer. Skrypty lua poedytowane, wszystko ma chulac. Robie miliard rzeczy na minute, otwarte okienka nie mieszcza sie juz na pasku start, kompilacja trwa, restarter juz odlicza, pliki sie podmieniaja, za chwile jeszcze tylko backup i ruszamy.
I ruszylismy…
1. Zapomnialem podmienic skompilowana binarke
2. Jak gracz padnie z aolem – zabiera mu bp i czesc eq.
3. Wiadomosc: You were downgroaded, nie pokazuje wlasciwych danych.
4. Gracz z blessingiem na 4 stracil 5 leveli oO.
Ok zamykam serwer, notka na stronie i zaczynam poprawiac. Pierwsza mysl – jak do tego moglo dojsc, przeciez wszystko sprawdzalismy… Ale pol godziny i bedzie gotowe.
Minelo pol godziny, co jest ku***a z ta je***na funkcja getLostExperience()… Zasada jej dzialania jest prosta jak drut – od obecnego stanu experience odejmij obecny stan experience razy ilosc procent straty. Ustawiam zeby zwracalo zero przy pelny blessie. Napierdzielam std::coutami jak dziad wata cukrowa na festynie. Patrze i oczom nie wierze, ustawilem zero, w grze komunikat ze gracz spadl z 500 levelu na 1. W konsoli ujemna wartosc expa – no to jajca jakies.
Dopiero pozniej udalo mi sie ustalic ze to jednak nie w tym miejscu jest blad, tylko w Player::die() oraz Player::preSave(). Wczesniej praktycznie cala funkcje die() zmienilem, na potrzeby blessa i kilku poprawek, jest 3 w nocy a ja widze ze ta funkcja nie dziala wogole tak jak powinna. Meka… umysl juz nie ten sam, ale dzielnie walczyl ze snem – wypalilem przy tym pol paczki fajek, przy kazdej jednej mialem inny sposob na zalatwienie problemu.
Ale jednak o ok 4 nad ranem, blad poprawilem, posprawdzalem, diepercenty dzialaja pieknie, wiadomosc do gracza o downgradzie tez, mimo iz calkiem w innej funkcji tak jak i caly blok kodu zrzucajacy exp.
Noc do tylu, odpalam serwer, usuwam newsa o poprawkach i ide spac…
O 13 sie budze, wpadam na serwer i poprawiam jeszcze pare glitchy, ktore zostawilem w nocy. Reszta dziala jak marzenie. Wolne… W statusie.cpp na sam koniec tej mordegi zamiast wersji serwera ustawiam sobie wersje rewizji w repo. Zeby pamietac. Akurat wyszlo tak ze 100 rewizja zakonczyla wszystkie poprawki. Okragla liczba w sam raz na update.
Przez to uzmyslowilem sobie ile zycie przecieka mi przez palce ostatnio i jak niewiele czasu mam dla siebie i dziewczyny, dodatkowo sesja na studiach zbliza sie nieublaganie.
A wiec na ta chwile zegnam sie czesciowo z aka i otsoftem i biore urlop od neta – czas popchnac zycie i studia do przodu. Oczywiscie bede ale okazjonalnie. Do zobaczenia pod koniec stycznia.