Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <a_samp>
- #include <a_mysql>
- #include <zcmd>
- #include <sscanf2>
- #define MAX_VERSLAI 500 // Maksimalus verslų skaičius, keiskit pagal poreikius
- #define VERSLU_SPALVA 0x00FF00FF //Tai nėra butinybė, tai tik spalva kurią naudosiu visoms žinutėms bei label.
- #define DIALOG_ACCEPT_VERSLA 5154 // Tai GUI lentelės ID(dialogid). Pas jus neturėtų būti lentelės su tokiu ID, jei yra - pakeiskit šį.
- enum v_info {
- ORM:Ormid,
- Id,
- Savininkas[MAX_PLAYER_NAME],
- Pavadinimas[101],
- Float:EnX,
- Float:EnY,
- Float:EnZ,
- InterjeroNr,
- Kaina,
- PelnasH,
- Pelnas,
- Locked,
- Text3D:Label
- };
- new Verslai[MAX_VERSLAI][v_info]; // Masyvas kuriame laikysime informaciją veikimo metu
- enum interior_info {
- Float:x,
- Float:y,
- Float:z,
- Int
- };
- // Tai antrasis masyvas skirtas interjerams
- // Pirmieji trys skaičiai yra iėjimo koordinatės, o ketvirtasis tikrasis interjero ID
- // Galite jų pridėt neribotą skaičių
- static const Interiors[][interior_info] = {
- {-25.8844,-185.8689,1003.5499,17}, // 24/7 parduotvės interjeras
- {2233.8032,1712.2303,1011.7632,1} // Caligula kazino interjeras
- };
- new Db; // Kintamasis kuriame bus laikomas prisijungimo prie DB numeris.
- main()
- {
- print("Pavyzdinė modifikacija naudojant MySQL ORM.");
- print("Pavyzdyje simuliuota Verslų sistema");
- print("Pavyzdžio ir pamokos autorius - Bebras");
- print("Gero naudojimo!");
- }
- public OnGameModeInit()
- {
- AddPlayerClass(5, 0.0, 0.0, 2.0, 90.0, 0, 0, 0, 0, 0, 0); // Eilutė su verslų sistema nėra susijusi.
- Db = mysql_connect("localhost","root","testas","");
- SetTimer("VersluPelnas",60*60*1000,true);
- KrautiVerslus();
- return 1;
- }
- stock KrautiVerslus()
- return mysql_tquery(Db,"SELECT * FROM verslai","OnVerslaiLoad",""); //Išsiunčiame užklausą į duomenų bazę, ir nurodome kad grižus užklausa iškviestų funkcija "OnVerslaiLoad"
- forward OnVerslaiLoad();
- public OnVerslaiLoad()
- {
- new str[128];
- for(new i; i < cache_get_row_count(); i++) // cache_get_row_count reiškia eilučių skaičių
- {
- Verslai[i][Ormid] = orm_create("verslai"); // Sukuriame orm ryšį su verslų lentele
- orm_addvar_int(Verslai[i][Ormid],Verslai[i][Id],"Id"); //Pridedame stulpelį "id" prie ryšio
- orm_setkey(Verslai[i][Ormid],"Id"); // Nustatome kad eilutės duomenų bazėje bus skiriamos pagal šį sulpelį
- orm_addvar_string(Verslai[i][Ormid],Verslai[i][Savininkas],MAX_PLAYER_NAME,"Savininkas"); // Pridedame stulpelį "savininkas" prie ryšio
- orm_addvar_string(Verslai[i][Ormid],Verslai[i][Pavadinimas],101,"Pavadinimas");
- orm_addvar_float(Verslai[i][Ormid],Verslai[i][EnX],"EnX");
- orm_addvar_float(Verslai[i][Ormid],Verslai[i][EnY],"EnY");
- orm_addvar_float(Verslai[i][Ormid],Verslai[i][EnZ],"EnZ");
- orm_addvar_int(Verslai[i][Ormid],Verslai[i][InterjeroNr],"InterjeroNr");
- orm_addvar_int(Verslai[i][Ormid],Verslai[i][Kaina],"Kaina");
- orm_addvar_int(Verslai[i][Ormid],Verslai[i][PelnasH],"PelnasH");
- orm_addvar_int(Verslai[i][Ormid],Verslai[i][Pelnas],"Pelnas");
- orm_addvar_int(Verslai[i][Ormid],Verslai[i][Locked],"Locked");
- //Eilutės prie šią, neturi komentarų kadangi veiksmas kartojasi. Dvi eilutės pirmosios yra pakomentuotos
- orm_apply_cache(Verslai[i][Ormid],i); // Tai užkraus duomenis į kintamuosius susietus višuje.
- // Krovimas baigtas, dabar galime parodyti kažką serveryje
- if(isnull(Verslai[i][Savininkas])) format(str,sizeof(str),"Verslas parduodamas\nKaina:%d\nValandos pelnas:%d",
- Verslai[i][Kaina],Verslai[i][PelnasH]);
- else format(str,sizeof(str),"%s\nSavininkas:%s",Verslai[i][Pavadinimas],Verslai[i][Savininkas]);
- //Kodas viršuje nustatys ar verslas turi savininka ar ne, atitinkamai pagal tai suformatuos žinutę teksto etiketei(3DTextLabel)
- Verslai[i][Label] = Create3DTextLabel(str,VERSLU_SPALVA,Verslai[i][EnX],Verslai[i][EnY],Verslai[i][EnZ],25.0,0,1);//Sukuriame minėta etiketę. Parametras po Z koordinatės reiškia atsumą kuriuo bus matoma etiketė
- }
- return 1;
- }
- public OnPlayerKeyStateChange(playerid,newkeys,oldkeys)
- {
- if((newkeys & KEY_SECONDARY_ATTACK) && !(oldkeys & KEY_SECONDARY_ATTACK)) // Patikriname ar žaidėjas paspaudė "KEY_SECONDARY_ATTACK", tai yra ENTER mygtukas. Galite keisti
- {
- if(IsPlayerInAnyVehicle(playerid)) return 0; // Jeigu žaidėjas transporto priemonėje, jam įeiti neleisime, todėl net neverta tikrinti prie kokio jis verslo.
- for(new i; i < MAX_VERSLAI; i++)
- {
- if(Verslai[i][Id] == 0) continue; // Jeigu tai tuščia verslo masyvo dalis, praleidžiame kodą apačioje ,grįžtame prie ciklo.
- if(IsPlayerInRangeOfPoint(playerid,5.0,Verslai[i][EnX],Verslai[i][EnY],Verslai[i][EnZ])) // Jeigu žaidėjas yra prie verslo įėjimo
- {
- if(Verslai[i][Locked] == 1) //Jei užrakinta
- {
- SendClientMessage(playerid,VERSLU_SPALVA,"Verslas užrakintas,pabandykite vėliau");
- return 0;
- }
- // Dabar ir naudosime masyvą "Interiors". Plačiau bus po kodu -> Žiūrėti pamokoje.
- SetPlayerInterior(playerid,Interiors[Verslai[i][InterjeroNr]][Int]); //Nustatome žaidėjo interjerą
- SetPlayerPos(playerid,Interiors[Verslai[i][InterjeroNr]][x],Interiors[Verslai[i][InterjeroNr]][y],Interiors[Verslai[i][InterjeroNr]][z]);
- SetPlayerVirtualWorld(playerid,Verslai[i][Id]); // Nustatome virtualuųjį pasaulį į unikalų tam verslui skaičių
- return 0;
- }
- if(GetPlayerVirtualWorld(playerid) == Verslai[i][Id]) // Jeigu žaidėjo virtualusis pasaulis lygus verslo ID. (Porą eilučių į viršų tai nustatome)
- {
- if(IsPlayerInRangeOfPoint(playerid,5.0,Interiors[Verslai[i][InterjeroNr]][x],Interiors[Verslai[i][InterjeroNr]][y],Interiors[Verslai[i][InterjeroNr]][z])
- && GetPlayerVirtualWorld(playerid) == Verslai[i][Id]
- && GetPlayerInterior(playerid) == Interiors[Verslai[i][InterjeroNr]][Int]) // Jeigu žaidėjas yra prie išėjimo. Tai nusprendžiam pagal jo buvimo vietą, virtualų pasaulį ir interjerą.
- {
- if(Verslai[i][Locked] == 1) //Jei užrakinta
- {
- SendClientMessage(playerid,VERSLU_SPALVA,"Verslas užrakintas");
- return 0;
- }
- // Jeigu iki čia atėjome, reiškia verslas atrakintas ir galima įeiti.
- SetPlayerInterior(playerid,0);
- SetPlayerPos(playerid,Verslai[i][EnX],Verslai[i][EnY],Verslai[i][EnZ]);
- SetPlayerVirtualWorld(playerid,0);
- return 0;
- }
- }
- }
- }
- return 1;
- }
- //Funkcija tikrins ar žaidėjas yra prie verslo įėjimo, ir jeigu jis prie įėjimo gražins verslo indeksą.
- stock IsPlayerInRangeOfVerslas(playerid,Float:distance=5.0) // Antras parametras nebūtinas, jei jo nebus vietoj jo naudosime skaičių 5.0
- {
- for(new i; i < MAX_VERSLAI; i++)
- {
- if(Verslai[i][Id] == 0) continue;
- if(IsPlayerInRangeOfPoint(playerid,distance,Verslai[i][EnX],Verslai[i][EnY],Verslai[i][EnZ])) return i; // Jeigu žaidėjas yra nurodytu atstumu prie verslo įėjimo gražinsime masyvo indeksą
- }
- return -1; // Jeigu žaidėjas nėra prie jokio įėjimo gražiname -1, kas yra netinkamas masyvo indeksas.
- }
- // Funkcija patikrins ar žaidėjas yra verslo savininkas.
- // Atkreipkite dėmesį jog duodame ne verslo unikalų Id, o verslo masyvo indeksą.
- stock VersloSavininkas(playerid,vid)
- {
- new name[MAX_PLAYER_NAME];
- GetPlayerName(playerid,name,sizeof(name));
- if(!isnull(Verslai[vid][Savininkas]) && !strcmp(Verslai[vid][Savininkas],name)) return true; // Jeigu masyvo dalis "savininkas" ne tuščias ir sutampa su žaidėjo vardu, reiškia jis savininkas
- return false;
- }
- CMD:parduotiversla(playerid,params[])
- {
- new verslas = IsPlayerInRangeOfVerslas(playerid,5.0),pid,kaina,str[70],name[MAX_PLAYER_NAME];
- if(verslas == -1) return SendClientMessage(playerid,VERSLU_SPALVA,"Turite būti prie verslo įėjimo");
- if(!VersloSavininkas(playerid,verslas)) return SendClientMessage(playerid,VERSLU_SPALVA,"Tai ne jūsų verslas!");
- if(sscanf(params,"u",pid,kaina)) return SendClientMessage(playerid,VERSLU_SPALVA,"Naudojimas /parduotiversla [ZaidejoID/dalis vardo] [Kaina]");
- if(!IsPlayerConnected(pid)) return SendClientMessage(playerid,VERSLU_SPALVA,"Tokio žaidejo nėra");
- if(kaina < 0) return SendClientMessage(playerid,VERSLU_SPALVA,"Kaina neigiama buti negali!");
- format(str,sizeof(str),"%s jums siulo pirkti jo verlsa uz %d(Galioja 30sec)",name,kaina);
- ShowPlayerDialog(playerid,DIALOG_ACCEPT_VERSLA,DIALOG_STYLE_MSGBOX,"Verslo pirkimas",str,"Pirkti","Atsisakyti");
- SetPVarInt(pid,"KasSiuloVersla",playerid);
- SetPVarInt(pid,"VersloIndeksas",verslas);
- SetPVarInt(pid,"VersloKaina",kaina);
- return 1;
- }
- public OnDialogResponse(playerid,dialogid,response,listitem,inputtext[])
- {
- if(dialogid == DIALOG_ACCEPT_VERSLA && response) // Jeigu tai lentelė kurią parodėme komandoje IR paspaudė pirmąjį mygtuką (Pirkti)
- {
- if(GetPVarInt(playerid,"VersloKaina") < GetPlayerMoney(playerid)) return SendClientMessage(playerid,VERSLU_SPALVA,"Jums neužtenka pinigų"); // Jeigu žaidėjui neužtenka pinigų
- // Jeigu iki čia atėjom, reiškia pinigų užtenka.
- new name[MAX_PLAYER_NAME],index = GetPVarInt(playerid,"VersloIndeksas"),str[128];
- GetPlayerName(playerid,name,sizeof(name));
- format(Verslai[index][Savininkas],24,name); // Perrašome savininko vardą
- // Kolkokas tinkamas savininkas tik kintamuosiuose, atnaujinkime jį ir 3D teksto etiketėje.
- format(str,sizeof(str),"%s\nSavininkas:%s",Verslai[index][Pavadinimas],Verslai[index][Savininkas]);
- Update3DTextLabelText(Verslai[index][Label],VERSLU_SPALVA,str);
- // Na galima nusiųsti pardavėjui žinutę kad verslas parduotas.
- format(str,sizeof(str),"%s nupirko jūsų verslą uz %d",GetPVarInt(playerid,"KasSiuloVersla"),GetPVarInt(playerid,"VersloKaina"));
- SendClientMessage(GetPVarInt(playerid,"KasSiuloVersla"),VERSLU_SPALVA,str);
- //Ištriname žaidėjo kintamuosius, nes jie mums nebereikalingi
- DeletePVar(playerid,"KasSiuloVersla");
- DeletePVar(playerid,"VersloIndeksas");
- DeletePVar(playerid,"VersloKaina");
- return 1;
- }
- return 0;
- }
- CMD:rakintiversla(playerid)
- {
- new verslas = IsPlayerInRangeOfVerslas(playerid,5.0);
- if(verslas == -1) return SendClientMessage(playerid,VERSLU_SPALVA,"Turite būti prie verslo įėjimo");
- if(!VersloSavininkas(playerid,verslas)) return SendClientMessage(playerid,VERSLU_SPALVA,"Tai ne jūsų verslas!");
- if(Verslai[verslas][Locked] == 0) // Jei atrakinta
- {
- RakintiVersla(verslas,true);
- SendClientMessage(playerid,VERSLU_SPALVA,"Verslas uzrakintas");
- return 1;
- }
- if(Verslai[verslas][Locked] == 1) //Jei užrakinta
- {
- RakintiVersla(verslas,false);
- SendClientMessage(playerid,VERSLU_SPALVA,"Verslas atrakintas");
- return 1;
- }
- return 1;
- }
- stock RakintiVersla(versloid,bool:status)
- {
- Verslai[versloid][Locked] = status;
- orm_update(Verslai[versloid][Ormid]); //Atnaujiname informaciją duomenų bazėje
- return 1;
- }
- CMD:pirktiversla(playerid,params[])
- {
- new verslas = IsPlayerInRangeOfVerslas(playerid,5.0);
- if(verslas == -1) return SendClientMessage(playerid, VERSLU_SPALVA, "Jūs turite būti prie verslo įėjimo!");
- if(!isnull(Verslai[verslas][Savininkas])) return SendClientMessage(playerid, VERSLU_SPALVA, "Šis verslas jau turi savininką!");
- if(GetPlayerMoney(playerid) < Verslai[verslas][Kaina]) return SendClientMessage(playerid, VERSLU_SPALVA, "Jums neužtenka pinigų.");
- // Atiimam pinigus.
- GivePlayerMoney(playerid,Verslai[verslas][Kaina]);
- // Gauname žaidėjo vardą ir padarome jį savininku.
- new name[MAX_PLAYER_NAME];
- GetPlayerName(playerid, name, sizeof(name));
- format(Verslai[verslas][Savininkas], MAX_PLAYER_NAME,"%s",name);
- // Atnaujiname teksto etiketę jog būtų rodomas tinkamas savininkas.
- new str[130];
- format(str,sizeof(str),"%s\n%s",Verslai[verslas][Pavadinimas],Verslai[verslas][Savininkas]);
- Update3DTextLabelText(Verslai[verslas][Label], VERSLU_SPALVA,str);
- // Atnaujiname savininką duomenų bazėje.
- orm_update(Verslai[verslas][Ormid]);
- SendClientMessage(playerid, VERSLU_SPALVA, "Sveikiname nusipirkus verslą!");
- return 1;
- }
- CMD:parduotiversla(playerid,params[])
- {
- new verslas = IsPlayerInRangeOfVerslas(playerid,5.0),pid,kaina,str[70],name[MAX_PLAYER_NAME];
- if(verslas == -1) return SendClientMessage(playerid,VERSLU_SPALVA,"Turite būti prie verslo įėjimo");
- if(!VersloSavininkas(playerid,verslas)) return SendClientMessage(playerid,VERSLU_SPALVA,"Tai ne jūsų verslas!");
- if(sscanf(params,"u",pid,kaina)) return SendClientMessage(playerid,VERSLU_SPALVA,"Naudojimas /parduotiversla [ZaidejoID/dalis vardo] [Kaina]");
- if(!IsPlayerConnected(pid)) return SendClientMessage(playerid,VERSLU_SPALVA,"Tokio žaidejo nėra");
- if(kaina < 0) return SendClientMessage(playerid,VERSLU_SPALVA,"Kaina neigiama buti negali!");
- format(str,sizeof(str),"%s jums siulo pirkti jo verlsa uz %d(Galioja 30sec)",name,kaina);
- ShowPlayerDialog(playerid,DIALOG_ACCEPT_VERSLA,DIALOG_STYLE_MSGBOX,"Verslo pirkimas",str,"Pirkti","Atsisakyti");
- SetPVarInt(pid,"KasSiuloVersla",playerid);
- SetPVarInt(pid,"VersloIndeksas",verslas);
- SetPVarInt(pid,"VersloKaina",kaina);
- return 1;
- }
- CMD:keistipavadinima(playerid,params[])
- {
- new verslas = IsPlayerInRangeOfVerslas(playerid,5.0),str[128];
- if(verslas == -1) return SendClientMessage(playerid,VERSLU_SPALVA,"Turite būti prie verslo įėjimo");
- if(!VersloSavininkas(playerid,verslas)) return SendClientMessage(playerid,VERSLU_SPALVA,"Tai ne jūsų verslas!");
- if(isnull(params)) SendClientMessage(playerid,VERSLU_SPALVA,"Naudojimas /keistipavadinima [Naujas pavadinimas]");
- if(strlen(params) > 100) return SendClientMessage(playerid, VERSLU_SPALVA, "Pavadinimas per ilgas, daugiausiai gali būti 100 simbolių!");
- strdel(Verslai[verslas][Pavadinimas],0,101); //Ištriname senąjį pavadinimą
- strins(Verslai[verslas][Pavadinimas],params,0,101); // Įrašome naują pavadinimą
- format(str,sizeof(str),"%s\nSavininkas:%s",Verslai[verslas][Pavadinimas],Verslai[verslas][Savininkas]);
- Update3DTextLabelText(Verslai[verslas][Label],VERSLU_SPALVA,str); //Atnaujiname teksto etiktę(3DTextLabel)
- orm_update(Verslai[verslas][Ormid]);//Atnaujiname duomenis duomenų bazėje.
- return 1;
- }
- CMD:pridetiversla(playerid,params[])
- {
- new interjeras,kaina,pelnas,Float:pos[3],query[150],i = GetFreeVersloIndex(),str[100]; //Ką daro funkciją "GetFreeVersloIndex" žiūrėkite žemiau
- if(sscanf(params,"ddd",interjeras,kaina,pelnas)) return SendClientMessage(playerid,VERSLU_SPALVA,"Naudojimas /pridetiversla [InterjeroNr] [Kaina] [Valandos pelnas]");
- if(interjeras > sizeof(Interiors) || interjeras < 0) return SendClientMessage(playerid,VERSLU_SPALVA,"Tokio interjero nera!"); // Jeigu masyve interjero su nurodytu numeriu nėra
- GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
- Verslai[i][EnX] = pos[0];
- Verslai[i][EnY] = pos[1];
- Verslai[i][EnZ] = pos[2];
- Verslai[i][InterjeroNr] = interjeras;
- Verslai[i][Kaina] = kaina;
- Verslai[i][PelnasH] = pelnas;
- format(query,sizeof(query),"INSERT INTO `verslai` (EnX,EnY,EnZ,InterjeroNr,Kaina,PelnasH)VALUES(%f,%f,%f,%d,%d,%d)",
- pos[0],pos[1],pos[2],interjeras,kaina,pelnas); // formatuojame užklausą: įašyti duomenis į lentelę "verslai"
- mysql_tquery(Db,query,"OnPridejusVersla","i",i); // Išsiunčiame užklausą, ir jai gryžus nurodome iškviesti funkciją "OnPridejusVersla"
- format(str,sizeof(str),"Verslas parduodamas\nKaina:%d\nValandos pelnas:%d",Verslai[i][Kaina],Verslai[i][PelnasH]);
- Verslai[i][Label] = Create3DTextLabel(str,VERSLU_SPALVA,Verslai[i][EnX],Verslai[i][EnY],Verslai[i][EnZ],25,0,1);
- return 1;
- }
- forward OnPridejusVersla(index);
- public OnPridejusVersla(index)
- {
- Verslai[index][Id] = cache_insert_id(); // Ši funkcija gražina sekantį "Auto incremented" stulpelio skaičių.
- //Atliekame tuos pačius veiksmus kaip kraunant, todėl jų nekomentuosiu.
- //Na gerai, tik pagrindinius dalykus
- Verslai[index][Ormid] = orm_create("verslai"); // Sukuriame ryšį su lentele "verslai"
- orm_addvar_int(Verslai[index][Ormid],Verslai[index][Id],"Id");
- orm_setkey(Verslai[index][Ormid],"Id"); // Nustatome kad eilutes skirsime pagal stulpelį "Id"
- orm_addvar_string(Verslai[index][Ormid],Verslai[index][Savininkas],MAX_PLAYER_NAME,"Savininkas");
- orm_addvar_string(Verslai[index][Ormid],Verslai[index][Pavadinimas],101,"Pavadinimas");
- orm_addvar_float(Verslai[index][Ormid],Verslai[index][EnX],"EnX");
- orm_addvar_float(Verslai[index][Ormid],Verslai[index][EnY],"EnY");
- orm_addvar_float(Verslai[index][Ormid],Verslai[index][EnZ],"EnZ");
- orm_addvar_int(Verslai[index][Ormid],Verslai[index][InterjeroNr],"InterjeroNr");
- orm_addvar_int(Verslai[index][Ormid],Verslai[index][Kaina],"Kaina");
- orm_addvar_int(Verslai[index][Ormid],Verslai[index][PelnasH],"PelnasH");
- orm_addvar_int(Verslai[index][Ormid],Verslai[index][Pelnas],"Pelnas");
- orm_addvar_int(Verslai[index][Ormid],Verslai[index][Locked],"Locked");
- return 1;
- }
- //Funkcija suranda laisvą "Verslai" masyvo dalį naujiems įrašams.
- stock GetFreeVersloIndex()
- {
- for(new i; i < MAX_VERSLAI; i++)
- {
- if(Verslai[i][Id] == 0) return i; // Jeigu Id yra nulis (ko naudojamoje dalyje būti negali) gražiname jį.
- }
- return -1;
- }
- forward VersluPelnas();
- public VersluPelnas()
- {
- for(new i; i < MAX_VERSLAI; i++)
- {
- if(Verslai[i][Id] != 0) continue;
- Verslai[i][Pelnas] += Verslai[i][PelnasH]; // Prideda pelną
- orm_update(Verslai[i][Ormid]); // Išsaugo viską į duomenų bazę
- }
- }
- /*
- CREATE TABLE IF NOT EXISTS `verslai` (
- `Id` int(11) NOT NULL AUTO_INCREMENT,
- `Savininkas` varchar(24) NOT NULL,
- `Pavadinimas` varchar(101) NOT NULL,
- `EnX` float NOT NULL,
- `EnY` float NOT NULL,
- `EnZ` float NOT NULL,
- `InterjeroNr` tinyint(4) NOT NULL,
- `Kaina` int(11) NOT NULL,
- `PelnasH` int(11) NOT NULL,
- `Pelnas` int(11) NOT NULL,
- `Locked` tinyint(4) NOT NULL,
- PRIMARY KEY (`Id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement