Jump to content

ForestCZE

Uživatel
  • Příspěvků

    111
  • Registrován

  • Aktivní

Příspěvky posted by ForestCZE

  1. Zdravím, vůbec netuším, od kdy to začalo, ani co to způsobuje. Vyvíjím mód a jednou za čas smažu všechny účty. Když se zaregistruju a přihlásím, vyberu postavu a spawnu se, tak spadne hra.

     

    Pawno mi ukazuje rekurzi:

    Header size:           4508 bytes
    Code size:           125708 bytes
    Data size:           673772 bytes
    Stack/heap size:     262144 bytes; estimated max. usage: unknown, due to recursion
    Total requirements: 1066132 bytes

    A ta rekurze se objeví, jakmile naincluduju dof2. Crashdetect mi v serverlogu nic neukáže. Jak to odhalit? Díky :)

  2. před 2 hodinami, IllidanS4 said:

    Stáhnout, dát do složky plugins a přidat do plugins v server.cfg. Na Win "plugins crashdetect", na Linuxu "plugins crashdetect.so".

    [13:48:17] 
    [13:48:17] Server Plugins
    [13:48:17] --------------
    [13:48:17]  Loading plugin: crashdetect.dll
    [13:48:17]   CrashDetect v4.18.1 is OK.
    [13:48:17]   Loaded.
    [13:48:17]  Loaded 1 plugins.

    A nikde žádné zprávy o crash

    EDIT: A ta rekurze mě taky děsí

    Header size:           4508 bytes
    Code size:           125640 bytes
    Data size:           673772 bytes
    Stack/heap size:     262144 bytes; estimated max. usage: unknown, due to recursion
    Total requirements: 1066064 bytes

    EDIT2: Rekurzi způsobuje include na registraci <dof2> .. je to normální?

  3. před 23 minutami, GaRGoyLeS said:

    Néééé, to rozhodně nemusíš. Stačí nějakým odhadem vydedukovat.. Někdy samozřejmě nemůžeš vědět a prostě si tipneš - radši více než méně, ale zrovna u názvů aut si to zjistit dokážeš.  Určitě máš nějaké pole s názvy aut, stačí se porozhlédnout po nejdelším názvu, mě třeba až na druhý pohled přišel největší tento: "Luggage Trailer A", což má 17 znaků. Dejme tomu, že jsem nenašel ten největší tak si dám rezervu třeba 25 nebo 30. Tady vidíš, že jsi zrovna ušetřil zbytečných 100 znaků. U spousty věcí máš třeba už velikost pevně danou (zde). Například jméno hráče může nabýt maximálně 24 znaků, ale dává se jich 25 pro nulový znak (konečný znak - EOS). Takže třeba zde by bylo úplně zbytečně dělat pole znaků na jméno o velikosti 128 znaků... a divil by ses kolik lidí to dělá.

     

    Samozřejmě s dnešní technikou už je to celkem zanedbatelný, když tvůj server nepoběží na bramboře.... ale není špatný se snažit pamětí šetřit.. pokud jednou budeš programovat, taky po tobě bude požadováno, aby tvůj program byl co nejúčinnější, ale zároveň nesebral spoustu výkonu (=optimalizovaný). Takže rozhodně není na škodu se naučit šetřit :d 

    Dobře, díky za vysvětlení. A teď zpět k tomu problému. Netuším, proč, ale mám to takto:

     

    new slot1[128], slot2[128], allslots[128];
    if(personalvehicle[playerid][0] != 0)
    {
    	format(slot1, sizeof(slot1), "%s", vehName[personalvehicle[playerid][0]]);
    }
    else
    {
    	format(slot1, sizeof(slot1), "Prázdný slot 1");
    }
    						
    if(personalvehicle[playerid][1] != 0)
    {
    	format(slot2, sizeof(slot2), "%s", vehName[personalvehicle[playerid][1]]);
    }
    else
    {
    	format(slot2, sizeof(slot2), "Prázdný slot 2");
    }
    format(allslots, sizeof(allslots), "%s\n%s", slot1, slot2);
    ShowPlayerDialog(playerid, D_PERSONALVEHICLES, DIALOG_STYLE_LIST, "Osobní vozidla", allslots, "Potvrdit", "Zpět");

    A dialog to vůbec nezobrazí...

     

    EDIT: Zapomněl jsem odečíst 400

  4. před 28 minutami, GaRGoyLeS said:
    
    
     
    
    new result[128];
    strcat(result, slot1, sizeof(result));
    strcat(result, "\n", sizeof(result));
    strcat(result, slot2, sizeof(result));
    //v proměnné result teď budeš mít výsledný string

    Nebo můžeš využít zkrácenější zápis a to přes fci format()

    
    format(result, sizeof(result), "%s\n%s", slot1, slot2);

    Více specikátorů máš zde:

    http://wiki.sa-mp.com/wiki/Format

    Dej si pozor na velikosti stringů... Máš dva o velikost 128 znaků a snažíš se je spojit též do stringu o 128 znacích. Chápu asi, že této velikost nenabývají, ale je zbytečné rezervovat tolik znaků, když je nepotřebuješ.. :/

    Super :) A zeptám se všeobecně. Když je 128 moc, jak mám vědět, kolik nastavit? To mám jít a počítat znak po znaku? (bez sarkasmu, ironie a špatného mínění)

     

    EDIT: Nevím, co je špatně, ale dialog se vůbec nezobrazí...

  5. Zdravím ve spolek, mám tento kód:

     

    new slot1[128], slot2[128], allslots[128];
    if(personalvehicle[playerid][0] != 0)
    {
    	format(slot1, sizeof(slot1), "%s", vehName[personalvehicle[playerid][0]]);
    }
    else
    {
    	format(slot1, sizeof(slot1), "Prázdný slot 1");
    }
    						
    if(personalvehicle[playerid][1] != 0)
    {
    	format(slot2, sizeof(slot2), "%s", vehName[personalvehicle[playerid][1]]);
    }
    else
    {
    	format(slot2, sizeof(slot2), "Prázdný slot 2");
    }

    A potřeboval bych tyto dva stringy sečíst do jednoho. Nějak takto:

    new result[128];
    result = slot1."\n".slot2;
    ShowPlayerDialog(playerid, 0, "Menu", result, "Potvrdit", "");

    Jsem zvyklý z PHP, ale v pawnu nevím, jak to bude. Našel jsem, že by to mělo být fcí strcat, ale nejde mi to. Díky předem za pomoc :)

  6. před 10 minutami, RmT_Kjuba said:

    Tak aspoň sis to sám vyřešil :d to se stává často že nato člověk přijde až když s tím chce pomoct :d Jeden den do toho koukáš a pak nato druhý den koukneš a hned vidíš chybu :d aspoň že sem ti dal vodítko kde je chyba :)

    Jo, díky :-)

     

    Podělím se teda ještě o řešení, snad dává smysl :)

    public OnPlayerSpawn(playerid)
    {
        ...
    
    	if(spawned[playerid] == false)
    	{
    		...
    		spawned[playerid] = true;
    	}
    
    	if(isskinset[playerid] == false)
    	{
    		skin[playerid] = GetPlayerSkin(playerid);
    		isskinset[playerid] = true;
    	}
    	else
    	{
    		SetPlayerSkin(playerid, skin[playerid]);
    	}
    	return 1;
    }

     

  7. před 9 hodinami, RmT_Kjuba said:

    Ukaž ukládání proměnné skin[playerid] a public OnPlayerSpawn

    Už to funguje, jsem vůl. Až jak jsi napsal, ať pošlu OnPlayerSpawn, tak jsem se na něj ještě jednou podíval. Ale když už jsem tu začal, tak vysvětlím, o co šlo.

     

    Registrace:

    DOF2_SetBool(file, "isskinset", false);
    DOF2_SetInt(file, "skin", 0);

    Ukládání:

    DOF2_SetBool(file, "isskinset", isskinset[playerid]);
    DOF2_SetInt(file, "skin", GetPlayerSkin(playerid));

    Načítání:

    isskinset[playerid] = DOF2_GetBool(file, "isskinset");
    skin[playerid] = DOF2_GetInt(file, "skin");

    OnPlayerSpawn:

    public OnPlayerSpawn(playerid)
    {
    	//různy fce
        
        if(spawned[playerid] == false)
        {
        	//Vše, co hci, aby se stalo jen po prvním spawnu
            spawned[playerid] = true;
            
            //A pak jsem tady měl další podmínku
            if(isskinset[playerid] == false) //aby to poprvé nenačetlo skin, když je tam 0 po registraci
            {
            	isskinset[playerid] = true;
            }
            else
            {
            	SetPlayerSkin(playerid, skin[playerid]);
            }
        }
        return 1;
    }

    No jenže pak mi došlo, že je to celé vložené v té podmínce if(spawned..., takže se to splní jen poprvé, respektive nikdy...

  8. Zdravím, tak jsem tu zase a dost zoufalý. Když zapnu server a poprvé přijdu na server, tak po spawnutí crashne hra. Jakmile přijdu znovu  a server zůstane zapnutý, po spawnutí normálně hraju a žádný crash. Absolutně to nechápu. Kdyby to crashovalo pořád, tak je asi chyba v módu, ale takhle?

     

    Crash message:

     

    SA-MP 0.3.7-R2
    Exception At Address: 0x005E5815
    Base: 0x06A70000
    
    Registers:
    EAX: 0x00000000	EBX: 0x47C34F00	ECX: 0x00000000	EDX: 0x00003F80
    ESI: 0x10BC6B60	EDI: 0x06100000	EBP: 0x00000100	ESP: 0x0177FC40
    EFLAGS: 0x00210246
    
    Stack:
    +0000: 0x14EF8F70   0x06100000   0x10BC6B60   0x47C34F00
    +0010: 0x00000000   0x00000000   0x00000000   0x00000001
    +0020: 0x00000000   0x00000000   0x6DB3C00B   0x307C13D6
    +0030: 0x3037C782   0x3FEFFADB   0x10BC6B60   0x00829B97
    +0040: 0xE0000000   0x3FEFFB19   0xE0000000   0x3FF0CCCC
    +0050: 0x00000100   0x0177FD7C   0x0083D978   0xFFFFFFFF
    +0060: 0x005E92CD   0x00001091   0x10BC6B60   0x0177FD8C
    +0070: 0x00000000   0x06101000   0x06B0ACB3   0x0177FCC0
    +0080: 0xBF3C08A9   0x0060EB2B   0x0060EB72   0x10B9A460
    +0090: 0x10BC6B60   0x0177FD8C   0x00000000   0x0177FD28
    +00A0: 0x00000000   0x00000000   0x3F800000   0x10BC6B60
    +00B0: 0x44FD6258   0xC4B1AC30   0x418A2D5D   0x10BC6B60
    +00C0: 0x071E3DA0   0x0177FD7C   0x06B3E8EB   0xFFFFFFFF
    +00D0: 0x06B0E0B0   0x10B9A460   0x10BC6B60   0x0177FD8C
    +00E0: 0x0177FD34   0x00000800   0x082000A1   0x10BC6B60
    +00F0: 0x0086D168   0x00568642   0x00000001   0xAE030D00
    +0100: 0x00000099   0x0053C09A   0x0000001A   0xFFFFFFFF
    +0110: 0x00000000   0x27FC62DE   0x06AD4506   0xFFFFFFFF
    +0120: 0x06B0DBDE   0x0000001A   0xAE028AD0   0x00000000
    +0130: 0x16494B80   0x0177FD64   0x0177F604   0x0177FF70
    +0140: 0x06B25F34   0x06B4A688   0x00000002   0x7541DEE0
    +0150: 0x0053E986   0x00000001   0x00000000   0x00000001
    +0160: 0x0053ECC2   0x00000001   0x00619B71   0x0000001A
    +0170: 0x00000001   0x00000001   0x0000000A   0x00748DA0
    +0180: 0x0000001A   0x00000001   0x74AF4FB0   0x00000000
    +0190: 0x0177FF80   0x002EC000   0x01828CBE   0x4F2E0277
    +01A0: 0x073F0330   0x00000008   0x00000100   0x00000008
    +01B0: 0x00000102   0x43C80000   0x43960000   0x00000000
    +01C0: 0x00000000   0x00000320   0x00000258   0x00000000
    +01D0: 0x00000001   0x0010017C   0x00000200   0x00000000
    +01E0: 0x012C0190   0x000B6183   0x00000190   0x0000012C
    +01F0: 0x0000002C   0x7451A8BF   0x00825EA4   0x0177FF70
    +0200: 0x00825EA4   0x00000000   0x002EC000   0x00821D17
    +0210: 0x00821D27   0xE195367C   0x0177FF80   0x008246F1
    +0220: 0x00400000   0x00000000   0x03C76DEB   0x0000000A
    +0230: 0x00000094   0x00000004   0x0000000A   0x040A08AE
    +0240: 0x00000001   0x00000000   0x00000000   0x00000000
    +0250: 0x00000000   0x00000000   0x00000000   0x00000000
    +0260: 0x00000000   0x00000000   0x00000000   0x00000000
    +0270: 0x00000000   0x00000000   0x00000000   0x00000000
    
    SCM Op: 0x77E, lDbg: 0 LastRendObj: 1226
    
    Game Version: US 1.0
    
    State Information: Ped Context: 0

    Zachrání mě někdo prosím? Díky

     

    EDIT: Zakomentoval jsem vše v OnPlayerSpawn a hra necrashuje. Takže beru zpět a přece jen je asi chyba v módu...

    EDIT2: Tak jo, už vím, jak to je. Při přihlášení si načítám skin z proměnné a v OnPlayerSpawn mám:

    SetPlayerSkin(playerid, skin[playerid]);

    Takže na začátku si vyberu třeba CJe ID 0 a po spawnu se mi načte například holka ID 193. Problém je v tom, že po smrti se mi načte zpět skin, který jsem si vybral na začátku, tedy CJ ID 0. Zajímavost na tom je ta, že když mi to vrátí toho CJe a nechám si vypsat aktuální skin, tak mám 193. Z toho plyne, že je to jako kdyby nějaký bug ve vykreslení nebo co. No a tak jsem na prasáka do OnPlayerSpawn dal:

    SetPlayerSkin(plaayerid, GetPlayerSkin(playerid));

    Abych si jakože jenom zaktualizoval postavu. A to mi crashuje hru... Netuším, jak z toho ven...

  9. před 14 minutami, bigw3b. said:
    
    new int[4];
    for(new i = 0; i < count; i++) int[i] = strval(out[i]);
    new total = (int[0]*86400) + (int[1]*3600) + (int[2]*60) + int[3]); 

     

    Na konci závorka navíc, ale jinak bez errors. Díky :)

    EDIT: Už to šlape, jak má :)

  10. před 4 minutami, Tanga said:

    ignorujme chybu čo ti to teraz vypisuje..
    Máš v cykle strval(out), ale nikde tú hodnotu neukladáš.
    Asi skôr do cyklu total += strval(out);

    Asi je to nesmysl tak, jak jsem to napsal. Jde o to, že to out je string a já to celé potřebuji přetypovat na integer :-) A potom jednotlivé hodnoty na indexech 0-3 sečíst.

  11. Moc nechápu dotaz. Jede to normálně po sobě. Např:

     

    new id[3];
    new getnick[MAX_PLAYER_NAME], nick[16];
    GetPlayerName(playerid, getnick, sizeof(getnick));
    format(id, sizeof(id), "Tvoje id je: %i", playerid);
    SendClientMessage(playerid, C_WHITE, id); //Vypíše ID
    format(nick, sizeof(nick), "Tvůj nick je: %s", getnick);
    SendClientMessage(playerid, C_WHITE, nick); //Vypíše nick

     

  12. před 13 minutami, MajorGames4 said:
      Opětovně skrýt obsah

    C:\Users\NIC\Desktop\multiFS.pwn(80) : warning 217: loose indentation
    C:\Users\NIC\Desktop\multiFS.pwn(91) : warning 202: number of arguments does not match definition
    C:\Users\NIC\Desktop\multiFS.pwn(91) : warning 202: number of arguments does not match definition
    C:\Users\NIC\Desktop\multiFS.pwn(93) : warning 217: loose indentation
    C:\Users\NIC\Desktop\multiFS.pwn(111) : error 010: invalid function or declaration
    C:\Users\NIC\Desktop\multiFS.pwn(111) : error 029: invalid expression, assumed zero
    C:\Users\NIC\Desktop\multiFS.pwn(113) : error 010: invalid function or declaration
    C:\Users\NIC\Desktop\multiFS.pwn(155) : error 002: only a single statement (or expression) can follow each "case"
    C:\Users\NIC\Desktop\multiFS.pwn(155) : warning 215: expression has no effect
    C:\Users\NIC\Desktop\multiFS.pwn(155) : error 001: expected token: ";", but found "return"
    C:\Users\NIC\Desktop\multiFS.pwn(156) : warning 225: unreachable code
    C:\Users\NIC\Desktop\multiFS.pwn(160) : warning 209: function "OnDialogResponse" should return a value
    C:\Users\NIC\Desktop\multiFS.pwn(161) : error 010: invalid function or declaration

     

    A jak máme vědět, že řádek 80 je zrovna ten a ten a 91 ten atd.? 

  13. Zkusil jsem s tím pracovat dál nějak takto:

     

    new out[4][4], count;
    count = strexplode(out, inputtext, " ");
    for(new i = 0; i < count; i++) strval(out[i]);
    new total = (out[0]*86400) + (out[1]*3600) + (out[2]*60) + out[3]);
    
    if(total > promenna) Tvuj aktualni cas je mensi nez zadany...

    A errrors:

     

    error 033: array must be indexed (variable "out")
    error 029: invalid expression, assumed zero
    warning 215: expression has no effect

    Předpokládám, že ta proměnná total musí být také pole. Asi?

  14. On 8. 2. 2018 at 20:45, ATomas said:
    
    new pass[MAX_PLAYERS];
    pass[playerid] = inputtext;

    Tato kontrukce je sice myslena dobře, ovšem lze použít jen u pole, kde je při kompilaci známá veikost. Což není tento případ.

    Doporučuji použít

    
    pass[playerid][0] = 0;//Pokud vis ze to bude prazdne, neni treba pouzit
    strcat(pass[playerid],inputtext);

     

    Super, díky :)

  15. Zdravím, existuje v pawn stejná funkce jako explode(); v PHP?

     

    Mám dialog (viz příloha) a potřeboval bych dle mezer vyexplodovat do pole:

     

    new pole[128] = explode(" ", inputtext);
    strval(pole[0]);
    strval(pole[1]);
    strval(pole[2]);
    strval(pole[3]);

    Nějak tak, abych s těmi čísly mohl pracovat dál. Jak na to? Díky předem za pomoc.

    sa-mp-000.png

  16. Zdravím, potřeboval bych poradit. Mám tento kód v OnDialogResponse:

     

    new test[128];
    format(test, sizeof(test), "Heslo: %s", inputtext);
    SendClientMessage(playerid, C_RED, test);

     Všechno funguje v pořádku, to heslo mi to vypíše. Já si to heslo potřebuji uložit, abych s ním mohl pracovat dál mimo funkci, takže mám něco jako:

     

    new pass[MAX_PLAYERS];
    pass[playerid] = inputtext;

    To mi ale hází, že to musí být pole.

    error 006: must be assigned to an array

    Dokázal by mi někdo poradit? Díky :)

     

     

  17. 5 minutes ago, Ewwe said:
    
    DOF2_CreateFile má jako druhý parametr heslo a mám pocit že používá klasický udb hash v základu ale lze to přepnou na bernstaina záleží kde jsi ten includ stáhl 

    Podle toho includu by to mělo být:

    DOF2::num_hash(password)

    Je to možné?

     

    EDIT: Include mám odtud

  18. Zdravím, po dlouhé době se vracím k pawnu a zjistil jsem, že je plno nových funkcí a možností. Narazil jsem na DOF2 systém.

     

    Když vytvořím soubor

    DOF2_CreateFile("soubor.txt", "mojeheslo");

    Tak to uloží něco jako:

    password = 218956422

    O jaký systém hashování se jedná? Když si to vytáhnu pomocí:

    DOF2_GetInt("soubor.txt", "password");

     Tak to pak porovnám se zadaným stringem. Jak zadaný string zahashovat, aby to sedělo s tím, který je v souboru? Děkuji předem za pomoc :)

  19.  

    Je to funkce, public ti akorát určuje, že je to funkce veřejná. To jen pro upřesnění (má to své vlastnosti, ale o tom jindy).

     

    Teď k tomu tvému returnu. Jak řekl HighPrint, návratovou hodnotu to mít nemusí (je to funkce ꜛ), je to jen čistě na tobě. Nativní SA:MP publicy/callbacky (říkej si tomu, jak chceš) mohou mít u konkrétního returnu specifickou funkci. U tebou definovaných to ale záleží jen na tobě, na tom, jak to budeš používat. Klidně nám ukaž příklad, kde to potřebuješ vědět, my ti řekneme. :) Každopádně tohle všechno bude fungovat a nehodí ti to chybu:

    forward Neco();
    
    public Neco() //verze bez returnu
    {
        print("Bla bla.");
    }
    
    public Neco() //verze s returnem, ale bez návratové hodnoty
    {
        print("Bla bla.");
        return;
    }
    
    public Neco() //verze s returnem i návratovou hodnotou
    {
        print("Bla bla.");
        return 1;
    }
    

     

    Jo, pravda je to funkce :d

     

    A ten příklad třeba:

    public UkazPenize()
    {
    	for(new all; all < MAX_PLAYERS; all++){
    		if(IsPlayerConnected(all)){
    			SetPlayerScore(all, GetPlayerMoney(all));
    		}
    	}
    }
  20. return je jenom návratová hodnota. Teoreticky když vytváříš funkce tak nemusíš mít u žádných. Většina callbacků ale v SAMP má význam v návratové hodnotě (např OnPlayerCommandText). Ve většině případů je 1 jako success a 0 jako fail. Jedná se v podstatě o výsledek té funkce.

     

    Neptám se na funkce, ale na publicy a každý public daný od SA-MP má return 1 popřípadě 0, tak proto se ptám, jestli i můj vytvořený public musí mít return a kdy.

  21. Zdravím, chtěl bych objasnit jednu věc. Když si vytvořím libovolný public - Kdy v něm dát return 1; a kdy ne?

     

    Vždycky jsem měl za to, že pokud je obsah publicu vyvolán SetTimerem, tak tam return být nemá a pokud je zavolán třeba v příkazu, tak tam return patří.

     

    Koukám na nějaké návody a všímám si, že je to asi obráceně, než jsem si celou dobu myslel :d Tak jak to tedy je? Díky moc za objasnění :)

×
×
  • Create New...