[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