Kuidas teha liikuvaid väravaid
#1
Kuidas teha käsklusega liikuvaid väravaid?

Viimasel ajal on see olnud teemaks ja otsustasin et teen kiire ja lihtsa õpetuse.

1. Tuleb mapida väravad ( on vaja kordinaate kus väravad asuvad suletult ja avatult)
Soovitan kasutada Map Editorit.


2. Olen saanud siis kordinaadid (need on näidis kordinaadid ja täiesti lambi koha peal)
Teen näidiseks 2 väravaga, ehk avanevad mõlemad eri poolele ja siis näiteks tegin ka lifti.

Code:
CreateObject(19313, 13.10, 1978.46, 19.99,   0.00, 0.00, 0.00); // Värav 1 kinni
CreateObject(19313, 27.12, 1978.44, 19.99,   0.00, 0.00, 0.00); // Värav 2 kinni
CreateObject(3095, 74.83, 1981.39, 16.16,   0.00, 0.00, 0.00);  // Lift all

CreateObject(19313, 2.45, 1978.35, 19.99,   0.00, 0.00, 0.00); // Värav 1 lahti
CreateObject(19313, 37.11, 1978.88, 19.99,   0.00, 0.00, 0.00); // Värav 2 lahti
CreateObject(3095, 74.83, 1981.39, 45.24,   0.00, 0.00, 0.00); // Lift üleval

3. Järgmiseks lisame muutujad GM-i algusesse (peale kõiki include)
Code:
new V2ravadAvatud = 0; // Seda kasutame käskluses et saaks teha väravad ühe käsklusega kinni ja lahti
new LiftAll = 0; // Samamoodi kasutame käskluses et saaksime teha lifti ühe käsklusega alla ja ülesse
new V2rav1, V2rav2, Lift; // Lisame uued niiüelda objektid/muutujad millele paneme tähendused järgi ja hakkame liigutama
#define Kiirus 10.0 // Defineerime ära ka kiiruse, kui kiiresti väravad avanevad/sulgevad (ei pea seda tegema aga endal lihtsam, näiteks valida sobivat kiirust ja et ei pea eraldi neid muutma pärast)

4. Järgmiseks tähendame ära mis asi mis on. Need lisame public OnGameModeInit() alla. (Lisame siia kordinaadid kui need väravad peaksid olema suletud!!)
Code:
public OnGameModeInit()
{
    V2rav1 = CreateObject(19313, 13.10, 1978.46, 19.99,   0.00, 0.00, 0.00); // Kahene värav 1 kinni
    V2rav2 = CreateObject(19313, 27.12, 1978.44, 19.99,   0.00, 0.00, 0.00); // Kahene värav 2 kinni
    Lift = CreateObject(3095, 74.83, 1981.39, 16.16,   0.00, 0.00, 0.00);  // Lift all
    return 1;
}

5. Järgmiseks hakkame tegema käsklusi. (Mina eelistan ja kasutan zcmd [eesti versiooni] ja teen ka sellega käsklused).
Väravate käsklus:

Code:
CMD:v2ravad(playerid, params[])
{
    // Kui värav on kinni siis muutuja on 0 aga kui värav on avatud siis on muutuja 1.
    // Ehk siis muutuja järgi ta vaatab kas vaja väravat liigutada kinni või lahti
    if (V2ravadAvatud == 0) // Muutuja on 0, ehk on värav kinni ja vaja väravat liigutada lahti
    {
        // MoveObject(objecti id mida liigutada tahame, positsioon X, positsioon Y, positsioon Z, Liikumis kiirus);
        MoveObject(V2rav1, 2.45, 1978.35, 19.99, Kiirus); // Liigutab värava kordinaatidele lahti
        MoveObject(V2rav2, 37.11, 1978.88, 19.99, Kiirus); // Liigutab teise värava kordinaatidele lahti
        V2ravadAvatud = 1; // Muudab muutuja 1 peale. Ehk kui järgime kord käsklust kasutada näitab ta V2ravadAvatud == 1 ja sulgeb väravad
    }
    else if(V2ravadAvatud == 1) // Aga kui muutuja on 1 ehk värav on lahti, siis ta sulgeb väravad.
    {
        MoveObject(V2rav1, 13.10, 1978.46, 19.99, Kiirus); // Liigutab värava originaal asendisse (samadele kordinaatidele mis OnGameModeInit() alla lisasime
        MoveObject(V2rav2, 27.12, 1978.44, 19.99, Kiirus); // Liigutab teise värava originaal kordinaatidele.
        V2ravadAvatud = 0; // Muudab muutuja tagasi 0 peale. Ehk kui järgime kord käsklust kasutada, näitab et värav on suletud ehk muutuja V2ravadAvatud == 1
    }
    return 1;
}

Lifti käsklus:
Code:
CMD:lift(playerid, params[])
{
    // Täpselt samamoodi on ka liftiga, lihtsalt kordinaatidel, liigutab lifti ülesse/ alla mitte kõrvale.
    if (LiftAll == 0) // Lifti muutuja on 0 ehk lift on all
    {
        // MoveObject(objecti id mida liigutada tahame, positsioon X, positsioon Y, positsioon Z, Liikumis kiirus);
        MoveObject(Lift, 74.83, 1981.39, 45.24, Kiirus); // Liigutab lifti ülesse
        LiftAll = 1; // Muudab muutuja ära, et lift asub üleval ehk lifti muutuja on 1
    }
    else if(LiftAll == 1) // Kui lifti muutuja on 1 ehk et lift asub üleval, liigutab lifti alla
    {
        MoveObject(Lift, 74.83, 1981.39, 16.16, Kiirus); // Liigutab lifti alla, ehk originaal kordinaatidele (samadele kordinaatidele mis OnGameModeInit() alla lisasime
        LiftAll = 0; // Muudab muutuja ära, ehk lift asub all ja muutuja on 0
    }
    return 1;
}

Nüüd peaksid kõik toimima kui olete kõike õigesti järginud. Lõpp tulemus peaks välja nägema siis siuke:
Code:
// This is a comment
// uncomment the line below if you want to write a filterscript

// Objektid kinnises olekus (need on siin lihtsalt kommentaarid)
/*
CreateObject(19313, 13.10, 1978.46, 19.99,   0.00, 0.00, 0.00); // Värav 1 kinni
CreateObject(19313, 27.12, 1978.44, 19.99,   0.00, 0.00, 0.00); // Värav 2 kinni
CreateObject(3095, 74.83, 1981.39, 16.16,   0.00, 0.00, 0.00);  // Lift all
*/
// Objektid lahtises olekus
/*
CreateObject(19313, 2.45, 1978.35, 19.99,   0.00, 0.00, 0.00); // Värav 1 lahti
CreateObject(19313, 37.11, 1978.88, 19.99,   0.00, 0.00, 0.00); // Värav 2 lahti
CreateObject(3095, 74.83, 1981.39, 45.24,   0.00, 0.00, 0.00); // Lift üleval
*/
#include <a_samp>
#include <zcmd>
// Muutujad
new V2ravadAvatud = 0;         // Seda kasutame käskluses et saaks teha väravad ühe käsklusega kinni ja lahti
new LiftAll = 0;             // Samamoodi kasutame käskluses et saaksime teha lifti ühe käsklusega alla ja ülesse
new V2rav1, V2rav2, Lift;     // Lisame uued niiüelda objektid/muutujad millele paneme tähendused järgi ja hakkame liigutama
#define Kiirus 10.0         // Defineerime ära ka kiiruse, kui kiiresti väravad avanevad/sulgevad (ei pea seda tegema aga endal lihtsam, näiteks valida sobivat kiirust ja et ei pea eraldi neid muutma pärast)

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
    print("\n--------------------------------------");
    print(" Blank Filterscript by your name here");
    print("--------------------------------------\n");
    return 1;
}

public OnFilterScriptExit()
{
    return 1;
}

#else

main()
{
    print("\n----------------------------------");
    print(" Blank Gamemode by your name here");
    print("----------------------------------\n");
}

#endif

public OnGameModeInit()
{
    V2rav1 = CreateObject(19313, 13.10, 1978.46, 19.99,   0.00, 0.00, 0.00); // Kahene värav 1 kinni
    V2rav2 = CreateObject(19313, 27.12, 1978.44, 19.99,   0.00, 0.00, 0.00); // Kahene värav 2 kinni
    Lift = CreateObject(3095, 74.83, 1981.39, 16.16,   0.00, 0.00, 0.00);  // Lift all
    return 1;
}

CMD:v2ravad(playerid, params[])
{
    // Kui värav on kinni siis muutuja on 0 aga kui värav on avatud siis on muutuja 1.
    // Ehk siis muutuja järgi ta vaatab kas vaja väravat liigutada kinni või lahti
    if (V2ravadAvatud == 0) // Muutuja on 0, ehk on värav kinni ja vaja väravat liigutada lahti
    {
        // MoveObject(objecti id mida liigutada tahame, positsioon X, positsioon Y, positsioon Z, Liikumis kiirus);
        MoveObject(V2rav1, 2.45, 1978.35, 19.99, Kiirus); // Liigutab värava kordinaatidele lahti
        MoveObject(V2rav2, 37.11, 1978.88, 19.99, Kiirus); // Liigutab teise värava kordinaatidele lahti
        V2ravadAvatud = 1; // Muudab muutuja 1 peale. Ehk kui järgime kord käsklust kasutada näitab ta V2ravadAvatud == 1 ja sulgeb väravad
    }
    else if(V2ravadAvatud == 1) // Aga kui muutuja on 1 ehk värav on lahti, siis ta sulgeb väravad.
    {
        MoveObject(V2rav1, 13.10, 1978.46, 19.99, Kiirus); // Liigutab värava originaal asendisse (samadele kordinaatidele mis OnGameModeInit() alla lisasime
        MoveObject(V2rav2, 27.12, 1978.44, 19.99, Kiirus); // Liigutab teise värava originaal kordinaatidele.
        V2ravadAvatud = 0; // Muudab muutuja tagasi 0 peale. Ehk kui järgime kord käsklust kasutada, näitab et värav on suletud ehk muutuja V2ravadAvatud == 1
    }
    return 1;
}

CMD:lift(playerid, params[])
{
    // Täpselt samamoodi on ka liftiga, lihtsalt kordinaatidel, liigutab lifti ülesse/ alla mitte kõrvale.
    if (LiftAll == 0) // Lifti muutuja on 0 ehk lift on all
    {
        // MoveObject(objecti id mida liigutada tahame, positsioon X, positsioon Y, positsioon Z, Liikumis kiirus);
        MoveObject(Lift, 74.83, 1981.39, 45.24, Kiirus); // Liigutab lifti ülesse
        LiftAll = 1; // Muudab muutuja ära, et lift asub üleval ehk lifti muutuja on 1
    }
    else if(LiftAll == 1) // Kui lifti muutuja on 1 ehk et lift asub üleval, liigutab lifti alla
    {
        MoveObject(Lift, 74.83, 1981.39, 16.16, Kiirus); // Liigutab lifti alla, ehk originaal kordinaatidele (samadele kordinaatidele mis OnGameModeInit() alla lisasime
        LiftAll = 0; // Muudab muutuja ära, ehk lift asub all ja muutuja on 0
    }
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    return 1;
}

public OnPlayerConnect(playerid)
{
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    return 1;
}

public OnPlayerSpawn(playerid)
{
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
    return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
    return 1;
}

public OnPlayerText(playerid, text[])
{
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    return 1;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
    return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
    return 1;
}

public OnRconCommand(cmd[])
{
    return 1;
}

public OnPlayerRequestSpawn(playerid)
{
    return 1;
}

public OnObjectMoved(objectid)
{
    return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
    return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
    return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
    return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
    return 1;
}

public OnPlayerExitedMenu(playerid)
{
    return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
    return 1;
}

public OnPlayerUpdate(playerid)
{
    return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
    return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
    return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
    return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
    return 1;
}

Lisaks on võimalik lisada igasugu asju käskluse alla juurde veel. Näiteks: kas kasutaja on sisse logitud, kas kasutaja on läheduses, või siis kas kasutaja on vip või adminn jne. Aga see kõik läheb juba komandi tegemise alla.
Lisaks on võimalik lisada ka taimer mis sulgeb värava mingi teatud aja pärast.
On ka võimalik teha süsteem, et ei peaks kasutama ültsegi käsklust, lihtsalt piisab kui kasutaja on mingi koha juurdes/raadiuses ja siis väravad avanevad automaatselt.



Vaata lisaks!! Minu tehtud õpetused ja funksioonid mida olen teinud ja kokku kogunud!!

SIIT


By Geto244
Reply
#2
Hästi tehtud õpetus ja hästi läbi seletatud kuidas kõik käib Wink Tubli!
Reply
#3
Tänan, eks ma ikka üritan tasapisi.
Vaata lisaks!! Minu tehtud õpetused ja funksioonid mida olen teinud ja kokku kogunud!!

SIIT


By Geto244
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)