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. u funguje i v té tvé "stockové" verzi CMD:givecash(playerid,params[]) { new id,amount; if(sscanf(params,"ui",id,amount)) return SendClientMessage(playerid, 0xFFFFFFFF,"Usage: /givecash [ID][Amount]"); if(playerid == id) return SendClientMessage(playerid, 0xFF0000FF,"You can't pay to yourself."); if(GetPlayerMoney(playerid) < amount) return SendClientMessage(playerid, 0xFF0000FF,"You don't have that much."); new name1[24],name2[24],string[128]; GetPlayerName(playerid, name1, 24); GetPlayerName(id, name2, 24); format(string, sizeof(string), "You gaved $%d to %s.",amount,name2); SendClientMessage(playerid, 0xFFFF00FF, string); format(string, sizeof(string), "%s gave you $%d!", name1, amount); SendClientMessage(id, 0xFFFF00FF, string); GivePlayerMoney(playerid, -amount); GivePlayerMoney(id, amount); return 1; } ty kódy by sis měl dělat přehlednější, pak se v tom budeš ztrácet... tohle by ti mělo fungovat, pokud ne, bude chyba někde se samotnými příkazy (výsledek kopírování) jinak, zapracoval bych na angličtině
  2. vidím vidím, chtěl jsem mít všechny identifikátory v češtině, ale můj návyk zapisovat je anglicky nakonec vyhrál upraveno
  3. je fajn, že jsi to potvrdil, část o řetězci a závorkách upravena jinak k té zkrácené verzi, jako resumé je to fajn a díky
  4. Původně jsem to v plánu neměl, ale rozhodl jsem se, že tu trochu objasním, jak funguje ternární operátor ? : Obtížnost: Jak to funguje Nejprve trochu nezbytné teorie, tento operátor se nazývá ternární, protože, jako jediný v pawn, pracuje se třemi operandy. první operand ? druhý operand : třetí operand _ Operandem nazýváme výraz, se kterým operátor pracuje. Tohle by myslím stačilo, teď se podívejme na to, jak funguje. logický výraz ? pravda : nepravda _ Operátor nejprve vyhodnotí logický výraz, pokud je tento výraz pravdivý (true), vrátí to, co je za otazníkem. Pokud je výraz nepravdivý (false), tak vrátí to, co je za dvojtečkou. Uvedu příklad: #define CERVENA 0xFF0000FF #define MODRA 0x0000FF00 new color; color = GetPlayerTeam(playerid) == 1 ? CERVENA : MODRA; Nejprve dojde k vyhodnocení logického výrazu, kterým je GetPlayerTeam(playerid) == 1. Pokud hráčův tým je skutečně tým s ID 1, tak se do proměnné color uloží hodnota za otazníkem, tedy CERVENA. Pokud ovšem má hráčův tým jiné ID, uloží se do proměnné hodnota za dvojtečkou, tedy MODRA. Využití v praxi Ne všechno se dá pochopit z teorie, proto je lepší to ukázat na několika příkladech z praxe. Hráčův tým Vezměme si ještě jednou příklad seshora a trochu jej upravme. Budeme chtít, aby se proměnné color nastavila CERVENA, pokud bude hráčův tým mít ID v rozmezí od 1 do 10. Pokud ne, nastaví se proměnné hodnota MODRA. Jak to lze řešit přes podmínky: if(GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10) color = CERVENA; else color = MODRA; _ Jak my to vyřešíme šikovně přes ternární operátor: color = GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10 ? CERVENA : MODRA; GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) - logický výraz CERVENA - hodnota, která se uloží, když je logický výraz pravdivý/true MODRA - hodnota, která se uloží, když je logický výraz nepravdivý/false Pokud se v tom pomalu ztrácíte a přijde vám to nepřehledné, můžete si to ozávorkovat: color = (GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10) ? (CERVENA) : (MODRA); _ Else if? Někteří z vás si možná řeknou "A co když potřebuji další podmínku, tedy else if?!" I tohle je samozřejmě pomocí ternárního operátoru možné, ale předem vás varuji, že se v tom možná začnete ztrácet. Zadání je následující: pokud má hráčův tým ID 1, nastaví se CERVENA, pokud má ID 2, nastaví se MODRA, pokud má jiné ID, nastaví se ZELENA. color = (GetPlayerTeam(playerid) == 1) ? (CERVENA) : ((GetPlayerTeam(playerid) == 2) ? (MODRA) : (ZELENA)); Za dvojtečku jsme přidali další ternární operátor. Pokud se ID rovná jedné, není problém, nastaví se CERVENA. Pokud se jedné nerovná, přeskočí za dvojtečku, zde narazí na další ternární operátor. Vyhodnotí další logický výraz. Pokud se ID rovná dvěma, nastaví se hodnota MODRA. Pokud to nebude ani jedna a ani dva, tak je to logicky jiné ID => nastaví se ZELENA. Šlo by to takhle větvit i dál, vždy by se za dvojtečku přidal další ternární operátor, ale při větším počtu bude lepší využít klasických podmínek, popř. switche. Příklad na závěr A dáme si ještě příklad na závěr. Skloňování v češtině programátorům leckdy dost komplikuje práci, výsledek výpisu hlášek se nám mnohdy nelíbí, například tady: new pocetHracu = 3,str[145]; format(str,sizeof str,"%i hráčů na serveru.",pocetHracu); SendClientMessageToAll(-1,str); _ Server nám vypíše tohle: 3 hráčů na serveru. _ Ale my chceme, aby vypisoval: 1 hráč na serveru. 2/3/4 hráči na serveru. 5/6/atd. hráčů na serveru. _ Zkrátka aby to vypsalo správný tvar slova hráč podle počtu. Lze to řešit přes podmínky nebo switch: switch(pocetHracu) { case 1: format(str,sizeof str,"%i hráč na serveru.",pocetHracu); case 2,3,4: format(str,sizeof str,"%i hráči na serveru.",pocetHracu); default: format(str,sizeof str,"%i hráčů na serveru.",pocetHracu); } _ Ale my si to zkrátíme na jeden řádek pomocí ternárního operátoru. format(str, sizeof str,"%i %s na serveru.",pocetHracu,(pocetHracu == 1) ? ("hráč") : ((pocetHracu < 5) ? ("hráči") : ("hráčů"))); Za specifikátor %s se dosadí jeden z tvarů slova hráč. Je to také krásná ukázka toho, že ternární operátor lze použít i v parametru funkce. Ještě jedno upozornění na závěr, když má tento operátor vracet řetězec, tak jej uzavřete do závorek vždy! Nevím, zda problém stále trvá, ale dříve byly problémy s tím, že když to nebylo v závorkách, pawno mohlo spadnout. Edit: Potvrzeno, problém stále trvá, pokud řetězec do závorek neuzavřete, kompilátor přestane pracovat. Tímto ukončuji návod, doufám, že si z něj někteří něco odnesou a že vám tento operátor třeba v něčem ulehčí nebo pomůže. Pokud jste narazili na nějakou chybu nebo se chcete na něco zeptat nebo se jen vyjádřit, pište. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  5. Tohle není návod, ale opoznámkovaný script, který prakticky nic nevysvětluje. Každá část kódu by měla být vysvětlena, měl bys vysvětlit princip, jak to pracuje. Navíc, tohle je špatně: new nahodny = random(4);//na 5 tipů Tohle bude generovat čísla 0, 1, 2 a 3. Pokud chceš 0 až 4, musíš tam mít random(5). Dám ti radu, na příští návod se lépe připrav a zkus vzít v potaz mé rady.
  6. fuck you Kratos :d
  7. jak určuješ hlasy, které mají váhu? bereš je na základě dnů od registrace, počtu příspěvků, počtu reputace apod.? nebo je to odhadem? nebo podle toho, koho znáš nebo kdo přispívá do chatu? to mě celkem zajímá
  8. vEnd

    pomoc Dialog

    mohl bys prosím udělat to, o co jsem tě už dřív žádal, tj. ukázat nám ID tvých dialogů?
  9. vEnd

    pomoc Dialog

    nechápu, proč by nemohl používat switch, nemusí to nutně řešit přes podmínky pro autora: jaké používáš ID dialogů?
  10. vEnd

    pomoc stringovy pole

    tuším, že chyba bude v tom sizeof, zkus jen sizeof(CL[][])
  11. vEnd

    pomoc Hodiny

    definuj "jako mrtvola" vyzkoušel jsi tu funkci, kterou postnul UareBugged?
  12. vEnd

    pomoc Hodiny

    pickup u obchodu -> CreatePickup & OnPlayerPickUpPickup hodiny (reálné, hodiny a minuty, přes textdraw, který si budeš muset udělat): new strTime[10],timedata[2]; gettime(timedata[0],timedata[1]); format(strTime,sizeof strTime,"%02d:%02d",timedata[0],timedata[1]); TextDrawSetString(ID_textdrawu,strTime); _ by the way, když už jsi to jednou pawnil, nejsi schopen to udělat znovu? zajímavé
  13. limit pro SCM je 144 znaků
  14. vEnd

    pomoc Příkaz

    wait, podle toho, co jsi napsal, bude kód po nahrazení maker vypdat takhle: //#define JeHracDozorca(%0) if(GetPlayerSkin(%0) == 286) //nahrazeno //#define JeHracVezen(%0) if(GetPlayerSkin(%0) == 292) public OnPlayerCommandText(playerid, cmdtext[]) { if (!strcmp("/go1", cmdtext, true)) { if(if(GetPlayerSkin(%0) == 286)) //jelikož jsi měl v makru rovnou i podmínku, budou tam teď podmínky 2x { //Je dozorca } else { SendClientMessage(playerid, -1, "Tento príkaz môže použiť iba dozorca!"); } return 1; } return 0; }
  15. ten kód tam máš prakticky celý, stačí si tu část, kde se nastavují nové pozice a nová rotace, hodit do podmínky s FINAL (ano, fX, fRotX atd.)
  16. Karolínka: new Cela[10] = 0; useless, počáteční hodnota všech proměnných a polí je vždy 0, navíc takhle se rozhodně pole neinicializuje for(new i; i<10; Cela[i]++) celkem by mě zajímalo to tvé testování, právě jsi vytvořila nekonečný cyklus, poněvadž nezvětšuješ proměnnou i, ale hodnotu Cela[0] Dobrý pokus, ale ne ... ať už tedy nepíši naprázdno: - vytvoř si dvojrozměrné pole, do kterého uložíš pozice X, Y a Z pro port do určité cely, těch cel bys měl mít asi tolik, kolik je maximální definovaný počet hráčů (to dá rozum, aby měl každý svou celu), poté jednoduše použij hráčovo ID, které je vždy jedinečné: (kdyby chtěl někdo namítat, že mi chybí kontrola, zda je cela obsazená, ať si přečte tučně zvýrazněná slova) new const Float:celyPoz[MAX_PLAYERS][3] = { {0.0,1.1,2.2}, //pozice pro port do 1. cely {0.0,1.1,2.2}, // 2. cely {0.0,1.1,2.2}, // 3. cely //atd., bude nutné naplnit všechny pozice }; a do OnPlayerSpawn: SetPlayerPos(playerid,celyPoz[playerid][0],celyPoz[playerid][1],celyPoz[playerid][2]); je to jedno z možných řešení, podle počtu hráčů na serveru si MAX_PLAYERS přizpůsob podle svého, defaultně je to 500, což je do začátku zbytečné, navíc naplňování pole 500 pozicemi cel by bylo dost otravné
  17. vEnd

    pomoc SetPlayerScore

    pokud to chceš mít na prvním tlačítku, odstraň ten vykřičník (jak již bylo řečeno výše): if(dialogid == DIALOG_SETADMIN) { if(response) { switch(listitem) { case 0: SetPlayerScore(playerid, 0); case 1: SetPlayerScore(playerid, 1); case 2: SetPlayerScore(playerid, 2); case 3: SetPlayerScore(playerid, 3); case 4: SetPlayerScore(playerid, 4); case 5: SetPlayerScore(playerid, 5); } } } _ a pokud už špatně nevidím, u funkce ShowPlayerDialog ti chybí 2 argumenty, a to právě na tlačítka, takže tady je to správně: (název tlačítek si přepiš) ShowPlayerDialog(playerid, DIALOG_SETADMIN, DIALOG_STYLE_LIST, "Nastavenia Administrátora", "Hráč\nSupport\nHelper\nModerátor\nAdministrator\nHlavný administrator", "Tl. 1", "Tl. 2");
  18. v podstatě funkční, ale: - máš tam zbytečně dlouhé řetězce (na nick 100 a na celou zprávu 256, přičemž nick může mít maximálně 24 znaků a limit SCM(TA) je 144 znaků) - fakt není sranda vyhledávat pozici, kde se pickup pro aktivaci nachází hodil by se příkaz na port nebo tak něco (upřesnění pro RZEčkaře a věta "pri Las Venturas" zrovna nepomáhá, navíc jen v poznámce) - vytváříš tam makra, která potom nikde nevyužíváš (SCM, COLOR_RED) - include zcmd je tam taky nadbytečně, vzhledem k tomu, že jsi žádné příkazy nenascriptoval když se to vezme po stránce obsahové i realizační + s přihlédnutím, že s pawn teprve začínáš, tak mé hodnocení je 5/10 gl do další tvorby, určitě se to zlepší
  19. mohu vědět, kde jsi přišel na to, že FS bez nich nefunguje? nejprve si to zkus, než něco podobného řekneš edit: konec OT, přesun do SZ
  20. řekni jediný důvod, proč by tam ty dva callbacky měly být a proč bych si měl zbytečně spamovat konzoli pomlčkami... nemluv zde prosím o tom, co by správný pawner měl vědět
×
×
  • Create New...