Poprzedni temat «» Nastêpny temat
<! SetTimer !>
Autor Wiadomo¶æ
Fire Dragon 
Wymiatacz



Wiek: 32
Do³±czy³: 7020 dni temu
Posty: 710
Sk±d: jeste¶ ?

Punkty: 265
Wys³any: 2009-03-07, 22:10   <! SetTimer !>

Du¿a liczba osobników homo sapiens sapiens znanych powszechnie jako ludzie, na tym forum jako "u¿ytkownicy" ma problemy z u¿ywaniem bardzo przydatnej funkcji jak± jest timer. Postaram siê przedstawiæ w jaki sposób jej u¿ywaæ.


| Budowa ogólna |


| SetTimer
Kod:
SetTimer("Nazwa funkcji", czas przez/co ile bêdzie wykonywana, bool powtarzalno¶ci, true = 1, false = 0);


| SetTimerEx
Kod:
SetTimerEx("Nazwa funkcji", czas przez/co ile bêdzie wykonywana, bool powtarzalno¶ci, true = 1, false = 0, formatowanie inicjacji danych w funkcji, inicjacja danych w funkcji);



| Zastosowanie |


Zastosowanie timerów jest baaaardzo szerokie, od prostej funkcji sprawdzaj±cej, do streamer'a obiektów.


| Przyk³ady praktyczne |

Nasz timer mo¿e wykonywaæ baaaardzo wiele rzeczy. Podam kilka przyk³adów.


| SetTimer

Funkcje które umieszczamy w SetTimer, odnosz± siê do rzeczy które nie maj± ¿adnego parametru np. gdy tworzymy funkcjê dla wszystkich graczy czy gdy funkcja poprostu nie ma argumentów.

Funkcja dla wszystkich graczy:

Nasza funkcja:
Kod:
forward god();
public god()
{
    for(new i=0,j=GetMaxPlayers(); i<j; i++) //pêtla dla wszystkich graczy
    {
        if(!IsPlayerConnected(i))continue;//Je¶li gracz z pêtli nie jest pod³±czony pêtla przeskakuje o 1 i jedzie dalej
        SetPlayerHealth(i,400); //Aby god dzia³a³, muszê ustawiæ pewn± warto¶æ ¿ycia dla graczy
        SetPlayerArmour(i,400); // - || -
    }
}


T± funkcjê wywo³am w publicu OnGameModeInit, gdy¿ ta funkcja ma pracowaæ od czasu w³±czenia mode.
Kod:

public OnGameModeInit()
{
     SetTimer("god",250,1);
     return 1;
}


Funkcja sprawdzaj±ca dla wszystkich graczy:

Nasza funkcja:
Kod:
forward WeaponsCheck();
public WeaponsCheck()
{
    new slot, ammo, weap; //zmienne
    for(new i=0,j=GetMaxPlayers(); i<j; i++)//Pêtla dla wszystkich graczy
    {
        if(!IsPlayerConnected(i))continue;//Je¶li gracz z pêtli nie jest pod³±czony pêtla przeskakuje o 1 i jedzie dalej
        for (slot = 0; slot < 14; slot++) //Pêtla dla sprawdzenia wszystkich slotów.
        {
            GetPlayerWeaponData(i, slot, weap, ammo); //Pobieranie broni z wszystkich slotów.
            if(weap == 16 || weap == 32 || weap == 0 || weap == 1 || weap == 46)// Je¶li broñ ma id to:
            {
                                //W moim przypadku nic
            }
                else //A je¶li jest inaczej
            {
                SendClientMessage(i, red, "This isn't a deathmatch gamemode ! Don't use weapons !"); //Wysy³a wiadomo¶æ
                ResetPlayerWeapons(i); //Resetuje bronie gracza
            }
        }
    }
    return 1;
}


T± funkcjê wywo³am w publicu OnGameModeInit, gdy¿ ta funkcja ma pracowaæ od czasu w³±czenia mode.
Kod:

public OnGameModeInit()
{
     SetTimer("WeaponsCheck", 5000, 1);
     return 1;
}


Funkcja sprawdzaj±ca:

Nasza funkcja:
Kod:
forward WindaUpped();
public WindaUpped()
{
    new Float: x, Float: y, Float: z; //Zmienne floatowe
    GetObjectPos(ServerData[gElevator], x, y, z); //Pobranie pozycji obiektu
    if(z == 57.413) //Je¶li koordynat "z" wyniesie 57.413 to:
    {
        MoveObject(ServerData[gDoor1], 958.210, -1187.412, 57.018, 0.5);
        MoveObject(ServerData[gDoor2], 958.207, -1185.559, 57.017, 0.5);
        SetTimer("CloseUp", 3000, 0);
        KillTimer(ServerData[tElevatorTimer]);
    }
    return 1;
}

T± funkcjê wywo³am w publicu OnPlayerSelectedMenuRow, gdy¿ ta funkcja ma za zadanie sprawdziæ gdzie jest pozycja drzwi od windy i w momencie gdy winda jest na górze, funkcja otworzy drzwi.
Kod:

if(Current == windam)
{
    switch(row)
    {
        case 0:
        {
            ServerData[tElevator] = SetTimer("Drzwi", 3000, 0);
            MoveObject(ServerData[gDoor1], 958.210, -1187.412, 17.142, 0.5);
            MoveObject(ServerData[gDoor2], 958.207, -1185.559, 17.142, 0.5);
            ServerData[tElevatorTimer] = SetTimer("WindaUpped", 200, 1);
            KillTimer(ServerData[tElevatorEx]);
            KillTimer(ServerData[tElevatorTimerEx]);
        }
        }
    return 1;
}


Funkcja powtarzalna:

Nasza funkcja:
Kod:
forward cmd();
public cmds()
{
    SendClientMessageToAll(lightblue,"Type \"/cmds\" to check the commands list.");
}


T± funkcjê wywo³am w publicu OnGameModeInit, gdy¿ ta funkcja ma pracowaæ od czasu w³±czenia mode.

Kod:
public OnGameModeInit()
{
     SetTimer("cmds",120000,true);
     return 1;
}


| SetTimerEx

Funkcje które umieszczamy w SetTimerEx, odnosz± siê dla danego gracza, lub maj± jakie¶ parametry.

Funkcja indywidualna:


Nasz funkcja:
Kod:
forward LastCar(playerid);
public LastCar(playerid)
{
        new Float: X, Float: Y, Float: Z, Float: A;
        X = dini_Float(ServerData[fSaveFile], "X Position");
        Y = dini_Float(ServerData[fSaveFile], "Y Position");
        Z = dini_Float(ServerData[fSaveFile], "Z Position");
        A = dini_Float(ServerData[fSaveFile], "A Rotation");
        PlayerData[playerid][gSavedPlayerVehicle] = dini_Int(ServerData[fSaveFile], "Vehicle Model");
        PlayerData[playerid][gSavedPlayerVehicle] = CreateVehicle(PlayerData[playerid][gSavedPlayerVehicle], X, Y, Z, A, -1, -1, 66666);
        PutPlayerInVehicle(playerid, PlayerData[playerid][gSavedPlayerVehicle], 0);
        PlayerData[playerid][gVehicleGod] = SetTimerEx("cargod", 250, 1, "i", playerid);
        return 1;
}


Tê funkcjê wywo³am w OnPlayerSpawn gdy¿ musz± zostaæ pobrane dane z pliku, które dadz± pojazd graczowi po jego ostatnim roz³±czeniu.

Kod:
public OnPlayerSpawn(playerid)
{
    if(dini_Int(ServerData[fSaveFile], "IsCarSaved") == 1)
    {
       SetTimerEx("LastCar", 500, 0, "i", playerid);
    }
        return 1;
}


Funkcja indywidualna z dodatkowym parametrem:

Nasza funkcja:
Kod:
stock CarSpawn(playerid,  modelid, bool:res)
{
        new iString[128];
        new Float:Floats[4], interior, wirtual;
        GetPlayerFacingAngle(playerid,Floats[3]);
        interior = GetPlayerInterior(playerid);
        wirtual = GetPlayerVirtualWorld(playerid);
        GetPlayerPos(playerid,Floats[0],Floats[1],Floats[2]);
        TogglePlayerControllable(playerid, true);
        GetXYInFrontOfPlayer(playerid, Floats[0], Floats[1], 5);
        if(res == false)
        {
            ServerData[vStaticVehicle] = CreateVehicle(modelid,Floats[0],Floats[1],Floats[2],Floats[3],-1,-1,600000);
            LinkVehicleToInterior(ServerData[vStaticVehicle], interior);
            SetVehicleVirtualWorld(ServerData[vStaticVehicle], wirtual);
            CarDeleter(ServerData[vStaticVehicle]);
            format(iString, sizeof(iString), "You have spawned %s (Model ID: %d, Vehicle ID: %d)", VehicleNames[modelid - 400], modelid, ServerData[vStaticVehicle]);
        }
        if(res == true)
        {
            ServerData[vDynamicVehicle] = CreateVehicle(modelid,Floats[0],Floats[1],Floats[2],Floats[3],-1,-1,600000);
            LinkVehicleToInterior(ServerData[vDynamicVehicle], interior);
            SetVehicleVirtualWorld(ServerData[vDynamicVehicle], wirtual);
            CarDeleter(ServerData[vDynamicVehicle]);
            format(iString, sizeof(iString), "You have spawned %s (Model ID: %d, Vehicle ID: %d)", VehicleNames[modelid - 400], modelid, ServerData[vDynamicVehicle]);
        }
        return SendClientMessage(playerid, yellow, iString);
}


Tê funkcjê wywo³am w OnPlayerCommandText, gdy¿ bêdzie mi ona s³u¿yæ jako spawner.

Kod:
if(strcmp(cmdtext, "/nrg", true, 10) == 0)
{
        SetTimerEx("CarSpawn", 500, 0, "i, d, b", playerid, 522, true);
    return 1;
}


Funkcja z parametrami:

Nasza funkcja:
Kod:
stock CreateQpa(objectid, Float:x, Float:y, Float:z, Float:a)
{
    CreateObject(objectid, x, y, z, 0, 0, a);
    return 1;
}


Tê funkcjê wywo³am w OnPlayerCommandText, gdy¿ bêdzie mi ona s³u¿yæ dynamicznie.

Kod:
if(strcmp(cmdtext, "/slupek", true, 10) == 0)
{
    new Float:Floats[4];
       GetPlayerFacingAngle(playerid,Floats[3]);
    GetPlayerPos(playerid,Floats[0],Floats[1],Floats[2]);
    SetTimerEx("CreateQpa", 1000, 0, "d, f, f, f, f", 3666, Floats[0], Floats[1], Floats[2], Floats[3]);
    return 1;
}


| Podsumowanie |


U¿ywaæ timer'a mo¿emy w bardzo ró¿norodny sposób, nie tylko w ramach zmiany zmiennej na inn± cyfrê w celu stworzenia blokady.
 
 
     
Gesior7 
Administrator
I <3 Chiquita



Wiek: 37
Do³±czy³: 7308 dni temu
Posty: 2607
Sk±d: Bia³ystok

Punkty: 39724
Wys³any: 2009-03-07, 23:40   

¦miechowe. Ale da siê zrozumieæ. ; P
Widzê, ¿e sam ju¿ trochê rozumiesz. Szybko siê uczysz.
_________________

In ancient times some random phpbb devs programed a mystic power named: Search button.
Only the chosen ones know how to use it. ツ

 
 
     
DaMiAn0 
Aktywny amator



Wiek: 29
Do³±czy³: 6498 dni temu
Posty: 147
Sk±d: Sk±d Jest Stunt?

Punkty: 11371
Wys³any: 2009-03-08, 09:36   

Po co to komu na PKS'ie ?? xP Jedynie na forach o Pawn,LUA,SA:MP itd. ale nie tu tutorial dosyæ przejrzysty ale to dopero pocz±tki xD
_________________
PKS Fan




 
 
     
~PKS|Nyqual 
PKS Team



Wiek: 31
Do³±czy³: 6930 dni temu
Posty: 520
Sk±d: Vice City

Punkty: 10260
Wys³any: 2009-03-08, 20:31   

DaMiAn0 napisa³/a:
Po co to komu na PKS'ie ?? xP Jedynie na forach o Pawn,LUA,SA:MP itd. ale nie tu tutorial dosyæ przejrzysty ale to dopero pocz±tki xD


A chocia¿ i mi przydatny bo wiele siê z tego dowiedzia³em. Dobra robota Fire Dragon, dodaj jeszcze jakie¶ inne tutoriale z Pawn.
_________________




 
 
     
Wy¶wietl posty z ostatnich:   
Odpowiedz do tematu
Nie mo¿esz pisaæ nowych tematów
Nie mo¿esz odpowiadaæ w tematach
Nie mo¿esz zmieniaæ swoich postów
Nie mo¿esz usuwaæ swoich postów
Nie mo¿esz g³osowaæ w ankietach
Nie mo¿esz za³±czaæ plików na tym forum
Nie mo¿esz ¶ci±gaæ za³±czników na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Style created by Matej from mStyles modified by Drool
statystyka