Právě je čtv 24. kvě 2012 1:13:55
Hosting WEDOS.cz
SLEVA 25% (slevový kód:PAWNO25)

Nejnovější témata:
[otázka] Kde spraviť mod ? od D4n09
[Ms 2012] NHL 2009 Remake od SweS
[HELP] stock & undefined symbol od WilliamKrizak
asus k8v-x od 7.Host
[HELP] Pickupy ! od AvestX

Vyzkoušejte antivirus ESET Smart Security 5

Vyhledat témata bez odpovědí | Zobrazit aktivní témata Zobrazit nové příspěvky | Zobrazit vaše příspěvky


Všechny časy jsou v UTC + 1 hodina [ Letní čas ]





Odeslat nové téma Odpovědět na téma  [ Příspěvků: 10 ] 
Autor Zpráva
PříspěvekNapsal: pon 16. kvě 2011 15:58:26 
Kendall Johnson "Kendl"
Kendall Johnson "Kendl"
Uživatelský avatar
Registrován: úte 24. bře 2009 14:16:39
Příspěvky: 2877
Bydliště: Továrna na marmeželádu / Sklad bagrů

Rozhodl jsem se napsat menší tutoriál.. Normálně bych to šoupl do fóra "Vaše scripty", ale chci vám ukázat další možnost využití proměných a menší alokaci paměti.. Tutoriál se dá ovšem využít i funkčně a ve vašem scriptu by měl plně fungovat..
(Dlouho jsem nepawnil, netestoval jsem tuto funkci, ale jsem si jistý, že funguje)

[hr][/hr]
O návodu:
  • Obtížnost: 3/5
  • Určeno pro: Mírně pokročilé
  • Požadavky:
      Pokročilé práce s proměnnými,
      public OnPlayerDeath,
      public OnPlayerUpdate,
      Smyčky,
      30 minut času

Úvod
Všichni známe pojem "cheater". Člověk, snažící se obejít, či porušit pravidla ve svůj prospěch. Většinou to dělá potají a jen někdy "nahlas" aby rozrušil server. V mnoha případech ho admini chytí a uvalí na něj trest, většinou ve formě banu.. Pokud ovšem takový admin na serveru není, je potřeba aby za něj práci někdo odvedl.. Pokud by na serveru nikdo nehlídal, cheateři by měli pré. Existuje spousta anti-cheatů, některé jsou dobré a některé jsou naopak k hovnu.. Většina z nich ovšem kontroluje jen závažnější věci, jako je nesmrtelnost, speedhack apod. Málo z nich kontroluje i weapon-hack (tedy je jich více, ale většinou fungují nefungují a nebo fungují neoptimalizovaně), a z takového malého cheatování zbraní může vyústit v obrovskou revoluci. Pokud tedy chcete kvalitní script, nebo si to chcete vyzkoušet sami, tento návod opravdu využijete! Naučíme se zvládat weapon-hack a vytvoříme skript, který může zakázat jakoukoliv zbraň a naučíme se ho využívat v praxi.

Základ
Jako první budeme potřebovat nějakou proměnnou na ukládání seznamu zakázaných zbraní.. Pokud chceme alokovat méně paměti, můžeme pro celý script využít jen jednu jedinou proměnou.. Bude nám stačit pole o počtu 50 indexů, jelikož podle mě víc než 50 zbraní zakazovat nebudeme (ve skutečnosti 49.. Povíme si dál).
Kód:
new DisWep[50]; //Jediná proměnná pro celý skript.


Dále bude potřeba nějaký zdroj na zpracování seznamu. Poslouží nám stock.. (Public je zbytečné forwardování a další práce pro kompiler, stock se uloží do mezipaměti a jelikož je malý, nebude nám to nijak vadit)
Stock bude požadovat jeden parametr a to ID zbraně, která se má zakázat.

Počtář
Pro lepší pozdější optimalizaci a pro určení do jakého indexu máme ID zbraně uložit nám poslouží první index pole.. Není potřeba kvůli takovému počtáři deklarovat další proměnnou.. Počtář nám uloží počet zbraní, které zakazujeme a to využijeme jak při kontrole tak při ukládání dalších zbraní..


Základní stock
Kód:
stock DisableWeapon(ID) //Nejdůležitější věc na skriptu..
{
   DisWep[DisWep[0]+1] = ID; //Uložení ID zbraně do proměnné
   DisWep[0]++; //Používáme první index u naší proměnné jako počtáře slotů
}

Jak je zde vidět při ukládání ID zbraně inkrementujeme obsah indexu 0 jenž používáme jako počtáře co nám počítá počet zakázaných zbraní.. Inkrementujeme ho proto, jelikož při prvním uložení zbraně by bylo DisWep[0] hodnota 0 a to by bylo použito jako destinační index pro uložení ID a našeho počtáře by tím zničilo a dokázalo porušit celý skript.. Při druhém uložení již bude DisWep[0] hodnota 1 a inkrementováním dostaneme 2 což je přesně počet zakázaných zbraní..

Použití a prevence
Teď díky seznamu si můžeme jednoduše pomocí smyčky zjistit, jestli hráč má u sebe, nebo drží v ruce zakázanou zbraň a dále podle toho jednat..
Kód:
public OnPlayerUpdate(playerid)
{
   for(new i;i<DisWep[0];i++) //Znovu smyčka pro sloty a využití počtáře
   {
       if(GetPlayerWeapon(playerid) == DisWep[i+1]) return 0; //Kontrolujeme a jednáme
   }
   return 1;
}

Nyní znovu využíváme počtáře a tentokrát kvůli optimalizaci.. Je zbytečné 50 smyček, když máme zakázané 3 zbraně.. Proto nám náš počtář sdělí, kolik je na seznamu zbraní a když máme pouze 3 zbraně, tak se jen 3x provede smyčka..

Při kontrole, jestli hráč drží v ruce zakázanou zbraň, používáme naši proměnnou pro seznam a jako index využíváme inkrementovaný loop smyčky.. Pokud se tedy smyčka provádí po druhé a máme 3 zbraně tak hodnota "i" bude 1 (jelikož počáteční hodnota "i" při deklaraci je 0, jak jistě všichni víme) a jelikož už jedeme po druhé, kontrolovali by jsme první zbraň a při prvním loopu by jsme kontrolovali obsah počtáře. Tedy při prvním loopu, by kontrola srovnávala ID zbraně v rukou s počtem zbraní na seznamu a při druhém loopu by teprve kontrolovala první zbraň.. To je ovšem nežádoucí a vyřešíme to právě tím inkrementem loopu.. Tím bude první loop "i" hodnota 1, druhý 2 a třetí 3.

Pokud tedy hráč drží v ruce zbraň public vrátí serveru hodnotu 0, což u publicu OnPlayerUpdate zajistí, že tento "check" (stav kdy se klient hráče ptá serveru o nové informace, jako jsou pozice, zdraví a další věci o ostatních hráčích) server pošle klientovi minimální informace (tedy jen to, že klient je stále připojen, a příkazy ze scriptu jako SetPlayerHealth apod.) a klient nemůže updatovat zdraví, pozice ani chat.. Tím docílíme toho, že klient si může střílet jak chce, ale nikoho nezabije a dokud nezmění zbraň tak nebude ve světě s ostatními..

Pokud chceme hráči dovolit (Nevím teda proč) nosit zbraň a ukazovat ji, či s ní i střílet ostatní a kickneme ho až někoho zabije.. Můžeme použít i tento kód
Kód:
public OnPlayerDeath(playerid, killerid, reason)
{
   for(new i;i<DisWep[0];i++) //Smyčka pro všechny sloty (využíváme první index, tedy počtáře slotů)
   {
       if(GetPlayerWeapon(killerid) == DisWep[i+1]) //Porovnávání ID zbraní.. Kvůli počtáři slotů musíme inkrementovat
       {
           new str[80];
           new name[MAX_PLAYER_NAME];
          
           GetPlayerName(killerid,name,MAX_PLAYER_NAME);
           format(str,80,"%s zabil zakázanou zbraní hráče!",name);
           SendClientMessageToAll(0xFF0000AA,str);
           SendClientMessage(killerid,0xFF0000AA,"Se zakázanou zbraní si zabil hráče!");
       }
   }
   return 1;
}

Je to stejný způsob jako předtím, s jiným jednáním..

Je možno vytvořit i další stock na tu kontrolu, avšak mě se to zdá zbytečné, pokud kontrolujeme jen v jednom či dvou publicích..

Závěr
Doufám, že jste si z návodu vzali nejen skript, ale i nějaké vědomosti a trochu toho smyslu pro optimalizaci. V dnešní době sice není až tak důležité optimalizovat, ovšem je to parádní způsob rozvoje logiky a paměti.. Také je to dobrý zvyk (psát optimalizovaně), pokud se chcete později učit i jiné jazyky..

Pokud tento skript jen zkopírujete a ani nebudete vědět jak to přesně funguje, naučíte se velký ho*no a přesně pro takový lidi moje návody nejsou. Ovšem pokud tento skript chcete jen jako bokovku na server a pawnu se aktivně neoddáváte či se ho neučíte, jen berte, serverů s dobrým anticheatem stále jen ubývá..

_________________
*Brain reset*


Offline
 Profil  
PříspěvekNapsal: pon 16. kvě 2011 16:07:43 
Moderátor
Moderátor
Registrován: čtv 28. dub 2011 18:53:54
Příspěvky: 1461

Jak jsem si tak četl, tak jsem přímo hltal. Tohle je aspoň TuT hoši ! :)

Jen u poslední funkce napíše že někdo někoho zabil, a trest ? Dodělej, je to tuším Kick/Ban(i); nebo Kick/Ban(killerid); ?
Nevím :D

Ale jo, bude se to hodit, ikdyž mám jiné způsoby na dělání anti weapon hacku ;)

Moje hodnocení : 9,5/10

_________________
Používejte mozek! Snadněji tak vyřešíte záhadu Schrödingerovy kočky.


Obrázek


Offline
 Profil  
PříspěvekNapsal: pon 16. kvě 2011 16:09:01 
Kendall Johnson "Kendl"
Kendall Johnson "Kendl"
Uživatelský avatar
Registrován: úte 24. bře 2009 14:16:39
Příspěvky: 2877
Bydliště: Továrna na marmeželádu / Sklad bagrů

Jaromír Jágr píše:
Jak jsem si tak četl, tak jsem přímo hltal. Tohle je aspoň TuT hoši ! :)

Jen u poslední funkce napíše že někdo někoho zabil, a trest ? Dodělej, je to tuším Kick/Ban(i); nebo Kick/Ban(killerid); ?
Nevím :D

Ale jo, bude se to hodit, ikdyž mám jiné způsoby na dělání anti weapon hacku ;)

Moje hodnocení : 9,5/10


To je na každym, kdo si to udělá.. Kick a Ban tam není proto, že to není pro kopíráky :)

_________________
*Brain reset*


Offline
 Profil  
PříspěvekNapsal: pon 16. kvě 2011 16:16:34 
Moderátor
Moderátor
Uživatelský avatar
Registrován: čtv 11. čer 2009 12:47:03
Příspěvky: 2228

Neudával bych příklad v souvistlosti s OnPlayerUpdate. Přece jen mluvíš o optimalizaci a tento public není zrovna moc vhodný. Přece jen se aktivuje hodněkrát za sekundu a to si myslím, že je zbytečný.

K tomu cyklu:
když dáš cyklus pro maximální hodnotu, která je uložená v té proměnné a poté použiješ v podmínce i+1, tak ti to bude vyhazovat i zbraň s ID 0 u proměnné , která není nadefinována u proměnné s indexem DisWep[DisWep[0]];
Lepší by bylo použít:
Kód:
for(new i=1; i<DisWep[DisWep[0]]; i++)


A ještě toto:
Citace:
Kód:
DisWep[DisWep[0]+1] = ID; //Uložení ID zbraně do proměnné
   DisWep[0]++;

Není lepší přehodit funkce abys nemusel v indexu přičítat +1? :P

Jinak pěkný tut, myslím, že se to některým uživatelům bude hodit.

_________________
Obrázek


Offline
 Profil  
PříspěvekNapsal: pon 16. kvě 2011 16:21:07 
Barry Thorne "Big Bear"
Barry Thorne "Big Bear"
Uživatelský avatar
Registrován: pon 17. led 2011 18:26:15
Příspěvky: 331
Bydliště: C:\\program files\...

podla mna pekny tut ;)
iba jedna otazka: preco si to nedal do ffredykovej vyuky ? :)
inak 10/10dobry tut :thumbup:

_________________
Obrázek


Offline
 Profil  
PříspěvekNapsal: pon 16. kvě 2011 16:32:41 
Kendall Johnson "Kendl"
Kendall Johnson "Kendl"
Uživatelský avatar
Registrován: úte 24. bře 2009 14:16:39
Příspěvky: 2877
Bydliště: Továrna na marmeželádu / Sklad bagrů

Roman Červenka píše:
Neudával bych příklad v souvistlosti s OnPlayerUpdate. Přece jen mluvíš o optimalizaci a tento public není zrovna moc vhodný. Přece jen se aktivuje hodněkrát za sekundu a to si myslím, že je zbytečný.

K tomu cyklu:
když dáš cyklus pro maximální hodnotu, která je uložená v té proměnné a poté použiješ v podmínce i+1, tak ti to bude vyhazovat i zbraň s ID 0 u proměnné , která není nadefinována u proměnné s indexem DisWep[DisWep[0]];
Lepší by bylo použít:

Kód:
for(new i=1; i<DisWep[DisWep[0]]; i++)


A ještě toto:
Citace:
Kód:
DisWep[DisWep[0]+1] = ID; //Uložení ID zbraně do proměnné
   DisWep[0]++;

Není lepší přehodit funkce abys nemusel v indexu přičítat +1? :P


Jinak pěkný tut, myslím, že se to některým uživatelům bude hodit.


Jak jsem zmiňoval v návodu.. V dnešní době není až tak optimalizace důležitá.. Ovšem OnPlayerUpdate se dá aktivně využívat obzvláště když víš jak ho používat.. Je jasné, že dlouhý kód mu neprospívá. Pro mírně pokročilé pawnery je teď ale moc brzo vysvětlovat jim pokročilou optimalizaci.. Také bych to nejradši vyřešil tick systémem, kdy bych kontroloval až každý 5tý tick, nebo bych po aktivní kontrole založil jedno sekundový timer s další kontrolou, ale řekni mi, který mírně pokročilý má obsáhlý mód, který potřebuje takovou optimalizaci? :)

To není pravda :)
Řekneme-li že mám 3 zbraně zakázaný, tak hodnoty loopu budou 0,1 a 2.. Inkrementem dostanu 1,2 a 3 což je mým cílem.. Jelikož index 0 u proměnné používám jako počtáře... Najdi si to v návodu, přesně o tom mluvím..

EDIT: I když počtář bude obsahovat hodnotu 3, smyčka se provede pořád 3x.. Zajišťuje to právě samotné znaménko "<", které znamená menší než a nerovná se..


Pro lepší přehlednost vždy používám tento způsob.. Je to můj styl kódu a každý si kód píše po svém.. Pokud ti to tak vyhovuje, nemám námitky.. :) Je to jako takový rukopis pawnera..

_________________
*Brain reset*


Offline
 Profil  
PříspěvekNapsal: pon 16. kvě 2011 16:35:07 
Moderátor
Moderátor
Uživatelský avatar
Registrován: čtv 11. čer 2009 12:47:03
Příspěvky: 2228

Jo, v tom druhým máš pravdu. Něják jsem blbě počítal nebo přemýšlel. :thumbup:

_________________
Obrázek


Offline
 Profil  
PříspěvekNapsal: úte 17. kvě 2011 7:29:10 
T - Bone Mendez
T - Bone Mendez
Uživatelský avatar
Registrován: úte 03. lis 2009 22:16:28
Příspěvky: 95

Kód:
DisWep[DisWep[0]+1] = ID; //Uložení ID zbraně do proměnné
DisWep[0]++;

je lepsie napisat ako
Kód:
DisWep[++DisWep[0]] = ID; //Uložení ID zbraně do proměnné

kedze x++ ti cislo zvacsi o 1, ale neda sa hned pouzivat, takze napr "new i=0; printf("I=%d",i++);" ti vypise, ze i=0, ale kebyze zadas ++i, tak ti vypise, ze i=1.

_________________
[TuT]Anti-Godmode
[TuT]Tuning auta - All in one
[TuT]Jednoduche rozmiestnovanie aut
[TuT]ESC Pauza
[TuT]Premenovanie (vratane DUDB)
[TuT]Tag, untag, a ine hratky s SetPlayerChatBubble
[INC]Prehadzovanie zbrani v aute (Q+E)

Obrázek


Offline
 Profil  
PříspěvekNapsal: úte 17. kvě 2011 11:03:48 
Kendall Johnson "Kendl"
Kendall Johnson "Kendl"
Uživatelský avatar
Registrován: úte 24. bře 2009 14:16:39
Příspěvky: 2877
Bydliště: Továrna na marmeželádu / Sklad bagrů

Mmartin píše:
Kód:
DisWep[DisWep[0]+1] = ID; //Uložení ID zbraně do proměnné
DisWep[0]++;

je lepsie napisat ako
Kód:
DisWep[++DisWep[0]] = ID; //Uložení ID zbraně do proměnné

kedze x++ ti cislo zvacsi o 1, ale neda sa hned pouzivat, takze napr "new i=0; printf("I=%d",i++);" ti vypise, ze i=0, ale kebyze zadas ++i, tak ti vypise, ze i=1.


Jak jsem říkal, každý má svůj styl a pro mě je přehlednější to rozepsat na dva řádky.. Ale ano i tak se to dá napsat...

_________________
*Brain reset*


Offline
 Profil  
PříspěvekNapsal: úte 17. kvě 2011 11:15:53 
The Truth
The Truth
Uživatelský avatar
Registrován: ned 23. kvě 2010 22:39:08
Příspěvky: 573
Bydliště: new Prague[MAX_PLAYERS];

Todle je tut s velkým T !!!
GJ !! "geek"
Spoiler:
10/10

_________________
RZE je jak Justin Bieber, všude je jí plno, ale stojí za starou bačkoru !

[ Map ] - CoD 2 Style | TV Studio
[ FS ] - eXaC | Aprílový vtip
[ GM ] - Star Wars - Return of Siths | HK City

Obrázek

Nejnovější verze RZE v pawn verzi..!!!


Offline
 Profil  
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 10 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


 Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na: