[TuT] Kako napraviti sustav organizacija od nule?

Započeo Joey_, Jul 28, 2012, 22:34:48 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Kako napraviti sustav organizacija od nule?
by Joey_

O ÄŒEMU SE RADI?

  • U ovom tutorialu ću vam pokazati kako napraviti sustav organizacija od nule. To znači da ćete pri kraju tutorial znati kako to sami napraviti.
  • U tutorialu ćete naučiti kako napraviti da ako je igrač član neke organizacije da kad se spoji na server da ga spawna u njegovoj bazi. Naučiti ćete i kako napraviti neke lider komande tipa /invite, /izbaci, /rankup. I joÅ¡ neke stvari koje ćete sami otkriti čitajući tutorial.
  • Te u ovom tutorialu se podrazumijeva da imate neki register/login sustav u vaÅ¡em modu i da znate kako dodati nove varijable za spremanje/učitavanje u vaÅ¡ register/login sustav.

POTREBNE STVARI
IGRAÄŒEVE VARIJABLE

  • Morate dodati joÅ¡ 3 varijable u svoj enum tako da bi skripta mogla pamtiti u kojoj je organizaciji igrač.
  • I morate dodat ovaj macro (#define) koji označava maksimalan broj organizacija i joÅ¡ 2 boje koje koristim u tutorialu.
  • Ovako to kod mene izgleda (vi vjerojatno imate drugačije nego Å¡to ja imam):
  • NAPOMENA: Kako si vi definirate varijable ovdje tako ćete morate imat kroz cijelu skriptu jer ja koristim neke druge nazive varijabli nego vi.

#define MAX_ORGS 2 // Ovo je maksimalni broj organizacija na serveru, kad dodate novu organizaciju, povecajte ga za 1

#define C_WHITE 0xFFFFFFAA

#define CRED "{FF0000}"

enum E_PLAYER_DATA
{
E_PLAYER_LEADER, // Varijabla koja pamti cega je igrac lider
E_PLAYER_MEMBER, // Varijabla koja pamti u kojoj je igrac organizaciji
E_PLAYER_RANK, // Varijabla koja pamti koji je igrac rank u organizaciji
E_PLAYER_SKIN, // Varijabla koja pamti koji skin je igrac imao prije ulaska u organizaciju
E_PLAYER_ORG_SKIN, // Varijabla koja pamti koji skin igrac ima dok je u organizaciji
E_PLAYER_MATS, // Varijabla koja pamti koliko igrac ima materijala kod sebe
E_PLAYER_DROGS // Varijabla koja pamti koliko igrac ima droge kod sebe
}

new
gPlayerData[MAX_PLAYERS][E_PLAYER_DATA];


KOMANDA /makeleader

  • Ispod se nalazi komanda /makeleader, sve je objaÅ¡njeno unutar nje.
  • U ovoj komandi ako nemate iste nazive varijabli kao ja, morate ih zamijeniti svojim nazivima. Inače neće raditi kako treba.
  • Unutar tog koda, tj. ispod komande se nalazi jedna funkcija koju morate dodati na kraj svoje skripte. Ta funkcija preko ID-a kojeg proslijedite u funkciju, vraća ime organizacije koja ima taj ID.

CMD:makeleader(playerid, params[])
{
if (IsPlayerAdmin(playerid)) // Provjerava da li je igrac RCON admin, vi to mozete promijeniti u svoju provjeru
{
new
iPlayerID,
iOrgID,
szPlayerName[MAX_PLAYER_NAME],
szMessage[105];

if (sscanf(params, "ud", iPlayerID, iOrgID)) // Ako igrac nije upisao sve potrebne parametre, ispisuje mu tu poruku
return SendClientMessage(playerid, C_WHITE, "KORISTI: /makeleader [igracev ID/dio imena] [ID organizacije]");
else if (iPlayerID == INVALID_PLAYER_ID) // Ako je ID igraca koji je igrac upisao nije online, ispisuje mu tu poruku
return SendClientMessage(playerid, C_WHITE, "ERROR: Pogresan ID igraca.");
else if (iOrgID < 1 || iOrgID > MAX_ORGS) // Ako je ID organizacije koju je igrac upisao manja od 1 ili veca maksimalnog broja organizacija, ispisuje mu tu poruku
return SendClientMessage(playerid, C_WHITE, "ERROR: ID organizacije ne smije biti manji od 1 ili veci od "#MAX_ORGS);

gPlayerData[iPlayerID][E_PLAYER_LEADER] = iOrgID; // Postavlja igracevu varijablu za lidera na ID organizacije, jer moramo negdje zapamtit koje organizacije je igrac lider
gPlayerData[iPlayerID][E_PLAYER_RANK] = 6; // Postavlja igracevu varijablu za rank na 6, to vi mozete promijeniti ako ne zelite da vam je najveci rank 6

switch(iOrgID)
{
case 1: // Prva organizacija, nazovimo je Los Santos Police Department
{
gPlayerData[iPlayerID][E_PLAYER_SKIN] = GetPlayerSkin(iPlayerID); // Sprema igracev skin tako da ako ikad bude izbacen iz organizacije, dobija svoj stari skin natrag
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 283; // Broj 283 je ID skina lidera organizacije, to mozete promijeniti u koji kod skin ID vi zelite

SetPlayerSkin(iPlayerID, gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN]); // Postavlja igracu skin za lidera organizacije
}
// Ovaj kod ispod kao da ne postoji, ali vam prikazuje kako dodati jos jednu organizaciju u /makeleader komandu, sto je potrebno svaki put kada zelite dodati novu organizaciju
/*case 2: // Druga organizacije, nazovimo je FBI
{
gPlayerData[iPlayerID][E_PLAYER_SKIN] = GetPlayerSkin(iPlayerID); // Sprema igracev skin tako da ako ikad bude izbacen iz organizacije, dobija svoj stari skin natrag
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 283; // Broj 283 je ID skina lidera organizacije, to mozete promijeniti u koji kod skin ID vi zelite

SetPlayerSkin(iPlayerID, gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN]); // Postavlja igracu skin za lidera organizacije
}*/
}

GetPlayerName(playerid, szPlayerName, MAX_PLAYER_NAME);

format(szMessage, sizeof(szMessage), "INFO: Admin %s vas je postavio za lidera organizacije %s", szPlayerName, GetOrgNameByID(iOrgID));
SendClientMessage(iPlayerID, C_WHITE, szMessage);

GetPlayerName(iPlayerID, szPlayerName, MAX_PLAYER_NAME);

format(szMessage, sizeof(szMessage), "INFO: Postavio si igraca %s za lidera organizacije %s", szPlayerName, GetOrgNameByID(iOrgID));
SendClientMessage(playerid, C_WHITE, szMessage);
}
else
SendClientMessage(playerid, C_WHITE, "ERROR: Moras biti RCON admin da koristis ovu komandu.");
return 1;
}

stock GetOrgNameByID(iOrgID)
{
new
szOrgName[29];

switch(iOrgID)
{
case 1: // Prva organizacija, nazovimo je Los Santos Police Department
szOrgName = "Los Santos Police Department";
default: // Ako ne postoji ID takve organizacije
szOrgName = "Nepoznata organizacija";
}
return szOrgName;
}


KOMANDA /invite

  • Ispod se nalazi komanda /invite, sve je objaÅ¡njeno unutar nje.
  • U ovoj komandi ako nemate iste nazive varijabli kao ja, morate ih zamijeniti svojim nazivima. Inače neće raditi kako treba.
  • Unutar tog koda, tj. ispod komande se nalazi OnDialogResponse callback kojeg morate dodat (ako ga nemate uopće u skripti) ili ako ga imate u skripti onda morate dodat kod unutar njega tako da bi skripta radilo kako treba.

CMD:invite(playerid, params[])
{
if (gPlayerData[playerid][E_PLAYER_LEADER] > 0) // Provjerava da li je igrac lider icega
{
new
iPlayerID,
szPlayerName[MAX_PLAYER_NAME],
szInviteMsg[241];

if (sscanf(params, "u", iPlayerID)) // Ako igrac nije upisao sve potrebne parametre, ispisuje mu tu poruku
return SendClientMessage(playerid, C_WHITE, "KORISTI: /invite [igracev ID/dio imena]");
else if (iPlayerID == INVALID_PLAYER_ID) // Ako je ID igraca koji je igrac upisao nije online, ispisuje mu tu poruku
return SendClientMessage(playerid, C_WHITE, "ERROR: Pogresan ID igraca.");

GetPlayerName(playerid, szPlayerName, MAX_PLAYER_NAME);

switch(gPlayerData[playerid][E_PLAYER_LEADER])
{
case 1: // Prva organizacija, nazovimo je Los Santos Police Department
{
gPlayerData[iPlayerID][E_PLAYER_MEMBER] = gPlayerData[playerid][E_PLAYER_LEADER]; // Ovdje postavljamo igracu kojeg zelimo pozvati u organizaciju varijablu na ID organizacije (tako da kasnije znamo u kojoj je organizaciji)
gPlayerData[iPlayerID][E_PLAYER_RANK] = 1; // Postavlja igracu kojeg zelimo pozvati u organizaciju rank na 1

// Ovdje formatiramo poruku koju cemo poslati igracu koji je pozvan u organizaciju
// Preko te poruke ce pozvani igrac prihvatiti ili ne prihvatiti ulazak u organizaciju
format(szInviteMsg, sizeof(szInviteMsg), "Lider %s vas je pozvao u organizaciju Los Santos Police Department.\n\nPritisnite tipku 'Prihvacam' ako zelite prihvatiti poziv za ulazak u tu organizaciju\nili pritisnite tipku 'Odbijam' ako ne zelite prihvatiti.", szPlayerName);
}
// Ovaj kod ispod kao da ne postoji, ali vam prikazuje kako dodati jos jednu organizaciju u /invite komandu, sto je potrebno svaki put kada zelite dodati novu organizaciju
/*case 2: // Druga organizacije, nazovimo je FBI
{
gPlayerData[iPlayerID][E_PLAYER_MEMBER] = gPlayerData[playerid][E_PLAYER_LEADER]; // Ovdje postavljamo igracu kojeg zelimo pozvati u organizaciju varijablu na ID organizacije (tako da kasnije znamo u kojoj je organizaciji)
gPlayerData[iPlayerID][E_PLAYER_RANK] = 1; // Postavlja igracu kojeg zelimo pozvati u organizaciju rank na 1

// Ovdje formatiramo poruku koju cemo poslati igracu koji je pozvan u organizaciju
// Preko te poruke ce pozvani igrac prihvatiti ili ne prihvatiti ulazak u organizaciju
// Kad dodajete novu organizaciju, morate promijeniti neke nazive u tekstu kako ne bi svaki tekst bio isti (govorim o imenu organizacije)
format(szInviteMsg, sizeof(szInviteMsg), "Lider %s vas je pozvao u organizaciju FBI.\n\nPritisnite tipku 'Prihvacam' ako zelite prihvatiti poziv za ulazak u tu organizaciju\nili pritisnite tipku 'Odbijam' ako ne zelite prihvatiti.", szPlayerName);
}*/
}

ShowPlayerDialog(iPlayerID, DIALOG_ORG_INVITE, DIALOG_STYLE_MSGBOX, "POZVANI STE U ORGANIZACIJU", szInviteMsg, "Prihvacam", "Odbijam");
}
else
SendClientMessage(playerid, C_WHITE, "ERROR: Moras biti lider da koristis ovu komandu.");
return 1;
}

#define DIALOG_ORG_INVITE 1 // Ovo morate dodati kod ostalih macroa (#define) ili na vrh skripte poslije #include

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case DIALOG_ORG_INVITE: // Ovdje ce se izvrsiti daljnji kod nakon sto je igrac pritisnuo 'Prihvacam' ili 'Ne prihvacam'
{
if (response) // Ako je igrac pritisnuo 'Prihvacam'
{
switch(gPlayerData[playerid][E_PLAYER_MEMBER])
{
case 1: // Prva organizacija, nazovimo je Los Santos Police Department
{
SetPlayerSkin(playerid, 280); // Broj 280 je ID skina za rank 1 u organizaciji LSPD, vi to mozete promijeniti na bilo koji ID skina koji vama odgovara

SendClientMessage(playerid, C_WHITE, "INFO: Prihvatili ste poziv za ulazak u "CRED"Los Santos Police Department");
}
}
}
else // Ako je igrac pritisnuo 'Ne prihvacam'
{
// Resetiramo igraceve varijable na 0 jer nije prihvatio ulazak u organizaciju
gPlayerData[playerid][E_PLAYER_MEMBER] = 0;
gPlayerData[playerid][E_PLAYER_RANK] = 0;

SendClientMessage(playerid, C_WHITE, "INFO: Odbili ste poziv za ulazak u organizaciju");
}
}
}
return 1;
}


KOMANDA /rankup

  • Ispod se nalazi komanda /rankup, sve je objaÅ¡njeno unutar nje.
  • U ovoj komandi ako nemate iste nazive varijabli kao ja, morate ih zamijeniti svojim nazivima. Inače neće raditi kako treba.

CMD:rankup(playerid, params[])
{
if (gPlayerData[playerid][E_PLAYER_LEADER] > 0) // Provjerava da li je igrac lider icega
{
new
iPlayerID,
iRankNum,
szPlayerName[MAX_PLAYER_NAME],
szMessage[71];

if (sscanf(params, "ud", iPlayerID, iRankNum)) // Ako igrac nije upisao sve potrebne parametre, ispisuje mu tu poruku
return SendClientMessage(playerid, C_WHITE, "KORISTI: /rankup [igracev ID/dio imena] [rank]");
else if (iPlayerID == INVALID_PLAYER_ID) // Ako je ID igraca koji je igrac upisao nije online, ispisuje mu tu poruku
return SendClientMessage(playerid, C_WHITE, "ERROR: Pogresan ID igraca.");
else if (iRankNum < 1 || iRankNum > 6) // Ako je broj ranka manji od 1 ili veci od 6, ispisuje mu tu poruku
return SendClientMessage(playerid, C_WHITE, "ERROR: ID organizacije ne smije biti manji od 1 ili veci od 6.");
else if (gPlayerData[iPlayerID][E_PLAYER_MEMBER] != gPlayerData[playerid][E_PLAYER_LEADER]) // Provjerava da li su igrac i ID igraca koji je upisao u istoj organizaciji
return SendClientMessage(playerid, C_WHITE, "ERROR: Taj igrac nije u vasoj organizaciji.");

gPlayerData[iPlayerID][E_PLAYER_RANK] = iRankNum; // Postavlja igracevu varijablu na broj ranka, tako da bi kasnije mogli znati koji je igrac rank

SetPlayerOrgSkin(iPlayerID, ((gPlayerData[iPlayerID][E_PLAYER_LEADER] > 0) ? (gPlayerData[iPlayerID][E_PLAYER_LEADER]) : (gPlayerData[iPlayerID][E_PLAYER_MEMBER])), iRankNum);

GetPlayerName(playerid, szPlayerName, MAX_PLAYER_NAME);

format(szMessage, sizeof(szMessage), "INFO: Lider %s ti je postavio rank na "CRED"%d", szPlayerName, iRankNum);
SendClientMessage(iPlayerID, C_WHITE, szMessage);

GetPlayerName(iPlayerID, szPlayerName, MAX_PLAYER_NAME);

format(szMessage, sizeof(szMessage), "INFO: Postavio si clanu %s rank na "CRED"%d", szPlayerName, iRankNum);
SendClientMessage(playerid, C_WHITE, szMessage);
}
else
SendClientMessage(playerid, C_WHITE, "ERROR: Moras biti lider da koristis ovu komandu.");
return 1;
}

stock SetPlayerOrgSkin(iPlayerID, iOrgID, iRank)
{
switch(iOrgID)
{
case 1: // Prva organizacija, nazovimo je Los Santos Police Department
{
switch(iRank) // Rankovi za prvu organizaciju
{
case 1: // 1. Rank
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 284; // 284 je ID skina za 1. rank u LSPD organizaciji i taj broj mjenjate u svoj ID skina koji zelite
case 2: // 2. Rank
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 280; // 280 je ID skina za 2. rank u LSPD organizaciji i taj broj mjenjate u svoj ID skina koji zelite
case 3: // 3. Rank
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 281; // 281 je ID skina za 3. rank u LSPD organizaciji i taj broj mjenjate u svoj ID skina koji zelite
case 4: // 4. Rank
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 282; // 282 je ID skina za 4. rank u LSPD organizaciji i taj broj mjenjate u svoj ID skina koji zelite
case 5: // 5. Rank
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 282; // 282 je ID skina za 5. rank u LSPD organizaciji i taj broj mjenjate u svoj ID skina koji zelite
case 6: // 6. Rank
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 288; // 288 je ID skina za 6. rank u LSPD organizaciji i taj broj mjenjate u svoj ID skina koji zelite
default:
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 284; // Ovaj ID skina neka vam bude uvijek jednak 1. ranku, on je tu samo ako je doslo do neke greske kod broja ranka
}
}
// Ovaj kod ispod kao da ne postoji, ali vam prikazuje kako dodati jos jednu organizaciju, sto je potrebno svaki put kada zelite dodati novu organizaciju
/*case 2: // Druga organizacija, nazovimo je FBI
{
switch(iRank) // Rankovi za drugu organizaciju
{
case 1: // 1. Rank
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 166; // 166 je ID skina za 1. rank u FBI organizaciji i taj broj mjenjate u svoj ID skina koji zelite
case 2: // 2. Rank
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 166; // 166 je ID skina za 2. rank u FBI organizaciji i taj broj mjenjate u svoj ID skina koji zelite
case 3: // 3. Rank
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 165; // 165 je ID skina za 3. rank u FBI organizaciji i taj broj mjenjate u svoj ID skina koji zelite
case 4: // 4. Rank
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 165; // 165 je ID skina za 4. rank u FBI organizaciji i taj broj mjenjate u svoj ID skina koji zelite
case 5: // 5. Rank
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 286; // 286 je ID skina za 5. rank u FBI organizaciji i taj broj mjenjate u svoj ID skina koji zelite
case 6: // 6. Rank
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 286; // 286 je ID skina za 6. rank u FBI organizaciji i taj broj mjenjate u svoj ID skina koji zelite
default:
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 166; // Ovaj ID skina neka vam bude uvijek jednak 1. ranku, on je tu samo ako je doslo do neke greske kod broja ranka
}
}*/
}

SetPlayerSkin(iPlayerID, gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN]);
return 1;
}


KOMANDA /izbaci

  • Ispod se nalazi komanda /izbaci, sve je objaÅ¡njeno unutar nje.
  • U ovoj komandi ako nemate iste nazive varijabli kao ja, morate ih zamijeniti svojim nazivima. Inače neće raditi kako treba.

CMD:izbaci(playerid, params[])
{
if (gPlayerData[playerid][E_PLAYER_LEADER] > 0) // Provjerava da li je igrac lider icega
{
new
iPlayerID,
szPlayerName[MAX_PLAYER_NAME],
szMessage[68];

if (sscanf(params, "u", iPlayerID)) // Ako igrac nije upisao sve potrebne parametre, ispisuje mu tu poruku
return SendClientMessage(playerid, C_WHITE, "KORISTI: /izbaci [igracev ID/dio imena]");
else if (iPlayerID == INVALID_PLAYER_ID) // Ako je ID igraca koji je igrac upisao nije online, ispisuje mu tu poruku
return SendClientMessage(playerid, C_WHITE, "ERROR: Pogresan ID igraca.");
else if (gPlayerData[iPlayerID][E_PLAYER_MEMBER] != gPlayerData[playerid][E_PLAYER_LEADER]) // Provjerava da li su igrac i ID igraca koji je upisao u istoj organizaciji
return SendClientMessage(playerid, C_WHITE, "ERROR: Taj igrac nije u vasoj organizaciji.");

gPlayerData[iPlayerID][E_PLAYER_MEMBER] = 0; // Resetira igracevu varijablu jer vise nije u organizaciji
gPlayerData[iPlayerID][E_PLAYER_RANK] = 0; // Resetira igracevu varijablu jer vise nije u organizaciji
gPlayerData[iPlayerID][E_PLAYER_ORG_SKIN] = 0; // Resetira igracevu varijablu jer vise nije u organizaciji

SetPlayerSkin(iPlayerID, gPlayerData[iPlayerID][E_PLAYER_SKIN]); // Vraca igracev skin koji je imao prije ulaska u organizaciju

GetPlayerName(playerid, szPlayerName, MAX_PLAYER_NAME);

format(szMessage, sizeof(szMessage), "INFO: Lider %s te je izbacio iz organizacije.", szPlayerName);
SendClientMessage(iPlayerID, C_WHITE, szMessage);

GetPlayerName(iPlayerID, szPlayerName, MAX_PLAYER_NAME);

format(szMessage, sizeof(szMessage), "INFO: Izbacio si clana %s iz organizacije.", szPlayerName);
SendClientMessage(playerid, C_WHITE, szMessage);
}
else
SendClientMessage(playerid, C_WHITE, "ERROR: Moras biti lider da koristis ovu komandu.");
return 1;
}


KOMANDA (/r)adio

  • Ispod se nalazi komanda (/r)adio, sve je objaÅ¡njeno unutar nje.
  • U ovoj komandi ako nemate iste nazive varijabli kao ja, morate ih zamijeniti svojim nazivima. Inače neće raditi kako treba.
  • Ispod koda komande se nalazi funkcija GetPlayerRank() koja je potrebna da kod radi kako treba.

CMD:r(playerid, params[])
{
if (gPlayerData[playerid][E_PLAYER_MEMBER] > 0 || gPlayerData[playerid][E_PLAYER_LEADER] > 0)
{
new
szChatMsg[128],
szPlayerName[MAX_PLAYER_NAME],
szMessage[128];

if (sscanf(params, "s[128]", szChatMsg)) // Ako igrac nije upisao sve potrebne parametre, ispisuje mu tu poruku
return SendClientMessage(playerid, C_WHITE, "KORISTI: (/r)adio [tekst]");

GetPlayerName(playerid, szPlayerName, MAX_PLAYER_NAME);

foreach(new iPlayerID : Player)
{
// Prolazi kroz sve online igrace i provjerava da li su u istoj organizaciji kao i posiljatelj poruke
if (gPlayerData[iPlayerID][E_PLAYER_MEMBER] == gPlayerData[playerid][E_PLAYER_MEMBER] || gPlayerData[iPlayerID][E_PLAYER_LEADER] == gPlayerData[playerid][E_PLAYER_LEADER])
{
format(szMessage, sizeof(szMessage), "%s %s kaze: %s", GetPlayerRank(playerid), szPlayerName, szChatMsg);
SendClientMessage(iPlayerID, C_WHITE, szMessage);
}
}
}
else
SendClientMessage(playerid, C_WHITE, "ERROR: Moras biti clan neke organizacije da koristis ovu komandu.");
return 1;
}

CMD:radio(playerid, params[])
return cmd_r(playerid, params);

stock GetPlayerRank(iPlayerID)
{
new
szRankName[16], // Broj 16 morate promijeniti ako imate rank ime vece od 15 znakova
iPlayerOrg = (gPlayerData[iPlayerID][E_PLAYER_MEMBER] > 0) ? (gPlayerData[iPlayerID][E_PLAYER_MEMBER]) : (gPlayerData[iPlayerID][E_PLAYER_LEADER]);

switch(iPlayerOrg)
{
case 1: // Prva organizacija, nazovimo je Los Santos Police Department
{
switch(gPlayerData[iPlayerID][E_PLAYER_RANK]) // Rankovi za prvu organizaciju
{
case 1: // 1. Rank
szRankName = "Vježbenik";
case 2: // 2. Rank
szRankName = "Kadet";
case 3: // 3. Rank
szRankName = "Policajac";
case 4: // 4. Rank
szRankName = "Viši Policajac";
case 5: // 5. Rank
szRankName = "Narednik";
case 6: // 6. Rank
szRankName = "Poručnik";
default:
szRankName = "Nepoznato";
}
}
// Ovaj kod ispod kao da ne postoji, ali vam prikazuje kako dodati jos jednu organizaciju, sto je potrebno svaki put kada zelite dodati novu organizaciju
/*case 1: // Druga organizacija, nazovimo je FBI
{
switch(gPlayerData[iPlayerID][E_PLAYER_RANK]) // Rankovi za drugu organizaciju
{
case 1: // 1. Rank
szRankName = "Vojnik";
case 2: // 2. Rank
szRankName = "Vojnik";
case 3: // 3. Rank
szRankName = "Zapovjednik";
case 4: // 4. Rank
szRankName = "Zapovjednik";
case 5: // 5. Rank
szRankName = "Zapovjednik";
case 6: // 6. Rank
szRankName = "General";
default:
szRankName = "Nepoznato";
}
}*/
}
return szRankName;
}


KOD ZA SPAWNANJE IGRACA U NJEGOVOJ BAZI

  • Ovaj kod spawn igraca u njegovoj bazi i postavlja mu skin koja mora imat dok je u organizaciji.
  • Ako vec imate svoj OnPlayerSpawn callback onda samo dodajte u njega ovaj kod ispod, a ako nemate OnPlayerSpawn callback onda dodajte cijeli callback u svoj mod.
  • U ovom kodu ako nemate iste nazive varijabli kao ja, morate ih zamijeniti svojim nazivima. Inače neće raditi kako treba.

public OnPlayerSpawn(playerid)
{
if (gPlayerData[playerid][E_PLAYER_MEMBER] > 0)
{
switch(gPlayerData[playerid][E_PLAYER_MEMBER])
{
case 1: // Prva organizacija, nazovimo je Los Santos Police Department
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746); // Postavlja igracevu poziciju na te koordinate, vi te koordinate mozete zamijeniti svojima
SetPlayerFacingAngle(playerid, 270.1425); // Postavlja kamo da igrac gleda, vi to mozete zamijeniti sa svojim kutem

SetPlayerSkin(playerid, gPlayerData[playerid][E_PLAYER_ORG_SKIN]); // Postavlja igracev skin na onaj koji mora imat dok je u organizaciji
}
// Ovaj kod ispod kao da ne postoji, ali vam prikazuje kako dodati jos jednu organizaciju za spawn, sto je potrebno svaki put kada zelite dodati novu organizaciju
/*case 2: // Druga organizacije, nazovimo je FBI
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746); // Postavlja igracevu poziciju na te koordinate, vi te koordinate mozete zamijeniti svojima
SetPlayerFacingAngle(playerid, 270.1425); // Postavlja kamo da igrac gleda, vi to mozete zamijeniti sa svojim kutem

SetPlayerSkin(playerid, gPlayerData[playerid][E_PLAYER_ORG_SKIN]); // Postavlja igracev skin na onaj koji mora imat dok je u organizaciji
}*/
}
}
else if (gPlayerData[playerid][E_PLAYER_LEADER] > 0)
{
switch(gPlayerData[playerid][E_PLAYER_LEADER])
{
case 1: // Prva organizacija, nazovimo je Los Santos Police Department
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746); // Postavlja igracevu poziciju na te koordinate, vi te koordinate mozete zamijeniti svojima
SetPlayerFacingAngle(playerid, 270.1425); // Postavlja kamo da igrac gleda, vi to mozete zamijeniti sa svojim kutem

SetPlayerSkin(playerid, gPlayerData[playerid][E_PLAYER_ORG_SKIN]); // Postavlja igracev skin na onaj koji mora imat dok je u organizaciji
}
// Ovaj kod ispod kao da ne postoji, ali vam prikazuje kako dodati jos jednu organizaciju za spawn, sto je potrebno svaki put kada zelite dodati novu organizaciju
/*case 2: // Druga organizacije, nazovimo je FBI
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746); // Postavlja igracevu poziciju na te koordinate, vi te koordinate mozete zamijeniti svojima
SetPlayerFacingAngle(playerid, 270.1425); // Postavlja kamo da igrac gleda, vi to mozete zamijeniti sa svojim kutem

SetPlayerSkin(playerid, gPlayerData[playerid][E_PLAYER_ORG_SKIN]); // Postavlja igracev skin na onaj koji mora imat dok je u organizaciji
}*/
}
}
return 1;
}


KOD ZA ONEMOGUCIVANJE VOZNJE VOZILA ORGANIZACIJE ONIMA KOJI NISU CLANOVI TE ORGANIZACIJE

  • Svaki kod stavi gdje mu je mjesto kako je prikazano u kodu ispod.
  • Kada dodajete novu organizaciju i zelite da vam drugi igraci osim clanova te organizacije ne mogu voziti vozila te organizacije, morate napraviti novu funkciju za provjeru da li je to vozilo dio te organizacije. I morate dodat jos jednu provjeru u OnPlayerStateChange callback te morate napraviti novu varijablu za tu organizaciju i dodijelit ID-eve vozila te organizacije toj varijabli (ako ovaj tekst niste skužili, pitajte te me u temi i probat ću vam bolje objasnit).

new
gPoliceCar[2]; // 2 je broj koliko ima policijskih vozila, ako zelite dodavat jos vozila LSPD organizaciji (ili nekoj novoj organizaciji), taj broj mora biti jednak broju vozila te org.

public OnGameModeInit()
{
gPoliceCar[0] = AddStaticVehicleEx(522, 1958.3783, 1343.1572, 15.3746, 270.1425, 1, 1, 60000); // Stvara vozilo LSPD-a i pamti njegov ID u varijabli gPoliceCar[0]
gPoliceCar[1] = AddStaticVehicleEx(522, 1958.3783, 1343.1572, 15.3746, 270.1425, 1, 1, 60000); // Stvara vozilo LSPD-a i pamti njegov ID u varijabli gPoliceCar[1]
return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
if (newstate == PLAYER_STATE_DRIVER) // Ako je usao u vozilo kao vozac
{
new
iVehicleID = GetPlayerVehicleID(playerid);

// Provjerava da li je igrac usao u vozilo org. LSPD i provjerava da li je clan te org., ako nije izbacit ce ga iz vozila
if (IsAPoliceCar(iVehicleID) && gPlayerData[playerid][E_PLAYER_MEMBER] != 1 && gPlayerData[playerid][E_PLAYER_LEADER] != 1)
{
SendClientMessage(playerid, C_WHITE, "ERROR: Nisi clan Los Santos Police Departmenta.");

RemovePlayerFromVehicle(playerid);
}
}
return 1;
}

stock IsAPoliceCar(iVehicleID)
{
for(new iIdx = 0; iIdx < sizeof(gPoliceCar); iIdx++)
{
if (gPoliceCar[iIdx] == iVehicleID)
return 1;
}
return 0;
}


SEFOVI

  • Svaki kod stavi gdje mu je mjesto kako je prikazano u kodu ispod.

// Ovo ispod dodajte na pocetak skripte
// Ovo je dio koda u kojem definiramo gdje ce bit spremljeni podaci o organizaciji, tj. o kolicini materijala u sefu organizacije
enum E_ORG_DATA
{
E_ORG_MATS,
E_ORG_DROGS
};

new
gOrgData[MAX_ORGS][E_ORG_DATA];

CMD:sef(playerid, params[])
{
new
userOption[7],
userItems[6],
userAmount,
orgID;

if (gPlayerData[playerid][E_PLAYER_LEADER] > 0) // Ako je igrac lider organizacije
{
// Uzimamo ID organizacije, ali smanjujemo taj broj jer u PAWN-u array (niz) pocinje sa 0, a ne sa 1, a mi spremamo ID organizacije od 1
// Primjer: nekiNiz[0] = 0; - Pocetni element tog niza je sad 0
//          nekiNiz[1] = 0; - Drugi element tog niza je sada 0, a ne prvi element niza
orgID = gPlayerData[playerid][E_PLAYER_LEADER] - 1;

if (sscanf(params, "s[7]{s[6]d}", userOption)) // Ako igrac nije upisao sve potrebne parametre, ispisuje mu poruku i opcije koje moze koristiti
{
SendClientMessage(playerid, C_WHITE, "OPCIJE: uzmi ostavi");
SendClientMessage(playerid, C_WHITE, "KORISTI: /sef [opcija] [mats/droga] [kolicina]");
return 1;
}

if (!strcmp(userOption, "uzmi", true)) // Ako je igrac odabrao opciju 'uzmi'
{
if (sscanf(params, "{s[7]}s[6]{d}", userItems))
return SendClientMessage(playerid, C_WHITE, "KORISTI: /sef uzmi [mats/droga] [kolicina]");

if (!strcmp(userItems, "mats", true)) // Ako je igrac odabrao opciju 'mats'
{
if (sscanf(params, "{s[7]s[6]}d", userAmount))
return SendClientMessage(playerid, C_WHITE, "KORISTI: /sef uzmi mats [kolicina]");
else if (gOrgData[orgID][E_ORG_MATS] < userAmount)
return SendClientMessage(playerid, C_WHITE, "ERROR: Nema toliko materijala u sefu");

gOrgData[orgID][E_ORG_MATS] -= userAmount; // Oduzmemo tu kolicinu materijala iz sefa
gPlayerData[playerid][E_PLAYER_MATS] += userAmount; // I dodamo tu kolicinu materijala igracu

SendClientMessage(playerid, C_WHITE, "Uspjesno si uzeo materijale");
}
else if (!strcmp(userItems, "droga", true)) // Ako je igrac odabrao opciju 'droga'
{
if (sscanf(params, "{s[7]s[6]}d", userAmount))
return SendClientMessage(playerid, C_WHITE, "KORISTI: /sef uzmi droga [kolicina]");
else if (gOrgData[orgID][E_ORG_DROGS] < userAmount)
return SendClientMessage(playerid, C_WHITE, "ERROR: Nema toliko droge u sefu");

gOrgData[orgID][E_ORG_DROGS] -= userAmount; // Oduzmemo tu kolicinu droge iz sefa
gPlayerData[playerid][E_PLAYER_DROGS] += userAmount; // I dodamo tu kolicinu droge igracu

SendClientMessage(playerid, C_WHITE, "Uspjesno si uzeo drogu");
}
}
else if (!strcmp(userOption, "ostavi", true)) // Ako je igrac odabrao opciju 'ostavi'
{
if (sscanf(params, "{s[7]}s[6]{d}", userItems))
return SendClientMessage(playerid, C_WHITE, "KORISTI: /sef ostavi [mats/droga] [kolicina]");

if (!strcmp(userItems, "mats", true)) // Ako je igrac odabrao opciju 'mats'
{
if (sscanf(params, "{s[7]s[6]}d", userAmount))
return SendClientMessage(playerid, C_WHITE, "KORISTI: /sef ostavi mats [kolicina]");
else if (gPlayerData[playerid][E_PLAYER_MATS] < userAmount)
return SendClientMessage(playerid, C_WHITE, "ERROR: Nemas toliko materijala kod sebe");

gOrgData[orgID][E_ORG_MATS] += userAmount; // Dodamo tu kolicinu materijala u sefa
gPlayerData[playerid][E_PLAYER_MATS] -= userAmount; // I oduzmemo tu kolicinu materijala igracu

SendClientMessage(playerid, C_WHITE, "Uspjesno si ostavio materijale");
}
else if (!strcmp(userItems, "droga", true)) // Ako je igrac odabrao opciju 'droga'
{
if (sscanf(params, "{s[7]s[6]}d", userAmount))
return SendClientMessage(playerid, C_WHITE, "KORISTI: /sef ostavi droga [kolicina]");
else if (gPlayerData[playerid][E_PLAYER_DROGS] < userAmount)
return SendClientMessage(playerid, C_WHITE, "ERROR: Nemas toliko droge kod sebe");

gOrgData[orgID][E_ORG_DROGS] += userAmount; // Dodamo tu kolicinu droge u sefa
gPlayerData[playerid][E_PLAYER_DROGS] -= userAmount; // I oduzmemo tu kolicinu droge igracu

SendClientMessage(playerid, C_WHITE, "Uspjesno si ostavio drogu");
}
}
}
else if (gPlayerData[playerid][E_PLAYER_MEMBER] > 0) // Ako je igrac clan organizacije
{
// Uzimamo ID organizacije, ali smanjujemo taj broj jer u PAWN-u array (niz) pocinje sa 0, a ne sa 1, a mi spremamo ID organizacije od 1
// Primjer: nekiNiz[0] = 0; - Pocetni element tog niza je sad 0
//          nekiNiz[1] = 0; - Drugi element tog niza je sada 0, a ne prvi element niza
orgID = gPlayerData[playerid][E_PLAYER_MEMBER] - 1;

if (sscanf(params, "s[7]{s[6]d}", userOption)) // Ako igrac nije upisao sve potrebne parametre, ispisuje mu poruku i opcije koje moze koristiti
{
SendClientMessage(playerid, C_WHITE, "OPCIJE: ostavi");
SendClientMessage(playerid, C_WHITE, "KORISTI: /sef [opcija] [mats/droga] [kolicina]");
return 1;
}

if (!strcmp(userOption, "ostavi", true)) // Ako je igrac odabrao opciju 'ostavi'
{
if (sscanf(params, "{s[7]}s[6]{d}", userItems))
return SendClientMessage(playerid, C_WHITE, "KORISTI: /sef ostavi [mats/droga] [kolicina]");

if (!strcmp(userItems, "mats", true)) // Ako je igrac odabrao opciju 'mats'
{
if (sscanf(params, "{s[7]s[6]}d", userAmount))
return SendClientMessage(playerid, C_WHITE, "KORISTI: /sef ostavi mats [kolicina]");
else if (gPlayerData[playerid][E_PLAYER_MATS] < userAmount)
return SendClientMessage(playerid, C_WHITE, "ERROR: Nemas toliko materijala kod sebe");

gOrgData[orgID][E_ORG_MATS] += userAmount; // Dodamo tu kolicinu materijala u sefa
gPlayerData[playerid][E_PLAYER_MATS] -= userAmount; // I oduzmemo tu kolicinu materijala igracu

SendClientMessage(playerid, C_WHITE, "Uspjesno si ostavio materijale");
}
else if (!strcmp(userItems, "droga", true)) // Ako je igrac odabrao opciju 'droga'
{
if (sscanf(params, "{s[7]s[6]}d", userAmount))
return SendClientMessage(playerid, C_WHITE, "KORISTI: /sef ostavi droga [kolicina]");
else if (gPlayerData[playerid][E_PLAYER_DROGS] < userAmount)
return SendClientMessage(playerid, C_WHITE, "ERROR: Nemas toliko droge kod sebe");

gOrgData[orgID][E_ORG_DROGS] += userAmount; // Dodamo tu kolicinu droge u sefa
gPlayerData[playerid][E_PLAYER_DROGS] -= userAmount; // I oduzmemo tu kolicinu droge igracu

SendClientMessage(playerid, C_WHITE, "Uspjesno si ostavio drogu");
}
}
}
else return SendClientMessage(playerid, C_WHITE, "ERROR: Nisi niti lider organizacije niti clan");
return 1;
}



KRAJ
Ovo je kraj tutorial, ako nešto ne kužite, postajte u temi i odgovorit ću vam u najkraćem mogućem roku. Ili ako zelite nesto da bolje objasnim, mozete postati u temi ili poslati meni PP/PM.
Ako želite još nešto da dodem u tutorial, pošalji mi prijedlog preko PP/PM.
Poslednja Izmena: Mart 23, 2013, 21:07:51 POSLE PODNE od Joey_

Last nick: Paradox



Citat: Joey_ poslato Jul 28, 2012, 22:55:10 POSLE PODNE
Hvala. :)

Tut je odličan, ali izbacuje 4 errora:

IC war.pwn(185) : error 017: undefined symbol "gPlayerData"
IC war.pwn(185) : warning 215: expression has no effect
IC war.pwn(185) : error 001: expected token: ";", but found "]"
IC war.pwn(185) : error 029: invalid expression, assumed zero
IC war.pwn(185) : fatal error 107: too many error messages on one line



if (gPlayerData[playerid][E_PLAYER_MEMBER] > 0)

Citat: SpaMaster poslato Jul 28, 2012, 23:08:40 POSLE PODNE
Citat: Joey_ poslato Jul 28, 2012, 22:55:10 POSLE PODNE
Hvala. :)

Tut je odličan, ali izbacuje 4 errora:

IC war.pwn(185) : error 017: undefined symbol "gPlayerData"
IC war.pwn(185) : warning 215: expression has no effect
IC war.pwn(185) : error 001: expected token: ";", but found "]"
IC war.pwn(185) : error 029: invalid expression, assumed zero
IC war.pwn(185) : fatal error 107: too many error messages on one line



if (gPlayerData[playerid][E_PLAYER_MEMBER] > 0)

Mislim da ti fali
new
gPlayerData[MAX_PLAYERS][E_PLAYER_DATA];

Citat: [Egrotusi TDM] CadrRa poslato Jul 28, 2012, 23:12:20 POSLE PODNE
Citat: SpaMaster poslato Jul 28, 2012, 23:08:40 POSLE PODNE
Citat: Joey_ poslato Jul 28, 2012, 22:55:10 POSLE PODNE
Hvala. :)

Tut je odličan, ali izbacuje 4 errora:

IC war.pwn(185) : error 017: undefined symbol "gPlayerData"
IC war.pwn(185) : warning 215: expression has no effect
IC war.pwn(185) : error 001: expected token: ";", but found "]"
IC war.pwn(185) : error 029: invalid expression, assumed zero
IC war.pwn(185) : fatal error 107: too many error messages on one line



if (gPlayerData[playerid][E_PLAYER_MEMBER] > 0)

Mislim da ti fali
new
gPlayerData[MAX_PLAYERS][E_PLAYER_DATA];


15 nekakvih errora, GM od 0 :)


@SpaMaster, trebaš dodat na vrh svog moda ovaj kod (kao što je i navedeno u tutorialu):

enum E_PLAYER_DATA
{
E_PLAYER_LEADER, // Varijabla koja pamti cega je igrac lider
E_PLAYER_MEMBER, // Varijabla koja pamti u kojoj je igrac organizaciji
E_PLAYER_RANK, // Varijabla koja pamti koji je igrac rank u organizaciji
E_PLAYER_SKIN, // Varijabla koja pamti koji skin je igrac imao prije ulaska u organizaciju
E_PLAYER_ORG_SKIN // Varijabla koja pamti koji skin igrac ima dok je u organizaciji
}

new
gPlayerData[MAX_PLAYERS][E_PLAYER_DATA];


UPDATE: Dodana komanda (/r)adio i još jedan novi kod za onemogućivanje vožnje vozila onima koji nisu članovi te organizacije.
Poslednja Izmena: Jul 28, 2012, 23:26:42 POSLE PODNE od Joey_

Last nick: Paradox

Citat: Joey_ poslato Jul 28, 2012, 23:26:20 POSLE PODNE
@SpaMaster, trebaš dodat na vrh svog moda ovaj kod (kao što je i navedeno u tutorialu):

enum E_PLAYER_DATA
{
E_PLAYER_LEADER, // Varijabla koja pamti cega je igrac lider
E_PLAYER_MEMBER, // Varijabla koja pamti u kojoj je igrac organizaciji
E_PLAYER_RANK, // Varijabla koja pamti koji je igrac rank u organizaciji
E_PLAYER_SKIN, // Varijabla koja pamti koji skin je igrac imao prije ulaska u organizaciju
E_PLAYER_ORG_SKIN // Varijabla koja pamti koji skin igrac ima dok je u organizaciji
}

new
gPlayerData[MAX_PLAYERS][E_PLAYER_DATA];


UPDATE: Dodana komanda (/r)adio i još jedan novi kod za onemogućivanje vožnje vozila onima koji nisu članovi te organizacije.

Neće, isto je.

Citat: SpaMaster poslato Jul 28, 2012, 23:27:41 POSLE PODNE
Neće, isto je.

Ja sam sam compileao taj kod, kod sebe i sve radi kako treba. Pošalji mi na PP/PM kod koji si napravio i riješit ćemo. ;)

Last nick: Paradox

Dobar tut  ;)
Respect: Gagi, Maki187, Phillips, TerminuS, Neno, Lepotic, [AL] K4[Я]!K3â,,¢, Gotti747


bravo paradox :)
napravi i koju fs :D
moze i jos koji tut ;D


Hvala svima. :)

@El Niñoâ,,¢, predloži neÅ¡to i ja iskriptam. ;D Ili napiÅ¡em tutorial. :D

UPDATE: Dodana funkcija GetPlayerRank() i updateana komanda (/r)adio.
Poslednja Izmena: Jul 29, 2012, 00:15:08 PRE PODNE od Joey_

Last nick: Paradox