Jump to content

WiDuAlK

V.I.P
  • Posts

    1.337
  • Joined

  • Last visited

  • Days Won

    95

Everything posted by WiDuAlK

  1. ​Stai, stai stai, acu mi-am dat seama ca el foloseste DIALOG_STYLE_INPUT si nu DIALOG_STYLE_LIST. De asta foloseste el strcmp
  2. Atunci, stergel pe ala care il ai(tot ce tine de el) si pune-l p'asta: STREAMER si o a iti mearga, am avut si eu problema asta, dar sterge mai intai tot ce tine de streamerul vechi
  3. Spune clar acele erori. Nu ai definit vafiabilele sau functiile respective, adica in GM ai pus functia, dar nu ai definit-o ce sa faca. Nu stiu ce GM folosesti, nu stiu cum trebuie sa le definesti pe respectivele, dar, daca tu ai compilat GM-ul de pe internet si nu dadea eroare, iar acum ai modificat tu prin el , si da eroare, iti sugerez sa te uiti peste respectivele functii si sa le redefinesti.
  4. WiDuAlK

    Crash..

    Uite aici ceva despre problema ta: Tutorial
  5. Arata cum apelezi la acel dialog
  6. Simplu. Tu folosesti createobject. Limita este de 1000 de obiecte. Tu ai deja 1000 de obiecte cu CreateObject sau poate chiar mai multe, dar citeste primele 1000 de obiecte. Q: Ce se poate face in cazul acesta? A: Foloseste Streamer si schimba CreateObject in CreateDymanicObject
  7. Eu nu am testat nimic, nu am dat compilare, dar ma rog, uite varianta mea, daca tot ai zis ca primesti de la gLogged eroare CMD:skill(playerid,params[]) { if(gPlayerLogged[playerid] == 0) return SendClientMessage(playerid,-1,"Nu esti logat!"); new x_nr[19],string[256]; if(sscanf(params, "s[5]",x_nr)) { SendClientMessage(playerid, COLOR_DS, "__________________ Skill Info __________________"); SendClientMessage(playerid, COLOR_DS, "{B8DBFF}Synthax: /skill <Type Skill ID>"); SendClientMessage(playerid, COLOR_DS, "{FFD633}(1)Lawyer"); SendClientMessage(playerid, COLOR_DS, "{FFD633}(2)Whore"); SendClientMessage(playerid, COLOR_DS, "{FFD633}(3)Drugs Dealer"); SendClientMessage(playerid, COLOR_DS, "{FFD633}(4)News Reporter "); SendClientMessage(playerid, COLOR_DS, "{FFD633}(5)Car Mechanic"); SendClientMessage(playerid, COLOR_DS, "{FFD633}(6)Arms Dealer"); SendClientMessage(playerid, COLOR_DS, "{FFD633}(7)Fishing"); SendClientMessage(playerid, COLOR_DS, "{FFD633}(8)Rob"); SendClientMessage(playerid, COLOR_DS, "{FFD633}(9)Muncitor in Cariera"); return 1; } else if(strcmp(x_nr,"1",true) == 0)//Lawyer { new level = PlayerInfo[playerid][pLawSkill]; if(level >= 0 && level <= 50) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Lawyer Skill level is 1."); format(string, sizeof(string), "{FFD633}You need to free %d more people to Level up.", 50 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 51 && level <= 100) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Lawyer Skill level is 2."); format(string, sizeof(string), "{FFD633}You need to free %d more people to Level up.", 100 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 101 && level <= 200) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Lawyer Skill level is 3."); format(string, sizeof(string), "{FFD633}You need to free %d more people to Level up.", 200 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 201 && level <= 400) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Lawyer Skill level is 4."); format(string, sizeof(string), "{FFD633}You need to free %d more people to Level up.", 400 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 401) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Lawyer Skill level is 5."); } } else if(strcmp(x_nr,"2",true) == 0)//Whore { new level = PlayerInfo[playerid][pSexSkill]; if(level >= 0 && level <= 50) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Whore Skill level is 1."); format(string, sizeof(string), "{FFD633}You need to have sex %d times more to Level up.", 50 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 51 && level <= 100) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Whore Skill level is 2."); format(string, sizeof(string), "{FFD633}You need to have sex %d times more to Level up.", 100 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 101 && level <= 200) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Whore Skill level is 3."); format(string, sizeof(string), "{FFD633}You need to have sex %d times more to Level up.", 200 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 201 && level <= 400) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Whore Skill level is 4."); format(string, sizeof(string), "{FFD633}You need to have sex %d times more to Level up.", 400 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 401) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Whore Skill level is 5."); } } else if(strcmp(x_nr,"3",true) == 0)//Drugs Dealer { new level = PlayerInfo[playerid][pDrugsSkill]; if(level >= 0 && level <= 50) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Drugs Dealer Skill level is 1."); format(string, sizeof(string), "{FFD633}You need to sell drugs %d times more to Level up.", 50 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 51 && level <= 100) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Drugs Dealer Skill level is 2."); format(string, sizeof(string), "{FFD633}You need to sell drugs %d times more to Level up.", 100 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 101 && level <= 200) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Drugs Dealer Skill level is 3."); format(string, sizeof(string), "{FFD633}You need to sell drugs %d times more to Level up.", 200 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 201 && level <= 400) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Drugs Dealer Skill level is 4."); format(string, sizeof(string), "{FFD633}You need to sell drugs %d times more to Level up.", 400 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 401) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Drugs Dealer Skill level is 5."); } } else if(strcmp(x_nr,"4",true) == 0)//News Reporter { new level = PlayerInfo[playerid][pNewsSkill]; if(level >= 0 && level <= 50) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your News Reporter Skill level is 1."); format(string, sizeof(string), "{FFD633}You need to use /news %d times more to Level up.", 50 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 51 && level <= 100) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your News Reporter Skill level is 2."); format(string, sizeof(string), "{FFD633}You need to use /news %d times people to Level up.", 100 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 101 && level <= 200) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your News Reporter Skill level is 3."); format(string, sizeof(string), "{FFD633}You need to use /news %d times people to Level up.", 200 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 201 && level <= 400) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your News Reporter Skill level is 4."); format(string, sizeof(string), "{FFD633}You need to use /news %d times people to Level up.", 400 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 401) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your News Reporter Skill level is 5."); } } else if(strcmp(x_nr,"5",true) == 0)//Car Mechanic { new level = PlayerInfo[playerid][pMechSkill]; if(level >= 0 && level <= 50) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Car Mechanic Skill level is 1."); format(string, sizeof(string), "{FFD633}You need to fix/fill a car for %d times more to Level up.", 50 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 51 && level <= 100) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Car Mechanic Skill level is 2."); format(string, sizeof(string), "{FFD633}You need to fix/fill a car for %d times people to Level up.", 100 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 101 && level <= 200) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Car Mechanic Skill level is 3."); format(string, sizeof(string), "{FFD633}You need to fix/fill a car for %d times people to Level up.", 200 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 201 && level <= 400) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Car Mechanic Skill level is 4."); format(string, sizeof(string), "{FFD633}You need to fix/fill a car for %d times people to Level up.", 400 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 401) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Car Mechanic Skill level is 5."); } } else if(strcmp(x_nr,"6",true) == 0)//pMatSkill { new level = PlayerInfo[playerid][pMatSkill]; if(level >= 0 && level <= 50) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Arms Dealer Skill level is 1."); format(string, sizeof(string), "{FFD633}You need to deliver materials for %d times more to Level up.", 50 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 51 && level <= 100) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Arms Dealer Skill level is 2."); format(string, sizeof(string), "{FFD633}You need to deliver materials for %d times people to Level up.", 100 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 101 && level <= 200) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Arms Dealer Skill level is 3."); format(string, sizeof(string), "{FFD633}You need to deliver materials for %d times people to Level up.", 200 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 201 && level <= 400) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Arms Dealer Skill level is 4."); format(string, sizeof(string), "{FFD633}You need to deliver materials for %d times people to Level up.", 400 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 401) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Arms Dealer Skill level is 5."); } } else if(strcmp(x_nr,"7",true) == 0)//Fishing { new level = PlayerInfo[playerid][pFishSkill]; if(level >= 0 && level <= 50) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Fishing Skill level is 1."); format(string, sizeof(string), "{FFD633}You need to Fish %d more Fishes to Level up.", 50 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 51 && level <= 100) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Fishing Skill level is 2."); format(string, sizeof(string), "{FFD633}You need to Fish %d more Fishes to Level up.", 100 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 101 && level <= 200) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Fishing Skill level is 3."); format(string, sizeof(string), "{FFD633}You need to Fish %d more Fishes to Level up.", 200 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 201 && level <= 400) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Fishing Skill level is 4."); format(string, sizeof(string), "{FFD633}You need to Fish %d more Fishes to Level up.", 400 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 401) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Fishing Skill level is 5."); } } else if(strcmp(x_nr,"8",true) == 0)//Robbing { new level = PlayerInfo[playerid][pRobSkill]; if(level >= 0 && level <= 50) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Rob Skill level is 1."); format(string, sizeof(string), "{FFD633}You need to Rob the City Bank %d more times to Level up.", 50 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 51 && level <= 250) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Rob Skill level is 2."); format(string, sizeof(string), "{FFD633}You need to Rob the City Bank %d more times to Level up.", 100 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 251 && level <= 500) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Rob Skill level is 3."); format(string, sizeof(string), "{FFD633}You need to Rob the City Bank %d more times to Level up.", 200 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 501 && level <= 999) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Rob Skill level is 4."); format(string, sizeof(string), "{FFD633}You need to Rob the City Bank %d more times to Level up.", 400 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 1000) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Your Rob Skill level is 5."); } } else if(strcmp(x_nr,"9",true) == 0)//Muncitor { new level = PlayerInfo[playerid][pMuncitorSkill]; if(level >= 0 && level <= 50) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Skill 1."); format(string, sizeof(string), "{FFD633}Mai fa %d curse pentru a trece la skill 2 .", 50 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 51 && level <= 100) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Skill 2."); format(string, sizeof(string), "{FFD633}Mai fa %d curse pentru a trece la skill 3 .", 100 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 101 && level <= 200) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Skill 3."); format(string, sizeof(string), "{FFD633}Mai fa %d curse pentru a trece la skill 4 .", 200 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 201 && level <= 400) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Skill 4."); format(string, sizeof(string), "{FFD633}Mai fa %d curse pentru a trece la skill 5.", 400 - level); SendClientMessage(playerid, COLOR_DS, string); } else if(level >= 401) { SendClientMessage(playerid, COLOR_DS, "{FFD633}Skill 5."); } } else return SendClientMessage(playerid, COLOR_DS, "{999999}Invalid parameter."); return 1; }Daca tot nu-ti merge, scapa de ea, oricum nu prea are rost...
  8. ​ei da? mai scriam da mi sa instalat lenea, dar nu pun accent pe marime, ci pe continut
  9. Da pai, daca te prinzi greu... ce sa iti fac
  10. Salutare, astăzi vreau să discut cu voi nişte lucruri legate de optimizarea unui GM şi tot în acelaşi timp cum să faci lucrurile mai simple în GM. Q: Mai simple? Cum mai simple? A: Urmăreşte-mă şi vei află. În primul rând să discutăm despre optimizare. Optimizarea este esenţială pentru un GM, adică reduce timpul de execuţie a unei/unor functi. Q: Bun, şi dacă îl reduce ce? A: În timpul de executare a unei/unor funcţii lagul va creşte, şansă de crash devine mai mare şi nimeni nu e mulţumit. Dacă optimizăm, timpul de lag va fi redus substanţial cea ce scade şansă de crash. Q: Dar lagul acela de ce se produce? A: Că să înţelegeţi mai bine imaginativă un calculator mai vechi, cu componente slabe de genu: 1 GB ram , placă video 64 , procesor AMD 2.0 GH. Acum ganditiva că el lucrează. cu cât deschizi mai multe programe cu atât funcţionează din ce în ce mai greu , până se blochează. Acum imaginativă un calculator mai bun de genu 4GB ram , placă video 1GB, procesor i3 şi punetil să ruleze aceleaşi programe. Cu siguranţă veţi observă diferenţa şi anume că se mişcă mai rapid la acele programe şi nu se mai blochează aşa de repede. Aşa ceva este şi cu GM-ul. El trebuie să gândească în acelaşi timp ce face fiecare player în parte. Dacă GM nu este optimizat atunci clientul(adică voi) de a se bloca(crash) este mai mare. Acum că am lămurit aceste aspecte haideţi să discutăm despre cum putem face un GM mai optim şi totodată introducem şi simplitatea. Mai întâi voi începe cu sistemul de stocare a datelor MYSQL. MYSQL Observ că mulţi se plâng că nu mai sunt GM-uri pe ini(dini, yini sau alte derivări ale acestuia).Dacă tot am pomenit de derivările lui ini, pentru cei care nu ştiu sistemul de stocare a datelor ini este cel care crează un fişier .txt în scriptfiles>user(account/conturi/akk/etc). Dini, yini şi mai sunt câteva derivări sunt pentru a face puţină parformantă, adică să fie creat fişierul .txt mai rapid. Ok , am lămurit şi acest aspect, acum hai să facem diferenţa mai întâi între ini şi mysql.Mai există şi SQLLite, dar habar nu am cu ce se mânca ăla... Mysql este în momentul actual cel mai rapid şi mai de folos sistem de creare a datelor. Este cel mai avantajos dintre toate, iar conturile sunt într-o deplină siguranţă. Q: Ok , şi ce treaba are cu siguranţă conturilor? A: Hai să va zic ce mi să întâmplat mie personal după un restart. Eram pe un server de să-mp, şi numai văd că se da restart la server, eu aveam nivelul 5 , aveam 2.000.000 $ , 2 maşini, totul bine şi frumos , dar după ce să dat restart , mă văd că trb să mă înregistrez din nou, singurul de pe server, m-am înregistrat şi văd că am lvl 1 şi cele 2 maşini, iar ceilalţi nu aveau contul afectat. La mysql nu să întâmplat nici odată această. Am zis că e şi mai rapid. Da este mult mult mai rapid decât ini , deoarece un cont pe mysql poate fi creat în baza de date într-un interval scurt de timp (0.0001-0.0010 secunde, tastaţi o comandă şi vedeţi timpul de execuţie dacă nu mă credeţi), iar la dini este undeva la 0.1 - 0.9 secunde , poate ajunge dacă este lag pe server chiar şi la 1 - 1.3 - 1.5 secunde. Personal cred că este şi mai uşor de folosit. La mysql trebuie să fi atent la query-uri, pentru că ele trimit în baza de date informaţiile, în rest conturile se verifică cu if(Rows)- adică dacă se găsesc rânduri la acel cont, la dini de exemplu se verifică cu if(dini_Exists(file)) şi , personal mă bucur că e mai greu de făcut legătură cu baza de date, deoarece nu tot puştiul poate să-şi deschidă server. Acum să vorbim despre procesoarele de comenzi. ZCMD(cel mai cunoscut) şi altele Văd că încă se foloseşte strcmp pe unele GM-uri. STRCMP este extrem de lent. STRCMP este o funcţie ce verifică mesajul din chat. Adică, uitaţi cum arată o comandă pe strcmp: if (strcmp("/mycommand", cmdtext, true, 10) == 0) - verifică dacă a fost scris /mycomand. Aici intervine zcmd, care e are 2 avantaje. Aici se poate spune de simplitate, adică e mai simplu să scri CMD:mycomand(playerid,params[]) decât if (strcmp("/mycommand", cmdtext, true, 10) == 0) , clar e mult mai simplu de scris. Acum , haideţi să va vorbesc de ce strcmp e mult mai lent. Să zicem că eu am 100 de comenzi pe strcmp. Eu folosesc ultima comandă, adică comandă cu numărul 100. STRCMP verifică 99 de comenzi şi când ajunge la a 100-a se aplică. În timp ce se verifică se produce lag, într-adevăr , lag-ul ăla se nu e vizibil , dar el există. ZCMD e conceput să fie mai rapid. El foloseşte CallLocalFunction cea ce "se aruncă" direct în comandă şi nu stă să verifice cele 99 de comenzi , cea ce e vizibil mai rapidă comandă la executare. Acum există nenumărate procesoare de comenzi LIFE-CMD MCMD(cel mai rapid la ora actuală), aceste procesoare au nevoie de plugin, iar în pluginul respectiv, este folosit memory hack, cea ce îl face mult mai rapid decât zcmd, dar e puţin vizibil ochiului că e mai rapid , dar că lag, e redus substanţial. SSCANF Când vorbim de sscanf putem spune clar simplitate în folosire. Sscanf este un strtok dar cu mai multe atribuiri şi este mult mult mai rapid în verificare. Am să va dau o comandă care foloseşte strtok să vedeţi şi cum se foloseşte. CMD:givemoney(playerid,params[]) { if(IsPlayerConnected(playerid)) { tmp = strtok(cmdtext, idx); if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_GRAD2, "USAGE: /givemoney [playerid/PartOfName] [money]"); return 1; } new playa; new money; playa = ReturnUser(tmp); tmp = strtok(cmdtext, idx); money = strval(tmp); if (PlayerInfo[playerid][pAdmin] >= 1339) { if(IsPlayerConnected(playa)) { if(playa != INVALID_PLAYER_ID) { GivePlayerMoney(playa, money); } } } else { SendClientMessage(playerid, COLOR_GRAD1, "Nu esti autorizat sa folosesti aceasta comanda"); } } return 1; }Vedeţi voi, în comandă există 2 strtok-uri şi acele strtok-uri se leagă şi de strlen. Strtok-ul , în comandă are atribuţia de a îi pune un parametru, în cazul nostru, la comandă de mai sus, avem 2 parametri şi anume "playerid/PartOfName" şi "money". Ele sunt definite în felul următor cu strtok: tmp = strtok(cmdtext, idx); - face legătură cu money, adică pune că parametru şi money(suma de bani pe care o atribuim) playa = ReturnUser(tmp); - transformă playa în jucător, adică oricare playa este jucător(playa este ţintă, persoană pe care aplicăm comandă) tmp = strtok(cmdtext, idx); - cu strtok îl definim că parametru în comandă money = strval(tmp); - cu strval money este definită că număr. Deci avem nevoie de 4 functi pentru o comandă simplă. Pare inutil să le scri , dar sunt esenţiale şi fără ele nu poţi face comandă corectă, mai ales că trebuie să transformăm definirile în valori playa - jucător, money - suma de bani şi să le facem că parametru. Aici intervine sscanf care e mult mult mai simplu de folosit şi mai rapid, adică noi transformăm definirile în valori şi totodată le facem şi parametri. Putem face în felul următor comandă, în loc să scriem atât o simplificăm şi o şi optimizăm. CMD:givemoney(playerid,params[]) { if(IsPlayerConnected(playerid)) { new playa, money; if(sscanf(params,"ud", playa, money)) return SendClientMessage(playerid, COLOR_GRAD2, "USAGE: /givemoney [playerid/PartOfName] [money]"); if (PlayerInfo[playerid][pAdmin] >= 1339) { if(IsPlayerConnected(playa)) { if(playa != INVALID_PLAYER_ID) { GivePlayerMoneyEx(playa, money); } } } else { SendClientMessage(playerid, COLOR_GRAD1, "Nu esti autorizat sa folosesti aceasta comanda"); } } return 1; }Acum să analizăm. Noi avem parametri următori, eu vii prezint pe cei mai folosiţi: s - String(sir de caractere, sau mesaj) i, d - Integer(sau numar intreg) -> 1, 42, -10 c - Caracter -> a, o, * l - Logical -> true, false b - Binary -> 01001, 0b1100 h, x - Hex -> 1A, 0x23 o - Octal -> 045 12 n - Numar -> 42, 0b010, 0xAC, 045 f Float(numar cu virgula sau pozitie) -> 0.7, -99.5 u Username(Nume jucator sau id jucator) -> WiDuAlK(numele), 0(id-ul meu) Bun şi acum să analizăm situaţia următoare: new playa, money; - eu am definit 2 lucruri: playa - care vreau să fie playerul şi money - care vreau să fie suma de bani pe care o atribui. if(sscanf(params,"ud", playa, money)) sscanf - funcţia (params - vine de la CMD:givemoney(playerid,params[]), dacă folosiţi strcmp, cea ce nu va recomand, în loc de params puneţi "cmdtext" din funcţia if (strcmp("/givemoney", cmdtext, true, 10) == 0) "ud", playa, money - fac 2 chestii 1 definesc valorile : "u" i se atribuie lui playa, "d" i se atribuie lui money, dacă era "ud", money, playa "u" i se atribuia lui money iar "d" lui playa. Deci revenim, această funcţie if(sscanf(params,"ud", playa, money)) este exact că funcţiile menţinute mai sus, adică : playa = ReturnUser(tmp); money = strval(tmp); deci respectivul "u" îl transformă pe playa în jucător, iar respectivul "d" îl transformă pe money în număr întreg. Tot în acelaşi timp, transformă cele acele 2 definiri în condiţi pentru comandă , adică dacă nu scrie /givemoney Widualk/0(id meu) 1000(suma de bani) să îi dea mesaj cu parametri comenzii. Totodată sscanf verifică dacă a scris parametri , nu doar îi transformă, deci if(sscanf(params,"ud", playa, money)) verifică dacă sau scris greşiţi parametri şi îi returnează un mesaj cu ei, sau cu ce vreţi voi. Că o concluzie la sscanf , ea are mai multe atribuţii , e şi simplă şi elegantă şi optimă şi ce vreţi voi. Deci e recomandabil să îl folosiţi la orice GM. Foreach Foreach-ul , este că un loop rapid. Loop-ul arată ceva de genu: for(new i = 0; i < MAX_PLAYERS; i++) , adică i să fie egal cu toţi jucători, adică să atribuie o funcţie tuturor jucătorilor. de genu: for(new i = 0; i < MAX_PLAYERS; i++) { GivePlayerMoney(i,100); } sau for(new i = 0; i < MAX_PLAYERS; i++) { GivePlayerWeapon(i,46(id arma),1(nr de munitii/gloante)); }Acest "i" creşte de la 0 şi ajunge la nr playerilor conectaţi pe server, adică dacă voi aveţi 46 de playeri pe server, i = 46, dacă voi aveţi 600 playeri, i = 600 şi se atribuie la toţi 600 nu doar unuia. În timp ce creşte i la nr max de playeri, adică se verifică playeri conectaţi, apoi creşte, se face într-un timp , pe care noi nu îl vedem , dar el există şi timpul acela, bine înţeles este încărcat cu lag. Aici intervine foreach şi prin simplitate şi pentru că este şi mai rapid, deci simplu pentru că scri aşa: foreach(Player, i) în loc de acel cod mărişor şi include-ul foreach este structurat să fie mai rapid decât loop-ul normal, deci timp de lag scăzut. Streamer Streamer este un include, care depinde şi de plugin . Şi cam atât pot să va zic... Glumesc , cu streamer poţi introduce obiecte în joc. Cu funcţia CreateObject poţi introduce doar 1000 de obiecte, deci voi puteţi pune 2000 de obiecte, dar primele 1000 le va citi. Streamer nu are limita şi poate fi configurat că obiectele să se vadă mai de la distanţă, mai de aproape. Q: Bun , dar de ce e limita de 1000 de obiecte? A: Limita respectivă este pentru binele clientului(voi când intraţi pe server sunteţi client, hostul e serverul), deci dacă marea limita era nevoie de resurse de pc, RAM şi alte resurse, deci limita este pentru binele clientului. Streamer nu are nevoie de multe resurse, doar dacă puneţi hărţi stricate, în sens cu multe obiecte într-o zona , ele fiind şi dublicate, poate chiar de mai multe ori, în rest nu produce lag, serverele de stunt au o groază de linii numai cu obiecte, dar nu prea au lag. Array-uri Array-ul e ceva de genu: new string[200]; acesta este array pt că are "[200]". Este un simplu array, el poate fi şi dublu de genu: new PlayerInfo[MAX_PLAYERS][pInfo] sau new număr[100][25]; sau mai mare. Dacă vedeţi, lungimea strîng-ului meu este de 200 de caractere(caracterele însemnând litere, cifre, simboluri sau spaţiul dintre 2 cuvinte). Deci va citi un mesaj de 200 caractere, în caz că va avea mai mult, caracterele în + nu vor fi afişate. De multe ori strîng-urile mari sunt inutile şi consumă biţi. În chat se pot vedea maxim 144 de caractere, deci strîng-ul nostru este mai mare cu 56 de caractere, care mănâncă biţi. Ce va recomand eu, este să faceţi strîng-urile mici, cam de 144 , mai mult nu aveţi nevoie, sau calculaţi în minte câte cuvinte scrieţi, şi îl puteţi face şi mai mic. Dacă e necesar, de exemplu pui comandă /stats pe dialog MSGBOX, da , ai nevoie de strîng mai mare, pentru că te foloseşti de el, dar în rest nu e necesar, şi e recomandabil să îl faci mai mic. Stilul Tot acum vreau să va vorbesc despre stilul în care scriptati. Eu personal folosesc tab-ul de multe ori, şi fac economie de new-uri, de genu: new strîng[100], targetid, suma = 0; în loc de new strîng[200]; new targetid; new suma = 0; şi mereu folosesc 2 tab-uri la aliniere de genu: if(sscanf(params,"ud", playa, money)) return SendClientMessage(playerid, COLOR_GRAD2, "USAGE: /givemoney [playerid/PartOfName] [money]");sau if(PlayerInfo[playerid],[pAdmin] < 1) return SendClientMessage(playerid, COLOR_GRAD2, "Nu poti folosi aceasta comanda!");Sau alţi folosesc SPACE între caracterele din functi, dar mie personal nu prea îmi place, dar dacă vouă va place e ok. Sau dacă aveţi multe enum-uri de genu: new engine, lights, alarm, doors, bonnet, boot, objective; putem face aşa: new engine, lights, alarm, doors, bonnet, boot, objective;Sau dialogurile să le aduceţi într-un enum nu în define, puteţi face ceva de genu: #define DIALOG_LOGIN 1 #define DIALOG_REGISTER 2 #define DIALOG_STATS 3 #define DIALOG_HELP 4 il faceti asa: enum { DIALOG_LOGIN, DIALOG_REGISTER, DIALOG_STATS, DIALOG_HELP };Şi iese mult mai frumos. Eu nu sunt fan acoladelor foarte lungi, de exemplu: CMD:fixveh(playerid,params[]) { if(IsPlayerConnected(playerid)) { if(PlayerInfo[playerid][pAdminServer] < 1337) { SendClientMessage(playerid, COLOR_GRAD1, " Nu esti autorizat sa folosesti comanda asta!"); return 1; } if(IsPlayerInAnyVehicle(playerid)) { RepairVehicle(GetPlayerVehicleID(playerid)); SendClientMessage(playerid, COLOR_GREY, " Masina a fost reparata !"); } } return 1; } transformam in: CMD:fixveh(playerid,params[]) { if(PlayerInfo[playerid][pAdminServer] < 1337) return SendClientMessage(playerid, COLOR_GRAD1, " Nu esti autorizat sa folosesti comanda asta!"); if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_GRAD1, " Nu esti intr-un vehicul!"); RepairVehicle(GetPlayerVehicleID(playerid)); SendClientMessage(playerid, COLOR_GREY, " Masina a fost reparata !"); return 1; } Observaţi că am scăpat de acoladele în exces, când se tastează comandă îşi face verificările, după ce trece de verificări se execută, dacă rămâne la o verificare îi da mesaj. Observaţi că am scăpat şi de verificarea if(IsPlayerConnected(playerid)) deoarece, cel care tastează comandă este mereu conectat, dar dacă folosim o comandă pe cineva, şi el nu este conectat, trebuie să facem verificarea dar în loc de if(IsPlayerConnected(playerid)) punem if(IsPlayerConnected(playa)) sau în loc de playa cum am definit noi jucătorul. Cam atât am avut de zis, dacă cunoaşteţi şi alte metode , puteţi să le ziceţi printr-un reply aici. Mic anunţ!! Am decis că la fiecare tutorial dacă acumulez 5 puncte de + şi câteva reply uri voi mai poştă un tutorial. Nu imediat, ci doar când observ acest lucru. Deci dacă acumulez câte 5 puncte + la aceste tutoriale: http://www.sa-mp.ro/forums/topic/20174-sscanf-si-zcmd/? http://www.sa-mp.ro/forums/topic/20256-cum-sa-tii-un-server-din-pc-folosind-hamachi/? http://www.sa-mp.ro/forums/topic/20286-tutorial-cum-sa-creez-un-radio-pe-server-si-cum-sa-iti-creezi-melodi-pentru-ascultat-pe-server/? http://www.sa-mp.ro/forums/topic/20173-foreach-inlocuieste-loopul/? Am câteva topicuri care mai au +-uri dar nu au câte vreau eu. Q: Ce faci tu cu +, la ce îţi trebuie, de ce tot inişti? A: Acel + şi reply reprezintă mai multe pentru mine... Un lucru ar fi ăla că apreciez ce am făcut eu, ce am încercat să explic, ce am vrut să arăt, apreciezi faptul că am făcut ceva pentu ţine/voi sau pentru această comunitate, luaţi-o cum vreţi, şi îmi mai spuneţi că v-am ajutat prin tutorialul meu şi mai doriţi să mai fac, la fel prin reply mai creşte şi activitatea pe forum.
  11. extrage din baza de date:| foloseste cache_get_field_content si pune la callback-ul cand se conecteaza
  12. Acest queri iti modifica tie numele: format(string,sizeof(string),"UPDATE users SET `name`='%s' WHERE `name`='%s'",name,name2); mysql_query(SQL,string);tu il stergi daca vrei sa scapi de el ;)
  13. O poza ceva ?
  14. know, nu prea stiu cum sa iti zic asa ca un off :-?? acu 4 luni e creat topicul , deci nu mai e nevoie:| si ca on: Stiu chestiile acestea. OFF topic , asta e singura solutie.
  15. ​Nu ti-as putea spune exact ce face dar o banuiala ti-as spune. DOAR O BANUIALA NU ALTCEVA, POSIBIL SA GRESESC if(!pPlayer)-Daca e diferit de pPlayer LOG(ERROR) << "event=position player_id=" - mi se pare ca daca log(error) este mult mai mic decat ce e intre ghilimele "event=position player_id=" << aMsg.playerId - ce este intre ghilimele este mult mai mic decat aMsg.playerId la fel si a 3-a verificare, care spune ca playerul nu exista ii da return. pPlayer->PushMovement(aMsg.movement); - asta nu imi dau seama cum sa descifrez dar na , sper sa nimeresc eu ceva pe acolo. Si da , ar trebui sa facem un topic special
  16. ​YLESS: "I have wikis, bounties, websites, and more; since starting with SA:MP I've done two uni courses, two internships, and got a full-time job (and I owe LOADS to SA:MP for giving me skills used in all those places)." Eu nu m-am ocupat de limbajele de programare , dar din curiozitate am tras un ochi peste ele si mi sa parut asemanatoare codurile intre ele, bine functii diferite si altele dar sunt asemanatoare prin stil, asa mi se pare mie, nu am incercat ci doar am tras un ochi. Da are foarte putine in comun cu C++ dar are, si poti intelege mai usor limbajele de programare avand putina experienta in pawn. Poate ma insel, poate nu au nici o treaba una cu alta dar ma uit la acest cod: class Integers { public static void main(String[] arguments) { int c; //declaring a variable /* Using for loop to repeat instruction execution */ for (c = 1; c <= 10; c++) { System.out.println(c); } } }vad functiile diferite dar se aseamana mult cu pawn. Inteleg mare parte din el desi nu este pawn. La fel ca celelalte limbaje de programare care seamana efectiv intre ele , dar difera prin scriere si functi. "pseudocod este baza" de acord cu tine, dar nu poti sa negi ca daca nu stiu pseudocod si vad un cod asemanator cu cel de sus nu pot intelege 10% din cod. Parerea mea.
  17. WiDuAlK

    Forum

    ​Ma know , trebuie mai mult decat ingrosat, nu ai observat de-alungul timpului ce se intampla la sectiunea ajutor ca modelul nu era respectat? Trebuie scos in evidenta sa il vada oricine, si cine greseste trebuie sanctionat.
  18. ​Eu nu sunt de acord cu tine. De ce? Pentru ca inca se mai activeaza in alte tari limbajul pawn, SA-MP-ul este intr-un continuu update, daca pot sa ii zic asa, si bine zis "daca vrei cu adevarat sa faci asta, fa-o." deoarece pawn este si el un limbaj de programare in sine. Ca este folosit pt SA-MP asta e partea a 2-a, dar este asemanator cu C++ , java, si alte limbaje de programare. Daca vrei sa faci o cariera ca IT-st poti invata pawn si cand vei trece pe limbajele de programare cautate iti va fi mai usor, deoarece ai notiunile de baza. Nu este doar parerea mea, YLESS a spus-o si el in ultimul reply al lui inainte de a se lasa. Ca o concluzie pentru toti care vor sa invete, daca vreti faceti-o dar nu pentru a scoate bani sau ceva, ci doar de distractie , pasiune si a va demonstra voua insisi ca pasiunea este cheia succesului. Cam atat am avut de zis.
  19. WiDuAlK

    Forum

    Am sa incep eu sa imi spun parerea sincera legata de forum. In primul rand imi place la nebunie tema. Imi place deoarece are un aspect mai frumos ochiului. Ce ar trebui adaptat: stiu ca nu e vina lui WopsS sau Viorel, dar ar trebui sa traduca paginile existente, modelele de postare ar trebui colorate, ajustate, facute ceva sa se vada clar, nu doar un simplu pinner. Cam asta e parerea mea, daca aveti alta parere, postati-o intr-un reply aici.
  20. Mai întâi de toate, va rog să citiţi TOT ce am spus eu prin acest topic , pentru că sunt uni , uni mai mulţi defapt, care copie dintr-o parte în altă dar nu ştiu ce înseamnă acele functi/callback-uri/variabile sau ce atributi au. Introducere Căutând idei pentru a construi un sistem de engine, menţionez că un sistem că acesta nu este aşa complex, m-am uitat prin diferite posturi pe să-mp.com , dar şi pe alte GM-uri care le mai am eu prin pc, orientativ, nu de a lua dintr-o parte în altă ci doar pentru a mă documenta în scripturile mele. Am văzut ce mă interesat, mi-am creat singur sistemul de engine, merge perfect(mie personal) şi sunt mulţumit de el. M-am folosit în crearea mea de 2 sisteme. Primul pe care l-am văzut pe un GM(nu dau nume, pentru că nu îl veţi găsi pe internet, a fost odată) şi unul de pe internet, unul cam ciudat din punctul meu de vedere pt că folosea TogglePlayerControllable , la care puteai da /unfreeze şi porneai cu maşină. Cel din GM se folosea de funcţia ManualVehicleEngineAndLights(). Ce face această funcţie? Dacă o folosiţi în sine, veţi vedea că nu va mai porneşte vehiculul când intraţi în el(am avut problema cu el, am şi postat o problema legată de el aici, eu iniţial credeam că nu porneşte farurile şi nu vehiculul) şi bine înţeles nu pornesc singure farurile de la maşină când se face noapte.De această funcţie m-am folosit şi eu, menţionez că era în GM, dar pe fs nu era, ci era , repet, TogglePlayerControllable. În acel GM era o mică eroare de concepţie , adică dacă porneai un vehicul,ieşeai fără să îl închizi şi încercai să îl porneşti pe al 2-lea îl închizi defapt, pentru că respectivă variabilă era asupra playerului, nu a vehiculului. Din acestea 2 m-am ghidat eu şi a fost foarte folositor. Mod de gândire În primul rând trebuie să definim o variabilă cu care atribuim unui vehicul o valoare. În ce constă acea valoare, ei bine dacă este engine off sau on. În al 2-lea rând ne trebuie să punem şi ManualVehicleEngineAndLights , pentru a nu porni vehiculul când intrăm în el, şi a nu fi nevoie de freeze. Menţionez că variabilă de care v-am spus o atribuim unui vehicul, nu la toate, ci doar respectivului vehicul în care ne aflăm , aşa nu vom avea parte de probleme la alte vehicule, functi eronate menţionate în introducere. Ne gândim şi la 2 metode pentru a porni vehiculul.Prima metodă este ce a comenzi,prin această metodă nu ne vom folosi de variabilă menţionată pentru că vor există 2 comenzi /engine şi /stopengine care nu au nevoie să verifice dacă vehiculul este deschis sau nu, ele înţelese de la sine. A 2-a metodă este cea a apăsării unei taste, cea mai folosită este tasta 2, pe care o vom folosi şi acum, dacă voi vreţi altă tasta, căutaţi aici şi înlocuiţi: http://wiki.sa-mp.com/wiki/Keys. La această metodă ne vom folosi de variabilă menţinută mai sus. Totodată cu ea verificăm dacă acel vehicul este pornit sau nu. Acestea fiind spuse, să trecem şi la partea de scripting. Mai întâi mergem la începutul GM-ului şi punem: new EngineVehicle[MAX_VEHICLES]; // Aceasta variabila am facut-o sa se atribuie vehiculelor de pe server insemnand toate nu doar primelor 10 20 30 si asa mai departe. Acum mergem şi punem funcţia această la publicul OnGameModeInit: ManualVehicleEngineAndLights(); //Aceasta functie face ca noi din pawn sa ii atribuim comenzi, nu ca pe GTA San Andreas , cand te urci intr-un vehicul imediat pleci cu el. Mergem tot la începutul GM-ului şi definim părţile unui vehicul, la care veţi vedea unde le vom folosi. new engine, lights, alarm, doors, bonnet, boot, objective; // acestea sunt componentele vehiculului pe partea de functie. Cu ele vom porni alarma, masina, usile(incuiate/descuiate) etc. Trecem pe partea de comandă unde vom face cele 2 comenzi. Comenzile /engine şi /stopengine care le vom crea fără a ne volosi de variabilă EngineVehicle pentru că ele sunt exact la obiect, nu trebuie să verificăm dacă e pornit vehiculul sau nu. CMD:engine(playerid,params[]) { new vehicleid = GetPlayerVehicleID(playerid);// definim vehicleid ca fiind id masinii in care ne urcam if(vehicleid == INVALID_VEHICLE_ID)// daca vehicleid este invalid, adica nu suntem in nici un vehicul return SCM(playerid,-1,"Nu esti intr-un vehicul");// ne da acest mesaj // aceasta este singura verificare de care avem nevoie. Tastand comanda, aceasta se verifica prima data. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);// definim parametri vehiculului in care ne-am urcat, adica cei mentionati mai sus SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);// setam vehiculul ca pornit, inlocuind engine cu VEHICLE_PARAMS_ON return 1; } CMD:stopengine(playerid,params[]) { new vehicleid = GetPlayerVehicleID(playerid);// definim vehicleid ca fiind id masinii in care ne urcam if(vehicleid == INVALID_VEHICLE_ID)// daca vehicleid este invalid, adica nu suntem in nici un vehicul return SCM(playerid,-1,"Nu esti intr-un vehicul");// ne da acest mesaj // aceasta este singura verificare de care avem nevoie. Tastand comanda, aceasta se verifica prima data. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);// definim parametri vehiculului in care ne-am urcat, adica cei mentionati mai sus SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);// setam vehiculul ca pornit, inlocuind engine cu VEHICLE_PARAMS_OFF return 1; } Observaţie: Putem înlocui fiecare din acei parametri cu VEHICLE_PARAMS_ON sau VEHICLE_PARAMS_OFF, la funcţia SetVehicleParamsEx deoarece aşa activăm acei parametri. Voi puteţi să îi puneţi şi un mesaj acestei comenzi, eu nu m-am complicat pt simplul fapt că lumea foloseşte cel mai des metodă prin tasta, de dragul comodităţii sau că este mai rapidă. Acum că am creat comenzile, mergem la partea de apăsare prin tasta. Acum ne vom folosi de variabilă EngineVehicle, dar şi de tasta 2. Tasta 2, conform wiki este: KEY_SUBMISSION când te afli în vehicul. Mergem la publicul OnPlayerKeyStateChange şi facem în felul următor: if(newkeys & KEY_SUBMISSION)// tasta 2 , pe care am ales-o { new vehicleid = GetPlayerVehicleID(playerid); if(vehicleid == INVALID_VEHICLE_ID) return SCM(playerid,Rosu,"Nu esti intr-un vehicul"); GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective); // pana aici, am explicat anterior // precum noi am facut variabila EngineVehicle, ea are la inceput valoarea = 0. Noi ne vom folosi de aceasta. //EngineVehicle are ca parametru nr max de vehicule, nu este pus aiurea, in cazul nostru putem atribui fiecarui vehicul in parte o valoare. Acum o vom face folosind vehicleid if(EngineVehicle[vehicleid] == 0)// in caz ca vehiculul in care ne-am urcat are valoarea 0 la EngineVehicle, vom face urmatoarele: { SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);// il pornim prin aceasta functie SCM(playerid,-1,"Ai pornit vehiculul!");// ii dam acest mesaj ca l-am pornit EngineVehicle[vehicleid] = 1;// ii stabilim valoarea 1, adica ca este pornit. } else if(EngineVehicle[vehicleid] == 1)// altfel, daca vehiculul are EngineVehicle = 1(adica este pornit) ii vom face urmatoarele: { SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);// il inchidem SCM(playerid,-1,"Ai inchis vehiculul!");// ii dam mesaj ca l-am inchis EngineVehicle[vehicleid] = 0;// ii stabilim valoarea 0(adica este inchis) } } Prin acestea, noi vom observă următoarele lucruri: -Dacă un player se urcă în vehicul şi îl porneşte, apoi se coboară şi pleacă lăsând-ul pornit, aşa va rămâne pentru fiecare jucător -Dacă un alt player se urcă în ACELAŞI vehicul, va putea merge cu el , şi îl va putea închide, şi va rămâne închis pentru toată lumea Acum, trebuie să facem că atunci când jucătorul se urcă în vehicul, şi vehiculul este închis , să îi spună ce trebuie să facă că să fie pornit vehiculul, în caz că este pornit, să nu îi dea nici un mesaj. Cum facem asta? Simplu. Mergem la publicul OnPlayerEnterVehicle şi punem următoare verificare if(EngineVehicle[vehicleid] == 0)// daca vehiculul este inchis, are valoarea EngineVehicle = 0 { SCM(playerid,-1,"Scrie /engine sau apasa 2, pentru a porni vehiculul!");// ii da mesaj sa ii spuna ce trebuie sa faca. } NOTĂ!! Aveţi măcar bunul simt de a nu copia tutorialul şi a-l poştă în altă parte şi ai modifică creditele. Eu am muncit la acest tutoriale, aşa că, nu vreau că altul să fie apreciat pentru muncă depusă de mine, nu de el. Cam atât şi cu acest tutorial, dacă ţi-a fost de folos dai +1, şi sper să ne auzim cu bine până la următorul tutorial.
  21. ia incearca sa folosesti asta, in loc de explode: new vehicleid = GetPlayerVehicleID(playerid); SetVehicleHealth(vehicleid, 0); si cred ca va exploda.
  22. Cine il ia? Eu am postat aceasta conversatie pt a intelege pers de genu ca nu e cum cred ei, ca nu sunt asa"rotunzi" si daca injura degeaba nu sunt interesanti. Nu sper sa inteleaga toti, dar macar cativa. Daca nu te poti schimba , macar prefate , oricum vei parea mai ok.... sper sa intelegeti ce vreau sa spun, daca nu... pace!
  23. Faptul e consumat, ai dat un reply degeaba...
  24. De unde sa stiu eu ca el e extremist in arta prostiei?
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.