Jump to content

Quiter

Uživatel
  • Příspěvků

    827
  • Registrován

  • Aktivní

  • Vítězných dnů

    32

Příspěvky posted by Quiter

  1. To vážne nevidíš, že je to stále dokola jeden a ten istý error? Aj HIP ti to už písal... stále dokola a dokola a dokola ten istý error... Takže logicky použi stále dokola a dokola a dokola tú istú opravu...

     

    Prejdi si prosím ťa základy... Nechápem, načo chceš používať sofistikované (také čo potrebujú hlavu) knižnice, keď ti chýbajú základy.

  2. Tak inak,

     

    C:\Program Files\Rockstar Games\GTA San Andreas\SAMP\pawno\include\amx_assembly\dynamic_call.inc(42) : fatal error 100: cannot read from file: "opcode"
    Citace

    pawno\include\amx_assembly\dynamic_call.inc(42)

    toto je súbor a riadok v ktorom je chyba, otvor si ten súbor, nájdi daný riadok a zisti, akym spôsobom je includnuty "opcode"

    Citace

    cannot read from file: "opcode"

    na toto nepotrebuješ vysoký level angličtiny :D

     

    #inlcude <opcode> // opcode je v zlozke "pawno/includes"
    #include <zlozka5/opcode> // opcode je v zlozke "pawno/includes/zlozka5"
    #include "./includes/zlozka42/opcode" // opcode je v zlozke "pawno/includes/zlozka42" - resp. zacina tam, kde spustas compilator (defaultne zlozka pawno)

     

  3. Citace

     když se restartuje server automaticky od hostingu

     

    Ťažko povedať či sa vtedy vôbec vykonáva OnGameModeExit - na wiki je písané že v prípade crashu sa to nevykonáva.

     

    Čo keby si na to skúsil ísť z opačného konca? Ak je problém iba to, že to hráča nekickne pri REŠTARTE servera, tak ho kickni po jeho spustení :D poznač si čas zapnutia servera (ongamemodeinit) a porovnávaj pri pripojení hráča. Ak sa hráč pripojí napr. 1 minutu (alebo skôr) od spustenia GM, tak ho kickni a napíš mu aby sa pripojil znova napr. za minútu...

     

    Nie je to síce ideálne riešenie, ale ani tvoj problém nie je normálny - stále si myslím že máš v GTA nainštalované nejaké módy ktoré to spôsobujú.

    • Líbí se mi to! (+1) 1
  4. Predpokladám, že celý problém je v synchronizácií - ty zavoláš Kick, a kým tá informácia dorazí ku klientovi (hráčovi), tak server je už offline - ale možno sa mýlim.

     

    Ako už bolo spomenuté, sprav si vlastný príkaz na reštart serveru:

    for (all players) Kick(playerid);
    SendRconCommand("gmx"); // ešte lepšie je dať toto do timeru napr. na 1 sekundu

     

    Citace
    • This function can also be used in a filterscript to detect if the gamemode changes with RCON commands like changemode or gmx, as changing the gamemode does not reload a filterscript.

    Zdroj

    Nemáš ten príkaz "kill" v nejakom FS? možno to spôsobuje problémy

     

    Posledné čo mi napadá je parkour mod :D viem že ten dosť často spôsoboval to, že ti nechal 0 HP ale nezabil ťa...

  5. Neviem či úplne chápem čo chceš, ale čo keby si každému bodu priradil "prioritu" a následne túto prioritu znižoval ak v jej okolí pribudol nový hráč?

     

    Príklad: 5 x 5

    001 001 001 001 001			003 003 003 002 001			003 003 003 002 001
    001 001 001 001 001			003 100 003 002 001			003 100 003 002 001
    001 001 001 001 001			003 003 003 002 001			004 004 004 002 001
    001 001 001 001 001			002 002 002 002 001			003 004 004 004 002
    001 001 001 001 001			001 001 001 001 001			002 003 100 003 002

    Najprv majú všetky maximálnu prioritu

    Potom vygenerujem pozíciu 1, 1 (začínam 0, 0) a všetkym okolo znížim prioritu o 2 a tým vedľa nich o 1.

    Potom vygenerujem pozíciu 4, 2 a opäť znížim prioritu. Prvku ktorý vygenerujem nastavím úplne najnižšiu prioritu aby mal prakticky 0 šancu že sa opäť vyskytne.

     

    Vo výsledku to pre teba znamená, že pred generovaním náhodnej pozície si musíš vypočítať súčet priorít (ideálne ako "1 / priorita"), vygenerovať číslo z tohto rozsahu a potom nájsť ktorá pozícia patrí vygenerovanej hodnote.

     

    Takže vo výsledku by to mohlo robiť to čo chceš, ale je za tým dosť réžie.

  6. Musíš čítať celú radu ktorú ti dal DuFF

    Aby si nemusel otvárať súbor s topkami pri každom porovnaní, je dobré držať si jeho kópiu v pamäti.

    Keď to spravíš tak ti stačí len pri vypnutí a zapnutí servera riešiť súbor (alebo v nejakom intervale, povedzme 24 hod).

     

    K tvojmu problému - samozrejme že hodnota je iná, keďže ty tú hodnotu prepisuješ len keď sa hráč odpojí. Tj. ja sa odpojím, uloží sa hodnota 54, následne sa pripojím a nazbieram ďalších 36, takže mám 90. V tom príde TOP ktorý vypíše že mám najviac 54 pretože táto hodnota je zapísaná v súbore pretože som sa ešte neodpojil. Chápeš?

     

    Riešenie: pred vypísaním hodnoty prebehni v cykle všetkých hráčov a skontroluj či daný hráč nemá viac ako maximum zapísané v súbore (po novom v pamäti), ak má viac, aktualizuj si premenne TopsName a TopsHodnoty ;)

  7. Jednoducho

    #include "utils/GivePlayerMoneyEx.pwn" // tu mozes dat aj viac uzitocnych funkcii, nie len 1
    #include "feature/Duels.pwn"

    Proste das tu funkciu GivePlayerMoneyEx PRED include s duelmi

     

    A ak to ti bude stale davat neake errory tak ich sem napis spolu s kodom

    • Líbí se mi to! (+1) 1
  8. napríklad pri kóde nižšie ti chýba zátvorka pred "case 2:" (tj. neuzatváraš "case 1:") ale to nesúvisí s daným error - to ti len vytvára ďalší error :D

    					case 1:
                        {
                            new i[2222];
                            strcat(i, "{FFFFFF}Premium účet na 5 dnů {FF1493}$500.000\n");
                            strcat(i, "{FFFFFF}Premium účet na 30 dnů {FF1493}$2.000.000 {FFFF00}Sleva 20%\n");
                            strcat(i, "{FFFFFF}Premium účet na 60 dnů {FF1493}$4.000.000 {FFFF00}Sleva 15%\n");
                            strcat(i, "{FFFFFF}Premium účet na 90 dnů {FF1493}$6.000.000 {FFFF00}Sleva 15%\n");
                            strcat(i, "{FFFFFF}Premium účet na 180 dnů {FF1493}$15.000.000\n");
                            strcat(i, "{FFFFFF}Premium účet na 360 dnů {FF1493}$32.000.000");
                            ShowPlayerDialogEx(playerid, DIALOG_HPREMIUM, DIALOG_STYLE_LIST, "Premium účet", i, "Vybrat", "Zavřít");
                        case 2:
                        {

     

    Nakoľko tam už však takýto preklep máš, skontroluj si či sa ti to nestalo niekde vyššie (nad riadkom 29071) - ak ti tam chýba zátvorka, môže to spôsobiť že si mimo "switchu"

    Ak nevieš ako switch funguje, odporúčam si naštudovať https://www.open.mp/docs/scripting/language/Style https://en.wikipedia.org/wiki/Switch_statement

     

    Ďalšia vec, odnaučte sa tvoriť kód o dĺžke 30 000 riadkov... nikdy v živote sa to nebude dať nikde použiť a sám sa v tom stratíš (error máš na riadku 29071, ale chyba môže byť na riadku 28 456)

    Používaj #include a tvor menšie súbory, príklad nižšie

    // tvoj GM.pwn
    #include "./moj_uzasny_gm/user.pwn"
    #include "./moj_uzasny_gm/cars.pwn"
    #include "./moj_uzasny_gm/carsSpawn.pwn"
    #include "./moj_uzasny_gm/objects.pwn"
    #include "./moj_uzasny_gm/job.pwn"
    
    public OnGameModeInit() {
    	/* ... nejaky kod pred */
    	fillUserSkins(); // nachadza sa v subore user.pwn
    	fillCarSpawn(); // nachadza sa v subore carsSpawn.pwn
    	fillObjects(); // nachadza sa v subore objects.pwn
    	/* ... nejaky kod po */
    }
    
    public OnDialogResponse(...) {
    	carDialogs(... parametre); // nachadza sa v subore cars.pwn
    	jobDialogs(... parametre); // nachadza sa v subore job.pwn
    }
    
    // "moj_uzasny_gm/carsSpawn.pwn" - subor ktory obsahuje len spawnovanie aut
    stock fillCarSpawn() {
    	AddStaticVehicle(415, .....);
    	AddStaticVehicle(522, .....);
    	AddStaticVehicle(400, .....);
    	AddStaticVehicle(550, .....);
    	/* ... dalsich 4 500 riadkov */
    }
    
    // ".../cars.pwn" - subor obsahuje dialogy pre auta
    #include "./dalsia_zlozka/dalsiaCastKodu.pwn" // mozes rozbit na viac suborov kvoli prehladnosti
    
    stock carDialogs(...) {
    	switch (dialogid) {
    		case ...:
    			// tvoj kod
    		break;
    		case ...:
    			// tvoj kod
    		break;
    	}
    }

     

    A ver mi, ked to spravne rozdelis do suborov, bude sa ti kodit omnoho jednoduchsie. Len pozor na zavislosti - kazdy subor by si mal includovat prave raz

  9. XpresS ti radí dobre (aj s tou podmienkou na pretecenie nadrze), ale je to ešte 1 nelogická vec.

    ForMaxPlayer(i) // spustis cyklus pre vsetkych hracov (predpokladam podla nazvu)
    {
      Car_Gas[GetPlayerVehicleID(i)] = 50; // kazdemu hracovi co sedi vo vozidle nastavis palivo na 50, ale nijako nekontrolujes ci hrac naozaj sedi vo vozidle
      SPIB(playerid, "~w~Dotankoval jste si vozidlo", 5); // sebe vypises spravu, ale vypises ju za kazdeho pripojeneho hraca, takze napr. 150x
      new engine,lights,alarm,doors,bonnet,boot,objective;
      GetVehicleParamsEx(GetPlayerVehicleID(i),engine,lights,alarm,doors,bonnet,boot,objective);
      SetVehicleParamsEx(GetPlayerVehicleID(i),1,lights,alarm,doors,bonnet,boot,objective);
      PalivoCas[playerid] = 120;
    }

    Takze je otazka, ci chces dotankovat len svoje vozidlo (odstran ten cyklus), alebo vsetkym hracom. Ak vsetkym hracom, tak si rozmysli ci chces tu spravu poslat hracovi ktory zadal prikaz (presun spravu a nastavenie casu mimo cyklus) alebo hracom ktorym si natankoval (zmen playerid na i)

  10. Ak máš nejaký systém registrácie, tak najjednoduchšie je vytvoriť globalnu premennu

    new bool:receivedReward[MAX_PLAYERS];

    nasledne pri pripojeni

    receivedReward[playerid] = false;

    a v prihlaseni (nezabudni pri odpojeni ukladat!!)

    receivedReward[playerid] = tvoja_funkcia_na_nacitanie_udajov_o_ulozenom_hracovi_boolean(playerid, "receivedReward");

    a potom ked stlaci N pri tej npc

    // ak chces aby dostal odmenu a druhy krat zobrazilo dialog
    if (receivedReward[playerid]) {
    	// zobraz dialog pretoze uz dostal odmenu
    } else {
    	receivedReward[playerid] = true;
    	// daj mu odmenu
    }
    
    // ak chces aby dostal odmenu a sucastne sa otvoril dialog
    if (!receivedReward[playerid]) {
    	receivedReward[playerid] = true;
    	// daj odmenu
    }
    // zobraz dialog

     

    Pokial nemas ziaden registracny system, tak by som to riesil tiez pomocou mena hraca (GetPlayerName) a suboru.

    Vytvoris si premennu rovnako ako hore, nasledne pri pripojeni otvoris subor, precitas vsetkych hracov a zistis ci sa hrac nachadza v subore. Ak ano, nastavis premennu na true. Pri pripisani odmeny nezabudni zapisat meno do suboru.

    • Líbí se mi to! (+1) 1
  11. Pokiaľ nemáš počítač čo používa ešte dierne pásky tak by ti mala takmer akákoľvek graf. karta pasovať. Treba si len dávať pozor na výkon zdroju a napájanie graf. karty - niektore staršie zdroje nemajú konektor na napájanie ultra výkonných graf. kariet.

    • Líbí se mi to! (+1) 1
  12. Tak to môže mať mnoho príčin... Takým lowcost riešením je reinštalácia windowsu :) (obnovenie systému). Ďalšou príčinou môže byť poškodený hardware, napríklad disk, ram alebo iné. Takže pokiaľ nepomôže obnova systému tak by som odporúčal vymeniť disk / ram, prípadne podľa veku ntbku uvažovať nad kúpou nového. Samozrejme do výmeny HW choď len v prípade že nepomôže reinštalácia windowsu!

    • Děkuji (+1) 1
  13. Úprimne, myslím že máš problém s pochopením čo je pole :)

    Spoiler
    
    public TimeUp(playerid)
    {
    	h_sekundy ++;
    
    	if(h_sekundy==59)
    	{
    		h_sekundy = 0;
    		h_minuty ++;
    	}
    	if(h_minuty==23)
    	{
    		h_minuty = 0;
    	}

    Keď máš na servery 1 hráča, tak je všetko v poriadku (teda až na to, že namiesto 59 sekund sa zobrazí 0 a teda každá minúta je o sekundu kratšia), ale keď sa pripojí 2. hráč, tak sa spustí ešte 1 timer a zrazu ti beží čas 2x rýchlejšie (pri 50 hráčoch 50x rýchlejšie). To isté robíš aj na konci timera :)

    Pridaj sem pre istotu kód kde spúšťaš tento timer (SetTimerEx funkciu).

    Riešenie:
    1) buď spravíš h_sekundy a h_minuty ako new h_sekundy[MAX_PLAYERS], h_minuty[MAX_PLAYERS]; a incrementovať budeš h_sekundy[playerid]++;
    2) alebo z timera odstrániš "playerid", incrementáciu necháš tak ako je, a podmienky obalíš do cyklu pre všetkých aktívnych hráčov
    
    Výber je na tebe... V prvom riešení môže mať každý hráč rôzny čas (napr. ja budem mať 15:24 a ty 08:14). V druhom riešení majú všetci hráči rovnaký herný čas.

    No a teraz k problému ktorý si spomínal. Predpokladám že timer spúšťaš ako SetTimer a nie SetTimerEx - to ti namiesto playerid doplní 0 a teda všetko funguje až do bodu kedy ID 0 zmení svoje nastavenia :) Preto pridaj časť kódu kde používaš SetTimer / SetTimerEx

     

    Teraz tá druhá časť problému s pickupmi:

    Opäť problém s poliami

    Spoiler
    
    ForMaxPlayer(a)
    {
    	for(new i; i < MAX_PICKUP_EX; i ++)
        {
       		// bla bla bla
        }
        ShowPlayerDialog(bla bla bla); // tu je problém
    }
                                    
    Pomocou ForMaxPlayer(a) prejdes vsetkych hracov a potom pre kazdeho hraca prejdes vsetky pickupy, ale pred tym, ako skocis na dalsieho hraca tak sebe zobrazis dialog - a ak sa nemylim tak samp zobrazuje iba posledny dialog - takze tebe sa zobrazia len pickupy hráča ktorý má najvyššie ID

     

    Takže ako som povedal, v oboch prípadoch máš problém s poliami, odporúčam prejsť nejaký tutorial :)

  14. před 1 hodinou, jenkings said:

    Prostě jen v místě kde máš SendClientMessage to nahradíš za ShowPlayerDialog

    Mám dojem že toto stačiť nebude :) Je pravda že som dlho neriešil nič takéto, ale ak si dobre pamätám tak v prípade natívneho banu (funkcia Ban(playerid)) ťa server sám vyhodí skôr než stíhneš zavolať nejaký script :)

    Preto si treba vytvoriť vlastný systém pre BAN kde si zabanovaných hráčov, dôvod, čas, dokedy a kto ho zabanoval, zapíšeš do súboru. Potom pri pripojení hráča skontroluješ, či sa daný hráč/IP nachádza v tomto súbore a či prípadne nevypršal jeho ban. Ak sa tam nachádza a ban je aktívny, tak zobrazíš pekne naformátovaný ShowPlayerDialog, následne spustíš timer napr. na 300ms a potom hráča vykopneš (Kick(playerid)) zo serveru. Tých 300ms je z dôvodu aby sa stíhol zobraziť dialog :)

  15. Často pomáha 1-2x reinštalovať xampp, prípadne ho dať na hlavný disk (C:) ak ho máš na inom. Taktiež skype vedel spôsobovať problémy so spustením :) Firewall môže byť problém. A samozrejme aj nastavenie (obsadenosť) portov.

  16. před 20hodinami, XpresS said:

    Už som to nejako spravil, no akože stačila by hashmapa, ale prečo si to nespraviš jednoduhšie ??? Toho sa vždy držím a všetko si uľahčujem... ako písať pretypovanie objektov...
    Ale každý primitivný typ má dedičnosť z Object, takže prečo by nešlo ?

    DONE, môžete uzatvoriť, :D

    Ako myslíš jednoduchšie? Vždy je lepšie použiť už vytvorenú knižnicu :D To je jednoduchšie ako písať vlastnú :)

    A tiež aké pretypovanie? Tu máš príklad na HashMapu priamo z javy a žiadne pretypovanie nepoužívam :) Taktiež používam primitívny typ int (pod kódom mam vysvetlené)

    HashMap<String, Integer> hm = new HashMap<>();
    int a = 5;
    hm.put("haha", a);
    int b = hm.get("haha");
    System.out.println(b);
    Integer c = 7;
    hm.put("haha2", c);
    Integer d = hm.get("haha2");
    System.out.println(d);

    A nie primitívne typy nemajú dedičnosť, preto sú primitívne (nie je to trieda a nemá metódy) :) Primitívne typy majú obaľovacie triedy a tie majú dedičnosť (napr. int -> Integer).

    Preto ako generikum nemôžem použiť int ale musím použiť triedu Integer :) java automaticky konvertuje int na Integer ak je potreba a samozrejme aj opačne 

    • Líbí se mi to! (+1) 1
  17. před 13minutami, XpresS said:

    Hej ten getter som opravil, noo práve ale potom to hádže Object miesto konkrétneho primitivného typu.

    Primitivny typ nevies vratit ako object :D preto su obalovacie triedy ako napr. Integer

    ked si vytvoris

    TvojaMapa<Integer> mapa = new TvojaMapa<>();

    tak 

    public A get() {

         return (A)super.get();

    }

    ti vrati Integer pretoze to co ti vrati super.get pretypujes na A

     

    naviac nestaci Java hashmapa? https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

  18. Tak ked sa pozries na to co si spravil tak je to hned jasne :)

    Takto sa enum nepouziva :)

    new HousePronajem;

    Takto to pouzit nemozes :)

    House[HouseID][HousePronajem]

    Musis sa pozriet kde sa vytvara premenna House - nieco taketo:

    enum enum_pre_domy {
    	bla,
    	blabla,
    	dalsie_cosi,
    	uz_ma_nic_nenapada,
    	HousePronajem // sem treba pridat HousePronajem
    };
    new House[MAX_POCET_DOMOV][enum_pre_domuy];

     

  19. vytvoris si pole suradnic

    new pole[][] = {
    	{ x1, y1, z1 },
    	{ x2, y2, z2 },
    	{ x3, y3, z3 },
    	... atd
    };
    

    a pri respawne kontrolujes ku ktorej je najblizsie

    new minDist = 99999; // nastavime vysoke cislo
    new id = 0; // toto predstavuje poradie najblizsej nemocnice
    for (int i = 0; i < sizeof(pole); ++i) {
        // spustime cyklus pre vsetky ulozene suradnice
    	new dist = GetPlayerDistanceFromPoint(playerid, pole[i][0], pole[i][1], pole[i][2]); // zistime vzdialenost k aktualnej nemocnici
       	if (dist < minDist) {
    		// ak je mensia ako doposial najblizsia
    		minDist = dist; // ulozime si aktualnu vzdialenost
    		id = i; // ulozime si aktualnu nemocnicu
    	}
    }
    
    int x = pole[id][0];
    int y = pole[id][1];
    int z = pole[id][2];
    // x, y, z su suradnice najblizsej nemocnice

     

    • Děkuji (+1) 1
  20. C:\Users\Admin\Desktop\SVR\gamemodes\RP.pwn(43) : error 017: undefined symbol "GetPlayerCustomSkin"

    - pravdepodobne sa snažíš skompilovať mód pre 0.3DL na verzii 0.3.7 (úplne iná verzia) - to sa ti nepodarí

    - buď stiahneš serverové súbory pre 0.3DL alebo prepíšeš mód

    - ak si si istý, že mód je robený pre verziu 0.3.7 (alebo staršiu), tak nepozná funkciu GetPlayerCustomSkin ktorá je buď nesprávne umiestnená v GM alebo vôbec neexistuje

     

    C:\Users\martin\Desktop\SVR\gamemodes\RP.pwn(42) : warning 203: symbol is never used: "playerid"

    - definoval si "playerid" vo funkcii ale nikde si ho nepoužil

     

    C:\Users\martin\Desktop\SVR\gamemodes\RP.pwn(44517) : error 021: symbol already defined: "S@@_OnPlayerCommandText"

    - definicia už existuje

×
×
  • Create New...