Poprzedni temat «» Następny temat
<! SetTimer !>
Autor Wiadomość
Fire Dragon 
Wymiatacz



Wiek: 30
Dołączył: 6280 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: 35
Dołączył: 6568 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: 27
Dołączył: 5758 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: 29
Dołączył: 6189 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