Would you like to react to this message? Create an account in a few clicks or log in to continue.

    [mega-TuT] Timer

    avatar
    QWER
    Znalec


    Posts : 60
    Join date : 28.04.2011

    [mega-TuT] Timer Empty [mega-TuT] Timer

    Odoslať pre QWER So apríl 30, 2011 9:53 pm

    Dobrý den Súdruhovia, súdružky ale hlavne občania tohto fóra. Veľa krát a stále častejšie vidím že niektoré módy majú aj 10 timerov a nieje raritou že častokrát je aj viac timerov na jednu sekundu. Asi vyšlo z módy ale stále o timeroch platí "čím menej tím lepšie". Je to tak, v následujúcich textoch si ukážeme niekoľko spôsobov ako naplno využiť jeden timer.

    Môže mód fungovať na jednom timery ?
    Áno, môže. Ide iba oto, aby ste ho vedeli využiť.

    Kedže už v úvode som hovoril otom že vám ukážem niekoľko spôsobov tak ich aj pomenujem[Varianta A (skrátene V.A, V.B...)] a na konci ohodnotím.

    Teoretická čast:


    Ako to vlastne funguje ?

    V.A By mohla fungovať tak že mód bude využívať 2 timery, jeden sekundový + druhý 2,5 sekundový (alebo iný, aký uznáte za vhodné/potrebné). Všetky scripty by sa dávali do tých dvoch publicoch.
    Výhody:
    + Môžete to využiť a použiť iba 1x ForConneted
    + Môžete rozumne nakladať zo stringom
    Nevýhody:
    - Ak ste :prase: tak je možné že tam bude bordel a nikto iný okrem vás sa tam nevyzná
    - Náročnejšie hladanie chyby

    V.B By mohla fungovať tak že mód bude využívať 1 timer (hlavný sekundový) a ak by niekto potreboval npr. tip tak cez premeny. Všetky scripty by sa dávali do toho publicu
    Výhody:
    + Možnosť využívať aj iný čas (npr. 10 sekund)
    + Možno rozumne nakladať zo stringom
    Nevýhody:
    - Ak ste :prase: tak je možné že tam bude bordel a nikto iný okrem vás sa tam nevyzná
    - Náročnejšie hladanie chyby
    - Viac premenných -> vačšia záťaž na RAM

    V.C By mohla fungovať tak že mód bude využívať 2 timery jeden sekundový + druhý 2,5 sekundový (alebo iný, aký uznáte za vhodný/potrebný). Scripty by sa nedávali rovno do publicu ale by sa "rozmnožili" do viacerých stockov/publicov.
    Výhody:
    + Jednoduchšie hľadanie chýb
    + Priehľadný kód
    (Ak zvládnete, + môžete 1x použiť ForConnected)
    Nevýhody:
    - Viac stringov

    V.D By mohla fungovať že mód bude využívať 1 timer (hlavný sekundový). Script by sa nedával rovno do publicu ale by sa "rozložil" do viacerých stockov/publicov a využívali by sa premenné, aby sa mohlo docieliť že sa npr. public tip spustí za 5 sekund
    Výhody:
    + Možnosť využívať aj iný čas (npr. 10 sekund)
    + Priehľadnejší kód
    + Jednoduchšie hľadanie chýb
    (Ak zvládnete, + môžete 1x použiť ForConnected)
    Nevýhody:
    - Viac premenných -> vačšia záťaž na RAM
    - Viac stringov

    V.E By mohla fungovať tak, že mód bude využívať 1 timer (hlavný sekundový). Script by sa "rozložil" do viacerých stockov/publicov a využívali by sa booly + 1 premenná
    Výhody:
    + Možnosť využívať aj iný čas (npr. 10 sekund)
    + Priehľadnejší kód
    + Jednoduchšie hľadanie chýb
    + Iba Jedena 32 bitová premena
    (Ak zvládnete, + môžete 1x použiť ForConnected)
    Nevýhody:
    - Viac stringov
    - Veľká šanca že timer nepôde ako švajciarske hodinky

    Praktická časť:

    Kedže už v úvode a v teoretickej časti hovoril o tom že vám ukážem niekoľko spôsobov tak aby ste sa nezľakli, nepremenoval som ich.

    Upozornenie ! Toto sú iba názorné ukážky ! Preto tam nepoužijem forward a vynechávam ";" a pod.

    V.A Máte v móde
    kód:

    SetTimer("SecondTimer",1000,1)
    SetTimer("MinuteTimer",60000,1)
    a potom samotný public
    kód:
    public SecondTimer(){
    ForConneted(i,GetMaxPlayers()){
    GetPlayerHealth(i,health)
    if(health > 100) BanEx(i,"Health-Hack")
    if(GetPlayerMoney(i) > 99999999) ResetPlayerMoney(i)
    }}
    a tak aj
    kód:
    public MinuteTimer(){
    ForConneted(i,GetMaxPlayers()){
    if(GetPlayerWeapon(i) == 35) BanEx(i,"Weapon-Hack")
    if(GetPlayerPing(i) > 500) Kick(i);
    }}
    Chyby pádu servera by sa museli hladať takto
    kód:
    public SecondTimer(){
    ForConneted(i,GetMaxPlayers()){
    GetPlayerHealth(i,health)
    print("Health")
    if(health > 100) BanEx(i,"Health-Hack")
    print("Money")
    if(GetPlayerMoney(i) > 99999999) ResetPlayerMoney(i)
    }}
    ako teoria hovorí, kebyže takto máte viac vecí tak je v tom obrovský bordel
    Spôsob hodnotím na: 1/5
    Vyjadrenie: "Tento spôsob sa hodí na menšie módy ako napríklad race alebo mini dm/tdm"

    V.B medzi new dáme npr.
    new reklama;
    new antiping;
    v ongamemodeinit by bolo
    kód:

    SetTimer("SecondTimer",1000,1)
    a samotný public
    kód:

    public SecondTimer(){
    reklama++;
    antimoney++;
    if(reklama == 60){
    SCMTA(c,"TUT By QWER");
    reklama = 0;
    }
    if(antiping == 30){
    ForConnected(i,GetMaxPlayers()) if(GetPlayerPing(i) > 500) Kick(i)
    antiping = 0;
    }
    }
    Chyby pádu servera by sa museli hladať takto
    kód:

    public SecondTimer(){
    reklama++;
    antimoney++;
    print("reklama")
    if(reklama == 60){
    SCMTA(c,"TUT By QWER");
    reklama = 0;
    }
    print("ping")
    if(antiping == 30){
    ForConnected(i,GetMaxPlayers()) if(GetPlayerPing(i) > 500) Kick(i)
    antiping = 0;
    }
    }
    Aj teóriou som dokázal že kebyže si to viete spraviť priehladne, tak jedinou nevýhodou je vysoký počet 32 bitových premenných
    Spôsob hodnotím na: 2/5
    Vyjadrenie: "Tento spôsob sa hodí začiatočníkom ktorý sa iba učia"

    V.C Fujha, už som pri C Very Happy, takže do tretice, všetko náučné Very Happy
    kód:

    SetTimer("SecondTimer",1000,1)
    SetTimer("MinuteTimer",60000,1)
    ukážem to iba na jednom
    kód:

    public SecondTimer(){
    GiveMoneyAll()
    ResetAllWeapons()
    }
    a potom niekam do módu
    kód:

    stock GiveMnoeyAll(){
    ForConnected(i,GetMaxPlayers()) GivePlayerMnoey(i,500)
    }
    dá sa aj public využiť
    forward ResetAllWeapons()
    public ResetAllWeapons(){
    ForConnected(i,GetMaxPlayers()) ResetPlayerWeapons(i)
    }
    ovšem že to môže biť náročnejší scirpt, pekný tut tu písal ATomas, takže načo to tu rozoberať Smile
    aj hľadanie chýb je jednoduchšie
    kód:

    public SecondTimer(){
    print("GiveMoney")
    GiveMoneyAll()
    print("ResetMoney")
    ResetAllWeapons()
    }
    Dúfam, že som vám presne ukázal Variantu C, ktorá je už použiteľnejšia no nieje to to pravé orechové(nemám rád orechy, sú moc horké)
    Spôsob hodnotím na: 4/5
    Vyjadrenie: "Tento spôsob je vhodný pre stredne pokročilých ale aj pre snaživcov, kedže sa vdaka nim naučíte čaro stockov"

    V.D Viz Teória, "zase jeden timer Very Happy, ak ti to vadí nečítaj návod "Timer a jeho plné využitie Very Happy""
    takže medzi new
    new reklama;
    new antiping;
    v ongamemodeinit by bolo
    kód:

    SetTimer("SecondTimer",1000,1)
    a potom public
    kód:

    public SecondTimer(){
    reklama++;
    antiping++;
    if(reklama == 60){
    TIP()
    reklama = 0;
    }
    if(antiping == 30){
    AHP()
    antiping = 0;
    }
    }
    vidíte? jednoduché ako úvaha o mori.
    a potom iba
    kód:

    stock TIP(){
    SCMTA(c,"TUT By QWER");
    }
    dá sa aj public využiť
    forward AHP()
    public AHP(){
    ForConnected(i,GetMaxPlayers()){
    if(GetPlayerPing(i) > 500) Kick(i)
    }
    }
    A ak mód padá, a neviete prečo (viete že je to hlavným timerom) tak jednoducho spravíte
    kód:

    public SecondTimer(){
    reklama++;
    antiping++;
    if(reklama == 60){
    print("TIP")
    TIP()
    reklama = 0;
    }
    if(antiping == 30){
    print("PING")
    AHP()
    antiping = 0;
    }
    }
    Možno že Varianta D vyzerá zložito, stačí ovládať premeny
    Spôsob hodnotím na: 4/5
    Vyjadrenie: "Tento spôsob je vhodný na naučenie sa kladných premenných no aj vzhľad je dobrý"

    V.E No Comment xD (konečne)
    Ako teória hovorí, budeme pužívať 1 premenu + booly čo zaručí že nebudeme toľko zaťažovať RAM-ku
    Medzi new dáme
    new Timer;
    a potom booly npr.
    new bool:antiping;
    new bool:reklama;
    spravíme si timer
    kód:

    SetTimer("SecondTimer",1000,1)
    a potom public

    kód:

    public SecondTimer(){
    Timer++;
    if(Timer == 30) antiping = true;
    if(Timer == 60){ reklama = true; // POZOR ak už nemáte viac boolov (ten stock/public ktorý sa má spustiť po npr. 60 sekundách musí vynulovať premenu Timer ! )
    Timer = 0;
    }
    if(reklama == true){
    TIP();
    reklama = false;
    }
    if(antiping == true){
    AHP();
    antiping = false;
    }
    }
    a potom iba opakovať
    kód:

    stock TIP(){
    SCMTA(c,"TUT By QWER");
    }
    dá sa aj public využiť
    forward AHP()
    public AHP(){
    ForConnected(i,GetMaxPlayers()){
    if(GetPlayerPing(i) > 500) Kick(i)
    }
    }
    a keby server padal tak print použite ako v Variante D
    kód:

    public SecondTimer(){
    Timer++;
    if(Timer == 30) antiping = true;
    if(Timer == 60){ reklama = true;
    Timer = 0;
    }
    if(reklama == true){
    print("TIP")
    TIP();
    reklama = false;
    }
    if(antiping == true){
    print("AHP")
    AHP();
    antiping = false;
    }
    }
    Mne sa zdá že asi najlepšia Varianta, však posúdte samy, jedinou a najvačšiou nevýhodou je že nepôjde presne, ale není jedno či sa TIP spustí po 30 alebo 40 sekundách ? Very Happy
    Spôsob hodnotím na: 4/5
    Vyjadrenie: "Spôsob je nepresný, ale zato sa dá povedať že "najoptimalizovanejší" z týchto 5 variant"

    Pochopenie:

    Všade som povačšinou dával Timer na ktorom som ukazoval prax, spúštal sa každú sekundu takže npr. pri V.D ! To funguje tak že každú sekundu sa premenné v publicu zvyšujú o 1 takže za 30 sekund tam má premenná hodnotu 30 a kedže tam je
    if(antiping == 30)
    to podmienka, "to sa stane ak je premena antiping na 30"
    čiže sme docielili že public AHP sa spustí každých 30 sekund

    Niekde v 1/3 som písal
    "(Ak zvládnete, + môžete 1x použiť ForConnected)"
    Je to pre lepších a kedže viem že viac ako 3/4 súdruhov tu, na fóre mi budú písať ako na to, je to jednoduché v stockoch nebudeme používať cyklus for ale iba playerid viz.
    kód:
    stock GiveAllMoney(playerid){
    GivePlayerMoney(playerid)
    }
    alebo
    kód:
    forward ChcekHealth(playerid);
    public ChcekHealth(playerid){
    GetPlayerHealth(playerid,health)
    if(health > 100) BanEx(playerid,"Health-Hack")
    }
    a timer pre všetkých by fungoval takto
    kód:
    public timer(){
    ForConnected(i,GetMaxPlayers()){
    GiveAllMoney(i)
    ChcekHealth(i)
    }
    //a sem veci ktoré niesu pre všetkých hráčov npr. menenie textdrawu a pod.
    }

    Dakujem za prečítanie môjho Návodu, a dúfam že ste si ho prečítali celý, ak nie odporúčam vám si ho prečítať min. 2x.
    S pozdravom váš milovaný a zároven nenávidený socialisticky založený
    QWER

      Práve je Pi apríl 26, 2024 12:47 pm