[TuT] Dinamicno kreiranje labela

Započeo lv, Avgust 05, 2014, 19:43:11 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 2 gostiju pregledaju ovu temu.

lv

*

Pozdrav, danas cu da vam pokazem kako da napravite sistem kreiranja labela IG ..
POTREBNO NAM JE:
YCMD Include
Y_Ini
sscanf
streamer
Koristimo komande
/napravilabel [vrsta] [tekst]
UPDATE: Stigla je FS .. Za one koje mrzi da ispisu komandu i par ucitavanja
Pre svega, potrebno je kreirati eNum negde na vrhu moda

#define MAX_LABEL 100 // Definisemo koliko maksimalno labela smemo imati na serveru
enum labelInfo
{
lIme[500], // Tekst koji ce se ispisivati na labelu
Float:lX, // Pozicija x
Float:lY, // Pozicija y
Float:lZ, // Pozicija z
lVrsta, // Vrsta labela ( ima ih dve )
};
new LabelInfo[MAX_LABEL][labelInfo]; // Definisemo funkciju LabeLinfo
new Text3D:LabelLabel[sizeof(LabelInfo)]; // Text3d.. 3DText labela
new LabelPickup[sizeof(LabelInfo)]; // LabelPickup. Za vrstu labela broj 1


Sledece sto trebamo, jeste da napravimo funkciju koja ce ucitavati sve kreirane labele
Sada cemo ispisati funkciju koja ce da ucita labele. Ovo stavite gde su vam ostali public / forwardi.. Ako radite mod od 0 , negde pred vrh skripte stavite

forward UcitajLabel(idlabel, name[], value[])
public UcitajLabel(idlabel, name[], value[])
{

Dakle, ovo je funkcija pomocu koje cemo ucitavati labele, u nju cemo sada ispisati sledece kodove, kako bi moglo sve lepo da se ucita, na odgovarajucim koordinatama


        INI_String("Ime",LabelInfo[idlabel][lIme],500); // Tekst labela
INI_Float("X",LabelInfo[idlabel][lX]); // Float X
INI_Float("Y",LabelInfo[idlabel][lY]); // Float Y
INI_Float("Z",LabelInfo[idlabel][lZ]); // Float Z
INI_Int("Vrsta",LabelInfo[idlabel][lVrsta]); // Vrsta | 1 ili 2 |


Dakle to bi trebalo ovako da izgleda


forward UcitajLabel(idlabel, name[], value[]);
public UcitajLabel(idlabel, name[], value[])
{
        INI_String("Ime",LabelInfo[idlabel][lIme],500); // Tekst labela
INI_Float("X",LabelInfo[idlabel][lX]); // Float X
INI_Float("Y",LabelInfo[idlabel][lY]); // Float Y
INI_Float("Z",LabelInfo[idlabel][lZ]); // Float Z
INI_Int("Vrsta",LabelInfo[idlabel][lVrsta]); // Vrsta | 1 ili 2 |
        return 1;
}


Sada prelazimo na komandu kojom kreiramo label.. Kasnije cemo odraditi Cuvanje, pa ucitavanje pri pokretanju servera

Znaci krecemo komandom, koristili smo procesor YCMD .. Ovako se sastavlja YCMD komanda

YCMD:testkomanda(playerid, params[], help)
{

Znaci, ovako cemo da napravimo komandu


YCMD:napravilabel(playerid, params[], help)
{

Sada cemo da ispisemo sve sto je potrebno oko labela
Prvo radimo odobrenje, znaci ako igrac nije admin level 6, da ne moze da kreira label. Vi mozete promeniti koji admin level zelite da igrac bude da moze da napravi label

if(PlayerInfo[playerid][pAdmin] < 6) return SCM(playerid,-1,"{FF0000}GRESKA:{FFFFFF} Nisi ovlascen !");

Zatim new

new text[500]; // 500 oznacava maksimalan broj karaktera | za komandu /napravilabel
new labelid = 0; // Oznacavamo ID labela
new string[512]; // String, da bi ispisali tekst na labelu
new vrsta; // Za komandu /napravilabel

Sada da namestimo da se label kreira gde je igrac poslednji put stajao

new Float:X, Float:Y, Float:Z; // Definise X,Y,Z poziciju
GetPlayerPos(playerid, X,Y,Z); // Dobija igraceve pozicije X, Y, Z

Dakle, to treba ovako da izgleda

YCMD:napravilabel(playerid,params[], help)
{
  if(PlayerInfo[playerid][pAdmin] < 6) return SCM(playerid,-1,"{FF0000}GRESKA:{FFFFFF} Nisi ovlascen !");
  new Float:X, Float:Y, Float:Z; // Definise igracevu poziciju
  GetPlayerPos(playerid, X,Y,Z); // Dobija igraceve pozicije X, Y, Z
  new text[500];
  new labelid= 0;
  new string[512];
  new vrsta;

Sada cemo da napravimo tzv. HINT / Podsetnik. Ako igrac upise samo /napravilabel .. Ili ako ne ispise vrstu ili tekst , sta da mu posalje
Za ovo cemo koristiti sscanf
Ovako koristimo funkciju

if(sscanf(params, "is[500]",vrsta,text)) // Znaci definisemo da treba da ispise vrstu, i text od max. 500 karaktera
{
SCM(playerid, -1, "{666666}HINT:{FFFFFF} /napravilabel [vrsta] [tekst]"); // Salje igracu poruku kakako da kreira label
SCM(playerid, -1, "{666666}VRSTE:{FFFFFF} | 1 = Label za komandu ( sa pickupom |  2 = Label bez pickupa"); // Salje igracu poruku kakve vrste labela postoje
return 1; // Obavezno ostaviti, inace ce se kreirati label sta god da napisemo..
}

Sve to bi za sada trebalo da izgleda ovako

YCMD:napravilabel(playerid, params[], help)
{
  if(PlayerInfo[playerid][pAdmin] < 6) return SCM(playerid,-1,"{FF0000}GRESKA:{FFFFFF} Nisi ovlascen !");
  new Float:X, Float:Y, Float:Z; // Definise igracevu poziciju
  GetPlayerPos(playerid, X,Y,Z); // Dobija igraceve pozicije X, Y, Z
  new text[500];
  new labelid= 0;
  new string[512];
  new vrsta;
  if(sscanf(params, "is[500]",vrsta,text)) // Znaci definisemo da treba da ispise vrstu, i text od max. 500 karaktera
  {
SCM(playerid, -1, "{666666}HINT:{FFFFFF} /napravilabel [vrsta] [tekst]"); // Salje igracu poruku kakako da kreira label
SCM(playerid, -1, "{666666}VRSTE:{FFFFFF} | 1 = Label za komandu ( sa pickupom |  2 = Label bez pickupa"); // Salje igracu poruku kakve vrste labela postoje
return 1; // Obavezno ostaviti, inace ce se kreirati label sta god da napisemo..
  }

Eh, sada . Koristimo Loop, kako  ne bi smo morali pisati i id labela .. Znaci, ovo radi na princip labelid ( kao sto je gore ) + 1. Recimo.. Imamo 2 fajla u folderu Labeli.. I sada ako imamo label id 2 .. Ici cemo 2+1 sto je 3 .. I automatski ce se kreirati label pod rednim brojem 3
Ovako treba da izgleda loop

for(new b = 0; b < sizeof(LabelInfo); b++)
{
if(LabelInfo[b][lX] != 0) // B = labelid
{
labelid = b + 1; // Znaci gledamo max labela +1 .. labelid = b + 1, kao sto sam gore naveo
}
}


E sada krenimo na stvaranje kreiranog labela ..
Koristimo funkcije : LabelInfo | Labelid | i jos neke funkcije iz eNume-a Labelinfo
Znaci ovako treba da bude

LabelInfo[labelid][lX] = X;
LabelInfo[labelid][lY] = Y;   // Komanda ce koordinate iz GetPlayerPos koristiti kao koordinate stvaranja labela
LabelInfo[labelid][lZ] = Z;
LabelInfo[labelid][lVrsta] = vrsta; // Vrsta labela koju smo kreirali.. 1 ili 2
strmid(LabelInfo[labelid][lIme],text,0,strlen(text),255); // ispisuje karaktere iz labela..


Dakle to sve sada treba da izgleda ovako


YCMD:napravilabel(playerid, params[], help)
{
  if(PlayerInfo[playerid][pAdmin] < 6) return SCM(playerid,-1,"{FF0000}GRESKA:{FFFFFF} Nisi ovlascen !");
  new Float:X, Float:Y, Float:Z; // Definise igracevu poziciju
  GetPlayerPos(playerid, X,Y,Z); // Dobija igraceve pozicije X, Y, Z
  new text[500];
  new labelid= 0;
  new string[512];
  new vrsta;
  if(sscanf(params, "is[500]",vrsta,text)) // Znaci definisemo da treba da ispise vrstu, i text od max. 500 karaktera
  {
SCM(playerid, -1, "{666666}HINT:{FFFFFF} /napravilabel [vrsta] [tekst]"); // Salje igracu poruku kakako da kreira label
SCM(playerid, -1, "{666666}VRSTE:{FFFFFF} | 1 = Label za komandu ( sa pickupom |  2 = Label bez pickupa"); // Salje igracu poruku kakve vrste labela postoje
return 1; // Obavezno ostaviti, inace ce se kreirati label sta god da napisemo..
  }
for(new b = 0; b < sizeof(LabelInfo); b++)
{
if(LabelInfo[b][lX] != 0) // B = labelid
{
labelid = b + 1; // Znaci gledamo max labela +1 .. labelid = b + 1, kao sto sam gore naveo
}
}
LabelInfo[labelid][lX] = X;
LabelInfo[labelid][lY] = Y;   // Komanda ce koordinate iz GetPlayerPos koristiti kao koordinate stvaranja labela
LabelInfo[labelid][lZ] = Z;
LabelInfo[labelid][lVrsta] = vrsta; // Vrsta labela koju smo kreirali.. 1 ili 2
strmid(LabelInfo[labelid][lIme],text,0,strlen(text),255); // ispisuje karaktere iz labela..


I sada krecemo na finalno.. Stvaranje labela, tekst i ostale [cenzura]osti .. Sada cemo koristiti kondicional if.. Znaci Ako. Ako je label  vrsta 1  Da kreira pickup i tekst. Ako je label vrsta 2 da samo kreira tekst .. I da sacuva kreirani label..

format(string,sizeof(string),"{FFF1AF}%s",text); // Znaci ovo je tekst labela..
LabelLabel[labelid] = CreateDynamic3DTextLabel(string ,0x33CCFFAA,LabelInfo[labelid][lX], LabelInfo[labelid][lY], LabelInfo[labelid]   [lZ],15); // LabelLabel je definisan kao Text3d
if(vrsta == 1) // Ako je label vrsta 1 sta da uradi
{
LabelPickup[labelid] = CreateDynamicPickup(1239, 1, LabelInfo[labelid][lX], LabelInfo[labelid][lY],    LabelInfo[labelid][lZ], -1,-1, -1, 50);
}
        format(string,sizeof(string),"Label ID:%d je napravljen.",labelid); //Stringujemo poruku
SCM(playerid, -1, string); // Saljemo igracu stringovanu poruku
SacuvajLabel(stanid); // Funkcija koja cuva label
return 1;
}


Zavrsili smo sa komandom.. Ona ovako treba da izgleda


YCMD:napravilabel(playerid, params[], help)
{
  if(PlayerInfo[playerid][pAdmin] < 6) return SCM(playerid,-1,"{FF0000}GRESKA:{FFFFFF} Nisi ovlascen !");
  new Float:X, Float:Y, Float:Z; // Definise igracevu poziciju
  GetPlayerPos(playerid, X,Y,Z); // Dobija igraceve pozicije X, Y, Z
  new text[500];
  new labelid= 0;
  new string[512];
  new vrsta;
  if(sscanf(params, "is[500]",vrsta,text)) // Znaci definisemo da treba da ispise vrstu, i text od max. 500 karaktera
  {
SCM(playerid, -1, "{666666}HINT:{FFFFFF} /napravilabel [vrsta] [tekst]"); // Salje igracu poruku kakako da kreira label
SCM(playerid, -1, "{666666}VRSTE:{FFFFFF} | 1 = Label za komandu ( sa pickupom |  2 = Label bez pickupa"); // Salje igracu poruku kakve vrste labela postoje
return 1; // Obavezno ostaviti, inace ce se kreirati label sta god da napisemo..
  }
for(new b = 0; b < sizeof(LabelInfo); b++)
{
if(LabelInfo[b][lX] != 0) // B = labelid
{
labelid = b + 1; // Znaci gledamo max labela +1 .. labelid = b + 1, kao sto sam gore naveo
}
}
LabelInfo[labelid][lX] = X;
LabelInfo[labelid][lY] = Y;    //Komanda ce koordinate iz GetPlayerPos koristiti kao koordinate stvaranja labela
LabelInfo[labelid][lZ] = Z;
LabelInfo[labelid][lVrsta] = vrsta; // Vrsta labela koju smo kreirali.. 1 ili 2
strmid(LabelInfo[labelid][lIme],text,0,strlen(text),255); // ispisuje karaktere iz labela..
format(string,sizeof(string),"{FFF1AF}%s",text); // Znaci ovo je tekst labela..
LabelLabel[labelid] = CreateDynamic3DTextLabel(string ,0x33CCFFAA,LabelInfo[labelid][lX], LabelInfo[labelid][lY], LabelInfo[labelid]   [lZ],15); // LabelLabel je definisan kao Text3d
if(vrsta == 1) // Ako je label vrsta 1 sta da uradi
{
LabelPickup[labelid] = CreateDynamicPickup(1239, 1, LabelInfo[labelid][lX], LabelInfo[labelid][lY],        LabelInfo[labelid][lZ], -1,-1, -1, 50);
}
        format(string,sizeof(string),"Label ID:%d je napravljen.",labelid); //Stringujemo poruku
SCM(playerid, -1, string); // Saljemo igracu stringovanu poruku
SacuvajLabel(stanid); // Funkcija koja cuva label
return 1;
}


Eh.. Sada .. Krecemo sa ucitavanjem labela pri startovanju servera ..
Dakle pod OnGameModeInit() stavite ovo .. Znaci ovo nam ispisuje label...  Takodje cemo da koristimo loop


for(new b = 0; b < sizeof(LabelInfo); b++)
{
new gFile[35];
new labelstring[500];
format(gFile, 50, "labeli/Label_%d.ini" ,b);
if(fexist(gFile))
       {
       INI_ParseFile(gFile, "UcitajLabel", .bExtra = true, .extra = b);
       if(LabelInfo[b][lX] != 0) // Ako je bilo koja druga vrsta labela osim 1 sta da uradi
       {
   
format(labelstring,sizeof(labelstring),"{FFF1AF}%s",LabelInfo[b][lIme]);
    LabelLabel[b] = CreateDynamic3DTextLabel(labelstring,0x33CCFFAA,LabelInfo[b][lX], LabelInfo[b][lY], LabelInfo[b][lZ],15);
    if(LabelInfo[b][lVrsta] == 1) // Ako je label vrsta 1 sta da uradi
    {
    LabelPickup[b] = CreateDynamicPickup(1239, 1, LabelInfo[b][lX], LabelInfo[b][lY], LabelInfo[b][lZ], -1,-1, -1, 50);
        }
printf("LABEL | Label Id %d je uspesno ucitan !",b); // "Stampamo" ovo na pokretanju GM-a
        }
}
}


Eto, to je bilo ucitavanje.. A funkciju UcitajLabel smo definisali gore pri pocetku tutorijala.. Sada .. SacuvajLabel..
Ista situacija kao sa UcitajLabel.. Ali pogledajte
Znaci ovde ide WriteString, WriteInt , WriteFloat.. Ovde Y_INI ispisuje informacije

forward SacuvajLabel(idlabel);
public SacuvajLabel(idlabel)
{
new dFile[128];
format(dFile, sizeof(dFile),"labeli/Label_%d.ini",idlabel);
new INI:File = INI_Open(dFile);
INI_WriteString(File,"Ime",LabelInfo[idlabel][lIme]);
INI_WriteFloat(File,"X",LabelInfo[idlabel][lX]);
INI_WriteFloat(File,"Y",LabelInfo[idlabel][lY]);
INI_WriteFloat(File,"Z",LabelInfo[idlabel][lZ]);
INI_WriteInt(File,"Vrsta",LabelInfo[idlabel][lVrsta]);
INI_Close(File);
return 1;
}


Ovo nisam hteo da objasnjavam jer sam gore objasnio
Takodje, ovo mi je prvi tutorijal. Tako da ...
Error-i su moguci.. Jer sam na pamet sastavljao kod .. Ako vas mrzi da ovo ispisujete( kao mene ) dolazi FS jos malo . Ako imate errore, obratite mi se , da to svi zajedno sredimo :)
CREDITS: Y_Less za sscanf, Y_INI | YCMD | | | | | | | Incognito | Streamer
Poslednja Izmena: Avgust 05, 2014, 20:44:19 POSLE PODNE od [UP] Lazarevic
Pišem skriptu isključivo kad sam naduvan

sve je to dobro osim

if(sscanf(params, "is[500]",vrsta,text))

stoce ti ovoliki string? Nevidim u ovom tutorial scim bi ti ovoliki string ispunio.
Poslednja Izmena: Avgust 05, 2014, 20:01:04 POSLE PODNE od C++
69

lv

*

Zasto ?
Pišem skriptu isključivo kad sam naduvan


lv

*

Hvala.. Neka .. Ko zna ko ce koliki label da pravi xD :D
Pišem skriptu isključivo kad sam naduvan


lv

*

Misliš na zcmd ?
Pišem skriptu isključivo kad sam naduvan