Hmm ja ci polecam lepiej co? takiego http://solidfiles.com/d/tSoY Zamiast GivePlayerMoney(playerid, kwota);
Uzywasz GiveMoney(playerid, kwota
. Bardziej funkcjonalniejsze
Witam,
Ten problem mo?na rozwi?za? w bardzo prosty spos?b. Jednak najpierw om?wi? tutaj jak dzia?a dodawanie pieni?dzy za pomoc? s0beita i innych cheat?w oraz jak dzia?aj? funkcj? GivePlayerMoney
1. Pieni?dze gracza domy?lnie s? po stronie klienta (gracza).
2. Domy?lny TextDraw z pieni?dzmi jest to reprezentacja graficzna pami?ci procesu gry, gdzie jest zapisana (binarnie) aktualna ilo?? posiadanych pieni?dzy.
3. s0beit i inne cheaty zmieniaj? tylko i wy??cznie warto?? w/w kom?rki pami?ci gdzie zapisane s? pieni?dze gracza TYLKO po stronie klienta. Po modyfikacji tej warto?ci zmienia si? te? reprezentacja graficzna (textdraw).
4. Funkcja serwera GetPlayerMoney pobiera w?a?nie t? warto?? z pami?ci od gracza, kt?ra mo?e by? ?atwo zmieniona przez r??ne programy do tego przeznaczone.
5. Funkcje GivePlayerMoney i ResetPlayerMoney zmieniaj? tylko warto?? w pami?ci procesu gracza.
6. Skrypt opieraj?cy si? tylko na tych trzech funkcjach jest w 100% podatny na r??nego rodzaju modyfikacje ze strony klienta. Pieni?dze nie s? nigdzie zapisywane po stronie serwera.
Rozwi?zanie:
Wystarczy stworzy? tablic? lub PVara, jak kto woli, gdzie b?dziemy przechowywa? aktualn? ilo?? pieni?dzy ka?dego gracza. Gracz nie b?dzie mia? mo?liwo?ci zmiany tej warto?ci przez wszelakie programy (s0beit itp.)
Uwaga!
Wa?ne jest aby nigy wi?cej nie u?ywa? funkcji GetPlayerMoney do sprawdzania czy gracz ma wystarczaj?c? ilo?? pieni?dzy do zakupu powiedzmy pojazdu. U?ywamy do tego naszej zmiennej tablicowej lub PVara gdzie mamy pewno??, ?e znajduje si? tam prawid?owa warto??.
Przyk?ad:
if (kasa[playerid] < 900) SendClientMessage(playerid, -1, "Masz za ma?o kasy");
gdzie:
kasa - zmienna tablicowa gdzie znajduj? si? pieni?dze graczy.
Przyk?ad deklaracji:
kasa[MAX_PLAYERS];
Uwaga2!
Po ka?dej zmianie warto?ci pieni?dzy zapisanej w tablicy u?ywamy tych dw?ch funkcji w tej kolejno?ci:
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, kasa[playerid]);
Je?li tego nie zrobimy to nie zmodyfikujemy warto?ci kom?rki pami?ci procesu gry docelowego gracza, a co za tym idzie po zakupie pojazdu gracz b?dzie my?la?, ?e mu pieni??k?w nie uby?o.
Jak mozna zauwazyc nie uzyta jest tu nigdzie funkcja GetPlayerMoney, wiec jesli gracz zmodyfikuje sobie wartosc pieniedzy nawet na 10000000000000 to i tak nic mu to nie da, poniewa? serwer pobiera warto?? ze swojej zmiennej tablicowej 'kasa', kt?r? stworzyli?my wcze?niej. Po dokonaniu jakiego? zakupu pieni??ki zmalej? graczowi do prawidlowej warto?ci.
Je?li samo takie zabezpieczenie nam nie wystarczy, mo?emy sprawdzac powiedzmy co 1min w Timerze czy kasa[playerid] == GetPlayerMoney(playerid) tzn. czy gracz czasem sobie nie dodal pieniazkow s0beitem lub innym czitem liczac na zyski. W takiej funkcji wywo?ywanej przez Timer je?li warunek kasa[playerid] == GetPlayerMoney(playerid) sie nie spelni mozemy wyrzuci? gracza z serwera lub da? mu ostrze?enie.
Uwaga3!
Wa?ne jest aby po ka?dym wej?ciu na serwer danego gracza ustawia? mu od razu pieni??ki na GivePlayerMoney(playerid, kasa[playerid]). Wa?ne te? jest ?eby przy ka?dej operacji zmiany warto?ci pieni?dzy gracza zmienia? zmienn? kasa[playerid].
To jest tylko teoria, jakby kto? chcia? wiedzie? jak to dzia?a. A to ?e nie kelner a kernel to wiem tylko ju? na gmailu by? zaj?ty "Kernel" wi?c zosta? "Kelner" . Nie kwestionuje Twojego rozwi?zania.
Rozpisa?e? si?, a 3/4 u?ytkownik?w tego forum czeka tylko na gotowy kod, aby wklei? go do tzw. "Autorskiego GameMode".
Co do nicku, GMail i GTAOnline, to dwa r??ne ?wiaty.
Ja ci tylko m?wi?em, to s? opisane funkcje opisze o co chodzi
. To s? funkcje tego ,a ?eby to zmieni? potrzebujesz wgra? tylko do folderu plik .inc kt?ry da?em ci download Tutaj jeszcze raz dam.
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach