[TUT] Jednostavan COS!

Započeo Ermin., Decembar 10, 2013, 23:00:23 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 2 gostiju pregledaju ovu temu.

Jednostavan COS - by ermin !

  Pozdrav balkan-samperi!
Tu spammam vec godinu i vise, a do sad nisam nista korisno napisao.

Smaram se i odlucim da napitutorial o izradi jednostavnog sistema vozila, pokusat cu da budem sto jasniji i sto precizniji u objasnjavanju (namjera je da bude sistem sto jednostavniji, te ko ne zna, da nauci bar osnovno o tome, pa da prosiri sistem kako zeli i umije)

Pa, dosta bi bilo uvoda, da krenemo.
(Prije svega da napomenem, u tutorialu cu koristiti sscanf, y_commands i y_ini sistem spremanja, jer je najlakse da se nauci)

Prvo sto nam treba, je par osnovnih varijabli, recimo da cemo za pocetak koristiti samo Poziciju vozila, boje vozila, model i string u koji cemo postavljati ime vlasnika vozila!

#define MAX_VOZILA  (100)   // koliko maximalno u skripti moze vozila biti (PRIVATNA (sistem))
#define PUT_DO_VOZILA     "/Vozila/%i.ini"
#define INVALID_CAR_ID  (-1)

Trebat ce nam varijabla koja ce pamtit ID igracevog auta..

new igracAuto[MAX_PLAYERS];


kad se igrac registruje potrebno je da mu vrijednost varijable postavite na -1 (INVALID_CAR_ID), tj da prilagodite


Potrebno je da definisemo varijable u koje cemo spremat pojedine vrijednosti vezane za auto..

enum cInfo
{
   Vlasnik[24], // string varijabla, u koju cemo pohranjivati ime vlasnika vozila
   Model, // integer (cijeli broj), u koji cemo postaviti model (vrstu) vozila
   Float:ParkX, // float var (u koji cemo postavljati ko-ordinate vozila)
   Float:ParkY,
   Float:ParkZ,
   Float:ParkA, // ugao
   Boja,
   Kreiranje // potrebno nam je nesto preko cega cemo postaviti id vozila, za provjere da ne bi doslo do mjesanja idova
   // naravno ovu varijablu nije potrebno ucitavati/zapisivati
}
new CarInfo[MAX_VOZILA][cInfo];


CarPath(carid)
{
    new cpath[16];
    format(cpath, sizeof cpath, PUT_DO_VOZILA, carid); // formatira string u koji pamti folder vozila (tacnije fajl koji treba da otvori)
    return cpath; // ova funkcija 'returna' string koji pokazuje gdje se nalazi fajl
}

forward ucitajVozilo_data(indeks, imevar[], vrijednost[]);
public ucitajVozilo_data(indeks, imevar[], vrijednost)
{
   INI_String("Vlasnik", CarInfo[indeks][Vlasnik], MAX_PLAYER_NAME);
   INI_Int("Model", CarInfo[indeks][Model]);
   INI_Float("ParkX", CarInfo[indeks][ParkX]);
   INI_Float("ParkY", CarInfo[indeks][ParkY]);
   INI_Float("ParkZ", CarInfo[indeks][ParkZ]);
   INI_Float("ParkA", CarInfo[indeks][ParkA]);
   INI_Int("Boja", CarInfo[idenks][Boja]);
}

SacuvajVozilo(vozilo)
{
    new put[16];
    format(put, 16, PUT_DO_VOZILA, vozilo);
    new INI:Fajl = INI_Open(put); // otvara fajl sa idom vozila
    INI_WriteString(Fajl, "Vlasnik", CarInfo[vozilo][Vlasnik]);
    INI_WriteInt(Fajl, "Model", CarInfo[vozilo][Model]);
    INI_WriteFloat(Fajl, "ParkX", CarInfo[vozilo][ParkX]);
    INI_WriteFloat(Fajl, "ParkY", CarInfo[vozilo][ParkY]);
    INI_WriteFloat(Fajl, "ParkZ", CarInfo[vozilo][ParkZ]);
    INI_WriteFloat(Fajl, "ParkA", CarInfo[vozilo][ParkA]);
    INI_WriteInt(Fajl, "Boja", CarInfo[vozilo][Boja]);
    return 1;
}


Sada trebamo napravit ucitavanje i kreiranje vozila (recimo kad se igrac konektuje)

new vozilo = igracevAuto[playerid];
if(vozilo != INVALID_CAR_ID) // ako igrac posjeduje auto, onda da ga ucita, inace ako ne posjeduje nema smisla da dzaba pozivamo parsefile.
INI_ParseFile(CarPath(vozilo), "ucitajVozilo_%s", .bExtra = true, .extra = igracevAuto[playerid]); // ovo je tesko objasnit, ali ustvari 'cupa' informacije iz falja i postavlja ih u varijable.
new model = CarInfo[vozilo][Model];
new Float:parkx = CarInfo[vozilo][ParkX];
new Float:parky = CarInfo[vozilo][ParkY];
new Float:parkz = CarInfo[vozilo][ParkZ];
new Float:parka = CarInfo[vozilo][ParkA];
new boja = CarInfo[vozilo][Boja];
CarInfo[vozilo][Kreiranje] = CreateVehicle(model, parkx, parky, parkz, parka, boja, boja, 300); // kreira vozilo sa parametrima koristenim od ucitanih varijabli.


Takodje bi trebali napraviti i unistavanje vozila (npr. kada se igrac diskonektuje sa servera)

if(igracevAuto[playerid] != INVALID_CAR_ID)
DestroyVehicle(CarInfo[igracevAuto[playerid]][Kreiranje]);
SacuvajVozilo(igracevAuto[playerid]);


To je to sto se tic cuvanja/ucitavanja (nadam se da nisam nesto promasio)
Sada cemo napraviti komandu za kupnju vozila, parkiranje i informacije o vozilu


YCMD:kupivozilo(playerid, params[], help)
{
    #pragma unused help
    if(igracevAuto[playerid] != INVALID_CAR_ID) return SendClientMessage(playerid, -1, "Vec imas auto");
    new ime[16];
    if(sscanf(params, "s", ime))
    {
        SendClientMessage(playerid, -1, "Koristi: /kupivozilo [ime vozila]");
        return SendClientMessage(playerid, -1, "Imena: Cadrona, Comet");
    }
    if(!strcmp(ime, "cadrona", true))
    {
        if(GetPlayerMoney(playerid) < 15000) return SendClientMessage(playerid, -1, "Nemate dovoljno novca ( 15k )");
        new car;
        for(new i = 0; i < sizeof(CarInfo); ++i)
        {
            if(!fexist(CarPath(i)))
            car = i;
            break;
        }
        SendClientMessage(playerid, -1, "Kupili ste cadronu!");
        CarInfo[car][Model] = 527;
        new pName[24];
        GetPlayerName(playerid, pName, 24);
        strmid(CarInfo[car][Vlasnik], pName, 0, strlen(pName), MAX_PLAYER_NAME);
        CarInfo[car][cBoja] = 1; // bijela za pocetak
        new Float:pos[4];
        GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
        GetPlayerFacingAngle(playerid, pos[3]);
        CarInfo[car][ParkX] = pos[0];
        CarInfo[car][ParkY] = pos[1];
        CarInfo[car][ParkZ] = pos[2];
        CarInfo[car][ParkA] = pos[3];
        CarInfo[car][Kreiranje] = CreateVehicle(527, pos[0], pos[1], pos[2], pos[3], 0, 0, 300);
        SacuvajAuto(car);
        igracevAuto[playerid] = car;
        return 1;
    }
    if(!strcmp(ime, "comet", true))
    {
        if(GetPlayerMoney(playerid) < 80000) return SendClientMessage(playerid, -1, "Nemate dovoljno novca ( 80k )");
        new car;
        for(new i = 0; i < sizeof(CarInfo); ++i)
        {
            if(!fexist(CarPath(i)))
            car = i;
            break;
        }
        SendClientMessage(playerid, -1, "Kupili ste comet!");
        CarInfo[car][Model] = 480;
        new pName[24];
        GetPlayerName(playerid, pName, 24);
        strmid(CarInfo[car][Vlasnik], pName, 0, strlen(pName), MAX_PLAYER_NAME);
        CarInfo[car][cBoja] = 1; // bijela za pocetak
        new Float:pos[4];
        GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
        GetPlayerFacingAngle(playerid, pos[3]);
        CarInfo[car][ParkX] = pos[0];
        CarInfo[car][ParkY] = pos[1];
        CarInfo[car][ParkZ] = pos[2];
        CarInfo[car][ParkA] = pos[3];
        CarInfo[car][Kreiranje] = CreateVehicle(480, pos[0], pos[1], pos[2], pos[3], 0, 0, 300);
        SacuvajAuto(car);
        igracevAuto[playerid] = car;
        return 1;
    }
   
    return SendClientMessage(playerid, -1, " Pogresan naziv vozila ! ");
}

YCMD:parkirajvozilo(playerid, params[], help)
{
    #pragma unused help
    #pragma unused params
    if(igracevAuto[playerid] == INVALID_CAR_ID)
        return SendClientMessage(playerid, -1, "Nemas vozilo");
    else if(GetPlayerState(playerid != PLAYER_STATE_DRIVER) || GetPlayerVehicleID(playerid) != CarInfo[igracevAuto[playerid]][Kreiranje])
        return SendClientMessage(playerid, -1, "Morate biti vozac vaseg vozila da bi parkirali !");
    new Float:x, Float:y, Float:z, Float:a;
    GetVehiclePos(GetPlayerVehicleID(playerid), x, y, z);
    GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
    CarInfo[igracevAuto[playerid]][ParkX] = x;
    CarInfo[igracevAuto[playerid]][ParkY] = y;
    CarInfo[igracevAuto[playerid]][ParkZ] = z;
    CarInfo[igracevAuto[playerid]][ParkA] = a;
    DestroyVehicle(CarInfo[igracevAuto[playerid]][Kreiranje]);
    new
        model = CarInfo[igracevAuto[playerid]][Model];
        boja = CarInfo[igracevAuto[playerid]][Boja];
    CarInfo[igracevAuto[playerid]][Kreiranje] = CreateVehicle(model, x, y, z, a, boja, boja, 300);
    SendClientMessage(playerid, -1, "Parkirali ste svoje vozilo !");
    return true;
}

YCMD:informacijevozila(playerid, params[], help)
{
    #pragma unused help
    #pragma unused params
    new c = igracevAuto[playerid];
    if(c == INVALID_CAR_ID)
        return SendClientMessage(playerid, -1, "Nemas vozilo");
    new string[12];
    format(string, 12, "*Model: %d", CarInfo[c][Model]);
    SendClientMessage(playerid, 0xD9F105AA, string);
    format(string, 10, "*Boja: %d", CarInfo[c][Boja]);
    SendClientMessage(playerid, 0xD9F105AA, string);
    return 1;
}

   
Mislim da je kod komandi sve jasno, ako treba nesto pojasnit recite..

To je to, ovo je moj prvi tutorial, znam da ima dosta nedostataka ali Boze moj ne mogu sve odma vidit vjerovatno cu editovat i dodavat neke nove mogucnosti (moguce da cu u dijalog prebaciti sve)

   
       
     
Poslednja Izmena: Februar 07, 2014, 20:37:02 POSLE PODNE od Ermin.

Tu i tamo dobar tut, pohvale
Mislim dakle Boze
Na Zari sve i svasta

Citat: Ï,Ñ'à¸,,à¹"pà¸,, poslato Decembar 12, 2013, 17:01:57 POSLE PODNE
Tu i tamo dobar tut, pohvale


Hvala, updateovat cu post kasnije, videt cu ako budem imao vremena, da malo 'sredim' kod, prebacim u dijalog, i tako..
Mada i nije potrebno, jer napisao sam samo shemu, a ako neko bude radio po ovom tutorijalu vjerovatno da ce vec znat kako i sta..



Hvala na tutorialu taman mio je trebao :P

Nagradna igra u toku: Klikni me nezno

Citat: [SX] TiXoR_ poslato Decembar 13, 2013, 10:52:58 PRE PODNE
Jel si ti ovo testira ?


Kod sam pisao dok sam otvarao temu, a ne u pawno-u.
Na svom modu imam identican COS (moguce da sam kod neke funkcije / ispisa fulao slovo, npr SendClietnMessage)

Evo sad vidim da ima par gresaka, npr umjesto indeks na jednom mjestu pise idenks.
Sredit cu to, editovat cu, ali ako vidis neku veliku gresku ukazi mi na to, u prvu ruku lose, sredit cu kod, smanjit stringove na minimum, i neke nepotrebne stvari (mada nema logike jer je ovo tutorijal a ne filterskripta) al' hajd..

Citat: [BURPG]Mihajlo poslato Decembar 13, 2013, 15:14:36 POSLE PODNE
Hvala na tutorialu taman mio je trebao :P

Hehh hvala, uredit cu ga jos, popravit greske u pisanju i tako.

Imaš nekih grešaka poslije ću objavit te 'errore' i fixat ih :D da se dzaba ovi pocetnici ne zajebavaju...
Testano radi :3

Moželi neko da fixa erore i objavi na pastebin ako nije problem.



svAka cAst
TrAziM Skriptera,Mapera i po mogucnosti Web dizajnera