Jump to content

Tanga

Uživatel
  • Příspěvků

    1278
  • Registrován

  • Aktivní

  • Vítězných dnů

    29

Everything posted by Tanga

  1. strcmp je skratka od string comparison (porovnanie stringov). parametre teda vidiš, str1, str2, potom volitelne bool:ignoreCase, length kde length je počet znakov čo max porovna (length = 2 tak "abeceda" = "abY SI VeDEL"). Ignore case či ako je že či to ignoruje velkemale pismena (tj. "nieco"="NieCO") Vracia to 0 ak su tie stringy rovnake if (strcmp() == 0) je to iste ako if (!strcmp)
  2. j, ten calllocalfunction je izcmd, cez to parsuje prikazy. Mozu to pouzivat aj ostatni ale izcmd z kazdeho prikazu spravi public funkciu a vola ju cez calllocal. Dini je shit v reale, je to dobre pre niekoho čo sa uči programovat, ale inak je to nepouzitelne.
  3. Btw, dini funguje tak ze pri kazdom jednotlivom čitani otvori subor, cely ho preskenuje kym nenajde to čo hladaš a potom tu hodnotu vrati. Ukladanie je ešte lepšie. Pri ukladani jednotlivych udajov zasa vytvori prazdnu kopiu suboru do ktoreho zapisuješ (s nazvom "nazov.part"), čita cely povodny subor, po jednom tie riadky prepisuje do novej kopie, pri každom kontroluje či prave dany riadok nechceš zmeniť (so strcmp()). Ked subor dokopiruje, odstrani povodny a znovu to prekopiruje (z nazov.part) do noveho suboru s povodnym nazvom kedze file_rename() v samp neexistuje.
  4. Divné, že už máš 30k riadkov a laguje ti to. Je to taky paradox. Ak máš tolko kódu, máš dosť skúseností napísať to tak aby to nelagovalo. Začiatočnícke chyby tam asi mať nebudeš, ale bez toho čo si napísal sa nedá povedať čo si kde spravil zle. Tak aspoň nejaké rady ti napíšem, možno dačo z toho pomôže.. • Menej cyklov • V cykloch nepoužívaj MAX_PLAYERS, ale GetPlayerPoolSize(). Podobne GetVehiclePoolSize(). • Používaj nejaký moderný cmd systém (izcmd). (1 prikaz = 1 volanie strcmp, pričom izcmd použiva binary serach vsetkych prikazov, nie jednotlivo strcmp) • Dáta ukladaj do databázy (mysql). (relational database wiki) • Ak používaš nejaké externé includy (streamery objektov, ...) tak skús nájsť to isté, ale ako plugin, nie ako pawn kód. (pawn je bytecode jazyk, dekodovanie jednej pawn instrukcie zaberie tušim 3 CPU inštrukcie (pawn-imp, introduction a ptm od strany 88. Ine verzie toho dokumentu maju INY OBSAH) • Nedávať veci do OnPlayerConnect(), skôr do vlastnej OnPlayerLogin(). Tam tiež možno ušetríš niečo ak maš vela botov (raksamp bot hack). • Nepoužívaj OnPlayerUpdate(), prípadne sa snaž to obmedziť. Keď sa hráč hýbe, volá sa to aj 30x za sekundu (PRE JEDNEHO HRAČA). • Menej cyklov • Anticheat... Namiesto kontroly všetkých, kontroluj náhodne. Skutočného cheatera teda nechytíš na prvykrat, ale časom určite. • Multithreading? Namiesto tých timerov multi-thread plugin. Možno by to našlo využitie. Tiež si prečítaj tie komenty k tomu, je to vcelku nebezpečné, zvažil by som mutex hooknutím funkcií, ktoré by mohli byť nebezpečné. Umm nič viac mi nenapada. Riešiť spotrebu RAM netreba... V podstate jediné kde RAM používaš sú tvoje premenné, takže ak tam nemáš nejaké zbytočné veci, asi moc neušetríš. Ak ti to laguje jak prasa, možno by som pridal viac premenných aby som nevolal stále nejaké funkcie... Tj. spomedzi spotreby RAM vs CPU by som vybral menšie zlo. Edit: Bulletlist ani numberlist nefunguje. Divne, na ostatnych prispevkoch mi to išlo. Musel som to tam dat tie odstavce manualne.
  5. Ten istý topic tu bol pred týždňom.
  6. Tanga

    návod Enum [**]

    Obsah Úvod #define enum Ďalšie použitie 1. Úvod Napadlo mi, že rýchlejšie než vysvetliť niekomu čo je to enum, by bolo dať mu odkaz na nejaký návod. Žiadny som však nenašiel. Boli útržky toho čo je to enum tu a tam, ale nič čo by sa dalo ľahko nájsť. Enum slúži na náhradu direktív preprocesora (#define NIECO). Je prehľadnejší a umožňuje lepšiu kontrolu errorov pri kompilácii. Enum je skratka od enumeration, tj. výčet, vyčíslenie. V tomto návode teda ukážem riešenie konkrétnej úlohy dvomi spôsobmi. Pomocou #define a enum. Majme systém, ktorý kontroluje kde sa nachádzajú isté autá a či sú obsadené. Použijeme teda jednu globálnu premennú. 2. #define #define POSX 0 #define POSY POSX + 1 #define POSZ POSX + 2 #define OCCUPIED POSX + 3 #define VELKOST_POLA (OCCUPIED - POSX + 1) // 3-0+1=4 #define POCET_AUT 20 new Vozidla[POCET_AUT][VELKOST_POLA]; ... stock PouzitiePola() { printf("Velkost posledneho pola = %d", VELKOST_POLA); for (new i; i < sizeof (Vozidla); i++) if (Vozidla[i][OCCUPIED] == true) { printf("%f", Vozidla[i][POSX]); // len nejaky priklad } } 3. Enum Rovnakú funkcionalitu s použitím enumu by sme dosiahli nasledovným kódom. Nie je nutné písať názvy jednotlivých prvkov v enume veľkým písmom. Záleží na vašich preferenciách, mne celkom dáva zmysel, že keďže to nahrádza konštanty, tiež by to malo byť veľkým písmom. #define POCET_AUT 20 enum CarEnum { Float:POSX, // enum umoznuje jednoduchu a prehladnu kontrolu typov Float:POSY, Float:POSZ, bool:OCCUPIED }; new Vozidla[POCET_AUT][CarEnum]; ... stock PouzitiePola() { printf("Velkost posledneho pola = %d", _:CarEnum); for (new i; i < sizeof (Vozidla); i++) if (Vozidla[i][OCCUPIED]) { printf("%f", Vozidla[i][POSX]); // len nejaky priklad } } Možno ste si všimli v PouzitiePola() s enumom: printf("Velkost posledneho pola = %d", _:CarEnum); Tá časť _:CarEnum musí mať predponu _: inak by kompiler hodil warning. Fungovalo by to ajtak. Je to len bug kompilera. V praxi som vypísanie veľkosti enumu ešte nevidel, nebojte sa že by to hnusilo kód. Pre pokročilých: 4. Ďalšie použitie Enum nemusí číslovať od nuly, dá sa spraviť aj toto: #include <a_samp> enum TestEnum { PREMENNA = 5, PREMENNA2, PREMENNA3, // pauza PREMENNA4 = 25, PREMENNA5 }; main() { printf("%d, %d", _:PREMENNA3, _:PREMENNA5); } Server log: SA-MP Dedicated Server ---------------------- v0.3.7-R2, (C)2005-2015 SA-MP Team ... [01:05:25] 7, 26 Som presvedčený, že s enumami sa dajú robiť rôzne pekelné kúsky z ktorých ja žiadne nepoznám, určite ak nejaké máte, pridajte.
  7. Šak stlačíš F5 a vytvorí ti to .amx súbor... To nemáš uložiť ako amx.
  8. Tanga

    pomoc Nová možnosť

    Ajoo, diky, fixed. Hej, dobre že si napísal aj tento spôsob. Akurát z toho tvojho nebude môcť hocikto odísť pred štartom (/quitbridge) ak sa rozhodne. Z môjho ešte hej. Aspoň má zakladateľ príspevku lepší výber.
  9. Tanga

    pomoc Nová možnosť

    Tak kvoli pohodliu hračov by som si naukladal (/save) pozície všetkych možnych štartovnych pozicii aut. enum BridgeCarsEnum { Float:POSX, Float:POSY, Float:POSZ, bool:OCCUPIED }; new BridgeCars[20][BridgeCarsEnum]; // tu si nasledne niekde napln tento enum.. Radsej v inom subore, bude to prehladnejsie /joinbridge new bool:joined; for (new i; i < sizeof BridgeCars; i++) { if (!BridgeCars[i][OCCUPIED]) { // zaradom prirad hracov do dalsieho volneho auta BridgeCars[i][OCCUPIED] = true; bridgeauto = CreateVehicle(402, BridgeCars[i][POSX], BridgeCars[i][POSY], BridgeCars[i][POSZ], 1, 1, 1, 0); joined = true; ... break; // rovno skonci cyklus } } if (!joined) SendClientMessage(playerid, -1, "Zavod je uz plny, nemohol si sa pripojit."); /konieczavodu for (new i; i < sizeof BridgeCars; i++) BridgeCars[i][OCCUPIED] = false; Nasledne by som hračov posadil na trať na volne pozicie.
  10. Tanga

    pomoc Začátečník

    Možno daka kniha, cjavim, "Učebnice jazyka C" od Herouta. Neni to o Pawn, ale je to skoro rovnaky jazyk. To mne pomohlo. uloz.to Ale keby niečo moj skype je gtanoncheat, mozes sa spytat, ale az ked dočítaš prvych 15 stran z tej knihy, skorej ani nepiš
  11. Dobrá otázka, dík. Po pár experimentoch som zistil, že áno. Resp. CallLocalFunction() j, to upravím. Povedzme, že includ z bodu 5 (callback hook) bude v include "testcode". Lepšie sa to predstavuje keď to volanie dám už mimo pôvodného súboru (nemusíš rozmýšlať či už to bolo definované alebo ktorý krok preprocesora prebieha... ale stalo by sa to isté). #include <a_samp> #include <testcode> main() { OnPlayerGiveDamage(1, 2, 3, 5, 6); // example of a normal call } a tiež teda ku koncu testcode.inc (riadok 19) je #define OnPlayerGiveDamage MyOnPlayerGiveDamage // premenovanie nasledujuceho callbacku z čoho vznikne main() { MyOnPlayerGiveDamage(1, 2, 3, 4, 5); } čo následne a) ak neexistuje ďalší hook, crashne pri forwarde z testinclude.inc "error 004: function "MyOnPlayerGiveDamage" is not implemented" ak existuje ďalší hook, zavolá rovno ten ďalší a preskočí ten môj (skompiluje, ale kód bude chybný)
  12. Hookovanie funkcií a callbackov Obsah Čo je to hookovanie Princíp hookovania a preprocesor _ALS_ - Advanced Library System Hookovanie funkcií Hookovanie callbackov Zhrnutie 1. Čo je to hookovanie Predstavte si gamemod v Pawn ako reťaz, kde každý krúžok predstavuje jednu funkciu (stock). Tieto krúžky sú pospájané, pretože jedna funkcia (stock) volá druhú a tá ďalšiu, atď. Dobrý, čitateľný kód je rozdelený do mnoho súborov, includov. Nanešťastie, každý callback môže byť definovaný iba raz, čo bráni efektívnemu rozdeleniu kódu. Tento problém rieši hookovanie, ktoré si možno predstaviť tak, že reťaz (gamemode) sa v niektorom krúžku rozdelí, pridá sa tam kód, ktorý chceme hooknuť a naspäť sa spojí, bez toho aby to akokoľvek ovplyvnilo zvyšok reťaze. To umožňuje použiť jeden callback aj viackrát v jednom súbore (prípadne v includoch). 2. Princíp hookovania a preprocesor Je treba povedať, že Pawn kompiler nefunguje (ani nemá prečo fungovať) tak ako Cčkový, alebo iný. Povedzme, že chceme upraviť (hooknuť) funkciu GivePlayerMoney() tak, že vždy keď je zavolaná, dá hráčovi dvojnásobok peňazí. Samozrejme bez toho, aby sme ovplyvnili nejaký už-existujúci kód. stock GivePlayerMoneyEx(playerid, money) { // definujeme vlastnu funkciu return GivePlayerMoney(playerid, money * 2); // v nej zavolame tu povodnu } #define GivePlayerMoney GivePlayerMoneyEx // predefinujeme tu povodnu Ďalšie použitie funkcie GivePlayerMoney() by už hráčovi dalo dvojnásobok peňazí. Štvrtý riadok spôsobí, že každé nasledujúce volanie GivePlayerMoney() preprocesor nahradí za GivePlayerMoneyEx(), teda za náš hook. Kompiler nehodí error/warning v prípade, že predefinujete už-existujúcu funkciu/callback. Na pochopenie princípu hookovania je treba vedieť ako funguje preprocesor Pawn. Stačí vedieť, že prebieha vo viacerých krokoch. V prvom kroku prebehne daný súbor, ktorý má spracovať. Skontroluje v ňom makrá a podmienky preprocesora a vyhodnotí ich. Súčasne si zapamätá ktoré funkcie (stocky, publicy) existujú, pridá si ich do medzipamäte a súbor prebehne znovu (opäť vyhodnotí makrá a podmienky preprocesora). Toto správanie podporí aj nasledujúci kód. Pre vaše dobro si každý z tých kódov skompilujte. #if defined A #error Funkcia je definovana #endif stock A() { } Kompiler hodí error kvôli tomu, že funkcia "A" je definovaná, hoc až za makrom. Zaujímavý je však tento kód: #if !defined A // vsimnite si zmenu, negaciu podmienky #error Funkcia nie je definovana #endif stock A() { } Hodí error rovnako, ako kód predtým. Ako je to možné? Predsa ide o znegovanú podmienku. Nečítajte ďalej, ak na to chcete prísť sami. Druhý kód prebieha tak, že preprocesor prejde ku "#if !defined". Tam samozrejme zastaví, pretože doteraz symbol "A" nikde nenašiel. Prečo teda prvý kód tiež narazil na error? V prvom kóde, preprocesor prebehne ku #if defined. "A" definované nie je a teda ide ďalej, ku koncu súboru, medzitým "A" nájde a uloží si ho do zoznamu známych symbolov. V ďalšej iterácii však preprocesor znova dôjde k #if defined, "A"čko už pozná a preto hodí error. Musím ešte povedať, že toto som zistil experimentami, popravde neviem ako funguje ten preprocesor. Ak máte nejaké objasnenie, môžete napísať. 3. _ALS_ - Advanced Library System Ak ste niekedy videli hookovací kód, všimli ste si, že oproti môjmu príkladu s GivePlayerMoney(), tam bolo niečo navyše. Správny kód by mal vyzerať takto: stock GivePlayerMoneyEx(playerid, money) { GivePlayerMoney(playerid, money * 2); } #if defined _ALS_GivePlayerMoney #undef GivePlayerMoney #else #define _ALS_GivePlayerMoney #endif #define GivePlayerMoney GivePlayerMoneyEx Toto slúži na detekciu, či už bola daná funkcia hooknutá. Ak áno, kód by nefungoval a tiež vyhodil warning 201: redefinition of constant/macro (symbol "GivePlayerMoney") Predefinovanie stocku/callbacku warning nehodí, predefinovanie makra/define áno. Kúzlo s "_ALS_" ošetruje práve to, aby bolo možné skombinovať viac hookov. Syntax "_ALS_" je akýsi neoficiálny štandard. Používajú to všetci a tým sa zaručí kompatibilita hookov od rôznych autorov. 4. Hookovanie funkcií Hookovanie funkcií už bolo ukázané, ale dám ešte jeden príklad. // ak je hrac vo vozidle, portne aj vozidlo stock SetPlayerPosEx(playerid, Float:x, Float:y, Float:z, bool:vehicleToo=false) { if (vehicleToo) { if (IsPlayerInAnyVehicle(playerid)) return PortWithVehicle(playerid, x, y, z); else return SetPlayerPos(playerid, x, y, z); } else return SetPlayerPos(playerid, x, y, z); } #if defined _ALS_SetPlayerPos #undef SetPlayerPos #else #define _ALS_SetPlayerPos #endif #define SetPlayerPos SetPlayerPosEx ... public OnPlayerCommandText(playerid, cmdtext[]) { if (!strcmp("/portme", cmdtext)) SetPlayerPos(playerid, 1, 2, 3, true); else if (!strcmp("/oldport", cmdtext)) SetPlayerPos(playerid, 234, 46, 324); } 5. Hookovanie callbackov Hookovanie callbackov prebieha trochu ináč než funkcií. Aj keď kód je skoro rovnaký, na pozadí ide v podstate o opačný proces než u funkcií. public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart) { // pouzijeme povodny callback if (IsPlayerAdmin(damagedid)) { // pridame vlastnu funkcionalitu Kick(playerid); } // zavolame nasledujuci hook #if defined MyOnPlayerGiveDamage // moze sa stat, ze neexistuje viac hookov, preto podmienka return CallLocalFunction("MyOnPlayerGiveDamage", "iifii", playerid, damagedid, amount, weaponid, bodypart); #else return 0; // v callbackoch su dolezite spravne return hodnoty #endif } #if defined _ALS_OnPlayerGiveDamage #undef OnPlayerGiveDamage #else #define _ALS_OnPlayerGiveDamage #endif #define OnPlayerGiveDamage MyOnPlayerGiveDamage // premenovanie nasledujuceho callbacku #if defined MyOnPlayerGiveDamage // samozrejme forward forward MyOnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart); #endif V skripte použijeme ten pôvodný callback a "predefinujeme" tie nasledujúce. Syntax "MyOnPlayerGiveDamage" už nie je "štandardizovaná", môžete použiť aj iný názov. 6. Zhrnutie Pri hookovaní v podstate nejde o ten kód, ako o to pochopiť čo robí preprocesor na pozadí. Ak ste si všetky kódy pozreli a porozmýšlali nad nimi, mali by ste tomu rozumieť. Či do toho "vidíte skrz na skrz" si môžete skúsiť odpovedaním na tieto dve bonusové otázky: 1.) V prípade, že je 10 skriptov čo hookujú nejakú funkciu a môj skript ju hookol prvý, koľká v poradí sa vykoná funkcia z môjho skriptu? 2.) V prípade, že je 10 skriptov čo hookujú nejaký callback a môj skript ho hookol prvý, koľký v poradí sa vykoná callback z môjho skriptu? Ak máte otázky/vylepšenia, pokojne sem s nimi.
  13. Tanga

    pomoc HELP

    Inak ak pogoogliš, da sa najsť zoznam všetkych colnych prechodov pre SAMP (open source trucking servery), mavaju tam aj rampy atď. Alebo vlastne si vygoogli cely colny (toll) system
  14. Vyskusam. Z latinskeho por ciento, tj. "zo sto, na sto, ku sto, rozdelit medzi 100, ...". Teda 5"%" = 5 "zo sto" = 5 "rozdelit medzi sto" = 5 "/100" = 0.05. No a ked chces 5% z nejakej inej sumy, len to nou vynasobiš, Keď ale povieš 5%, nie je jasne "čo rozdeluješ medzi 100, predpoklada sa teda že čislo 1" 5% z 1 = (5/100) * 1 Keď tam maš zadane aj čo presne rozdeluješ, napr. "686", tak 5% z 686 = (5/100) * 686 (je to "opačny" zapis nez pouzil Ewwe, vysledok je rovnaky)
  15. Tanga

    script [inc] ReturnDate

    OK, neda mi nepozriet to teraz... Hlavne sa nenechaj odradit od Pawn tym co som napisal.. Proste, tje jedno. Neberte to tak važne. Kod som pozrel, nechapem z toho nič, ale to bude tym ako timestamp funguje plus tym tvojim optimalizačnym riešenim. Tak ak chceš, možem ti aspon poradit co by som tam zmenil ja... Pozrel som ten tvoj kod, a tiez ten z odkazu co si dal, tipujem ze tym nekonecnym cyklom si sa inspiroval odtial... Ten kod co tam chlapik dal je tiež nejaky podozrivy.. Nerozumiem mu teda, ale Timestamp -= 172800; // Delete two days from the current timestamp. This is necessary, because the timestamp retrieved using gettime() includes two too many days. wat @Highpritn to s tymi dvoma hodinami shet skoro mi pri tom zhorel mozog, ale uz viem Čo je unix timestamp: kolko sekund ubehlo od 1970-01-01T00:00:00 GMT U nás však 01.01.2017 00:00:00 nastalo kvôli časovému posunu o dve hodiny skorej než v Greenwichi, a teda "náš" timestamp stihol napočítať o dve hodiny menej oproti nejakému na kompe v Greenwichi. (GMT) 01.01.2017 00:00:00 = 1483228800 (MY) 01.01.2017 00:00:00 = GMT - 2 hodiny = 1483228800 - 7200 = 1483221600 Je to potrebné odpočítať teda preto, lebo tipujem autor dal vypočítať cez online kalkulačku dátum 1.1.2017 a len pre GMT. Keby v tej kalkulačke našiel naše časové pásmo, rovno mu ukáže náš dátum a netreba nič odčitovať. zo zvyškom čo pišeš suhlasim No a čo by som ti/autorovi poradil, #define pisat vzdy s velkymi pismenami. Robi sa to tak vzdy a vzdy sa to tak aj robilo. Lahsie sa to cita. Tiez by som nepomenovaval tie #define rovnako ako premenne. A tiež nepouživat goto, next, break, atd. Samotne použitie takychto konštruktcii spomaluje celkovu rychlost vykonania kodu kvoli branch prediction (podobny pripad, hlavne mad obre vysvetlenie). Ale to nei je podstatne. Hlavne sa to zle číta, lebo musíš hladať kde to začína a končí. Tiež switch je rýchlejší než ify. Na druhej strane viem, že najrýchlejší kód je vždy najmenej čitatelný. Inak teda priznavam, nemam šajnu čo sa v tom kode deje a netušim čo su tie magicke čisla. Do buducna, piš komentare. Evidentne sa totiž chceš pochváliť svojim kódom, tak musíš aj zariadit, že ten kod je to čo nas zaujme. A dobry kod je ten, ktory ma komentare. A tiež teda chvalim napad.
  16. Tanga

    script [inc] ReturnDate

    Kontaktovat ta cez SZ? wat načo taky prispevok vobec? Treba napisat dobry kod a nemusel by si to vysvetlovat. Inak sa na to nikto ani nepozrie nie uz to rozmyslat nad tym ako si to spravil.
  17. Tanga

    pomoc [SAMP] Niektoré znaky..

    Stiahol by som GTA z ineho torentu, aj samp nanovo mozno.
  18. Čusbus. Napadlo mi, že by som sa pochválil akú hudbu počvúam, resp., že by som sa opýtal čo počúvate vy. Už to tu párkrát bolo a je mi jasné, že by to ajtak nikto nepočúval. Všetci by teda len napísali mená songov. Ale to mi prišlo vcelku oničom, už predsalen je ľudstvo ďalej. A teda mi napadlo, keďže ja používam youtub v podstate len na počúvanie songov, abo aspoň v drvivej väčšine, dajte sem screenshot svojho home na youtube. Tam sa zobrazujú videá, ktoré pozeráte najčastejšie a teda, "ste to vy". Takto budeme môcť vidieť aj náhľad na daný song a je to celkovo lepšie. Samozrejme, ak počúvate hudbu cez nejaký iný softvér, tak dajte podobný screen. Ako? Buď si stiahnite nejaký web-to-image plugin do prehliadača, alebo napr. (ja) sa dá použiť nejaký web-to-pdf a následne vygoogliť pdf-to-jpeg converter a cez to spraviť obrázok. Obrázky dajte do spojleru, to ich resizne tak, aby boli čitateľné.
  19. Jo a, fajn by bolo keby linky fungovali aj v komentoch na statusy. Tie nejdu vobec.
  20. To co ti povedal highprint je, ze z konzoly nikdy nedostanes EOF. "Takze vlastne vypisat hodnotu EOF nie je mozne" wtf bro, proste eof dostaneš v konzoli až ked vypneš dany program. Pri suboroch by to fungovat mohlo, ale nie v konzoli. Detekovat chces ci nestlacil enter, atd.
  21. Tanga

    hledám AntiProxy

    tak posli tu kktinu od killera a dakto ti to odtial vyhodi ak ide len o hento, staci amx
×
×
  • Create New...