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

[Pamoka]Garažų sistema su MySQL


bebras

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3375 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

Taigi tai yra mano paties sukurta garažų sistema. Jums reikės:
 
ZCMD include
MySQL include + plugin. (Pamoka tinka R6 bei R7+ versijoms,atkreipkite dėmesį kur parašyta.
SSCANF2 include + plugin (Tik naudojant MySQL R6 ar žemesnę)
Nieko nelaukę pradėkime nuo #include bei #define:
 
 
#include <a_samp>
#include <sscanf2>
#include <zcmd>
#include <a_mysql>
#define MAX_GARAZAI 100 // keiskite į savo norimą skaičių
 
 
Kad būtų patogiau prieiti prie savo masyvų naudokime enum (galit naudoti define arba constant):
 
 
enum garazuInfo
{
	gid,
	Savininkas[MAX_PLAYER_NAME],
	Float:enX,
	Float:enY,
	Float:enZ,
	InteriorIndeksas, // Pastaba. Tai NĖRA tikrasis interjero ID. Tai yra skaičius(indeksas) "Interjerai" masyve.
	Kaina,
	bool:Locked,
	Text3D:Label
};

 
Pats masyvas:
new gInfo[MAX_GARAZAI][garazuInfo];
 
Dar vienas masyvas interjerams:
 
enum interjeru_info {
Interior,
Float:exX,
Float:exY,
Float:exZ
};
 
new const Interjerai[][interjeru_info] = {
{0,5.0,14.54,8.0},
{4,4.0,6.7,7.2}
//Šiame masyve rašykite visus norimus interjerus.
//Rašykite tokiu formatu: interjero Id,X koordinatė,Y koordinatė, Z koordinatė
//Pavyzdys pateiktas(netikri interjerai). Pastebėkite kad po paskutinio kablelio nereikia
};

 

 
 
Kiti reikalingi kinamieji:
 
 
new Garazai;
new dbHandle; // naudojant R7+
 
public OnGameModeInit()
{
mysql_connect("Duombazes IP","Vartotojas","Table pavadinimas","Slaptazodis"); // Naudojant R6 arba zemesne
dbHandle = mysql_connect("Duombazes IP","Vartotojas","Table pavadinimas","Slaptazodis"); // Naudojant R7+
mysql_debug(); //R20+ pervadinta į "mysql_log"
LoadGarazus(); //Garazu pakrovimo funkcija kuria sukursime netrukus
return 1;
}
 
 
Garazu pakrovimo funkcija su R6.
 
 
stock LoadGarazus()
{
	new query[128];
	mysql_query("SELECT * FROM `Garazai`");
	mysql_store_result();
	Garazai = mysql_num_rows(); // eiluciu skaiciu irasome i "Garazai" velesniam naudojimui
	for(new i; i < Garazai; i++)
	{
		new string[64];
		mysql_fetch_row_format(query,"|");
		sscanf(query,"p<|>e<ds[24]fffddd>",gInfo[i]); // naudojame sscanf eilutes "isskaidyumui". p<|> nurodome kad musu skirtukas bus simbolis "|" kuris reiškia sekanti laukeli. e<> rodo kad infomracija perkelsime i masyva
		//isnull funkcija gaunate kartu su zcmd.inc, ji patikrina ar "string" yra tušcias, kas musu atveju reiškia jog savininko nera
		if(isnull(gInfo[i][Savininkas])) format(string,sizeof(string),"Garažas parduodamas\nKaina %d",gInfo[i][Kaina]);
		else format(string,sizeof(string),"Savininkas %s",gInfo[i][Savininkas]);
		gInfo[i][Label] = Create3DTextLabel(string,0x00FF00FF,gInfo[i][enX],gInfo[i][enY],gInfo[i][enZ],50,0); // sukuriame 3D label
	}
	mysql_free_result();
	return 1;
}

 

 
Garažų užkrovimo funkcija naudojant R34+
 
stock LoadGarazus()
{
mysql_tquery(dbHandle,"SELECT * FROM `Garazai`","OnGarazuLoad",""); 
return 1;
}
forward OnGarazuLoad();
public OnGarazuLoad()
{
	new string[64];
	//"cache_get_row_count" funkcija gražina gautų eilučių skaičių
	Garazai = cache_get_row_count(); // Eilučių skaičių ikeliame į "Garazai" vėlesniam naudoimui
	for(new i; i < cache_get_row_count(); i++) 
	{
		gInfo[i][gid] = cache_get_row_int(i,0,dbHandle);
		cache_get_row(i,1,gInfo[i][Savininkas],dbHandle,MAX_PLAYER_NAME);
		gInfo[i][enX] = cache_get_row_float(i,2,dbHandle);
		gInfo[i][enY] = cache_get_row_float(i,3,dbHandle);
		gInfo[i][enZ] = cache_get_row_float(i,4,dbHandle);
		gInfo[i][InteriorIndeksas] = cache_get_row_int(i,5,dbHandle);
		gInfo[i][Kaina] = cache_get_row_int(i,6,dbHandle);
		gInfo[i][Locked] = (cache_get_row_int(i,7,dbHandle))?(true):(false); // gautą rezultatą iš karto palyginam ir pagal tai nustatom true arba false
		//isnull funkciją gaunate kartu su zcmd.inc, ji patikrina ar "string" yra tuščias, kas mūsų atveju reiškia jog savininko nėra
		if(isnull(gInfo[i][Savininkas])) format(string,sizeof(string),"Garažas parduodamas\nKaina %d",gInfo[i][Kaina]);
		else format(string,sizeof(string),"Savininkas %s",gInfo[i][Savininkas]);
		gInfo[i][Label] = Create3DTextLabel(string,0xFFFF00FF,gInfo[i][enX],gInfo[i][enY],gInfo[i][enZ],10,0); // sukuriame 3D Label
	}
	return 1;
}
 
 
Gerai, garažai teoriškai egzistuos, bet ko gero mes norėsime į juos įeiti, ar ne? Tai ir padarykime:
 
 
CMD:enter(playerid)
{
	for(new i; i < Garazai; i++) // štai ir panaudojame "Garazai",kadangi jis turi eiluciu skaiciaus duombazeje verte,mum nereikes tušciai loopinti
	{
		//patikriname ar žaidejas yra netoli kokio nors garažo iejimo.
		if(IsPlayerInRangeOfPoint(playerid,20,gInfo[i][enX],gInfo[i][enY],gInfo[i][enZ]))
		{
			//Jei užrakinta galima baigti funkcija
			if(!gInfo[i][Locked]) return SendClientMessage(playerid,-1, "Garažas užrakitnas");
			//Kadangi jei rašytume viska vienoje vietoje butu labai negražus kodas. Todel interjero indeksa isirašau i kintamaji "int"
			new int = gInfo[i][InteriorIndeksas];
			if(IsPlayerInAnyVehicle(playerid)) // jei žaidejas yra transporto priemoneje
			{
				new vehicleid = GetPlayerVehicleID(playerid);

				SetVehiclePos(vehicleid,Interjerai[int][exX],Interjerai[int][exY],Interjerai[int][exZ]);
				SetVehicleVirtualWorld(vehicleid, gInfo[i][gid]);
				LinkVehicleToInterior(vehicleid,gInfo[i][InteriorIndeksas]);
				SetVehicleVirtualWorld(vehicleid,gInfo[i][gid]);
			}
			else
			{
				SetPlayerPos(playerid,Interjerai[int][exX],Interjerai[int][exY],Interjerai[int][exZ]);
				SetPlayerInterior(playerid,gInfo[i][InteriorIndeksas]);
				SetPlayerVirtualWorld(playerid,gInfo[i][gid]);
			}
			return 1; //Kadangi kodui pasiekus šia vieta jis bus baigtas, nenorime toliau testi to ciklo
		}
	}
	return 1;
}
CMD:exit(playerid)
{
	for(new i; i < Garazai; i++)
	{
		//taspats kaip ir /enter, del gražesnio kodo
		new int = gInfo[i][InteriorIndeksas];
		//del paskutines dalies: palyginame žaidejo virtualu pasauli su UNIKALIU garažo ID, kitaip nežinotume prie kurio garažo vartu ji nukelti
		if(IsPlayerInRangeOfPoint(playerid,8,Interjerai[int][exX],Interjerai[int][exY],Interjerai[int][exZ]) && GetPlayerVirtualWorld(playerid) == gInfo[i][gid])
		{
			//Jei užrakinta galima baigti funkcija
			if(!gInfo[i][Locked]) return SendClientMessage(playerid,-1, "Garažas užrakitnas");
			if(IsPlayerInAnyVehicle(playerid))
			{
				new vehicleid;
				vehicleid = GetPlayerVehicleID(playerid);
				SetVehiclePos(vehicleid,gInfo[i][enX],gInfo[i][enY],gInfo[i][enZ]);
				LinkVehicleToInterior(vehicleid,0);
				SetVehicleVirtualWorld(vehicleid,0);
			}
			else
			{
				SetPlayerPos(playerid,gInfo[i][enX],gInfo[i][enY],gInfo[i][enZ]);
				SetPlayerInterior(playerid,0);
				SetPlayerVirtualWorld(playerid,0);
			}
			return 1; //Kadangi kodui pasiekus šia vieta jis bus baigtas, nenorime toliau testi to ciklo
		}
	}
	return 1;
}
 
 
 
Garažus kaip ir visą savo nekilnojamąjį turtą norėsime užrakinti, tai padaryti mums leis ši funkcija:
 
CMD:lock(playerid)
{
	new name[MAX_PLAYER_NAME];
	for(new i; i < Garazai; i++)
	{
		GetPlayerName(playerid,name,sizeof(name)); //gauname žaidėjo vardą
		new int = gInfo[i][InteriorIndeksas]; //taspats kas ir /enter, /exit komandose
		//Suskaidyta eilutė į kelias dėl patogesnio skaitymo
		if((IsPlayerInRangeOfPoint(playerid,8,gInfo[i][enX],gInfo[i][enY],gInfo[i][enZ]) //Jeigu žaidėjas yra prie įėjimo
			// "||" reiškia loginį "ARBA"
			|| IsPlayerInRangeOfPoint(playerid,8,Interjerai[int][exX],Interjerai[int][exY],Interjerai[int][exZ])) //jeigu žaidėjas prie IŠėjimo
			//"&&" reiškia loginį "IR"
			&& !isnull(gInfo[i][Savininkas]) // jeigu garažo savininkas egzistuoja 
			&& !strcmp(gInfo[i][Savininkas],name)) // IR jeigu parašęs komandą žaidėjas yra savininkas
		{
			//Kadangi "Locked" yra "boolean" tipo, ir turi tik reiškmes, nustatome naują į reikšmią į senosios priešingybę, kitaip tariant, "perjungiam"
			gInfo[i][Locked] = !gInfo[i][Locked];
			return 1; //kam testi toliau kai jau suradome tai ko norejome
		}
	}
	return 1;
}
 
 
Viskas kaip ir padaryta. Išskyrus vieną dalyką, iš kur mes gausime tuos garažus? O gi su /buygaraz komanda:
 
 
CMD:buygaraza(playerid,params[])
{
	new name[MAX_PLAYER_NAME];
	GetPlayerName(playerid,name,sizeof(name));
	for(new i; i < Garazai; i++) // vel panaudojame savo "Garazai" kintamaji su garažu kiekiu.
	{
		if(IsPlayerInRangeOfPoint(playerid,8,gInfo[i][enX],gInfo[i][enY],gInfo[i][enZ]))
		{
			if(!isnull(gInfo[i][Savininkas])) return SendClientMessage(playerid, 0xFF0000FF, "Šis garažas jau turi savininka");
			if(gInfo[i][Kaina] > GetPlayerMoney(playerid)) return SendClientMessage(playerid,0xFF0000FF, "Jums neužtenka pinigu");
			//Jei atejom iki cia, reiškia viskas gerai ir galime duoti jam garaža
			//pirmiausia atimkime pinigus
			GivePlayerMoney(playerid,-gInfo[i][Kaina]);
			new query[80];
			mysql_real_escape_string(name,name);
			//"strins" funkcija prideda tam tikra "string" nurodytoje vietoje,0 - pradžia
			strins(gInfo[i][Savininkas],name,0);
			format(query,sizeof(query),"UPDATE garazai SET Owner = '%s' WHERE gid = %d",name,gInfo[i][gid]);
			mysql_function_query(dbHandle,query,false,"",""); 	//R7+
			mysql_query(query);								 	//R6 ar žemesne
			format(query,sizeof(query),"Savininkas: %s",gInfo[i][Savininkas]);
			//Atnaujinam label
			Update3DTextLabelText(gInfo[i][Label], 0xFFFF00FF,query);
			return 1;
		}
	}
	return 1;
}
 
 
 
 
 
O čia neprivaloma, bet naudinga komanda garažų sukūrimui IG:
 
CMD:addgaraz(playerid,params[])
{
	if(IsPlayerAdmin(playerid)) // Zaidejas tures buti prisijunges i RCON. (/rcon login slaptažodis)
	{
		new tmp,Int;
		if(sscanf(params,"dd",tmp,Int)) return SendClientMessage(playerid,0xFF0000FF,"Naudojimas /addgaraz [Kaina] [Interjero numeris]");
		else if( Int < 0 || Int >= sizeof(Interjerai)) return SendClientMessage(playerid,0xFF0000FF,"Tokio interjero nera");
		else if(tmp < 5000) return SendClientMessage(playerid,0xFF0000FF,"Minimali garažo kaina 5000");
		new Float:x,Float:y,Float:z;
		GetPlayerPos(playerid,x,y,z);
		new query[120];
		format(query,sizeof(query),"INSERT INTO Garazai (enX,enY,enX,Interjeras,Kaina) VALUES (%f,%f,%f,%d,%d)",x,y,z,Int,tmp);
		mysql_query(query); // PALIKTI VIENA Palik sita jei naudoji R5/6
		mysql_function_query(dbHandle,query,false,"SendQuery",""); // PALIKTI VIENA Palik sita jei naudoji R7+
		//Duomenø bazæ atnaujinome, dabar reikia atnaujinti þaidimà
		new index = GetFreeGarageIndex(); //Þiûrëkite þemiau
		gInfo[index][Kaina] = tmp;
		gInfo[index][enX] = x;
		gInfo[index][enY] = y;
		gInfo[index][enZ] = z;
		gInfo[index][InteriorIndeksas] = Int;
		format(query,sizeof(query),"Savininkas %s",gInfo[index][Savininkas]);
		gInfo[index][Label] = Create3DTextLabel(query,0x00FF00FF,gInfo[index][enX],gInfo[index][enY],gInfo[index][enZ],50,0); // sukuriame 3D label
		Garazai++; //Labai svarbu. Kitaip naujausis garazas bus ignoruotas
	}
	return 1;
}
stock GetFreeGarageIndex()
{
	for(new i; i < MAX_GARAZAI; i++)
	{
	    //jeigu sis elementas nenaudojamas, mes ji panaudosime
		if(gInfo[i][gid] == 0) return i;
	}
	return -1; //jeigu nebera tusciu.
}
 
 
 Jeigu neveiks ar turėsite klausimų/pasiūlymų. Rašykite!
 
CREATE TABLE IF NOT EXISTS garazai (
Id INT(11) AUTO_INCREMENT NOT NULL,
Savininkas VARCHAR(24) NOT NULL,
X FLOAT NOT NULL,
Y FLOAT NOT NULL,
Z FLOAT NOT NULL,
Interjeras TINYINT(3) unsigned NOT NULL,
Kaina INT(11) unsigned NOT NULL,
Uzrakintas TINYINT(1) unsigned NOT NULL,
PRIMARY KEY(Id)
)
Redaguota , nario Justas Š.
Nuoroda į komentarą
Dalintis per kitą puslapį

  • Parašė po 7 mėnesių...

Negalėjai užkrovimo funkcijos į vieną sudėti?

"else if(tmp < 5000) return SendClientMessage(playerid,0xFF0000FF,"Minimali namo kaina 5000");" Minimali namo kaina? Galvojau, kad garažus kuriame..

 

Komandos susidaro iš angliško + lietuviško žodžio. pvz : 

  1. CMD:buygaraza(playerid,params[])

Juokingai atrodo :)

Redaguota , nario Blacky
Nuoroda į komentarą
Dalintis per kitą puslapį

Negalėjai užkrovimo funkcijos į vieną sudėti?

"else if(tmp < 5000) return SendClientMessage(playerid,0xFF0000FF,"Minimali namo kaina 5000");" Minimali namo kaina? Galvojau, kad garažus kuriame..

 

Komandos susidaro iš angliško + lietuviško žodžio. pvz : 

  1. CMD:buygaraza(playerid,params[])

Juokingai atrodo :)

Nelabai supratau "krovimo funkcijas sudėt į vieną" ?

 

Pakeičiau į "garažai" :)

 

Dėl pavadinimų: meh, niekada dėl jų labai nesistengiau... Gal jau tiek sugebės žmonės pakeisti.

Nuoroda į komentarą
Dalintis per kitą puslapį

  • Parašė po 3 mėnesių...

1) error 017: undefined symbol "interjeru_info" 

new const Interjerai[][interjeru_info] = {
{0,5.0,14.54,8.0},
{4,4.0,6.7,7.2}

2) error 017: undefined symbol "garazuInfo" 

new gInfo[MAX_GARAZAI][garazuInfo];

3) invalid array size (negative, zero or out of bounds)

new gInfo[MAX_GARAZAI][garazuInfo];

4) error 091: ambiguous constant; tag override is required (symbol "Savininkas")

&& !isnull(gInfo[i][Savininkas]) // jeigu garažo savininkas egzistuoja

5-6) error 029: invalid expression, assumed zero

&& !isnull(gInfo[i][Savininkas]) // jeigu garažo savininkas egzistuoja 

jei gali padėk pataisyti :) visą kodą įmesiu į pastebin ir atsiusiu AŽ

 

Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3375 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!

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

  • Šiame puslapyje naršo:   0 nariai

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

Skelbimai


×
×
  • Sukurti naują...