Peršokti į turinį
Pavienis.

[Pamoka][GRP]Komanda policijai: sekti

Recommended Posts

Sveiki, buvo prašymas iš seniau padaryti tokią komandą, kurioje žaidėjas įvedęs kito žaidėjo nicką - rodytų jo buvimo pozicija kuri atsinaujina.Stengiuosi paaiškinti visas funkcijas, jų veikimą.Taigi pradėkime:

1.

Game modo pradžioje prie "new" prisirašome:

new Text:SEKIMAS;

Taipogi PlayerDB.txt prie kitų enum'ų:

new seklys,
new beglys,

Pirmasis new'as - jis mums reikalingas,kad atpažintų vėliau sukurtą Texdraw'ą

PlayerDB - reikalingi kintamiesiems atpažinti

2.

Sukuriame pačio texdraw'o funkcijas

public OnGameModeInit()

callback'e (gali būti data/init.txt):

SEKIMAS = TextDrawCreate( 14, 150, "Beglys uz:~n~~n~" );//sukuriame Texdraw nustatome jo buvimo koordinates, išlyginame teksta su ~n~ (keliame naują eilutę)
  TextDrawUseBox(SEKIMAS,1);//Sukuriame dėžutę
  TextDrawBoxColor(SEKIMAS,0x00000066);//Nustatome dėžutės spalva (pilka)
  TextDrawTextSize(SEKIMAS,159, 81);//Nustatome dydį (patariu nekeisti)
  TextDrawBackgroundColor(SEKIMAS,0x000000ff);//Fono spalva (juoda)
  TextDrawFont(SEKIMS,2);//Tekstui priskiriame sšifto stylių
  TextDrawLetterSize(SEKIMAS,0.33, 1);//nustatome raidžių dydį
  TextDrawColor(SEKIMAS,0xffffffff );//raidžių spalva (balta)
  TextDrawSetOutline(SEKIMAS,1);//nustatome kad raidės turėtų apipavidalinimą
  TextDrawSetProportional(SEKIMAS,1);//Lyginam mūsų texdrw'ą proporcingai
  TextDrawSetShadow(SEKIMAS,1);// uždedame šešėlį

3.

Turime jau teksdraw'ą reikią jį kažkaip aktyvuoti taigi sukuriame komandą,po:

public OnPlayerCommandText(playerid, cmdtext[])

if(!strcmp(cmdtext, "/sekti", true,6))// ivedus komandą - tesiame, skacius komandos ilgis
  {
 if(playerDB[playerid][specialybe]!=2){SendClientMessage(playerid,RED,"Ši komanda teisėsaugai!"); return 1;}//darbo kintamasis nera lygus 2 - siunciame zinute (pasikeisti)
     new tname[MAX_PLAYER_NAME];//sekamojo new'sas, priskiriantis visus zaidejus
       strmid(tname,GetArgument(1, cmdtext, 0),0,MAX_PLAYER_NAME);// jei nebus tarpo tarpo tarp nick ar tik komanda, isgavus ja kartosime funkcija ir siusime pranesima:
        if(!strcmp(tname,"0",true)){SendClientMessage(playerid, GREEN, "Sekti bėgantį nusikaltėlį /Sekti Vardas_Pavardė"); return 1;}
        new tid = GetPlayeridMid(tname);//gauname sekamojo id
        if(tid==INVALID_PLAYER_ID)// jei toks id negalioja
        {
         SendClientMessage(playerid,RED,"Tokio žaidėjo nėra!");// issiunciame zinute
        return 1;//baigiame funkciją
        }
           if(tid == playerid)// jei id tavo - neleiziame
     {
     SendClientMessage(playerid,RED,"Kam tau sekti save !?");// zinute, baigiame
     return 1;//baigiame funkciją
              }
     }
          if(playerDB[playerid][seklys])// jei jau sekame zaideja, ir id nebegaliotu
     {
     if(tid == playerid)// nepersijungtu atgal (nebutina to daryti )
     {
     SendClientMessage(playerid,RED,"Kam tau sekti save !?");
     return 1;
     }
     playerDB[playerid][seklys]=false;//kartojant komanta (galima ir "else", sekliui bus kintamasis priskirtas false; reiskia jis nebeseks
     playerDB[tid][beglys]=false;//isjungiame sekamojo kintamaji "tid" - jo reiksme
     TextDrawHideForPlayer(playerid, SEKIMAS); // paslepiame kurta texdraw'ą
     DisablePlayerCheckpoint(playerid);// isjungiame chekpintus
     return 1;// gražiname funkciją
     }
     {
        GetPlayerName(tid,tname,sizeof(tname));// isgauname sekamojo vardą
        new name[MAX_PLAYER_NAME];//gausime  vardą, iš visų žaidėjų
        GetPlayerName(playerid,name,sizeof(name));//gaunam varda, formatuojame
     GetPlayerName(playerid,name,sizeof(name));
     TextDrawShowForPlayer(playerid, SEKIMAS);// suaktyvuojame texdraw'ą
     playerDB[tid][beglys]=true;//sekamajam priskiriame kintamaji - teigiama
     playerDB[playerid][seklys]=true;// sekliui taipogi teigiamaji
     return 1;// gražiname funkciją
	}

3.

Na dabar mes dar nieko neseksime, tik turime bėglio vardą,bei kintamuosius na o kas gi bus, jei jis bus teigiamas?

Po:

public OnPlayerUpdate(playerid)

(galima kurti ir taimerį, tai labiau patirusiems)

if(playerDB[playerid][seklys])// jei aktyvuojamas  seklio kintamasis
{
for(new i = 0; i != MAX_PLAYERS; ++i){// masyvas zaidejams, jei jo nebus buginsis id
if (!IsPlayerConnected(i))continue;//jei "prisikonectinta" - tesiame
if (playerDB[i][beglys])//beglio kintamais isgautame masyve "i"
{
new vardas[MAX_PLAYER_NAME];//reikalingas gauti vardui
GetPlayerName(i,vardas,MAX_PLAYER_NAME);//gauname varda
new Float:coo[6], SekString[128];//float'as gauti pozicijai, SekString[128] - stingo dydis
GetPlayerPos(i,coo[0],coo[1],coo[2]);//gauname pozicija beglio "i" masyve
GetPlayerPos(playerid,coo[3],coo[4],coo[5]);//gauname savo pozicija
new Float:distance = ((floatabs(coo[0]-coo[3])+floatabs(coo[1]-coo[4])+floatabs(coo[2]-coo[5]))/3)/100;
format(SekString, sizeof(SekString), "~g~Beglys: ~w~%s ~g~uz:~n~~n~%f KM",vardas ,distance);// isvedame float'ą vaizduojame ji,gauname beglio vardą.
SetPlayerCheckpoint(playerid,coo[0],coo[1],coo[2],2);//Priskirime chekpointą pagal float.
TextDrawSetString(SEKIMAS, SekString);// texdrawui priskiriame string'ą
}
}
}

Rezultatas:

f009a6d23dc5f767578f6d448a903fef77.png

SendClientMessage funkcijose naudokite spalvas pagal save!

P.S - šis callbackas tikrina labai greitai,~6 kartus per sec todėl patartina naudoti taimerį, taip sunaudosite mažiau resursų, jei bus prašymų - sukursiu.

Jei rasite klaidų - praneškite,ačiū už dėmesį

  • Teigiamai 4

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį






Komandoje galūt įvėliau su {} tuoj patikrinsiu :)

if(!strcmp(cmdtext, "/sekti", true,6))// ivedus komandą - tesiame, skacius komandos ilgis
  {
 if(playerDB[playerid][specialybe]!=2){SendClientMessage(playerid,RED,"Ši komanda teisėsaugai!"); return 1;}//darbo kintamasis nera lygus 2 - siunciame zinute (pasikeisti)
     new tname[MAX_PLAYER_NAME];//sekamojo new'sas, priskiriantis visus zaidejus
       strmid(tname,GetArgument(1, cmdtext, 0),0,MAX_PLAYER_NAME);// jei nebus tarpo tarpo tarp nick ar tik komanda, isgavus ja kartosime funkcija ir siusime pranesima:
        if(!strcmp(tname,"0",true)){SendClientMessage(playerid, GREEN, "Sekti bėgantį nusikaltėlį /Sekti Vardas_Pavardė"); return 1;}
        new tid = GetPlayeridMid(tname);//gauname sekamojo id
        if(tid==INVALID_PLAYER_ID)// jei toks id negalioja
        {
         SendClientMessage(playerid,RED,"Tokio žaidėjo nėra!");// issiunciame zinute
        return 1;//baigiame funkciją
        }
           if(tid == playerid)// jei id tavo - neleiziame
     {
     SendClientMessage(playerid,RED,"Kam tau sekti save !?");// zinute, baigiame
     return 1;//baigiame funkciją
              }
     }
          if(playerDB[playerid][seklys])// jei jau sekame zaideja, ir id nebegaliotu
     {
     if(tid == playerid)// nepersijungtu atgal (nebutina to daryti )
     {
     SendClientMessage(playerid,RED,"Kam tau sekti save !?");
     return 1;
     }
     playerDB[playerid][seklys]=false;//kartojant komanta (galima ir "else", sekliui bus kintamasis priskirtas false; reiskia jis nebeseks
     playerDB[tid][beglys]=false;//isjungiame sekamojo kintamaji "tid" - jo reiksme
     TextDrawHideForPlayer(playerid, SEKIMAS); // paslepiame kurta texdraw'ą
     DisablePlayerCheckpoint(playerid);// isjungiame chekpintus
     return 1;// gražiname funkciją
     }
     {
        GetPlayerName(tid,tname,sizeof(tname));// isgauname sekamojo vardą
        new name[MAX_PLAYER_NAME];//gausime  vardą, iš visų žaidėjų
        GetPlayerName(playerid,name,sizeof(name));//gaunam varda, formatuojame
     GetPlayerName(playerid,name,sizeof(name));
     TextDrawShowForPlayer(playerid, SEKIMAS);// suaktyvuojame texdraw'ą
     playerDB[tid][beglys]=true;//sekamajam priskiriame kintamaji - teigiama
     playerDB[playerid][seklys]=true;// sekliui taipogi teigiamaji
     return 1;// gražiname funkciją
     }

Klaidą buvo tokia padejeij }, bet pamiršai atidaryt :song:

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Komandoje galūt įvėliau su {} tuoj patikrinsiu :)

if(!strcmp(cmdtext, "/sekti", true,6))// ivedus komandą - tesiame, skacius komandos ilgis
  {
 if(playerDB[playerid][specialybe]!=2){SendClientMessage(playerid,RED,"Ši komanda teisėsaugai!"); return 1;}//darbo kintamasis nera lygus 2 - siunciame zinute (pasikeisti)
     new tname[MAX_PLAYER_NAME];//sekamojo new'sas, priskiriantis visus zaidejus
       strmid(tname,GetArgument(1, cmdtext, 0),0,MAX_PLAYER_NAME);// jei nebus tarpo tarpo tarp nick ar tik komanda, isgavus ja kartosime funkcija ir siusime pranesima:
        if(!strcmp(tname,"0",true)){SendClientMessage(playerid, GREEN, "Sekti bėgantį nusikaltėlį /Sekti Vardas_Pavardė"); return 1;}
        new tid = GetPlayeridMid(tname);//gauname sekamojo id
        if(tid==INVALID_PLAYER_ID)// jei toks id negalioja
        {
         SendClientMessage(playerid,RED,"Tokio žaidėjo nėra!");// issiunciame zinute
        return 1;//baigiame funkciją
        }
           if(tid == playerid)// jei id tavo - neleiziame
     {
     SendClientMessage(playerid,RED,"Kam tau sekti save !?");// zinute, baigiame
     return 1;//baigiame funkciją
              }
     }
          if(playerDB[playerid][seklys])// jei jau sekame zaideja, ir id nebegaliotu
     {
     if(tid == playerid)// nepersijungtu atgal (nebutina to daryti )
     {
     SendClientMessage(playerid,RED,"Kam tau sekti save !?");
     return 1;
     }
     playerDB[playerid][seklys]=false;//kartojant komanta (galima ir "else", sekliui bus kintamasis priskirtas false; reiskia jis nebeseks
     playerDB[tid][beglys]=false;//isjungiame sekamojo kintamaji "tid" - jo reiksme
     TextDrawHideForPlayer(playerid, SEKIMAS); // paslepiame kurta texdraw'ą
     DisablePlayerCheckpoint(playerid);// isjungiame chekpintus
     return 1;// gražiname funkciją
     }
     {
        GetPlayerName(tid,tname,sizeof(tname));// isgauname sekamojo vardą
        new name[MAX_PLAYER_NAME];//gausime  vardą, iš visų žaidėjų
        GetPlayerName(playerid,name,sizeof(name));//gaunam varda, formatuojame
     GetPlayerName(playerid,name,sizeof(name));
     TextDrawShowForPlayer(playerid, SEKIMAS);// suaktyvuojame texdraw'ą
     playerDB[tid][beglys]=true;//sekamajam priskiriame kintamaji - teigiama
     playerDB[playerid][seklys]=true;// sekliui taipogi teigiamaji
     return 1;// gražiname funkciją
     }

Klaidą buvo tokia padejeij }, bet pamiršai atidaryt :song:

Aha, dėkui dabar pats pastebėjau :)

  • Teigiamai 1

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį










Svečias
Ši tema yra užrakinta.

  • Narių peržiūri šį forumą:   0 nariai

    Nėra registruotų narių peržiūrinčių šį forumą.


  • SuperGames programele
  • SuperGames programele


×