-
Příspěvků
827 -
Registrován
-
Aktivní
-
Vítězných dnů
32
Content Type
Profiles
Forums
Calendar
Gallery
SA-MP
Příspěvky posted by Quiter
-
-
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.
-
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"
Citacepawno\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"
Citacecannot 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)
-
predpokladám že zložku / priečinok "internal" si si vytvoril ty...
takže máš 2 možnosti
1) drž sa návodu a uprac si priečinky / zložky
2) prepíš YSI súbory tak, aby mali správne cesty k súborom (toto dá omnoho viac práce)
-
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ú.
- 1
-
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.
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...
-
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.
-
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
-
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
- 1
-
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
-
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)
-
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.
- 1
-
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.
- 1
-
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!
- 1
-
Úprimne, myslím že máš problém s pochopením čo je pole
Spoilerpublic 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
SpoilerForMaxPlayer(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
-
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
-
Č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.
-
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ť, :DAko 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
- 1
-
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
-
Uplne nerozumiem prečo tam posielaš ten Integer.class? je to nutné? veď generika su prave aby sa taketo niečo odstránilo
A pri get by ti stačilo return (A)super.get(); či?
-
Ano presne to myslim, tak na koniec pridaj
VirtualWorld, DumNaTrhu, HousePronajem };
PS: nemusi to byt na konci Odporucam pozriet si tutorial pre enumy
-
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];
-
okey, moja chyba, pole má byť
new Float:pole[][] = { ... }
to ti vyriesi tag mismatch (dufam)
local variable "x" shadows a variable at a preceding level
nemozes pouzit new x (y a z) kedze ho mas uz definovane ako globalnu premennu, zmen si nazov a tiez to bude
new Float:nx = ...;
-
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
- 1
-
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
Event system v1.0
v Hledám/nabízím
Odesláno:
Tuším je v podmienkach, že zdieľané FS, GM atď musia obsahovať aj zdrojový kód. Alebo sa mýlim?