Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 4254 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

(redaguota)

1 pamoka.


Callbackų bendri paaiškinimai.



Callback‘as – kas tai yra ?

Callback‘as - tai vieta po kuria reikia rašyti bet kokias funkcijas.
Tačiau, yra daugėlis callbackų, ir jų paskirtys skiriasi.
Pvz.:
public OnPlayerCommandText
Šiame callbacke galima rašyti, kurti tik komandas žaidėjo, admino, vipo, kažkokio darbuotojo, ar dar kažkokios kitos paskirties žaidėjo.
Taipogi, tikrinimai ar žaidėjas turi pakankamai pinigų, ar žaidėjas yra mašinoje, ar žaidėjas yra ieškomas galimi yra visuose callbackuose.
Tačiau negalima sumaišyti callbackų paskirčių.
Komandas rašyti galima tik po šiuo callbacku.
Kitas callbackas pvz. Būtų : public OnPlayerConnect
Šis callbackas yra skirtas tam, kad kai žaidėjas tik prisijungia prie serverio.
Tarkim reikia kad pirmiausia prisijungtų žaidėjas arba užsiregistruotų, tam kad galėtų žaisti ir naudotis visomis komandomis skirtomis jo privilegijoms.
Tai rašyti reikėtų :
public OnPlayerConnect(playerid)
{
ShowPlayerDialog(playerid,dialogid,DIALOG_STYLE_PASSWORD,“Prisijunk“,“Turi prisijungti arba užsiregistruoti“,“Patvirtinti“,“Išeiti“);

Štai išmes kai tik jungsites į serverį GUI langą, ir prašys, kad prisijungtum arba užsiregistruotum.
Apie GUI savybes dabar neaiškinsiu apie jas aiškinęs esu 4-oje pamokoje.

Kitas pavyzdys su callbacku pvz public OnPlayerDeath
Šis callbackas funkcionuoja tik tada, kai žaidėjas miršta.
Dabar pavyzdys:
public OnPlayerDeath
{
SendClientMessage(playerid,RAUDONA,“Tu numirei, už tai tavo spalva pasikeičia į raudoną spalvą.“);
SetPlayerColor(playerid,RAUDONA);

Štai, ir pasikeis žaidėjo spalva į raudoną.
Iš pradžių informuojame, apie paruoštą veiksmą, o po informavimo atliekame veiksmą.


















2 pamoka


Stockų kurimas, paskirtis, greitesnis naudojimas.


Kas yra stockas ?


Stockas, tai panašus dalykas kaip ir callbackas, tačiau, stockas yra labai pravartus dalykas norint pakartoti tą patį veiksmą daugelį kartų.
O stocke surašytos funkcijos visos, gali būti naudojamos daug kartų, ir daug kuriose vietose.
Iš pradžių: Kurimas stocko -


stock Stocko_Pavadinimas(playerid)
{
funkcijos atliekamos
}

Stockai nerašomi callbackuose. Jei callbackuose sukursi stocką, tai tą stocką galėsi naudot tik tam callbacke.
Jei nori, kad galėtum naudot stocką visame gamemode, rašyk arba po visais callbackais, arba prieš visus callbackus.

* Stocko pavadinime negali būti tarpų. Visada pavadinime turi būti jungiamasis ženklas, jeigu pavadinimą darai iš dviejų ar daugiau žodžių.
* (playerid) šiuose skliaustuose rašoma tada, kai stockas bus naudojamas žaidėjui. Pvz.: saugot žaidėjo informaciją, arba baninti žaidėją.
* (vehicleid) šiuose skliaustuose rašoma vehicleid todėl, nes stocas su tokiais skliaustais arba kitaip sakant parametru, pritaikomas ir galimas naudoti tik mašinoms. Pvz.: Išsaugot mašinas, nudažyt mašinas, ar sprogdint mašinų padangas
* () tušti skliaustai paliekami tada, kai stockas naudojamas serveriui.

Tarkim norint serveryje pakeisti laiką, orą ar išjungti serverį.taipogi, visada stock žodis turi prasidėti mažąja raide.Po pavadinimo, parametro stocko, kitoje eilutėje turi,
atidaryt galimas f-jas su tokiu skliaustu {Kai parašai visas f-jas, turi uždaryti stocką su } skliaustu.
Jokiu būdu negalima rašyti stocke return 1; užbaigimo f-jos.

Dabar parodysiu pavyzdį:

stock Apdovanojimas(playerid)
{ - atidarome.
GivePlayerScore(playerid,500); - Duodam žaidėjui 500 XP.
GivePlayerMoney(playerid,5000); - Duodam žaidėjui 5000 LT.
SetPlayerSkin(playerid,200); - Nustatom žaidėjo 200 skiną pagal ID.
SendClientMessage(playerid,ZALIA,“Sveikinu, tu buvai apdovanotas“); - Pranešame už ką gavo.
} – uždarome.
Naudojimas stocko yra paprastas.
Pvz kaip esu sukūręs stocką Apdovanojimas, tai bet kur galiu panaudot šitą.
Pvz.:
public OnPlayerUpdate(playerid) – Kai žaidėjas atlieka veiksmą bet kokį.
{
if(GetPlayerScore(playerid) > 50) – Jei žaidėjas turi 50 XP ar daugiau, tai naudojame stocką.
{
Apdovanojimas(playerid); - Stocko pavadinimas, ir nurodymas kam pritaikomas.
return 1; - f-jos uždarymas.
}


















































































3 pamoka

Forward‘ų, define‘ų naudojimas.

Forwardai, tai reikalingi tam, kai sukuri naują callbacką, pvz.:

public Callbackas(playerid)
{
čia kažkokios f-jos
return 1;
}

Tai tikrinant ar nėra klaidų, jums išmes klaidą, kad trūksta forwardo šiam callbackui.
Tai tada kur nors viršui pačiam gamemodo, parašyti reikia :
forward Callbackas(playerid);


* forward žodis prasideda iš mažosios raidės, visada.

Stockams forwardų nereikia, su jais yra paprasčiau, nei su callbackais.
O tiek callbackų, tiek stockų atliekami veiksmai yra tokie patys.

Define‘ų naudojimai :


Kas yra define ?
Tai tokia funkcija, kurios dėka galima vieną parašytą žodį parametre, atlikti tam tikrą funkciją.
Tarkim spalvą :
#define RAUDONA 0xFF5588
tada rašai : SendClientMessage(playerid,RAUDONA,“...“);
Ir teksto spalva bus raudona.
Kadangi, kai GUI dialogus kursi, tai reikės visą laiką keist GUI ID skaičius.
Kartais būna taip, kad pasimeti skaičiuose, ir su jais nepatogu.
Galimas kitas variantas.

#define PRISIJUNGIMO_GUI (1)

Štai, specialiai uždefininom GUI Dialogui id’ą.
Naudojimas būtų toks : ShowPlayerDialog(playerid,PRISIJUNGIMO_GUI,…..);
Ir nereikės toi vietoj rašyti 1,2,3 ir t.t.
Tokiu atvėju ir išvengsi skaičių ID bugų, kad kartais įrašai net ą skaičių ir pradeda bugintis sistemos.


Kaip viršui pavyzdys yra PISIJUNGIMO_GUI (1), tai kam tas 1 reikalingas ?
Tam, kad sunumeruoti defines. Jeigu reikėtų atsirinkti tau kuris yra kuris, pagal numeraciją greičiau atsirinksi, ir išvengsi sisteminių bugų ar nesusipratimų, kurie dažnai įvyksta editinant kokius nors gamemodus.
Pvz.: GRP 4 ar kažkokius panašius.






4 pamoka..
GUI Dialogų kurimas, ir viskas apie juos.				


GUI dialogų tipų yra 4, t.y:
1.Sąrašo tipas. (DIALOG_STYLE_LIST)
2. 2 variantų pasirinkimo tipas. (DIALOG_STYLE_MSGBOX)
3. Įvedamų simbolių tipas. (DIALOG_STYLE_INPUT)
4. Slaptažodžio tipas. (DIALOG_STYLE_PASSWORD)

1. Sąrašo tipas:
Visada norint sukurti GUI reikia rašyti : ShowPlayerDialog(playerid,dialogo id,TIPAS,“Antraštė“,“1. Variantas\n2. Variantas“,“Sutikimo mygtukas“, “Nesutikimo mygtukas“);
Viskas atrodyti turėtų taip:
ShowPlayerDialog(playerid,1,DIALOG_STYLE_LIST,“Spalvos“,“Žalia.\nMėlyna.\nGeltona.\nRaudona.“,“Pasirinkti“,“Atšaukti“);

\n – simbolis reiškia naują eilutę, arba kitą pasirinkimą. Kitą pasirinkimą duos šis simbolis, tik DIALOG_STYLE_LIST GUI tipe. Kituose duos, tik naują eilutę.
Toliau, po callbacku OnDialogResponse (Jį susirasti gali spausdamas CTRL + F ir įrašydamaas OnDialogResponse)
Rašai:
if(dialogid == 1)
{
If(response) – Jei paspaudė mygtuką “Pasirinkti”
{
if(listitem == 0) - Jei pasirinks žalią spalvą, tai
{
SendClientMessage(playerid,ZALIA,“Tu pasirinkai spalvą: Žalią“);
}
if(listitem == 1) - Jei pasirinks mėlyną spalvą, tai
{
SendClientMessage(playerid,MELYNA,”Tu pasirinkai spalvą: Mėlyną”);
}
if(listitem == 2) – Jei pasirinks Geltoną spalvą, tai
{
SendClientMessage(playerid,GELTONA,”Tu pasirinkai spalvą: Geltoną”);
}
if(listitem == 3) – Jei pasirinks raudoną spalvą, tai
{
SendClientMessage(playerid,RAUDONA,”Tu pasirinkai spalvą: Raudoną”);
}
return 1;
}
if(!response) – Jei paspaudė mygtuką “Atšaukti”
{
SendClientMessage(playerid,SPALVA,”Tu pasirinkai mygtuką – Atšaukti”);
}
return 1;
}

Visada pirmas pasirinkimas šiuo atveju žalia spalva, būna 0.
if(listitem == 0) – Čia žalia spalva.


Visada, sąrašo tipe, pirmo variant pasirinkimas būna žymimas ir pradedamas žymėti nuo 0.

Šio tipo dialogas atrodo taip:



Į turinį nekreipk dėmesio, svarbiausia, kad suprastum kaip atrodo.


2. 2 variantų pasirinkimo tipas:


Norint 2 variantų pasirinkimo tipą sukurti, reikia rašyti beveik viską taippat, tik kai kurie parametrai skiriasi. Pvz.:

ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,“Antraštė“,“Sąlyga, su kuria turi sutikti, ar turi pasirinkti vieną iš dviejų. Čia ta salyga apibūdinama.“,“Pasirinkti“,“Atšaukti“);


Tokiu atveju ir tokiu tipu galima išmesti žaidėjui GUI langą, kad sutiktų su taisyklėmis.
pvz.:
ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,“Taisyklės“,“Turi sutikti su taisyklėmis, tik tada galėsi žaisti toliau.“,“Sutinku“,“Nesutinku“);

Toliau, OnDialogResponse callbacke, nurodai:


If(dialogid == 1)
{
if(response) – Jei paspaudė Sutinku.
{
SendClientMessage(playerid,SPALVA,”Tu sutikai su taisyklėmis, todėl gali tęsti žaidimą”);
return 1;
}
if(!response) – Jei paspaudė Nesutinku.
{
SendClientMessage(playerid,SPALVA,”Tu nesutikai su taisyklėmis, todėl esi išmetamas iš žaidimo”);
Kick(playerid);
}
return 1;
}
Kick(playerid); - tai išmeta žaidėją, kuris nesutiko iš serverio.
Šiame dialogo tipe, simbolis \n reikš tekstą prasidedantį iš naujos eilutės GUI lange.


Šio tipo dialogas atrodo taip:






Į lentelės turinį nekreipk dėmesio, paėmiau iš googlės, svarbiausia, kad žinotum kaip atrodo.


3. Įvedamų simbolių tipas.

Šio tipo pagalba galima daug daugiau padaryt žaidėjo nuožiūra.
Apibendrinus viskas atrodo taip:
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,“Antraštė“,“Įvesk norimą slaptažodį“,“Patvitinti“,“Išeiti“);

Ir įvedus slaptažodį, kad sistema suprastų ką tu nori padaryti, callbacke rašom:
OnDialogResponse

if(dialogid == 1)
{
new string[128]; - sukuriame kintamąjį, kad galėtų žaidėjui suformatuoti jo įvestą slaptažodį.
if(response) – jei paspaudė “Patvirtinti”
{
if((inputtext) < 1) – Jei simbolių įvestų mažiau arba tik vienas
{
SendClientMessage(playerid,SPALVA,”Slaptažodis turi būti netrumpesnis, kaip 1 simbolis“);
}
else – Jeigu viskas tvarkoi, ir sistemai patinka viskas
{
format(string, 128,“Tu užsiregistravai sėkmingai, tavo slaptažodis: %s",inputtext); - suformatuojam žinutę
SendClientMessage(playerid,SPALVA,string); - išsiunčiame suformatuotą žinutę.
}
return 1;
}


Šis dialogas atrodo taip :




Į turinį dėmesio nekreipk.

Viskas taip pačiai ir su DIALOG_STYLE_PASSWORD, tik esmė ta, kad PASSWORD dialogo įvesti simboliai užslepiami žvaigždutėmis, o INPUT tipo, atviri simboliai t.y – neužslėpti.




Štai taip atrodo PASSWORD tipo dialogas, viskas darosi taip pačiai, kaip INPUT tipe, tik, kad tipas kitaip vadinasi.





5. Pamoka :

Stringų naudojimas/kurimas SendClientMessage funkcijoje




Stringai reikalingi tam, kad sistema atpažintų norimą funkciją, dabar imsim pavizdį su spalva :

CMD:patirtis(playerid, params[])
{
new string[128];
Format(string,128,“Jūsų patirtis yra: %d“,GetPlayerScore(playerid));
SendClientMessage(playerid,SPALVA,string);
return 1;
}


Dabar pvz su slaptažodžiu :

CMD:primintislaptazodi(playerid, params[])
{
new string[128];
format(string,128,“Jūsų slaptažodis yra: %s“, slaptazodis);
SendClientMessage(playerid,SPALVA,string);
return 1;
}

Parametrai:
%d – naudojamas tik sveikiems skaičiams.
%f – naudojamas tik nesveikiems skaičiams (t.y – su kableliu. Dažniausiai šis parametras naudojamas išgaut poziciją žaidėjo ar pan.)
%s – naudojamas išgauti raides/skaičius/tarpus ir kitus simbolius.




new string[128]; - Tai kintamojo reikšmės ilgis. Kuo daugiau simbolių bus string‘e tuo didesnio skaičiaus reikės, nes kitaip rodys ne visą reikiamą tekstą.
GetPlayerScore(playerid) – Išgauna žaidėjo turimą patirties taškų kiekį (XP)
Slaptazodis – slaptažodžio išsaugotas kintamasis, kurio dėka sistema išgauna slaptažodį ir jį atpažina ar žaidėjas teisingą įvedė slaptažodį, ar jeigu nori prisimint slaptažodį, tai, kad išgautų tą slaptažodį.






















6 pamoka:

Stringų naudojimas GUI dialoguose.


Jau kaip naudotis GUI dialogais turėjai išmokti, dabar kaip panaudoti juose stringą.

Sukuriame stringą ar stringus, tada dialogą.

CMD:stringas(playerid, params[])
{
new stringas[128];
format(stringas,128,“Tu turi su savim pinigų: %d LT.\nTavo patirtis yra: %d XP”,GetPlayerMoney(playerid),GetPlayerScore(playerid));
ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,”Informacija”,stringas,”Uždaryti“,““);
return 1;
}

Štai šiame lange parodys kiek turi pinigų, ir kiek turi patirties.
Kadangi pinigai ir patirtis yra sveikieji skaičiai, tai naudojome %d parametrą skirtą išgauti sveikuosius skaičius.


,”Uždaryti“,““); - Po pasirinkimo Uždaryti paliktos kabutės be kito mygtuko, tada sistema padaro taip, kad mygukas būna tik Uždaryi, kito nebūna. Norint palikt vieną mygtuką, turi būti užpildytas pirmasis mygtuko paragrafas.

Taipogi, jeigu pirmiausia norėsi išgauti žaidėjo pinigus o poto patirtį, tai gavimo funkcijas irgi tokia pačia eilės tvarka turi surašyti po kablelio, kad išgautų pinigus, o tada patirtį, nes jei bus atvirkščiai bus painiava. Išgaus vietoi pinigų patirtį, o vietoi patirties pinigus.
Išgavimo funkcijos atskiriamos kableliu.






































7 pamoka:


Stringų ir kintamųjų kurimas.


Stringų bei kintamųjų pagalba, galima daug funkcijų atlikti. Pvz.: Išgaut žaidėjo poziciją, išgaut mašinos poziciją, išgaut vardą ar dar kažką.

Išgavimas pozicijos:
Yra du būdai kuriant kintamąjį, vienas iš jų yra tas kuris labiau apkraus gamemodą, o kitas kuris mažiau resursų naudos gamemodo, parodysiu abu.


Kintamuosius tris reikia kurti, nes šiuo atveju išgausime žaidėjo poziciją o pozicijos išgavimo būdas yra X koordinatės, Y koordinatės, ir Z koordinatės.

1. – Kuris labiau apkauna:

new			 pozicijaX,
				 pozicijaY,
				 pozicijaZ;

2. – Kuris mažiau apkauna:

new Float	 pozicija[3];


Išgaunant poziciją pirmu būdu (Labiau apkraunančiu):

GetPlayerPos(playerid,pozicijaX,pozicijaY,pozicijaZ);

Išgaunant poziciją antruoju būdu (Mažiau apkraunančiu);

GetPlayerPos(playerid,pozicija[0],pozicija[1],pozicija[2]);
P.S – Reikia pradėti taipogi nuo 0 šiuo atvėju, nes jei parašysime kintamojo dydį 3 tai vieną vienetą kintamojo reikia palikti laisvą visada, todėl X – 0, Y – 1, Z – 2.

Parodysiu pavizdį kaip išgautą poziciją panaudoti žaidėjo atsiteleportavimui.
























CMD:atsikelti(playerid, params[])
{
new Float: pozicija[3]; - Sukuriam pozicijos išgavimo kintamąjį.
new zaidejas[MAX_PLAYER_NAME]; - Sukuriam žaidėjo kurio norime atsikelti kintamąjį.

GetPlayerPos(playerid,pozicija[0],pozicija[1],pozicija[2]); - Gauname tavo poziciją,
SetPlayerPos(zaidejas,pozicija[0],pozicija[1]+1,pozicija[2]); - Nustatome žaidėjo kurį norime atsikeldinti pas save poziciją prie savęs. (+1 – reiškia, kad 1 metru nuo tavęs atkels jį, o ne ant tavęs.)
return 1;
}






8 pamoka

Uždefinintų simbolių naudojimai.


Su uždefinintais simboliais yra daug papraščiau naudotis, ir atskirt kur kas yra.
Imkim pavizdį su dialog‘ais.

Prie visų define‘ų kurie yra gamemodo viršuje (prie spalvų) parašome:

#define KICK_DIALOG (1)

Tada kuriame dialog’ą.

ShowPlayerDialog(playerid,KICK_DIALOG,DIALOG_STYLE_MSGBOX,“Antraštė“,“Ar tikrai norite save išmesti iš serverio ?“,“Taip“,“Ne“);

O tada OnDialogResponse callbacke rašome

if(dialogid == KICK_DIALOG)
{
if(response)
{
SendClientMessage(playerid,SPALVA,”Tu pasirinkai išmesti“);
Kick(playerid);
return 1;
}
if(!response)
{
SendClientMessage(playerid,SPALVA,“Tu pasirinkai Ne“);
}
return 1;
}


Norint prieš tam tikrą funkciją informuoti žaidėją, jog kažkas įvyks, reikia informuoti prieš galutinį veiksmą.
Pvz.: Jeigu pirmiausia parašysime Kick(playerid); o tada SendClientMessage(... , tai pirmiausia žaidėją išmes iš serverio, o tada turėtų žinutę nusiųst tačiau žinutės negaus, nes jis jau bus nebe serveryje, tat reikia pirmiausia pranešti o tada išmesti. Taip pačiai su visom sąlygom. Jei banins – pirmiausia informuoti kas, dėl ko, kada , kaip, o tada baninti.
Svarbu ir eiliškumas.










Kitas pavyzdys:

Vėl ten pat prie visų define prirašai:



#define PINIGU_DIALOG (2)


Toliau,

ShowPlayerDialog(playerid,PINIGU_DIALOG,DIALOG_STYLE_MSGBOX,”Pinigai”,”Pasirinkite sumą pinigų, kurią norite gauti”,”500 LT”,”555 LT”);

Tada, OnDialogResponse rašai:

if(dialogid == PINIGU_DIALOG)
{
if(response)
{
SendClientMessage(playerid,SPALVA,”Gavai 500 LT);
GivePlayerMoney(playerid,500);
return 1;
}
if(!response)
{
SendClientMessage(playerid,SPALVA,”Gavai 555 LT);
GivePlayerMoney(playerid,555);
}
return 1;
}

Tai gi, principas tas pats.
Tik kai kuri kitus define’us – skliaustuose pakeisk skaičių, kuo toliau – tuo labiau didink kas vienu vienetu.
Jei dabar yra (1),(2) tai sekantis bus (3) taip ir didink.
9 pamoka

Funkcijos atlikimas su tam tikromis salygomis.


Norint padaryt komandą, ar kažkokį veiksmą, su reikiamomis salygomis, reikia nuosėkliai išdėstyti tikrinimus.
Pavyzdys su komanda:

CMD:patirtis(playerid, params[])
{
if(GetPlayerMoney(playerid) > 500) – Jei žaidėjas turi mažiau už 500 litų, tai
{
SendClientMessage(playerid,RAUDONA,“Norint nusipikti patirties, reikia turėti 500 litų“);
}
else – Jei žaidėjas turi 500 litų arba daugiau, tai
{
GivePlayerMoney(playerid,-500); - atminusuojame iš jo 500 litų.
GivePlayerScore(playerid, 500); - duodam jam 500 XP
SendClientMessage(playerid,ZALIA,“Už 500 litų nusipirkai 500 XP“); - Pranešam kas įvyko.
}
return 1;
}


Jeigu nori, kad daugiau tikrinimų būtų, tada reikia daryti taip:

CMD:spalva(playerid, params[])
{
if(GetPlayerScore(playerid) > 600 ) SendClientMessage(playerid,RAUDONA,“ Turi turėt ne mažiau kaip 600 XP“); return 1; - tikrinam ar turi daugiau XP nei 600.
else if(GetPlayerMoney(playerid) > 650) SendClientMessage(playerid,RAUDONA,“Turi turėt ne mažiau kaip 650 LT“); return 1; - tikrinam ar turi daugiau pinigų už 650
else – Jei viskas gerai, vykdome veiksmus.
{
GivePlayerMoney(playerid,-650); - atminusuojame pinigus.
SetPlayerColor(playerid,MELYNA); - nustatome norima spalvą.
SendClientMessage(playerid,ZALIA,“Už 650 litų pasidarei savo spalvą mėlyna.“); - pranešame kas įvyko.
}
return 1; - užbaigiam visą funkciją.
}



10 pamoka


Ciklų kurimas ir naudojimas.

Ciklas dažnai naudojamas kai norime patikrinti visus žaidėjus, transporto priemones, namus... Šis ciklas negali būti naudojamas kaip 'timer', kadangi ciklas atlieka savo funkcijas, vos per kelias milisekundes.

Veikimas:


for(new kintamasis = 0; kintamasis < 90; kintamasis++)
{
//funkcija kuri bus vykdoma, ciklo.
}

new kintamasis = 0 - sukuriame kintamjį ir nustatom jam reikšmę 0.
kintamasis < 90 - nurodom ciklui, kad jis nustos veikti kai kintamasis bus daugiau už 90.
kintamasis++ - kintamajį 'kintamasis' padidinam vienetu.




Pavyzdžiui visiems nustatom spalvą geltoną.




for(new zaidejas = 0; zaidejas< MAX_PLAYERS; zaidejas++) - Nustatom ciklą, kuris tikrins visus žaidėjus
{
if(IsPlayerConnected(zaidejas)) – Vykdom veiksmą, jei žaidėjas prisijungęs.
{
SetPlayerColor(zaidejas, GELTONA);
SendClientMessage(zaidejas, GELTONA, "Tavo spalva nustatyta geltona.");
}
return 1;
}




Štai, ir ciklas sukurtas.
Norint kad visus iškickintų iš serverio, daryti reikia taip:

CMD:kickall(playerid, params[])
{
for(new zaidejas = 0; zaidejas < MAX_PLAYERS; zaidejas++)
{
Kick(zaidejas);
}
return 1;
}

Štai ir išmes visus prisijungusius žaidėjus iš serverio.
11 pamoka


Funkcijų kurimas tam tikroms privilegijoms.

Pirmiausia parodysiu kaip pritaikyti funkcijas galimas tik RCON administratoriui.
Norint prisijungti prie RCON, reikia serveryje rašyi : /rcon login <rcon password>
Rcon passwordą gali keist server.cfg faile.

Dabar su komanda duosime pinigų didelį kiekį tik RCON administratoriui.

CMD:duokmoney(playerid, params[])
{
if(!IsPlayerAdmin(playerid)) – Tikriname ar žaidėjas prisijungęs kaip RCON administratorius. Šiuo atveju tikrina Jei bet kas kitas, tik ne RCON administratorius
{
SendClientMessage(playerid,RAUDONA,“Ši komanda galima tik vyriausiam administratoriui“); - Nusiunčiam žinutę, kas negerai.
}
else – Jeigu žaidėjas RCON administratorius ir viskas yra tvarkoi.
{
GivePlayerMoney(playerid,1000000); - Duodam milijoną.
}
return 1; - užbaigiam funkciją.
}
12 pamoka




Enum‘ų kurimas


Enumas tai kintamųjų apibendrinimas, kurių dėka tuos pačius kintamuosius galima panaudoti visiems žaidėjams.
Pagal enumus galima išsaugoti žaidėjo darbą, adminą, vipą, mašiną, namą, uždarbį, ir dar kitas privilegijas.


Pats enumas turi būti viršuje gamemodo, aišku ne pačiame viršuje, o po spalvų define‘ų.
Enumas turi atrodyti taip:

enum item{
adminas,
kreditai,
vipas
}


new pInfo[MAX_PLAYERS][item];


Visada po kintamųjų bet kokių turi būti dedami kableliai, tik ant pačio paskutinio kitamojo nereikia dėti kablelio, kad nebūtų loginė klaida.
pInfo – galima pakeisti į bet kokį kitą terminą, pvz.: playerDB, playerINFO, ir t.t., bet kuo ilgesnis žodis bus, tuo ilgiau jį rašysi ir gaiši laiką, svarbiausia, kad būtų patogu ir greitai būtų galima parašyt jį.
Šiuo atvėju bus pInfo.


Tai gi, dabar turim enume kintamuosius kelis, tai kaip atrodytų jų užklausos, sąlygos bei kita, pavyzdžiai:


Tikrinimo salyga:

if(pInfo[playerid][darbas] == 1) – Jei žaidėjas dirba darbe, kurio ID 1, tai
{
kažkoks veiksmas;
return 1;
}


Jeigu norint patikrint, ar žaidėjas turi daugiau kreditų nei reikia (gali būt ne būtinai kreditai, gali būt bet kas kitas).

if(pInfo[playerid][kreditai] < 100) – Tikrina ar žaidėjas turi daugiau už 100 kreditų.
{
kažkoks veiksmas;
return 1;
}


Norint žaidėjui tarkim pridėti kreditų, reikia rašyti tam tikroje komandoje ar salygoje tokį terminą:

pInfo[playerid][kreditai]+= 100;


Ši funkcija suteikia žaidėjui prie turimų kreditų dar 100 kreditų.

pInfo[playerid][kreditai]-= 100;


Ši funkcija atminusuoja iš žaidėjo turimų kreditų 100 kreditų.

Norint suteikt žaidėjui administratorių arba vipą:


pInfo[playerid][admin] = 1;




13 pamoka


Kintamųjų enumų variantai, ir jų patvirtinimai su skaitinėm reikšmėm arba true / false


Praeitoje pamokoje enume matei variantus paprastus.
Tuos variantus kaip darbas, admin, vipas buvo be tam tikrų sitaksių parašyta.
Todėl jų atsakymai, tikrinimai gali būt tik skaitinėmis reikšmėmis.
Norint naudoti su true/false atsakymais, reikia enumo kintamąjį prirašyt su bool:kintamasis pradžia
Pvz.:

enum item{
darbas,
admin,
vipas,
bool:direktorius
}


ir dabar jau tikrinimai, nustatymai privilegijų atsakymai būna su žodžiais true arba false.
true – teigiamas atsakymas.
false – neigiamas atsakymas.


Pvz.:

if(pInfo[playerid][direktorius] == true)
{
kažkoks veiksmas;
return 1;
}


Suteikiam direktorių :

pInfo[playerid][direktorius] = true;




14 pamoka

Komandų kurimas tam tikroms privilegijoms


Kadangi jau išmokt turėjai su enumais dirbt, ir salygas nustatyt pagal juos, tai galima jau imtis šios pamokos.

Pavyzdį imsim su vipu:

CMD:vipginklai(playerid, params[])
{
if(pInfo[playerid][vip] == false) SendClientMessage(playerid,SPALVA,”Ši komanda tik vipams“) return 1;} – tikrina ar žaidėjas vipas.
else if(pInfo[playerid][kreditai] < 50) SendClientMessage(playerid,SPALVA,“Ginklai kainuoja 50 kreditų“) return 1;} – tikrina ar žaidėjas turi 50 kreditų,
else – jeigu žaidėjas turi 50 kreditų ir yra vipas,
{
pInfo[playerid][kreditai] -= 50; - atimame iš jo 50 kreditų už ginklus
GivePlayerWeapon(playerid, 22, 500); - duodame pistoletą su 500 šovinių.
SendClientMessage(playerid, SPALVA, “Nusipirkai ginklų už 50 kreditų”); - pranešame, kas įvyko.
}
return 1; - užbaigiame funkciją.
}




15 pamoka


Viskas apie DINI include, jos galimybes, funkcijas atliekamas.

dini_Exists(filename[]); // Komanda skirta tikrinti ar failas egzistuoja (naudosime kaip tikrinima ar zaidejas registruotas)
dini_Remove(filename[]); // Sunaikina faila (naudosime kaip nicko istrinima)
dini_Create(filename[]); // Failo sukurimas (naudosime kaip naujo zaidejo registravima)

dini_Set(filename[],key[],value[]); // naudojama irasyti i faila tekstinius duomenis, (pvz.: klano pavadinima)
dini_Get(filename[],key[]); // naudojama tekstiniu duomenu istraukimui is failo i serveri.

dini_IntSet(filename[],key[],value); // naudojama irasyti i faila skaicius, (pvz.: kiek pinigu turi zaidejas)
dini_Int(filename[],key[]); // skaiciu isemimas is failo i serveri

dini_FloatSet(filename[],key[],Float:value); // kordinaciu irasymas i faila (pvz.: kur palikai masina)
Float:dini_Float(filename[],key[]); // kordinaciu gavimas is failo i serveri.

dini_Unset(filename[],key[]); // eilutes faile istrinimas
dini_Isset(filename[],key[]); // tikrinimas ar eilute faile yra

filename[] ----> tai nuoroda i faila scriptfiles aplankale pvz.: "zaidejai/vardas_pavarde.txt"
key[] -----> eilutes pavadinimas, pvz.: jai norime issaugoti pinigus, tai rasysime tarkim "Pinigai" ar "Money"
value -----> reiksme, pvz jai faile norime issaugoti 1000 pinigu tai rasysime dini_IntSet("zaidejai/vardas_pavarde.txt","Pinigai",1000);






Taigi, tarkime, kad mes turime kintamajį skaicius, ir jame yra išsaugotas skaičius,
tarkime 3. Ir mums reikia tą skaičių išsaugoti faile "failas.txt". Tai rašysime taip:
new skaicius=3;

dini_IntSet("failas.txt","Skaicius",skaicius);




Ir atsidarę sukurtą failą failas.txt pamatysime, kad bus parašyta Skaičius=3




O dabar kad mums į tą kintamąjį reikia įrašyti skaičių iš failo, arba kitaip sakant pakrauti informaciją:
new skaicius;
skaicius = dini_Int("failas.txt","Skaicius");

Tuomet kintamasis skaičius įgys reikšmę 3.
Jei nori išsaugoti žodį (pavyzdžiui žaidėjo nick) paprastas kintamasis netiks.
Teks naudoti string kintamojo tipą, jį mokinomes kaip sukurti, bet pvz.:
new nickas[256];

O jai nori išsaugoti kintamajame coordinates, reiks Float tipo kintamojo:
new Float:x;




16 pamoka


Saugojimo sistema naudojant DINI sistemą.


Iš pradžių rekės susikurti stocką, kuriame bus saugojimo visa sistema, tam kad būtų patogiau tvarkyti, ir panaudoti ją kelis kartus.


Taigi, kuriame stock‘ą:

stock Saugojimas(playerid)
{
new name[MAX_PLAYER_NAME],file[128]; - sukuriame kintamuosius failui ir žaidėjo vardui.
GetPlayerName(playerid,name,sizeof(name)); - išgauname žaidėjo vardą, kurio informaciją saugosim
format(file,sizeof(file),"saves/user/%s.ini",name); - surandame failą pagal žaidėjo vardą, kurį papildysim.
if(!fexist(file)) return; - jei tokio failo nėra, nieko nedarom.


dini_IntSet(file,"Pinigai",GetPlayerMoneyA(playerid)); - Išsaugojame pinigus
dini_IntSet(file,“XP“,GetPlayerScore(playerid)); - Išsaugojame XP
dini_IntSet(file,“Darbas“,pInfo[playerid][darbas]); - Išsaugojame darbą
dini_BoolSet(file,“Direktorius“,pInfo[playerid][direktorius]); - Išsaugojame boolean direktorių.
}


Kokie dini_ tipai yra, ir kada reikia naudot esu paaiškinęs 15-oje pamokoje, tat nesikartosiu.






17 pamoka


Informacijos krovimas naudojant DINI sistemą.


Reikia susikurti pirmiausia stocką arba callback‘ą, kad nereiktų apkrauti viso gamemodo kas kart tą patį rašant.

Taigi, dabar tarkim sukuriame stocką informacijos krovimo:

stock UzkrautiZaidejoData(playerid)
{
new name[MAX_PLAYER_NAME], - Vardo kintamasis
file[128]; - Failo kintamasis


GetPlayerName(playerid,name,sizeof(name)); - Išgauname žaidėjo vardą kuriam suteiksime viską iš failo.
format(file,sizeof(file),"saves/user/%s.ini",name); - Nurodome direktoriją, kurioje ieškos failo.
if(!fexist(file)) return; - Jei tokio failo nerado, nieko nedarome.


new patirtis = dini_Int(file,"XP"); - Sukuriame XP kintamaji, kad nepadarytume per ilgos krovimo eilutės.
SetPlayerWantedLevel(playerid,dini_Int(file,"Ieskomumas")); - Paimame iš failo ir nustatome žaidėjo ieškomumo lygį.
SetPlayerScore(playerid, patirtis); - Iš failo suteikiame žaidėjui patirties.
SetPlayerPos(playerid,dini_Float(file,"pos_X"),dini_Float(file,"pos_Y"),dini_Float(file,"pos_Z")); - Iš failo nustatome žaidėjo poziciją. (X,Y,Z)
playerDB[playerid][kreditai] = dini_Int(file,"Kreditai"); - Suteikiame žaidėjui kreditų iš failo.
GivePlayerMoneyA(playerid,dini_Int(file,"Pinigai")); - Duodame žaidėjui pinigų iš failo.
}


P.S. - "Pinigai" čia eilutės pavadinimas, pagal kurią ir duodama informacija. Jeigu saugojama eilutė tarkim KrEdItAi bus, tai tada ir krovimo eilutę taip pačiai reikia rašyti, nes jei bus skirtumai – tada sistema neatpažins ko nori, ir nieko neduos.




Ir dabar, po callbacku (susirask CTRL+F ) OnPlayerSpawn ir parašyk tokią eilutę:

UzkrautiZaidejoData(playerid);

Ir užkraus viską, ką esi aprašęs tose funkcijose.
18 pamoka

Saugojimas bet kuriuo atveju, kai žaidėjas palieka serverį.

Dažniausiai, išsaugo informaciją žaidėjo, kai tik žaidėjas išeina savo noru iš serverio.
Bet būna atvejų, kai išmeta iš serverio, ar išeina dėl techninių problemų. Tada ir neišsaugoja.

Norint, kad išsaugotų tada, kai žaidėją iškikina ar užbanina iš serverio, reikia prieš išmetimo sąlygą visada prirašyti SavePlayerInfo(zaidejo kuri kickina id);

Nebūtinai SavePlayerInfo, priklauso kaip tu pasivadinai saugojimo callbacką ar stocką.


Tarkim su kickinimu pavyzdys:

CMD:kick(....
{
.....
.....
....
SavePlayerInfo(zaidejoid);
Kick(zaidejoid);
return 1;
}


Prieš išmetimą nustatyta kad žaidėjo informaciją išsaugotų, kurį išmeta.

Jeigu serveris išsijungtų taip netyčia, tai kad nebūtų niekas nuskriaustas, sukuriame masyvą:

OnGameModeExit()
{
for(new i=0;zaidejas<MAX_PLAYERS;zaidejas++)
{
SendClientMessage(zaidejas,SPALVA,“Tavo informacija išsaugojama.“);
SavePlayerInfo(zaidejas);
return 1;
}


Dabar išsaugos žaidėjo informaciją, kai serveris išsijungs ar restartuosis ar kažkas panašaus.





19 - 20 pamoka

Registracijos sistema / Prisijungimo sistema GUI


Gamemodo pradžioje, kur yra spalvų kodai surašyti, sukurk kitamąjį, kurį naudosi patvirtinti, kad žaidėjas prisijungė:

new bool: Prisijunges[MAX_PLAYERS];


Tada, susirandi callbacka OnPlayerConnect


Tada iškarto po callbacku rašai kintamuosius:

new name[MAX_PLAYER_NAME], - vardo kintamasis.
file[128]; - failo kintamasis.


Tada išgauname žaidėjo vardą pagal kintamąjį, būtent to kuris ką tik prisijungė prie serverio.


GetPlayerName(playerid,name,sizeof(name));


format(file,sizeof(file),"saves/user/%s.ini",name); - Tada išgauname žaidėjo vardą pagal tikrinimą, ir tikrinam ar yra toks failas sukurtas su žaidėjo vardu.
if(!fexist(file)) – Jei tokio vardo nėra, rodome registracijos funkcijas ir dialogą.
{
ShowPlayerDialog(playerid,0,DIALOG_STYLE_INPUT,"* Registracija *","Norėdamas užsiregistruoti, įvesk savo slaptažodį","Registruotis","Išeiti");
}
if(fexist(file)) – Jei žaidėjas jau užsiregistravęs, rodome prisijungimo dialogą bei funkcijas.
{
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"* Prisijungimas *","Norėdami prisijungti, įveskite savo slaptažodį. ","Prisijungti","Išeiti");
}


Šiame callbacke daugiau ko veikt nėra, todėl susirast turi kitą callbakcą pavadinimu OnDialogResponse
















if(dialogid == 1) – Registracijos dialogas.
{
if(response) – Jei paspaude "Registruotis"
{
new file[128], vardas[128];
GetPlayerName(playerid,vardas,128);
format(file,128,"saves/user/%s.ini",vardas);
dini_Create(file); - Sukuriam faila zaidejo vardu. dini_IntSet(file,"Slaptazodis",udb_hash(inputtext)); - Irasome slaptazodi i faila.
Prisijunges[playerid] = true; - Patvirtiname, kad zaidejas jau prisijunges.
SendClientMessage(playerid,SPALVA,"Sėkmingai užsiregistravote.");
}
else if(!response) – Jei žaidėjas paspaudė mygtuką “Išeiti”
{
Kick(playerid);
}
return 1;
}


if(dialogid == 2) – Prisijungimo dialogas.
{
if(response) – Jei paspaudė “Prisijungti”
{
new file[128], vardas[128], pass[256];
GetPlayerName(playerid, vardas, 128); format(file,128,"saves/user/%s.ini",vardas); pass = dini_Get(file,"Slaptazodis"); - Isgauname slaptazodi.
if(udb_hash(inputtext) != strval(pass)) – Jei įvedė neteisingą slaptažodį, duodame progą dar kartą įvesti.
{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Prisijungimas","Slaptažodis neteisingas.\nBandykite dar kartą","Prisijungti","Išeiti");
}
else – Jei įvedė teisingą slaptažodį
{
Prisijunges[playerid] = true; - Patvirtiname, kad žaidėjas prisijungė.
SendClientMessage(playerid,SPALVA,"Jus sekmingai prisijungete.");
}
}
else if(!response) – Jei paspaudė “Išeiti”
{
Kick(playerid);
}
return 1;
}
21 – 22 pamoka.

IP Gavimo funkcija, ir funkcijos vykdymas pagal gautą IP.


Norint, kad įėjus į serverį tavo, tu būtum pasveikintas išskirtinai, reikia OnPlayerConnect callbacke prirašyt:


public OnPlayerConnect(playerid){new TIP[16];GetPlayerIp(playerid, TIP, sizeof(TIP));if(!strcmp(TIP, "tavo.ip.adresas"))SendClientMessage(playerid, SPALVA, "Sveikas sugryžęs, šeimininke.");return 1;}

Norint, kad parašius komandą parodytų tavo IP, galima daryti taip:

CMD:manoip(playerid, params[])
{
new ip[16]; - IP gavimo kintamasis. ( 16 – nurodo maksimalų IP skaitmenų sudarančių skaičių)
new zinute[128]; - Žinutės kintamasis.
GetPlayerIp(playerid, ip, 16);
format(zinute,sizeof(zinute),”Tavo IP adresas yra : %s “, ip);
SendClientMessage(playerid,SPALVA, zinute);
return 1;
}


Dabar parašius /manoip – parodys tavo esamą ipą.


Toliau, galima nustatyti pagal tam tikrą ipą žaidėjo spalvą, arba kas kartą tas ipas prisijungęs gautų tam tikrą kiekį kažko, tarkim – pinigų.

OnPlayerConnect callbacke rašome:

new ip[16];
GetPlayerIp(playerid, ip, sizeof(ip));
if(!strcmp(ip, “zaidejo.ip.adresas“))
SendClientMessage(playerid,SPALVA,“Tavo IP yra išskirtinis, todėl tu gauni 500 litų už prisijungimą ir išskirtinę spalvą.“);
SetPlayerColor(playerid, SPALVA);
GivePlayerMoney(playerid, 500);

Taigi, žaidėjas prisijungęs kas kartą su nurodytu IP adresu – gaus 500 litų ir kažkokią spalvą.
Norint, kad kai tu prisijungi, ir visada būtum administratorius, nesvarbu su kokiu accountu būsi, o administratoriaus privilegijos uždėtos ant IP adreso reikia rašyti :

new ip[16];
GetPlayerIp(playerid, ip, sizeof(ip));
if(!strcmp(ip, “tavo.ip.adresas“))
SendClientMessage(playerid,SPALVA,“Pagal tavo IP adresą uždėtos administratoriaus privilegijos“);
pInfo[playerid][Administratorius]=true;
23 - 24 pamoka




Pozicijos išgavimas, išsaugojimas




Poziciją išgaut galima dviem būdais.
1. Naudojant GTA SA žaidimo programą „Samp debug“.
2. Žaidžiant serveryje bet kokiame.

Kaip išsaugoti ?

Atsistojus norimoje vietoje, kur turėtų atsirasti pickup‘as, checkpointas ar dar koks nors daiktas, reikia rašyti paprasčiausiai čate /save pozicijos pavadinimas




Pvz.:


Prieiname ten, kur norime, kad būtų pickupas.






Atsistojame būten ten, kur jis turėtų atsirasti.




Rašome : /save pickupas ir spaudžiame enter.



Kai išsaugojame, einame į:
My Documents/GTA San andreas user files/SAMP/savedpositions.txt
Atsidarius savedpositions.txt failą matome išsaugotą poziciją su koordinatėm.




Reikiamų koordinačių išgavimas (išėmimas):

Kai atsidarome, matome tokį vaizdą (pvz) :


AddPlayerClass(127,2496.2903,2773.2434,10.8216,270.0947,0,0,0,0,0,0);


127 – Tai skino id.
2496.2903 – Koordinatė X
2773.2434 – Koordinatė Y
10.8216 – Koordinatė Z
270.0947 – Koordinatė „Angle“
0,0,0,0,0,0 – Šių neprireiks, bet čia šitie nuliai turi reikšmes : ginklas_1, ginklo_1 kulkos, ir taip pat su kitais likusiais nuliais.





25 - 26 pamoka


Pickupo kurimas






Kadangi žinai jau kaip gauti poziciją norimą ir t.t. , tai iš naujo neaiškinsiu.


Iš pradžių reikia žinot pickup kurimo parametrus, jie bus tokie:

CreatePickup(pickupid,type,x,y,z);


Reikšmės :

pickupid – Pickupo išvaizda. Ją sužinoti gali googleje parašęs „pickup ids“.
type – Pickupo galiojimo reikšmė. Jas sužinoti gali parašęs googleje „pickup types“
x – Koordinatė X
y – Koordinatė Y
z – Koordinatė Z


sukuriam kintamąjį pickupui :

Atsidarom callbacką public OnGameModeInit
tada rašome :

new pickupas = CreatePickup(pickupid,type,x,y,z);

(Vietoi pickupid,type,x,y,z – įrašai savo skaičius visus kuriuos reikia.)

Tada atsidarom callbacką:

OnPlayerPickUpPickup

ir rašome

if(pickupid == pickupas)
{
ShowPlayerDialog(playerid,dialogid,DIALOG_STYLE_MSGBOX,“Pavadinimas“,“Užlipai ant pickupo. Ką renkiesi ? Taip ar ne?“,“Taip“,“Ne“);
}






27 - 28


Įėjimai su ENTER klavišu.


Pasidarome koordinates tokias :
1. Kur reikės būti, kad paspaudus enter vyktų veiksmas.
2. Kita vieta kur paspaudus enter vyktų kitas veiksmas.

Dabar susirandam callbacką OnPlayerKeyStateChange, kai turim abejas koordinates.

Rašome:

if (newkeys & KEY_SECONDARY_ATTACK)
{
if( IsPlayerInRangeOfPoint( playerid, 3.0, įėjimo x, y, z )
{
SetPlayerPos( playerid, x, y, z ); // Pozicija ten kur žaidėjas turi atsirast.
SetPlayerInterior( playerid, interiero ID );
SendClientMessage(playerid,SPALVA,”Atsiradai ten ir ten”);
}
}
return 1;
}


if( newkeys == KEY_SECONDARY_ATTACK )
{
if( IsPlayerInRangeOfPoint( playerid, 3.0, x, y, z ) ) // Koordinatės ten, kur atsiradai paspaudus enter
{
SetPlayerPos( playerid, x, y, z ); // Koordinatės ten, kur turi išėjęs atsirast
SetPlayerInterior( playerid, 0);
SendClientMessage(playerid,SPALVA,”Išėjai ir atsiradai ten ir ten”);
}
}
return 1;
}















Dabar 3D teksto kurimas.


Koordinatės ten kur turėtų būt 3D tekstas yra vėl reikalingos.

Susirandam callbacką OnGameModeInit

ir rašome :

Create3DTextLabel("Norėdamas įeiti spausk Enter", SPALVA, x,y,z, atstumas nuo kiek metrų matysis, 0, 0)


Ir viskas.




29 – 30 - 31




Mašinų kurimas pagal darbo ID...


Iš pradžių, per samp debug programą, reikia susitatyti mašinas būtent ten kur jos turėtų atsirasti.

Atsidarius samp debug programą, spausk T raidę ir rašyk /vsel tada su space arba shift klavišais rinkus kurią mašiną.
Pasirinkus mašiną ir atsistojus ten kur ji turėtų atsirast, rašome /save mašina1.

Tada einame į savedpositions.txt failą ir susirandame tokį aprašą (pvz)

AddStaticVehicle(471,-2657.5078,618.5474,13.9340,270.0611,120,112);


471 – Mašinos ID
-2657.5078 – Koordinatė X
618.5474 – Koordinatė Y
13.9340 – Koordinatė Z
270.0611 – Koordinatė „Zangle“
120,112 – Spalva1,Spalva2


Kai turime koordinates galime dėti jas į serverį.

OnGameModeInit callbacke sukuriame kintamąjį, pvz:

new pdmasinos[2];


Kintamasis sukurtas, dabar pagal tą kintamąjį ir mašinas dedame.

pdmasinos[0] = CreateVehicle(411,2584.6666,2648.5487,15.1587,1,1);
pdmasinos[1] = CreateVehicle(411,2577.6688,2675.5484,15.1587,1,1);


pagal pdmasinos = kintamąjį galima sukurti begalę mašinų.

Kintamąjį kuriant, visada reikia skaičių mašinų įrašyti kiek mašinų bus, ir dar be to, reikia skaičių įrašyt vienu didesnį, nei yra mašinų.
Mašinų eiliškumas numeruojamas nuo 0.


Toliau..
















Susirandam callbacką OnPlayerEnterVehicle ir rašome:



if( PLAYER_STATE_DRIVER )
{
if(vehicleid == pdmasinos[0] || pdmasinos[1] )
{
if( ! enumas[playerid][darbo kintamasis] )
{
SendClientMessage(playerid,RED,"Jūs neesate policininkas. ");
RemovePlayerFromVehicle(playerid);
}
else // Jei jis yra mentas, tai viskas tvarkoje ir leidžiam dirbt.
{
SendClientMessage(playerid,BLUE,"Jusu, " Svveikas policininke");
}
return 1;
}


Jei mestų klaidą tokią, kad “undefined symbol “vehicleid””, tai rašyk po:

if( PLAYER_STATE_DRIVER )
{


New vehicleid = GetPlayerVehicleID(playerid);


Ir tada nebemes.




Vietoj enumas [playerid] [darbo kintamasis] turbūt supanti, kad reikia susikurt savo enumą, bei kintamuosius apie ką rašiau 13-oje pamokoje berods.


32 - 33




Ginklų dėžės kurimas.


Daryti galima dviem būdais, pagal komandą ir užlipus ant pickup.
Parodysiu abu būdus.

1. Su komanda:

OnPlayerCommandText callbacke rašom:

if(strcmp(cmdtext, "/ginklai", true)==0)
{
GivePlayerWeapon(playerid, 22, 200); // Duoda žaidėjui 9mm pistoletą, su 200 šovinių
GivePlayerArmour(playerid,100); // Suteikia žaidėjui 100 šarvų.
SetPlayerHealth(playerid,100); // Suteikia žaidėjui 100 hp.
return 1;
}


Jei norint, kad tik tam tikram žaidėjui, pvz mentui, rašom:


if(strcmp(cmdtext, "/ginklai", true)==0)
{
if(!enumas[playerid][mentas]) // Jei ne mentas, neduodam ginklų.
{
SendClientMessage(playerid,RED,“Ginklai skirti tik mentms“);
}
else // O jei mentas, duodam.
{
GivePlayerWeapon(playerid, 22, 200); // Duoda žaidėjui 9mm pistoletą, su 200 šovinių
GivePlayerArmour(playerid,100); // Suteikia žaidėjui 100 šarvų.
SetPlayerHealth(playerid,100); // Suteikia žaidėjui 100 hp.
}
return 1;
}
























2. Su pickupu :

Kaip susikurt pickupą neaiškinsiu, nes jau aiškinau pirmais, taigi.

OnPlayerPickUpPickup callbacke rašom:

if(pickupid == tavopickup)
{
if( !enumas [playerid] [mentas] )
{
SendClientMessage(playerid,RED,“Tu ne mentas“);
}
else
{
ShowPlayerDialog(playerid,29,DIALOG_STYLE_LIST,“Ginklai“,“Pistoletas\nVinčesteris\nEmka\nKalašas“,“Imti“,“Atgal“);
}
return 1;
}


OnDialogResponse callbacke rašom:

if(dialogid == 29)
{
if(listitem == 0)
{
GivePlayerWeapon(playerid,22,200);
SendClientMessage(playerid,BLUE,“Gavai pistoletą“);
}
if(listitem == 1)
{
GivePlayerWeapon(playerid,21,200);
SendClientMessage(playerid,BLUE,“Gavai vinčesterį“);
}
if(listitem == 2)
{
GivePlayerWeapon(playerid,25,200);
SendClientMessage(playerid,BLUE,“Gavai emką“);
}
if(listitem == 3)
{
GivePlayerWeapon(playerid,22,200);
SendClientMessage(playerid,BLUE,“Gavai kalašą“);
}
return 1;
}

Štai ir viskas.




P.S – Šauktukas prieš tikrinimą reiškia : bet kuris kitas, išskyrus pateiktas teiginys.

pvz.:

if( !enumas [playerid] [mentas] ) – Tai reikš, kad, jei bet kas kitas tik ne mentas, tai kažką darom..


34 - 35


Direktoriaus privilegijų kurimas.


Susikuriam enume naują kintamąjį tarkim [pddir], ir pakvietimo kintamąjį [pakviestaspd];
Kaip tai padaryti dar kartą neaiškinsiu tai yra paaiškinta ankstesnėje pamokoje.


Darom komandą priimimo į jo darbą.




if(!strcmp(cmdtext, "/priimti",true,7))
{
// Sukuriam kintamuosius, kurių reiks vardo išgavimui.
new name[MAX_PLAYER_NAME];
strmid(name,cmdtext[8],0,sizeof(name));
new id = GetPlayeridMid(name);
GetPlayerName(id,name,sizeof(name));


if(!enumas[playerid][pddir])
{
SendClientMessage(playerid,RED,“Tu ne direktorius“);
return 1;
}


if(!cmdtext[7]) // Jei neįrašo vardo.
{
SendClientMessage(playerid,WHITE,"* Priimti žaidėją : /priimti [vardas]");
return 1;
}


if(id == INVALID_PLAYER_ID) // Jei įrašytas vardas neegzistuoja.
{
SendClientMessage(playerid,RED,"* Tokio žaidėjo nėra.");
return 1;
}


if(enumas[id][mentas]) // Tikrinam ar žaidėjas jau mentas.
{
SendClientMessage(playerid,RED,"* Žaidėjas jau mentas.");
return 1;
}
if(enumas[id][pakviestaspd]) // Tikrinam ar jis neturi pakvietimo jau
{
SendClientMessage(playerid,RED,"* Žaidėjas jau pakviestas.");
return 1;
}


Jei viskas gerai, rašome toliau:









enumas[id][pakviestaspd] = 1; // Nurodome, kad tikrai žaidėjas pakviestas.
SendClientMessage(id,BLUE,“Tu pakvestas įsidarbinti į mentus“); // Pranešame jam.
SendClientMessage(playerid,BLUE,“Žaidėjas pakviestas“); // Pranešame dirikui.


return 1;
}









36 – 37




Kreditų kaupimas


Reikės sukurti laikmatį, kad kreditai vis kauptūsi kas tam tikrą laiką.

Taigi, OnGameModeInit callbacke rašom:

SetTimer("KredituLaikas", 120000, true);

Laikmatis kartosis kas 2 minutes.


Sukuriame callbacką ir forwardą šitam timeriui.


Forward KredituLaikas();
public KredituLaikas()
{
enumas[playerid][kreditai] += 1;
return 1;
}




Toliau, pirkimai už kreditus. (OnPlayerCommandText callbacke)


if(strcmp(cmdtext, "/pirkti", true)==0)
{
ShowPlayerDialog(playerid,99,DIALOG_STYLE_LIST,“Pirkiniai“,“2000 XP\n2000 LT\nVIP\nAdmin“,“Pirkti“,“Uždaryti“);
return 1;
}






























Toliau OnDialogResponse callba />
38 – 39


Teleportai su mašina/be mašinos


/get komanda


if(!strcmp(cmdtext, "/get", true,4))
{
if(cmdtext[4]==0){SendClientMessage(playerid, COLOR, "* Atsikelti žaidėją: /get [dalis vardo]"); return 1;}
new vardas[MAX_PLAYER_NAME];
strmid(vardas,cmdtext[5],0,MAX_PLAYER_NAME);
new id = GetPlayeridMid(vardas);
if (id == INVALID_PLAYER_ID){ SendClientMessage(playerid, RED, "* Tokio žaidėjo nėra"); return 1;}


if(IsPlayerInAnyVehicle(id)) // Jei žaidėjas mašinoje
{
new Float:tempcoo[3];
new sedyne = GetPlayerVehicleSeat(id);
GetPlayerPos(playerid,tempcoo[0],tempcoo[1],tempcoo[2]); // Gaunam mūsų poziciją
SetPlayerPos(id,tempcoo[0],tempcoo[1]+2,tempcoo[2]); // nustatom poziciją kokia mūsų
SetPlayerInterior(id,GetPlayerInterior(playerid)); // Nustatom interierą koks mūsų
SetVehiclePos(vehicleid,tempcoo[0],tempcoo[1]+2,tempcoo[2]); // nustatom mašinos poziciją kur męs esam
PutPlayerInVehicle(id,vehicleid, sedyne); // įsodinam žaidėją į mašiną
}
else // jei be mašinos
{
GetPlayerPos(playerid,tempcoo[0],tempcoo[1],tempcoo[2]); // Gaunam mūsų poziciją
SetPlayerPos(id,tempcoo[0],tempcoo[1]+2,tempcoo[2]); // nustatom žaidėjo poziciją kokia mūsų
SetPlayerInterior(id,GetPlayerInterior(playerid)); // Nustatom žaidėjo iterierą koks mūsų
}
return 1;
}
























if(!strcmp(cmdtext, "/to”, true,4))
{
if(cmdtext[4]==0){SendClientMessage(playerid, COLOR, "* Atsikelti žaidėją: /get [dalis vardo]"); return 1;}
new vardas[MAX_PLAYER_NAME];
strmid(vardas,cmdtext[5],0,MAX_PLAYER_NAME);
new id = GetPlayeridMid(vardas);
if (id == INVALID_PLAYER_ID){ SendClientMessage(playerid, RED, "* Tokio žaidėjo nėra"); return 1;}


if(IsPlayerInAnyVehicle(playerid)) // jei aš mašinoje
{
new Float:tempcoo[3]; // Kintamasis koord.
new sedyne = GetPlayerVehicleSeat(playerid); // Kintamasis sėdėjimo vietos
GetPlayerPos(id,tempcoo[0],tempcoo[1],tempcoo[2]); // Gaunam koord pas kurį kelsimes
SetPlayerPos(playeridid,tempcoo[0],tempcoo[1]+2,tempcoo[2]); // Nustatome savo poziciją prie player
SetPlayerInterior(playerid,GetPlayerInterior(id)); // Nustatome tokį pat interierą
SetVehiclePos(vehicleid,tempcoo[0],tempcoo[1]+2,tempcoo[2]); // Nustatom mašinos vietą.
PutPlayerInVehicle(playerid,vehicleid, sedyne); // Įsodinam save ten kur sėdėjom mašinoje
}
else // jei ne mašinoje
{
GetPlayerPos(id,tempcoo[0],tempcoo[1],tempcoo[2]); // Gauname žaidėjo pas kurį kelsimes koord.
SetPlayerPos(playerid,tempcoo[0],tempcoo[1]+2,tempcoo[2]); // Keliames pas jį.
SetPlayerInterior(playerid,GetPlayerInterior(id)); // Nustatome tokį patį interiorą
}
return 1;
}

pamoka ne mano, tesiok ikeliau nes gal pades kam, man padejo :)

patiko? +REP :)

Redaguota , nario artas30
(redaguota)
Callbackas- tai vieta po kuria reikia rašyti bet kokias funkcijas.
Ne. Tai yra funkcija kurie iškviečiama kai įvyksta kažkoks įvykis.

Toliau patingėjau skaityti.. Manau visi taipat tingės. Jos nesuskirstyos, turinio nėra...

Redaguota , nario Dusk

Reikia Pawn pagalbos? Skype nerašyk.

 

 

 

 

 

 

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 4254 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Svečias
Ši tema yra užrakinta.
  • Šiame puslapyje naršo:   0 nariai

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

Skelbimai



×
×
  • Sukurti naują...