Jump to content

vEnd

Hlavní moderátor
  • Příspěvků

    772
  • Registrován

  • Aktivní

  • Vítězných dnů

    60

Everything posted by vEnd

  1. Ian "Lemmy" Kilmister (1945-2015) R.I.P.

    1. Show previous comments  1 more
    2. vEnd

      vEnd

      frontman Motörhead

    3. Woody

      Woody

      Hlavně že měli mít ten koncert v Praze.

    4. vEnd

      vEnd

      víš, smrt si většinou nevybírá

  2. Zdravím, zase po dlouhé době jsem se rozhodl zde publikovat jeden ze svých návodů. Předem říkám, že se nejedná o nic, čemu by se měli věnovat začátečníci, takže pozdější dotazy typu "Co je to if? Co je to funkce? Co je to pawn?" budou pravděpodobně ignorovány. Řeč bude o variabilních parametrech funkce a práce s těmito parametry. Obtížnost: Obsah 1. Úvod - základní principy a pojmy 2. Konstantní vs. variabilní parametry; kombinované parametry 3. Datové typy / tagy variabilních parametrů 4. numargs, getarg, setarg 5. Pořadí parametrů Úvod Než se do toho pustíme, uveďme a vysvětleme si pojmy, se kterými budeme pracovat. Je-li řeč o parametru (nebo také argumentu), je tím myšlen parametr/argument funkce. Variabilním (proměnným) počtem parametrů myslíme takové parametry, jejichž počet při definici funkce není pevně daný. To znamená, že při volání funkce můžeme dosadit vždy různý počet parametrů. Konec řečí, jdeme si ukázat, jak na to. Konstantní vs. variabilní parametry Ve většině případů pracujete s funkcemi, které mají konstantní (neměnný) počet parametrů. Může jít například o následující, notoricky známou funkci: SendClientMessage(playerid,color,const message[]); _ Při jejím volání se očekává, že pokaždé dosadíme 3 parametry (ID hráče, barvu zprávy a text zprávy), takže volání může vypadat například následovně: SendClientMessage(0,-1,"You're noob."). Pak tu jsou ale funkce, které mají variabilní (proměnný) počet parametrů. Příkladem nám může být mnou definovaná funkce pro sčítání libovolného počtu celých čísel: MultiSum(...) { new num = numargs(),sum; for(new i;i<num;i++) sum += getarg(i); return sum; } _ Když budeme volat tuto funkci, můžeme dosadit kolik parametrů jen chceme. MultiSum(3,8), MultiSum(9,3,-1,5,3) i MultiSum(1,1,1,-5,1,4,2,3,5,8) bude fungovat a bude fungovat správně. Jistě vám už došlo, že variabilitu počtu nám zajišťují tři tečky. Oba výše uvedené postupy lze zkombinovat, tedy určit několik pevně daných parametrů a zbytek nechat jako variabilní. Ale pozor, v tomto případě musí být konstatní parametry na začátku a tři tečky vždy na konci! Funkce pro formátování textu nám budiž příkladem: format(output[], len, const format[], {Float,_}:...); _ První tři parametry uvádíme vždy, další se odvíjí od počtu použitých specifikátorů. (více o funkci format) Datové typy / tagy variabilních parametrů Uvedeme-li při definici funkce pouhé tři tečky, funkce bude očekávat jen celočíselné parametry a řetězce. Chceme-li dosazovat i argumenty jiných datových typů / tagů (Float, File, Text apod.), zápis bude vypadat následovně: Float:... //pouze pro desetinná čísla {Float,_}:... //pro celá čísla, řetězce, čísla s desetinnou čárkou a logické hodnoty {Float,bool}:... //pro desetinná čísla a logické hodnoty {Text,Text3D,Menu}:... //pro ID textdrawů, 3D labelů a menu _ A takto bychom mohli pokračovat dál. Princip spočívá v tom, že před tečky uvedeme příslušný tag, pokud je jich více, uzavřeme je do složených závorek { } a oddělujeme čárkou. Znak _ (podtržítko) nám zastupuje celá čísla, logické hodnoty a řetězce. numargs, getarg, setarg Varování: Tento způsob tvoření parametrů (zejména v případě polí a řetězců) je dosti pomalý. Jsou i rychlejší alternativy, pokud umíte pracovat s direktivou emit. Nyní se dostáváme k funkcím, které pracují s parametry, jejichž počet neznáme. Již jsme je použili nahoře u funkce MultiSum. numargs() Tato funkce vrací celkový počet argumentů funkce, tedy i pevně dané argumenty, ne jen ty variabilní, na to pozor. MultiSumWithException(exception,...) { new num = numargs(),sum; for(new i=1;i<num;i++) { if(getarg(i) == exception) continue; sum += getarg(i); } return sum; } MultiSumWithException(4,1,5,3,4); //numargs vrátí číslo 5 (4 variabilní a 1 konstantní parametr) _ getarg(arg,index=0) Funkce vracející hodnotu argumentu podle zvoleného ID (arg). Začíná se od nuly, takže první argument bude mít ID 0, druhý ID 1 atd. Parametr index nám poslouží v případě, že v naší funkci použijeme řetězec nebo pole. Pole/řetězec se totiž jeví jako jeden argument (arg) a abychom se dostali k jeho buňkám / k jednotlivým znakům řetězce, musíme využít indexu (index). I tyto indexy začínají nulou. PrintThirdNumberFromArrays(...) //při volání dosadím pole a řetězec { new num = numargs(); for(new i;i<num;i++) { printf("%i",getarg(i,2)); //výpis hodnoty třetí buňky pole / třetího znaku řetězce } } PrintThirdNumberFromArrays({7,4,5,3},"ahoj"); //numargs vrátí číslo 2 (2 parametry - 1 pole a 1 řetězec), funkce vytiskne 5 a 111 (111 je hodnota znaku 'o' v ASCII tabulce, pro výpis znaku použijte specifikátor %c namísto %i) _ setarg(arg,index=0,value) Setarg nastavuje parametru hodnotu. Funguje podobně jako getarg, za arg dosadíme pořadí argumentu, index využijeme v případě polí a řetězců (jinak doplňte nulu) a za value novou hodnotu daného argumentu. Příklady: setarg(0,.value=1); //nastaví 1. argumentu hodnotu 1 setarg(3,.value=Text3D:5); //nastaví 4. argumentu hodnotu ID 3D labelu 5 (pozor, argumenty musí tento tag podporvat, viz výš) _ Pořadí parametrů Tohle až tak s tématem nesouvisí, ale když už jsme se dostali tak daleko, uvedeme si i toto. V kódu výše jsme použili .value. Tato syntaxe nám slouží k tomu, abychom nemuseli dosazovat za index nulu, ta je totiž výchozí hodnotou tohoto parametru. Zkrátka jsem tím přeskočil defaultně určený argument. Toto přeskakování parametrů můžete vidět například zde. Když se nám zachce (ale podotýkám, že je to zbytečné), můžeme tím měnit i pořadí normálních argumentů: SendClientMessage(0,0xFF0000FF,"Ahoj!"); //parametry doplněné v typickém pořadí playerid, barva, zpráva SendClientMessage(.color=0xFF0000FF,.message="Ahoj!",.playerid=0); //tatáž funkce, akorát jsem změnil pořadí argumentů _ Hodí se ještě uvést, že u variabilních parametrů toto nelze dělat. A proč? No protože nemají u definice funkce svůj název/identifikátor (jsou tam jen ty tři tečky, popř. tagy, to nestačí). No a to máme vše. Doufám, že jste se něčemu přiučili, profesionálové mi to mohou zkontrolovat, grammarové hledat gramatické a pravopisné chyby, hnidopichové podotknout, že tenhle návod je i jinde (áno, překvapivě jsem ho taky psal já ) a ostatní mi vyjádřit svůj názor, budu rád. Ok, I'm out. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  3. Tohle ne, pawn nepodporuje čtyři a více dimenzí. 3D tam má asi proto, že to má rozdělené do skupin, čili skupina, vozidlo, délka.
  4. Pak tam máš málo, protože ID může být 0 až 499.
  5. Chceš mi tvrdit, že playerid, jehož hodnotu nebude mít žádný tvůj hráč vyšší jak 499 (3 znaky), zabírá 8 znaků?
  6. Vzkaz od Tanga, cituji: "Ak vám napadá to riešiť len písaním pluginov, tak evidentne nemáte dosť skúseností ani na napísanie toho pluginu. Google -> callback hooking Pawn -- Tango"
  7. vEnd

    pomoc [HELP] SetTimer

    Jestli děláš na módu, tak pak to nech v OnGameModeInit. Akorát by mě zajímalo, proč máš v poznámce jednou tohle: /////////////// public nad OnFilterscipt A pak tohle: //timer na začiatku v gamemodeinit Měl by sis v tom udělat trochu pořádek, i v těch poznámkách... Ten kód, co jsem ti poskytl, by měl normálně fungovat, pokud ti nejde (a pokud ti nefungují žádné timery), bude chyba jinde, momentálně mne ale nenapadá, kde. Dej sem ještě ten OnGameModeInit.
  8. vEnd

    pomoc [HELP] SetTimer

    forward Vyplaty(); public Vyplaty() { static const vyplataCastky[8] = {3563,7864,7480,7503,5320,4830,8450,4956}; for(new i,a=GetPlayerPoolSize();i<=a;i++) { if(!IsPlayerConnected(i)) continue; new str[145]; format(str,sizeof str,"[ -- JOBS -- ] %s %i$.",PlayerInfo[i][pJob] == 0 ? ("Obdržal si podporu pre nezamestnaných") : ("Prišla ti výplata"),vyplataCastky[PlayerInfo[i][pJob]]); SendClientMessage(i,COLOR_BLUE,str); GivePlayerMoney(i,vyplataCastky[PlayerInfo[i][pJob]]); } return 1; } Tento kód by měl být funkční, ale tvůj problém bude asi v tom, že máš filterscript, ale časuješ to v OnGameModeInit. Pokud to opravdu máš jako FS, dej tohle: SetTimer("Vyplaty",10000,true); Do callbacku OnFilterScriptInit.
  9. if(GetVehicleModel(vehicleid) == 460 || GetVehicleModel(vehicleid) == 511 || GetVehicleModel(vehicleid) == 519 || a takhle pokračuj) Pokud těch ID nebudeš mít časem nějaké větší množství (deset patnáct a víc), dá se to vyřešit takhle, jinak bych si udělal funkci: CorrectVehicle(modelid) { static const models[] = {460,511,519,577,593,592,553}; //lze přidávat další for(new i;i<sizeof models;i++) { if(modelid == models[i]) return 1; } return 0; } A použití pak bude vypadat následovně: if(CorrectVehicle(GetVehicleModel(vehicleid))) //je v jednom z těch vozidel
  10. 1. Tohle new Text:Textdraw0; si dej někam nahoru pod includy / k ostatním globálním proměnným, pokud to doposud máš v OnGameModeInit. Zbytek tam nech. 2. Ve chvíli, kdy chceš TD zobrazit, použij funkci TextDrawShowForPlayer, nebo TextDrawShowForAll. Za parametr Text:text budeš dosazovat tu proměnnou Textdraw0. Jde o to, že tvým kódem TD pouze vytvoříš, funkcemi, které jsem uvedl v bodu 2, je zobrazíš buď pro jednoho, nebo pro všechny hráče.
  11. Pozor SB, časuješ funkci bez parametrů, ale při její definici parametr máš. V tomhle případě bude mít vždy hodnotu 0.
  12. vEnd

    pomoc Plugin v C#

    Hele já nevím, asi jde, ale nemám s tvořením pluginům žádné zkušenosti (a nejsem si jistý, že zde najdeš někoho, kdo má), chtěl jsem ti akorát dát alternativy, než (jestli vůbec) se někdo ozve.
  13. vEnd

    pomoc Plugin v C#

    Našel jsem ti pár návodů z oficiálního fóra: #1 #2 Nevím, zda jsou aktuální, každopádně nějaké informace se tam dozvíš, než ti zde někdo odpoví.
  14. A ty máš všechny hry, co kdy šly na Windows 8? Vcelku zajímavé... Má pravdu, nemůžeš s jistotou vědět, že všechny půjdou.
  15. Krátké hodnocení na základě popisu a krátké návštěvy serveru (~ 15 minut): Další mód lehce splývající s desítkami podobných, neustále se držící stejných vzorců (jak jsem projížděl městem, místy mi to připadalo povědomé až ohrané, což mi zrovna chuť do dalšího hraní nedodalo) a s poměrně očividnou inspirací v jiných módech, i přes to lze říct, že patří k jedněm z těch lepších (nerad bych jej házel do stejného pytle s těmi módy, které jsou poskládané z deseti scriptů, nalezených na různých fórech o pawn). Je poznat, že si developer s ním dává práci, jsou v něm i náznaky kreativity (gang systém, eventy). Zdá se, že to míří správným směrem, chce to ale originalitu a zapojit více kreativní myšlení. Za mě 6/10, když jsem tam byl, viděl jsem, že hráče máte a že je to baví, a to je nakonec to, oč tu jde. Hodně štěstí do dalšího vývoje.
  16. Já bych k tomu tvému kódu měl také ještě poznámku - tohle: new Otazka[100][131]; A tohle: Otazka[id] = EOS; Určitě fungovat nebude, kompilátor tě ani nepustí. Doporučuji ti ty kódy zkoušet, než je postneš.
  17. what about SetPlayerVirtualWorld(playerid,playerid)? edit: popř. kdybys nechtěl, aby se vw 0 používal, tak SetPlayerVirtualWorld(playerid,playerid+1)
  18. V tomhle máš sice pravdu, ale on se ptá, proč se mu to otevírá i v případě, že nestiskl dané tlačítko, jak vidíš, kód dal z callbacku OnPlayerKeyStateChange. SwoBii: V názvu funkce vidím Autoskola, jsi tedy ve vozidle, když se ti to stále zobrazuje? Protože KEY_SPRINT odpovídá tlačítku W, když jsi ve vozidle. (zde to máš napsané) To by dost dobře mohlo být důvodem, proč se ti to neustále zobrazuje. Pokud nejsi ve vozidle, ujisti se, že tu funkci nevoláš i jinde, třeba v OnPlayerPickUpPickup. Jinak, když chceš zjistit, zda zmáčkl danou klávesu, používej operátor &, ne ==. Viz tohle.
  19. Zkus si to přeložit - kryjí se ti názvy proměnných. Tuhle máš pojmenovanou vehicle a nějakou v nadřazeném bloku a/nebo globální máš také pojmenovanou vehicle. Vyřešíš to jednoduše, jednu z nich pojmenuj jinak, třeba vehicleNeco.
  20. vEnd

    script Jednoduchý náhodný text.

    když mu chceš poradit, tak alespoň správně, velikost musí být 11 (EOS)
  21. vEnd

    script Jednoduchý náhodný text.

    kdybys ta jednotlivá písmena použil jako znaky ('A', 'B' a pak %c%c atd.), nemusel bys mít LetterList jako 2D pole... neber to ani tak jako výtku, jako spíš možnost ušetřit trochu paměti btw, nepřehánějte to s tím YSI, taky to nemusí být v každém 50řádkovém scriptu
  22. Dost laxně vysvětlené, každopádně: autor toho editoru se jmenuje Zamaroht, ne Zamaroth u pragmy máš místo unused pouze unsed v názvu návodu bys měl mít na konci ještě [**]
  23. a jak si představuješ, že to chodí v životě? že ti firma zaplatí SMSkou do hry nebo ti dá administrátorská práva k nějakým systémům?
×
×
  • Create New...