Savet oko proveravanja

Započeo .Drakula., Jun 24, 2022, 19:35:53 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 3 gostiju pregledaju ovu temu.

Pitanje/savjet:Na koji nacin bi mogao da proveravam da li je vazeci ID vozila, kuce, biznisa itd.(kreiranih stvari na serveru)
Opširnije: Radio sam komandu za admina da moze proveriti novac u kreiranim stvarina. E sada pitanje na koji nacim mogu proveriti da li je ta stvar kreirana ili nije( da li je vazeci id ili ne)

Komanda:

CMD:proverinovac(playerid, params[])
{
if(PI[playerid][pAdmin] < 3) return Error(playerid, "Upisali ste komandu koja ne postoji.");
if(AdminDuty[playerid] == false && PI[playerid][pAdmin] < 6) return Error(playerid, "Morate biti na duznosti.");
new vrsta[10], id;
    if(sscanf(params, "s[10]i", vrsta, id))
    {
        SCM(playerid, SPLAVA, "==================================");
        Cmd(playerid, "/proverinovac [ vrsta ] [ id ]");
        SCM(playerid, BELA, "[vrste]: vozilo | kuca | vikendica | firma");
        SCM(playerid, BELA, "[vrste]: biznis | stan | trafika");
        SCM(playerid, SPLAVA, "==================================");
        return 1;
    }
    if(strlen(vrsta) > 10) return Error(playerid, "Vrsta ne moze biti duza od 10 karaktera.");
    if(id < 1) return Error(playerid, "Id ne moze biti manji od 1.");
if(strcmp(vrsta, "vozilo", true) == 0)
{
if(TipVozila[id] != PRIVATNO_VOZILO) return Error(playerid, "To vozilo nije ownable.");
SCMF(playerid, ZUTA, "(info) "bela"U vozilu ID:%d ima %d dinara.", id, CI[ScriptIDVozila[id]][cNovac]);
}
else if(strcmp(vrsta, "kuca", true) == 0)
{
SCMF(playerid, ZUTA, "(info) "bela"U kuci ID:%d ima %d dinara.", id, HI[id][hKasa]);
}
else if(strcmp(vrsta, "vikendica", true) == 0)
{
SCMF(playerid, ZUTA, "(info) "bela"U vikendici ID:%d ima %d dinara.", id, VI[id][vKasa]);
}
else if(strcmp(vrsta, "firma", true) == 0)
{
SCMF(playerid, ZUTA, "(info) "bela"U firmi ID:%d ima %d dinara.", id, FI[id][fKasa]);
}
else if(strcmp(vrsta, "biznis", true) == 0)
{
SCMF(playerid, ZUTA, "(info) "bela"U biznisu ID:%d ima %d dinara.", id, BI[id][bKasa]);
}
else if(strcmp(vrsta, "stan", true) == 0)
{
SCMF(playerid, ZUTA, "(info) "bela"U stanu ID:%d ima %d dinara.", id, SI[id][sKasa]);
}
else if(strcmp(vrsta, "trafika", true) == 0)
{
SCMF(playerid, ZUTA, "(info) "bela"U trafici ID:%d ima %d dinara.", id, TI[id][tKasa]);
}
else return Error(playerid, "Nepoznata vrsta.");
    return 1;
}

Mogu proveriti da li postoji kreirani fajl.
Primer:

new vFile[50];
format(vFile, sizeof(vFile), CI_FILE, kola);
if(!fexist(vFile)) return Error(playerid, "To vozilo ne postoji.");

Ili

for(new i; i < MAX_KUCA; i++)
{
    if(HI[i][hPostavljena] == 1)
    {
SCMF(playerid, ZUTA, "(info) "bela"U kuci ID:%d ima %d dinara.", i, HI[i][hKasa]);
    }
}

Dodatno:Nisam do sada radio ovakve provere pa me zanima na koji nacin to mogu uraditi.
Da proverim da li je id kreiran, ako nije da ide Error, a ako jeste da ide poruka.

Proveravaj preko ovoga sto si poslao gore

[pawn]new vFile[50];
format(vFile, sizeof(vFile), CI_FILE, kola);
if(!fexist(vFile)) return Error(playerid, "To vozilo ne postoji.");[/pawn]

Isti princip ti ide za sve sto je kreirano preko y_ini-ja, samo razlicita putanja do file-a koji ti treba :D

Za mene je ovo jako relativno pitanje posto zavisi kako si zamislio sistem. Recimo ako postoji fajl, ne znaci da je to kreirano posto mozda su default/invalid vrednosti.
Ja kad god radim bilo kakav sistem, a da nesto moze da postoji ili ne, uvek uvedem/odredim invalid vrednost, kao sto je na prime INVALID_DYNAMIC_ID implementiran u streameru.

Recimo ako radim sistem kuca, odaberem vlasnik id da je -1 kao invalid to jest da ne postoji,, ili recimo ako mi -1 kao vlasnik kuce znaci da je pripada drzavi (nema vlasnika) onda znam da coordinate nikad ne mogu biti tacno 0.0, pa uzmem da je to invalid.
I kad god proveravam, proveravam tacno tu informaciju da li je jednaka odabranoj invalid vrednosti. Inace za takve stvari napravim i funkciju, tipa IsValidHouse(houseid), i tu uporedjujem da mi je kasnije lakse ako budem menjao. Takodje to znaci da kad se server startuje, da moras sve elemente (kuce u primeru iznad) postaviti na invalid pre nego sto ucitas bilo sta.


Evo ti primer, negde sam vec post ovo na forumu ali bice izgubilo se u smecu.
https://pastebin.com/Zjske6yM

Primer je za teleporte, zamislio sam to da bude za javna mesta (zgrade u koje mozes ulaziti tipa opstina, auto skola, PD i slicno). Sistem nema save/load i komande, ali ima sve funkcije da funkcionise (kreiranje, brisanje, TP) i mislim da je najbolji primer posto jednostavnije od ovoga ne mozes.
Poziciju X od ulaza sam izabrao za proveru na invalid vrednost, a 0.0 coordinate su mi invalid vrednost posto nikad se nece desiti da je to 0.0, cak i da pokusas in game da uzmes 0.0 coordinate uvek ce biti 0.00005 ili nesto, nikad tacno 0.0

Takodje sam uveo i INVALID_BUILDING_ID koji mi je -1, i ukoliko building (teleport) ne postoji, vracam tu vrednost i radim sa njom. Recimo ako u komandi zelis da proveris da li je igrac blizu teleporta, koristis GetBuildingNearPlayer(playerid), ukoliko ti funkcija vrati INVALID_BUILDING_ID znaci igrac nije blizu teleporta, dok ako nije INVALID_BUILDING_ID onda ce ti vratiti sam ID teleporta (niza ili kako bi ovde neki mufljuzi rekli enum-a :D )


Pogledaj primer, prouci ga malo, nadam se da ce ti pomoci makar malo. Inace, moje licno misljenje, ali po meni je ovo pravilan nacin kako da se rade ovakvi sistemi. Napravis sistem ovako, onda komande samo koriste funkcije iz sistema, i sutra ako recimo zelis da prebacis nesto u TD-ove, dialoge ili nesto trece, nema copy/paste ili nanovo pisanja 15 linija, sve vec postoji samo koristis funkcije.

Dobar je primer, ali bi trebao da izmenim celi sistem kuce, vozila i sl.
ja sa ovako:

#define MAX_KUCA                        (2001)
#define KUCA_FILE                       "BD/kuce/Kuca_%d.ini"
enum Kuce
{ .........
hPostavljena,
....
}
new HI[MAX_KUCA][Kuce];


//sada kreiranje u dialogu

if(dialogid == D_NAPRAVI_KUCA && response)
{
        new kucaid = 0;
        for(new b = 0; b < sizeof(HI); b++)
        {
            if(kucaid == 0)
            {
                if(HI[b][hPostavljena] == 1) { continue; }
                else if(HI[b][hPostavljena] == 0) { kucaid = b; }
            }
        }
        if(kucaid > MAX_KUCA) return Error(playerid, "Ne mozete napraviti vise kuca.");
        ....
        .......// biranje vrste kuce
        ........// cene kuce
        ........//potrebnog levela
        ........//itd itd
        .....
        .....
        HI[kucaid][hPostavljena] = 1; // na samom kraju
        strmid(HI[kucaid][hVlasnik], "Niko", 0, strlen("Niko"), 255);
        SacuvajKucu(kucaid);
        SCM(playerid, ZELENA, "(info) "bela"Kuca ID:%d je napravljena.", kucaid);
    }


E sad kada bi ja napravio bool kao ti u primeru:

stock bool:IsValidBuilding(buildingid)
{
    if(buildingid < 0 || buildingid > MAX_BUILDINGS) return false;
    if(BuildingInfo[buildingid][BuildingEntrance][tpX] == 0.0) return false;
    return true;
}


Moj primer:

stock bool:IsValidBuilding(kucaid)
{
    if(kucaid < 0 || kucaid > MAX_KUCA) return 0;
    if(HI[kucaid][hPostavljena] == 0) return 0;
    return 1;
}


I kasnije samo kada proveravam koristim:

if(!IsValidBuilding(kucaid)) return Error(playerid, "Kuca nije kreirana.");

Mislim mozes, sve zavisi sta imas, i sta si voljan da uradis. Posto imas promenivu hPostavljena koja govori da li kuca postoji onda nju proveravaj, jbg tako je zamisljen sistem i tako je odradjen. Ako ne zelis da menjas sve zivo onda koristis sta imas.

osim ovoga sto ti je korisnik @Deleted User rekao, mozes koristiti i iteratore, kada kreiras kucu dodas je u iterator, kada je izbrises removas iz iteratora
u tom slucaju iterator ce posedovati samo validne ID-eve kuca

svakako se isplati koristiti ih, mozes vracati random kucu, countati sve kreirane na serveru i jos mnogo toga

Gde mogu naci da procitam o tome,da prucim ja malo to.

Citat: .Drakula. poslato Jun 25, 2022, 22:37:50 POSLE PODNE
Gde mogu naci da procitam o tome,da prucim ja malo to.

https://balkan-samp.com/forum/index.php?topic=137504.0
https://balkan-samp.com/forum/index.php?topic=130637.0

Naravno obavezno pogledaj i komentare, nisam siguran da li je jos neko radio tutorial za iteratore

Neaktivna tema, zakljucacu posto odgovori su tu. Ukoliko zatreba da se otkljuca PM.
Lock - Neaktivna tema.