-
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
-
-
No máš to presne opačne najpr potrebuješ spraviť databázu a potom podmienku v DB si ku každému voucheru pridáš parameter "used" alebo niečo podobne... ak bude true tak už nemôže tento voucher použiť...
potom podmienka bude nejak takto:
/* Nacitanie zadaneho voucheru z DB */ if (!nacitanaHodnotaUsed) { // moze pouzit /* Ulozenie dat do DB - zmena parametra Used na "true" */ } else { // nemoze pouzit }
// EDIT
Môže každý hráč použiť daný voucher? Pretože riešenie hore je určené tak, že voucher môžeš použiť len raz a je jedno ktorý hráč ho využije, iný hráč ho už nepoužije
Myslel si to tak alebo inak?
- 1
-
před 4hodinami, Lukasz said:
Jo, jsem slepý.
Ono by bylo stejně asi lepší vzít reálný počet hráčů na serveru, vygenerovat podle toho náhodné číslo a dopočítat k jakému playerid to sedí. Ono když ti GetPlayerPoolSize() vrátí třeba 100 (na jeho serveru nereálné, pokud to nezaplní NPC), na serveru máš ale jen dva hráče, tak to pak dá zabrat trefit se do správného playerid.
SAMP berie najnižšie volné ID pri pripojení, takže toto je veľmi ojedinelý prípad... Naviac random funguje viac menej podla rovnomerného rozdelenia, takže ak je 100 hodnôt, každá má približne 1/100 šancu, a keď budú na servery 2 hráči, tak je to cca 50 cyklov... 50 cyklov v ktorých sa skoro nič nerobí je totálne nič
Samozrejme existuje lepšie riešenie... napr. použiť list (arraylist) z PawnPlus a ukladať doň pripojených hráčov... vtedy by sa ten cyklus zopakoval cca 1x (môže sa stať že vygeneruje zabijaka a teda musí znova) -
před 10hodinami, Lukasz said:
Tvůj kód má problém v tom, že pokud bude připojený pouze jeden hráč, tak se bude jednat o nekonečný cyklus a server "padne".
Treba čítať celé:
Taktiež si určite pred spustením skontroluj, či je na servery viac ako 1 hráč...
-
No takto, nech máme nejaké informácie:
1) Robil si celý ten mód alebo upravuješ nejakú verejnú verziu?
2) Vravíš že ti to píše do konzoly, tak potom kde je problém? Stlačím CTRL + F a nájdem požadovanú hlášku... Kontrola bude niekde v danom mieste +-.
3) Kde ti beží server? Na localhoste a ostatní sa pripájajú cez hamachi? Alebo máš niekde hostovaný server? Lebo ak hamachi, tak problém môže byť aj v tom... Popíš bližšie informácie
Pawnera tu pravdepodobne nenájdeš, nakoľko MY čo sme na tom vyrastali tak už pracujeme na svojich projektoch (mimo pawn) a sem chodíme skôr aby sme pomohli.
-
Ak tam chce WIN tak potom odzalohovat osobne veci a preinstalovat OS na windows... Pozor vsak na podporu ovladacov - ak tam je speci hardware tak nemusi existovat ovladac - jedna sa skor o starsie modely
-
Prepáč ale teraz nehovoríš dobre...
Súhlasím že GetPlayerPoolSize ti vráti aktuálne najvyššie pripojené ID, to som ani v mojom príspevku nepopieral (môžeš si ho prečítať znova). Ale funkcia RANDOM vracia čísla od 0 po zadané číslo exkluzívne, tj. ak bude random(10) tak vráti 0...9, čiže číslo 10 nebude výsledkom RANDOM... preto musíš v random použiť GetPlayerPoolSize() + 1
Presne toto som ti hore písal, že si máš najprv prečítať funkciu ktorú používaš...
A k tomu kódu... Tvoj kód nebude fungovať, pretože nerozumieš princípu while cyklu...
While by sa dal preložiť ako "opakuj pokiaľ platí", takže ty opakuješ ak je hráč pripojený a nie je NPC a skončíš akonáhle nájde NPC alebo nepripojeného hráča
Inak povedané, ty losuješ náhodné číslo až do okamihu, kedy sa vylosuje NPC alebo nepripojený hráč... Preto musíš tvoj cyklus opraviť tak ako som ti posielal.
Taktiež presne to je dôvod, prečo sa ti kód zacyklí a server padne.
A to tabovanie: je pekné že TY sa orientuješ, ale projekt skoro nikdy nerobíš sám a teda v robote by si mal písať kód tak, aby keď to chytí niekto po tebe tak vedel čo si chcel robiť
- 4
-
1. rada - tabuj, nepoužívaj jednoriadkové podmienky s funkciou - zvyšuje to prehladnosť
2. rada - spoznaj všetky cykly uľahčí ti to prácu... je pekné že vieš while ale treba poznať aj do-while
3. rada - vždy si pozri svoj kód znova - tvoj kód hovorí, že pokiaľ je hráč pripojený A NIE JE npc, tak vylosuj nové náhodné číslo... to je blbosť, ty chceš aby sa vygenerovalo nové pokiaľ hráč NIE JE pripojený ALEBO je npc
4. rada - pozri si definiciu funkcii ktoré používaš - random je od 0 po zadané číslo ale exclusive, takže zadané číslo sa nevygeneruje, takže hráč s najvyšším ID nebude nikdy cieľom
Taktiež si určite pred spustením skontroluj, či je na servery viac ako 1 hráč... Ťažko budeš hladať cieľ keď tam je len ten zabijak - tvoj kód sa zacyklí
Každopádne som skúšal tvoj kód a nepadá to (samozrejme ani nefunguje), takže chyba bude buď v kóde pred alebo po. Prikladám ti cyklus ako by mal vyzerať.
new randomid; do { randomid = random(GetPlayerPoolSize() + 1); } while (!IsPlayerConnected(randomid) || IsPlayerNPC(randomid) || randomid == playerid)
-
čo by si potreboval? SQL je celkom jednoduchý jazyk Skôr tam ide o to, ako moc komplikované selecty chceš robiť
A toto si určite prečítaj
-
před 29minutami, Anonimus24 said:
ZDE: error
C:\Users\START\Desktop\samp server\pawno\include\a_samp.inc(265) : error 029: invalid expression, assumed zero
public SAMP_INCLUDES_VERSION = 0x037030;
ten řádek který jsi chtěl z a-samp
kde si taky riadok vzal? odkial mas a_samp? nic podobneho sa u mna nenachadza... odporucam ten riadok zakomentovat a skusit skompilovat... alebo este v lepsom pripade stiahnut nove a_samp.inc
-
Dávaš nám riadky zo zlého súboru pri chybe musíš aj čítať o aký súbor sa jedná -> nie všetky chyby sa nachádzajú v tvojom GM
C:\Users\START\Desktop\samp server\pawno\include\a_samp.inc(265) : error 029: invalid expression, assumed zero Ty si nejak upravoval a_samp include? priloz sem ten riadok (a pozor na to ktory subor otvaras)
C:\Users\START\Desktop\samp server\pawno\include\dini.inc(31) : warning 214: possibly a "const" array argument was intended: "filename" funkcie v DINI include by mala mať konštatné (const) parametre napríklad: stock nejakafunkcia(const filename[]) {}
C:\Users\START\Desktop\samp server\gamemodes\SZ1.pwn(2155) : warning 214: possibly a "const" array argument was intended: "text" to iste co hore, akurat sa to uz nachadza v tvojom GM
C:\Users\START\Desktop\samp server\gamemodes\SZ1.pwn(2239) : warning 239: literal array/string passed to a non-const parameter Podobne ako hore, vo funkcii by si mal mat const, myslim ze prekladac vtedy nealokuje nove miesto pre premennu ale natvrdo tam vpise dany text
C:\Users\START\Desktop\samp server\gamemodes\SZ1.pwn(2540) : error 017: undefined symbol "FALSE"; did you mean "false"? Toto je snad uplne jasne nie? Miesto "FALSE" pouzi "false" - videl som to v tej definicii co si poslal hore
-
Mne sa to napríklad stávalo keď som mal príliš vela #define
Taktiež ak som napr. použil PawnPlus
Ak ešte nepoužívaš novší compiler tak skús tento: https://github.com/pawn-lang/compiler/releases/ - môže pomôcť
- 1
-
-
-
- Popular Post
- Popular Post
Ahojte.
Na základe nedávneho príspevku som sa rozhodol spraviť include na čítanie a zápis dát.
Tento include vyžaduje mať nainštalovaný plugin PawnPlus <- LINK
Prečo? V scripte sú použité utriedené mapy pre optimalizáciu hľadania údajov.
Prejdeme teda na použitie.
Toto vložíme na začiatok vášho GM - načíta tento include do vášho GM
#include <fSystem>
Takto otvoríme súbor:
Obsah súboru sa uloží do pamäte a je možné ho modifikovať až do doby, než súbor zatvoríte.
V prípade že súbor neexistuje, vytvorí sa.
new subor = DataOpen("test.txt"); // trva asi 700 tickov ak je v subore 100 000 dat // new subor obsahuje identifikator nasho suboru ktory sa pouziva vo funkciach
Uložíme dáta do súboru:
Maximálna dĺžka kľúča je 24.
Dáta sa neuložia hneď, ukladajú sa až pri zatvorení súboru.
Dáta sú ihneď dostupne, nie je potrebne zatvárať súbor, avšak bez zatvorenia súboru sa dáta neuložia!
// pre demonstraciu sa ulozi 100 000 dat do suboru - pri testoch cca do 250 tickov (GetTickCount) new kluc[25]; for (new i = 0; i < 100000; ++i) { format(kluc, sizeof(kluc), "riadok%d", i); DataSetS(subor, kluc, "ahoj"); // ulozi string/array // DataSet -> ulozi integer (new) // DataSetF -> ulozi float } // kluc -> kluc pod ktorym sa ulozia nase data "ahoj"
Načítame dáta zo súboru:
Maximálna dĺžka kľúča je 24.
// pre demonstraciu precitame 100 000 udajov, trvanie asi 150 tickov new kluc[25]; for (new i = 0; i < 100000; ++i) { format(kluc, sizeof(txt), "riadok%d", i); DataGetS(subor, kluc)); // nacita string/array // DataGet(subor, kluc) -> nacita integer // DataGetF(subor, kluc) -> nacita float if (i % 1000 == 0) { printf("%d -> %s", i, DataGetS(tst, txt)); } }
Zatvoríme súbor:
Pri zatvorení súboru sa ukladajú dáta do súboru.
DataClose(subor);
Ak chceme zatvoriť všetky súbory:
DataCloseAll();
Na záver by som chcel požiadať o spätnú väzbu, či už kladnú alebo nie, vždy však poprosím aj nejaký popis.
Poznámka: Odporúčam použiť novšiu verziu prekladača (napr. 3.10.0.0)
- 2
- 4
-
Pozerám na to a určite ti príde rozumne stále otvárať a zatvárať súbor?
Napr. budem mať 1000 údajov o hráčovi v súbore, lebo môj GM je best pro (hehe) a teda pri načítaní údajov 1000 krát otvorim daný súbor, 1000 krát ho zatvorím a 1000 krát prejdem 1-1000 riadkov súboru, pričom pri každom riadku vykonám ešte x y ďalších operácií? -> z toho vychadza zlozitost na N^2*k -> kde N je pocet zaznamov, k je pocet operacii ktore musis spravit
Ak sa mýlim a tvoj script funguje inak tak som zvedavý že ako to je vymyslené rád sa novému priučím
Rozumnejsie by bolo pouzit utriedenie daneho suboru, potom ho cely nacitat do pamati, rozparsovat na jednotlive kluce a data a potom logaritmicky skakat po jednotlivych datach, zlozitejsie by bolo ukladanie.
Z toho by vysla zlozitost N*k + log(N)
Este by sa to dalo optimalizovat tym, ze ak sa 2x po sebe otvori rovnaky subor, nie je nutne ho opatovne otvarat... Taktiez spravit oddelenu funkciu, kde by bolo explicitne povedane, ze teraz idem nacitavat len 1 udaj
- 2
-
No bol som sa tam pozrieť a nič moc veru rozdiel tam nejaký nevidím, máš tam občanku, vodičák, zbroják ako 90% týchto serverov a povolania ti asi ani nefunguju, resp. nenašiel som
V nápovede máš trochu divnú vec: Bez občianskeho preukazu nemôžete robiť žiadne povolania. Prikazom /jobs si zobrazite povolania ktore môžete robiť bez občianskeho preukazu.... parafrazujem ale význam ostáva
Rovnako v napovede je že /gps -> urad, skusil som /gps a nic, prikaz neexistuje
Takze rad by som vedel tie rozdieli, co je na tvojom servery unikatne
- 1
-
Ehm, nejak som nepochopil tie "featury"? Napr. benzínka je v každom kúsku mapy Skús to nejak viac objasniť
Pote se take na serveru nachazi ruzne featury jako napr: Urad, Pizzerie, Benzinka, Ammu-Nation atd..
-
Na tomto fóre som už dlho a práve tu som objavil krásy programovania a tiež krásu miltiplayer hier.
V poslednej dobe už samp nie je také populárne ako kedysi, stále sa však nájdu mladí ľudia ktorí to vyskúšajú a snažia sa niečo vytvoriť. Presne pre nich je tento článok určený.
Takže, moja idea je hlavne o tom, vytvoriť mód pre všetkých od všetkých.
Jednalo by sa o verejný (a možno aj nie) repozitár na gitlabe/hube v ktorom by sa nachádzal celý server (vrátane include/pwn/amx/exe/...), takže každý nový člen by jednoducho mohol hostovať vlastný test server a spoločne by sme pracovali na móde (prípadne filterscriptoch - filé scriptoch).
GM by bol členený na xy scriptov (presnejšie includov) aby mohol každý člen pracovať na vlastnej funkcionalite a taktiež by musel byť každý riadok (blok) riadne okomentovaný.
Moja otázka teda znie, nachádza sa tu niekto, kto by sa pridal? Spolupráca je čiste dobrovoľná (jedine by bolo nutné požiadať o práva) a výsledný GM by bol voľne dostupný pre všetkých.
Nakoľko je to len voľnočasová aktivita tak finančná odmena nie je, jednalo by sa len o zisk skúseností a možno aj dobrých základov pre ďalší postup v programovaní
EDIT //
Ešte upresním, nehľadám namakaných programátorov ale nováčikov ktorí majú chuť sa učiť pawn, ale pridať sa môže ktokoľvek.
- 2
-
před 15hodinami, Mivčo said:
DestroySelectionMenu(playerid); CreateSelectionMenu(playerid); SetVehicleVirtualWorld(GetPlayerVehicleID(playerid), LC2SA4SAMP_VWORLD);
Default VW je 0, nie -1 (objekty maju -1 aby boli vo všetkých, nie vozidla)
Kde konkretne vytváraš to vozidlo? Pretože z toho čo píšeš som pochopil že robíš toto:
1) zadáš príkaz - to premiestni teba a tvoje aktuálne vozidlo do VW 630 000 a voláke drobné
2) vyberieš vozidlo z nejekého menu - to vytvorí vozidlo ktohovie v akom svete, pretože kód opäť nemáme k dispozícií
Takže to napíš ešte raz a všetko, všetky kódy, všetko čo presne ako kde a prečo robíš... Inak nečakaj že ti niekto pomôže
-
-
- Popular Post
- Popular Post
Ostatných ignoruj, proste ti nevedia poradiť a len zbierajú príspevky (lebo očividne niekto nevie čítať predošlé príspevky a musí 10x písať to isté - spamätajte sa uživatelia).
Kukám tvoj kód (ano dá sa to prečítať ale naozaj nabuduce sem skopíruj kód a nie obrázok) a stačí keď si pozrieš ako sa tvoria príkazy a ako sa robí príkaz na spawn vozidla - tj. zistiť pozíciu hráča.
Celý kód spočíva v pár jednoduchých krokoch:
1) Vytvor príkaz
2) Zisti pozíciu hráča (GetPlayerPos)
3) Vytvor auto na týchto pozíciach (v podstate tvoj kód, akurát nastav pozície vozidlu)
4) Vlož hráča do auta (PutPlayerInVehicle)
// EDIT
Sa nedivím že toto fórum ide do hája keď uživatelia iba spamuju... Potom má help 25 príspevkov a žiaden použiteľny, všade len samí hejt že ten nevie písať, ten nevie fotiť ten nevie nič...
- 5
-
No v PWN maš callback OnPlayerDeath(playerid, killerid, reason) { return 1; }
V tomto musis zistit akou zbranou bol zabity - to je parameter reason
Nasledne si musis do nejakej globalnej premennej (alebo ak si skusenejsi tak PVar) ulozit pocet tychto zabiti - tato premenna bude dvojrozmerne pole. V pripade ze ani teraz netusis o com je rec, tak odporucam precitat si nejake tutorialy tu na fore
-
V GM/FS mas OnPlayerDeath(playerid, killerid, reason)
reason je zbran ktorou bol zabity
killerid je id hraca ktory ho zabil
Takze si spravit nejake pocitadla (pre kazdeho hraca vlastnu) a tuto premennu budes navysovat
-
Myslím že problém bude v switch chýba ti break, mám dojem že v c++ je potrebný break pre switch
Tj. program sa ti neopakuje ale switch sa presunie na zvolený CASE, vykoná ho a pokračuje ďalej nasledujúcim a nasledujúcim caseom
Moja rada: pridaj si viac výpisov :D alebo debug
EDIT//
Ešte môže nastať problém ak miešaš std::cin a inú metódu inputu ako napr. getline
Filmy
v Hledám/nabízím
Odesláno:
sktorrent napriklad... nie je tam toho moc ale čo je nové tak tam väčšinou je