Jump to content

Scydo

Obsahový guru
  • Příspěvků

    872
  • Registrován

  • Aktivní

  • Vítězných dnů

    83

Příspěvky posted by Scydo

  1. On 20. 4. 2020 at 0:51, ffredyk said:

    chtěl bych poznat i vaše nápady a návrhy, ohledně změn na tomto projektu.

    Úžas v PAWN byl právě, protože byl celkem prostý, jednoduchý na naučení ale především výsledek programátor VIDĚL! Chtěl magorské auto, co mění barvu každou milisekundou, bum měl a viděl. Chtěl si vytvořit vozidlo, které střílí objekty v podobě raket, bum udělal a viděl. Ne jako programátoři C++ nebo Pythonu, kdy bouchali do klávesnice, rudý vzteky a častým nepochopením proč to (ne)funguje a po tom všem, výsledkem je 5 slov a 4 operace v konzoli :d
     

    Takže, za mě, nápad se zaměřit na jazyky, které mají "vizuální výsledky" jako je PAWN (i když koukám, že víceméně stejný nápad už padl v podobě Unity nebo UE :) )

    • Nope 1
    • Líbí se mi to! (+1) 1
  2. Díky a našel by jsi nějaký trik aby se nemuselo vše psát do jednoho dlouhého řádku? Protože se to přepíše, když dám dva pod sebe.

    format(data, sizeof size, "Admin Level : %s\nBanka : %i\nCash : %i", 
    	Admin[playerid], Banka[playerid], GetPlayerMoney(playerid));
  3.  

    else if(strcmp(INI_String(File, "Password"), udb_hash(inputtext),false)) return ShowPlayerDialog(playerid,Dialog_Info2,DIALOG_STYLE_INPUT,"Zmena Hesla","{ff0000}Špatné heslo ! {ffffff}Zadej své staré heslo:","Dále","Cancel");
    

     

    I kdybys dokázal dosadit správně všechny arg. tak ti to nepůjde, protože y_ini nedokáže načítat údaje jen tak mimo bez základně důležitých parametrů, z callbacku, name[] a value[]. Buď načítej údaje pomocí 2 načítacích callbacků(1.[zda samozřejmě existuje soubor] po připojení, co bude obsahovat potřebné údaje, a 2. který po zadaní hesla donačte zbytek údajů. Takže, dokud nezadá heslo, nic důležitého se nenačte), nebo to načti pomocí jednoho všechno, a bez zadání správného přihlašovacího hesla ho vyhazovat.

  4. Je vidět, že kdokoliv dělal na tomhle HS, tak znalosti YSI má extrémně malé. Kromě teoretických chyb(navíc závorka, chybějící středník), je tam využití knihovny srovnatelné asi s použitím návratových hodnot...

    (plus hádám, že autor to načítá z alternativní cesty. Lepší je to načítat z přímé, tak kdybys neměl...)

    #include <YSI_Storage\y_ini>
    #include <YSI_Data\y_iterate>
    +

    #include <sprintf>
    Jestli ti můžu něco doporučit, tak můj ověřený způsob s tagy a iterátory(funkční ovšem) a k tomu sprintf(). Pokud budeš dělat desítky souboru a cyklovat je, tak stačí drobná chyba v zápisu a celý systém se ti začne hroutit.

    Navíc je to mnohem jednodušší. Takže, začneš přidáním iterátoru pro své domy. Tak můžeš rovnou cyklit domy a ne vlastní cykly a proměnné(makro na maximum domů můžeš zachovat) : 

    new Interator: Houses<MAX_HOUSES>;
    Taky nezapomeň a další proměnné(informace) o domě jako pozice, jméno majitele, cena apod.

     

    Pak samozřejmě vyčistíme iterátor. Nechceme, aby nám tam lítali nežádoucí informace:

     

    public 
    OnFilterScriptExit() {
    Iter_Clear(Houses);
    Teď přichází ta dokonalost icon_e_biggrin.gif. Stačí jenom nalézt volný iterátor a začlenit do něj náš další dům. Číslo nalezeného volného iterátoru můžeš použít i jako id domu!

     

     

    new
    house_id = Iter_Free(Houses);
    Iter_Add(Houses, Iter_Free(Houses));
    protože máš id volného baráku, můžeš mu rovnou přiřazovat údaje jaké jméno majitele, cena apod.

     

    PS: jestli chceš zjistit počet přidaných domů, nemusíš nic cyklit, deklarovat proměnnou, nic takového, stačí jenom zjistit počet vložených interátorů:

    if (Iter_Count(Houses) == MAX_HOUSES) ...
    Vybereš si nějaký(jeden), kam budeš všechno ukládat:

    new
    INI:Soubor = INI_Open("Baraky.sav");
    A nakonec ukládání údajů. K tomu ještě použiješ tag. Tag ti zajistí, aby se všechny údaje ukládali pod daný barák do seznamu. A abys ses nezdržoval s formátováním, použiješ sprintf(je to i nakonec kratší):

    INI_SetTag(Soubor, sprintf("House%i", house_id));
    INI_WriteString(Soubor, ...);
    INI_WriteInt(Soubor, ...);
    INI_WriteString(Soubor, ...);
    INI_WriteInt(Soubor, ...);
    INI_WriteInt(Soubor, ...);
    INI_WriteInt(Soubor, ...);
    INI_Close(Soubor);
    Načítání není o nic těžší. Stačí při načítání všech údaju přidat i načítání tagů. V samotném callbacku pak při načítání hledat jejich tag nejdříve. To stačí hledat jenom slovo House a číslo. Poté přidávat i dané iterátory(protože to jsou jejich id):

    Zjištěný id pak můžeš používat i rovnou do proměnných.

     

    INI_ParseFile("Baraky.sav" , "NahratData", .bPassTag = true);
    
    public NahratData(tag[], name[], value[]) {
    
    	new
    		sstr[14];
     	strmid(sstr, tag, 5, strlen(tag));
    	new 
    		i = strval(sstr);
    	INI_String(...);
    	INI_Int(...);
    	INI_String(...);
    	Iter_Add(Admins, i);
    	INI_Int(...)
    	return (false);
     }
    POZOR Nepřidávat iterátor jako poslední. Návr. hodnoty načítání ti to znemoží
  5. Prakticky každý se to učí jinak. Někdo tu sázel jeden help za druhým, někdo zase se jenom zeptal v chatě a ihned věděl(i když tam viděl jenom nepatrný rozdíl a myslel si, že je to zcela něco jiného)... Tudíž je nejlepší si najít takový způsob, co ti vyhovuje a držet se ho.

    Například já postupoval style, že když jsem nevěděl co dělá jaká fce, dopsal jsem jí v prohlížeči za odkaz http://wiki.sa-mp.com/wiki/, a když měl problémem s chybou, tak jsem jí zkopíroval, napsal do Google a díval se, jak něco podobného řeší jiní...

    Nejvíc se na tom podepíše ten zájem. Pokud se ho chceš naučit a tvořit s ním, určitě radši prozkoumáš všechno, co to umí a dokáže, popřípadě si vyslechneš jakoukoliv pomoc, než, kdybys ses učil pouze to, co potřebuješ, abys měl to samé, co vidíš na nějakém cizím serveru a zalíbilo se ti to.

  6.  

    public OnPlayerCommandText(playerid,cmdtext[])
    {
        if(!strcmp(cmdtext, "/stuntpark", true))
        {
            SetPlayerPos(playerid, 2452.7988,16.5131,3.1842);
            return 1;
            SendClientMessage(playerid, FIALOVA, "{FFFFFF} Byl jsi {FF0000}Teleportován{FFFFFF} na {00FF00}StuntPark {FFFFFF}by {00FFFFF}.db[G].{FFFFFF} | Pro port na {FF0000}Tunely {FFFFFF}+ {FF0000}Parkour {FFFFFF}dej {00FF00}/tunely{FFFFFF}.");
        }
        return 0;
    }

     

    Problém je, že vracíš a po té máš další fce. Jakmile vrátíš následné fce se nevykonají.

    	if (!strcmp("/stuntpark", cmdtext)) {
    
    		SetPlayerPos(playerid, 2452.7988, 16.5131, 3.1842);
    		SendClientMessage(playerid, FIALOVA, "{FFFFFF} Byl jsi {FF0000}Teleportován{FFFFFF} na {00FF00}StuntPark {FFFFFF}by {00FFFFF}.db[G].{FFFFFF}");
    		SendClientMessageToAll(FIALOVA, "| Pro port na {FF0000}Tunely {FFFFFF}+ {FF0000}Parkour {FFFFFF}dej {00FF00}/tunely{FFFFFF}.");		
    		return 1;
    	}
    A pokud jde o text s jménem hráče, tak stačí ten jeho nick zjistit a formátovat text. Buď si na to můžeš vytvořit tu fci PlayerName(), abys to při dalších použitích měl jednodušší, nebo to zjišťovat lokálně:

     

    		if (!strcmp("/stuntpark", cmdtext)) {
    
    		new 
    			String[72 + 1],
    			Name[MAX_PLAYER_NAME + 1];
    		GetPlayerName(playerid, Name, sizeof Name);
    		format(String, sizeof String, "Hráč %s se odwarpoval na StuntPark by .db[G].", Name);
    		SetPlayerPos(playerid, 2452.7988, 16.5131, 3.1842) , SendClientMessageToAll(FIALOVA, String);
    		return 1;
    	}
  7. Je to uživatelský error, to znamená, že někdo ti tam hodil

    #error
    v případě, že například uděláš někde chybu. Podívej se, kde to makro s tímhle upozorněním je. Třeba tam budou poznámky. Nebo přijdeš na způsob, kde je přesně chyba.
  8. Přeji příjemnou nudu:

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  9. Popis problému:

     

    Mám spravené /createvehicle,čo vytvorí auto,potom mám /destroycars,čo tie všetky autá zničí,ale chcel som poradiť ako mám spraviť príkaz,aby zničili len jedno auto to čo bolo posledné vytvorené.

    To, že to přetáhneš z eXisu a trošku předěláš, si moc nepomůžeš... Máš 2 nejlepší možnosti. Za 1. pokud chceš vždycky u každého admina nechat, aby mohl vytvořit pouze jedno auto, tak to je snadné, prostě uložíš do proměnné id vozidla. Pokud chceš ale nějakou řadu, kdy vytváříš postupně auta, a pak je po zpátku ničíš, tak to je nejlepší si udělat pole, zkusit cyklus z konce a vracet se s tím, že kontroluješ, zda dané auto vytvořil(či existuje) a prostě ho zničit.

    • Líbí se mi to! (+1) 1
×
×
  • Create New...