AMX Mod X - vše co potřebuješ k serveru
Prostor pro Vaši reklamu - napište nám

Pokročilé hledání





Všechny časy jsou v UTC


 [ Příspěvků: 2 ] 
Autor Zpráva
 Předmět příspěvku: Tasky - Návod na set_task, remove_task a task_exists
PříspěvekNapsal: pát 26. kvě 2017 16:01:31 
Offline
AMXX Podpora
Uživatelský avatar

Registrován: pon 28. kvě 2012 16:35:06
Příspěvky: 2428
Bydliště: Nitra
Poděkoval: 23 x
Obdržel poděkování: 352 x
Čaute. Dnes sa pozrieme na task (úlohy/timer) v amxmodx.

Funkcie o ktorých si niečo povieme:
- set_task
- remove_task
- task_exists

Čo je to task?
- Ľahko povedané, jedná sa o časovač, ktorý nám zavolá (spustí) funkciu po určitom čase.
- Je to základná funkcia z knižnice amxmodx.inc.

Funkcia set_task
Kód:
native set_task(Float:time, const function[], id = 0, const any:parameter[] = "", len = 0, const flags[] = "", repeat = 0);

- Timer ktorým voláme funkciu až po nami určenom čase.
- Float:time - timer (časovač) ktorý má uplynúť pred zavolaním funkcie. Vždy zadávame čísla s desatinnou čiarkou (1.0, 3.2, 11.005). čas sa vždy udáva v sekundách (1 minúta = 60 sekúnd apod).
- function[] - názov funkcie, ktorá sa má zavolať po uplynutí času
- id - ID alebo index teda identifikačné číslo (v základe je 0 ale odporúčam ho prideliť vždycky)
- parameter, len - sú to len ďalšie dáta.. nepodstatné teraz
- flags - Upresnenie typu tasku, nastavenie opakovania a ďalšie nastavenia:
- "a" - timer sa bude opakovať iba určitý počet krát (podľa toho koľko mu zadáme)
- "b" - nekonečná slučka (timer sa bude opakovať dokým ho ručne nezrušíme, nezmeníme mapu alebo nevypneme server)
- Flagy nekombinovať! ("ab", "ba", apod.)
- repeat - pri nastavenom flagu na "a", touto premennou určíme počet opakovaní (napr.: ak napíšeme 20, tak 20 krát sa to zopakuje)

Príklad:
Kód:
#include < amxmodx >

public plugin_init( )
{
    register_clcmd( "say /kill", "clcmd_kill" );
    return PLUGIN_CONTINUE;
}

public clcmd_kill( playerid )
{
    set_task( 5.0, "task_kill", playerid );
    return PLUGIN_HANDLED;
}

public task_kill( playerid )
{
    if( !is_user_alive( playerid ) )
    {
        return PLUGIN_HANDLED;
    }
    client_cmd( playerid, "kill" );
    client_print( playerid, print_chat, "Spachal si samovrazdu!" );
    return PLUGIN_HANDLED;


Zo zdrojového kódu môžeme vyčítať, že hráča pri napísaní príkazu /kill za 5 sekúnd zabije.

Kód:
set_task( 5.0, "task_kill", playerid );
// 5.0 - päť sekúnd
// "task_kill" - názov funkcie ktorú zavoláme po uplynutí 5 sekúnd
// playerid - hráčové ID, ktoré neskôr použijeme


Funkcia remove_task
Funkciou remove_task odstránime už existujúci task vytvorený cez set_task.
Keď task zrušíme, funkcia ktorú sme zadali sa nezavolá (nespustí)!
Túto funkciu je možné použiť kedykoľvek a to aj keď je hráč odpojený alebo daný task už skončil. (Pri zavolaní funkcie sa task odstráni automaticky).
Kód:
native remove_task(id = 0, outside = 0);

- id - ID alebo identifikačné číslo
- outside - Pri zadaní 1 sa zrušia všetky tasky (aj v ostatných pluginoch!) s ID ktoré zadáme. (V základe je 0, tým pádom nie je potrebné ho zadávať)
- Funkcia nám vráti počet zrušených taskov:
Kód:
new pocet = remove_task( 32 );
// pocet == pocet zrusenych tasks..          


Funkcia task_exists
Jednoduchá funkcia, ktorá nám zistí či task (so zadaným ID) ešte existuje tj.: či je časovač ešte aktívny.
Kód:
native task_exists(id = 0, outside = 0);

- id - ID alebo identifikačné číslo
- outside - Pri zadaní 1 sa hľadajú všetky tasky (aj v ostatných pluginoch!) s ID ktoré zadáme. (V základe je 0, tým pádom nie je potrebné ho určovať)
- Funkcia nám vráti 1 ak task existuje, v opačnom prípade 0.

Najčastejší problém
Najľahším spôsobom ako zistiť index hráča (id) je zadať ho napriamo ako ID tasku. Hráč bude mať index napríklad 16, tak aj task bude mať id 16.
Problém ale nastáva, keď chceme v jednom okamihu pre toho istého hráča spustiť viacero taskov (timerov) naraz.
Keď vytvoríme task s ID 32 a už nám jeden s takýmto ID na serveri beží, ten predošlý task sa nám teda preruší a vytvorí sa ten nový.
Ak chceme aby sa tasky navzájom neprerušovali, musíme každému tasku zadať jedinečné ID.
To znamená, že nadefinujeme ID jednotlivých taskov:
Kód:
#define TASKID_SRAT 1000
#define TASKID_WELCOME 1500
#define TASKID_CIGAN 2500 

a spočítame ich s hráčovým indexom:
Kód:
set_task( 5.0, "task_welcome", playerid + TASKID_WELCOME );

Ako to bude pracovať:
Kód:
new playerid = 28;
#define TASKID_WELCOME 1500

set_task( 1.0, "task_welcome", 28 + 1500 ); // 1528
 

Vo funkcii "task_welcome" si zase ID hráča jednoducho vytiahneme a to odčítaním TASKID_WELCOME:
Kód:
playerid -= TASKID_WELCOME;
// Pre lepšie pochopenie: playerid = playerid - 1500;      

Prečo playerid -= TASKID_WELCOME; ?
Index hráča sa pohybuje od 1 do 32.
Keď tasku sme zadali playerid + TASKID_PISSING (príklad: playerid + 1500)
Premenná playerid bude mať v celej funkcii hodnotu 12001 až 12032.
Je to teda neplatný index a server bude vyhadzovať chybu ako napríklad: index out of bounds alebo invalid entity apod.

Záver
To by malo byť zatiaľ všetko. Akékoľvek otázky, píšte sem pod návod.
V prílohe je menšia ukážka s TASKID ;)

Pôvodné príspevky
viewtopic.php?p=51973#p51973
viewtopic.php?p=51978#p51978


Nemáte oprávnění prohlížet přiložené soubory.

_________________
S pozdravom,
K@T4pULT


Moje pluginy

VIP Chat, Don't shoot on the hostages, Server Menu

Opravené pluginy
Teleport Smoke Grenade [Fixed] (Nezabudnite poďakovať smradi)


Nahoru
  
 
 Předmět příspěvku: Re: Tasky - Návod na set_task, remove_task a task_exists
PříspěvekNapsal: stř 31. kvě 2017 20:35:43 
Offline
AMXX Perfect
AMXX Perfect
Uživatelský avatar

Registrován: stř 11. črc 2012 15:00:55
Příspěvky: 816
Poděkoval: 81 x
Obdržel poděkování: 75 x
nice :).


Nahoru
  
 
 [ Příspěvků: 2 ] 

Všechny časy jsou v UTC


Kdo je online

Uživatelé procházející toto fórum: CommonCrawl [Bot] a 0 návštevníků



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

Přejít na:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
All rights reserved 2007-2016 © by AMXMODX.cz, kopírování textů nebo grafických prvků z této stránky je bez souhlasu administrátora (jab.jab@seznam.cz) přísně zakázáno!


TOPlist