Jump to content

DuFF

Přispěvatel
  • Příspěvků

    205
  • Registrován

  • Aktivní

  • Vítězných dnů

    42

Everything posted by DuFF

  1. Chápem správne, že tieto objekty nechceš pridať na server, ale chceš si ich pridať do hry tak, aby si ich videl aj v singleplayeri? Nikdy som to nerobil, ale pokiaľ viem, docieliš to úpravou .ipl súborov v GTA San Andreas/data/maps. Tu je na to nejaký návod.
  2. DuFF

    pomoc Pawn compiler

    Keď všetko ostatné zlyhá a budeš zúfalý, môžeš ešte skúsiť Zeexov compiler, ktorý má opravených pár známych bugov pawn compileru. Compiler sa ešte zvykol chovať podobne v prípade, že niekde chýbala zátvorka uzatvárajúca blok. Tanga na to vyrobil užitočný nástroj "Missing Brackets Detector", ktorý by tu mal byť niekde v sekcii Na stažení (ak prežil rollback).
  3. DuFF

    pomoc C - Divný output

    Aj keď sme už problém vyriešili, ešte si dovolím drobnú optimalizáciu. Skús sa zamyslieť, či potrebuješ ten vnútorný cyklus na počítanie temp_sum. Podľa mňa by ti stačilo spočítať ho iba raz (na začiatku) a v každej iterácii cyklu ho iba mierne upraviť (bez potreby vnútorného cyklu). Skús to vymyslieť najskôr sám, až potom si rozklikni spoiler.
  4. DuFF

    pomoc C - Divný output

    Neviem, kde môžeš mať chybu. Ja s týmto programom: Dostávam pravdepodobne správny výstup: count = 3 special numbers: 17 5 2 V maine, ktorý si sem postol, máš nejaké "test_array", ktoré ani nevidím nikde zadeklarované. Možno si over, či si namiesto toho použil result_array.
  5. DuFF

    pomoc C - Divný output

    Myslím si, že chyba je na tomto riadku: result_array[i] = input_array[i]; Špeciálne číslo na i-tom indexe vstupu nemusí byť nutne uložené na i-tom indexe výstupu. Vstupné pole môže obsahovať najskôr nejaké čísla, ktoré nie sú špecialne a povedzme, že prvé špeciálne číslo bude vo vstupnom poli na indexe 3. Toto prvé špeciálne číslo pochopiteľne nechceš uložiť vo výstupnom poli na index 3, ale na index 0. Chceš, aby bolo i-té nájdené špeciálne číslo uložené na i-tom indexe výstupu. Správne by malo teda byť: result_array[totally] = input_array[i];
  6. Trochu si ten login prekombinoval, skús to nejak takto: Ak sa rozhodneš pridávať hashovanie, urobíš to vo funkciách Register a Login. Pre začiatočníka to nie je najľahšie na pochopenie, ale skúsim: Trik je v tom, že neukladáš priamo heslo, ale iba jeho hash - reťazec, ktorý vznikol aplikovaním hashovacej funkcie na heslo a náhodný reťazec (salt). Pri prihlasovaní potom rovnakou hashovacou funkciou a rovnakým saltom zahashuješ heslo, ktoré hráč zadal do prihlasovacieho dialogu. Ak sa tento nový hash zhoduje s hashom, ktorý si uložil do súboru pri registrácii, je veľmi vysoká šanca, že hráč zadal správne heslo (niektoré hashovacie funkcie majú kolízie a tak sa môže stať, že 2 rôzne heslá majú rovnaký hash). Teda čo musíš urobiť: Vo funkcii Register vygeneruješ náhodný salt, zahashuješ hráčovo heslo pomocou vygenerovaného saltu a salt a hash si uložíš do súboru (budeš ich potrebovať pri overení správnosti hesla pri prihlasovaní). Vo funkcii Login potom prečítaš zo súboru salt, zahashuješ hráčovo heslo pomocou prečítaného saltu, prečítaš zo súboru hash, ktorý si tam uložil pri registrácii a porovnáš (napríklad pomocou funkcie strcmp), či sa nový hash rovná tomu prečítanému zo súboru. Ak áno, hráč zadal správne heslo. Ak nie, zobrazíš mu znova prihlasovací dialog.
  7. Nič by sa nepokazilo, hráč by iba videl namiesto zadávaných znakov v dialogu bodky. Môj osobný názor ale je, že je fajn schovávať heslo pri logine, ale pri registrácii by som ho hráčovi radšej zobrazil, aby mal istotu, že sa zaregistruje pod správnym heslom (caps lock, num lock, preklepy, ... vedia spôsobiť problémy).
  8. Problém je v tejto časti: Pravdepodobne si chcel napísať if (response == 1). Každopádne táto podmienka je zbytočná a môžeš ju z kódu odstrániť, pretože o 5 riadkov vyššie kontroluješ, či je response 0 a ak je, tak ukončíš funkciu returnom. Ak sa teda vykoná kód z tejto časti, máš istotu, že response nie je 0 (aj bez ďalšieho overovania podmienkou). Momentálne sa ti deje to, že kód v tele tvojej podmienky sa nemôže nikdy vykonať. Je to z toho dôvodu, že ak je response 0, funkciu ukončíš o pár riadkov vyššie returnom. Naopak, ak response nie je 0, funkcia sa síce neukončí, ale podmienka response == 0 nie je splnená, a tak sa nevykoná jej telo. Druhý problém je s podmienkou if(strlen(inputtext)). Ak by si to nechal takto, ako to je teraz, na každé neprázdne heslo by ti vypísalo správu, že ty heslo je krátke. Pravdepodobne si chcel napísať napríklad if(strlen(inputtext) < 6). Tip: Aj keď to nie je všeobecne dobrá prax, v pawne je užitočné používať debugovacie správy. Napríklad aby si zistil, ktorá vetva podmienky sa vykonala, prípadne kde sa ukončilo vykonávanie funkcie. Jednoducho na nejaké miesto v kóde pridaj printf("<nejaký unikátny text>"); a keď tento text potom nájdeš v server logu, budeš vedieť, že sa ten blok kódu, do ktorého si vložil print, vykonal. Keby si takýto print vložil na začiatok svojej funkcie Register, zistil by si, že sa táto funkcia nikdy nevolá.
  9. Ospravedlňujem sa za otváranie starého topicu, ale všimol som dosť podstatný bug. Nie je ošetrený výber (ani vklad) zápornej čiastky. Funkcia OnlyNumbers mi síce zabráni napísať do dialogu priamo zápornú hodnotu, ale myslím, že mi nič nebráni docieliť zápornú hodnotu pomocou overflowu. Napríklad tak, že by som do dialogu na výber peňazí napísal sumu 2147483649 (2^31 + 1). Funkcia OnlyNumbers ma nezastaví, pretože každý znak v reťazci "2147483649" je platná číslica. strval("2147483649") vracia hodnotu -2147483647. if (GetPlayerMoney(playerid) < strval(inputtext)) ma nezastaví, pretože budem mať pri sebe viac $ ako -2147483647. Riadok GivePlayerMoney(playerid, -strval(inputtext)); nakoniec spôsobí, že mi server vyplatí 2147483647 $ aj napriek tomu, že som v banke nemusel mať uložené vôbec nič.
  10. Bohužiaľ (pre niekoho vďakabohu), realita je taká, že všetky známejšie rze servery sú už buď úplne mŕtve (progamers, sacz, nfs, tgr, avalon, play sector, velka parba, psycho social, real national...) alebo postupne zomierajú aj napriek (aspoň minimálnej) snahe majiteľov a admin teamu (bfs, snk, ...).
  11. Zdravím, má niekto nápad, ako sa bez použitia hrubej sily dopracovať k riešeniu rovnice 2 * n^2 = d^2 + d, ak musí platiť 50 <= d <= 500 a n <= d? Použitím hrubej sily som sa síce dopracoval k jedinému možnému riešeniu (d = 288, n = 204), ale verím, že na to existuje aj krajší postup. // Edit: n a d sú prirodzené čísla.
  12. Predpokladám, že ide o obdĺžnikovú (výška nás nezaujíma) zónu zadanú 2 protiľahlými bodmi. Označme tieto body A, B a príslušné súradnice týchto bodov Ax, Ay, Bx a By. Na tomto obrázku vidno zónu, ktorej Ax = 1, Ay = 2, Bx = 3 a By = 5. V tejto zóne ležia všetky body, ktorých súradnica x je väčšia alebo rovná 1 a menšia alebo rovná 3 a zároveň ich súradnica y je väčšia alebo rovná 2 a menšia alebo rovná 5. Vidíš, že v zóne ležia všetky body, ktorých súradnica x je medzi Ax a Bx a zároveň ich súradnica y je medzi Ay a By. Mohol by si teda napísať niečo takéto: Tento kód má jeden problém - musíš vždy zabezpečiť, aby bolo Ax vždy menšie alebo rovné Bx a Ay vždy menšie alebo rovné By. Aby si si nemusel dávať taký veľký pozor, môžeš vo funkcii kontrolovať, či to naozaj platí a v prípade potreby argumenty vymeniť.
  13. Máš už vytvorenú mysql databázu a funkčné ukladanie banov do nej? To by som riešil ako prvé. Na webe sa potom už len na túto databázu pripojíš, pomocou jednoduchého query získaš zoznam banov a následne cyklom každý ban zobrazíš ako nejaké html elementy (pravdepodobne to chceš ako tabuľku).
  14. DuFF

    pomoc XP & Level systém

    Ja by som toto zakomponoval skôr do funkcie, ktorou budem zvyšovať XP hráča. Rovno by som mu v nej zvýšil level, ak by to bolo možné a zavolal nejaký callback, napr. OnPlayerLevelIncreased(playerid), ktorý by mal na starosti odmeny za nový level (toľkokrát, na koľko levelov by mal hráč XP). // Edit: prikladám kód pre zmätených (netestoval som)
  15. Práve som testoval tento kód a po zadaní príkazu /createpickup sa pickup vedľa mňa vytvoril. Keď som sa naň postavil, zobrazila sa mi tiež hláška „Skrytý balíček“. Toto bude pravdepodobne dôvod, prečo sa ti pickup nezobrazil. Parameter pickupType som dal účelovo ako posledný, aby mohol byť nepovinný (defaultne PICKUP_TYPE_UNDEFINED). Ak vymeníš poradie parametrov v definícii funkcie, musíš vymeniť aj poradie argumentov vo volaní funkcie. Predpokladám, že upravená definícia funkcie u teba vyzerá nasledovne: stock CreatePickupEx(model, type, Float:X, Float:Y, Float:Z, E_PICKUP_TYPE:pickupType, virtualworld) V tomto prípade chceš funkciu volať nasledovne: CreatePickupEx(1279, 15, x, y, z, PICKUP_TYPE_PACKAGE, -1); Navrhujem ti vyskúšať najskôr neupravenú verziu funkcie a do úprav sa púšťať až keď ti bude neupravená verzia fungovať. Modifikátor „stock“ pri funkcii znamená, že funkcia bude do výsledného .amx súboru zahrnutá iba vtedy, ak sa niekde v kóde používa. Ak ju nikde nepoužiješ, kompilátor ju bude ignorovať a na rozdiel od klasickej funkcie (bez modifikátoru) nedostaneš varovanie, že funkcia nie je nikde použitá. Využíva sa to napríklad v includoch (väčšinou nepotrebuješ použiť všetky funkcie, ktoré include obsahuje). Viac o funkciách a modifikátore stock sa môžeš dočítať napríklad tu.
  16. Nebude lepší nápad uložiť si pre každý pickup, či ide o skrytý balíček, o pickup na opravu auta, (prípadne o nejaký iný typ), alebo to nie je žiaden z týchto prípadov? Tých 16 kB ( ak správne počítam 4096 * 4 B ) pamäte nikoho nezabije a ak potom budeš mať viac pickupov rovnakého typu, budeš môcť v konštantnom čase zistiť, aký typ pickupu si zobral. Momentálne musíš napríklad na zistenie, či si zobral repair pickup, prechádzať celé pole s repair pickupmi. Myslím to nejak takto (kód som neskúšal, nezaručujem funkčnosť, chcem iba ukázať myšlienku): A ešte lepší nápad by bol asi využiť Streamer plugin, jeho CreateDynamicPickup, Streamer_SetArrayData a Streamer_GetArrayData. Ako na to sa môžeš dočítať napríklad tu.
  17. DuFF

    pomoc pomoc?

    V tom prípade by som ti navrhol prečítať si ešte 5-krát a pomaly upozornenie z môjho predchádzajúceho príspevku.
  18. DuFF

    pomoc pomoc?

    Riadky, ktoré si poslal, používajú Streamer Plugin. Musíš si ho stiahnuť (napríklad z tohto odkazu). V stiahnutom archíve v priečinku pawno/include nájdeš include streamer.inc, ktorý si vlož do priečinku include vo svojom priečinku s pawnom. Následne môžeš skompilovať tento kód: Upozorňujem ťa ešte na to, že ak sa pokúsiš spustiť tento filterscript na nejakom serveri, musí na ňom bežať Streamer Plugin. Nahráš ho tam tak, že si zo stiahnutého archívu z priečinku plugins vyberieš streamer.dll (ak používaš Windows) alebo streamer.so (ak používaš Linux alebo máš server hosťovaný na Fakahede) a vybraný súbor umiestniš do priečinku plugins vo svojom samp serveri (prípadne na hostingu). Potom už len tento plugin zapíšeš do server.cfg podobným spôsobom, ako tam zapisuješ filterscripty. Do server.cfg zapíšeš "plugins streamer.dll" alebo "plugins streamer.so" (podľa toho, ktorý súbor si nahral do priečinku plugins).
  19. DuFF

    pomoc pomoc?

    Ukáž nám kód, ktorý sa pokúšaš skompilovať a robí ti problémy. Ak chceš pridať mapu do filterscriptu, pridaj riadky s CreateObject do public OnFilterScriptInit. Ak ju chceš pridať do herného módu, pridaj tieto riadky do public OnGameModeInit. Ukážka, ako by mal vyzerať kód filterscriptu, ktorý na server pridá nejaké objekty: Tiež môžeš zvážiť využitie streameru - hlavne ak sa chystáš pridávať väčšie množstvo objektov.
  20. DuFF

    pomoc Nechápu...

    error 010: invalid function or declaration vyzerá trochu inak ako fatal error 100: cannot read from file: "core", súhlasíš?
  21. A máš to definované skôr (vyššie), ako to používaš?
  22. Skôr, než sa pokúsiš o PlayerInfo[killerid][pKills]++, by si mal overiť, či killerid nie je INVALID_PLAYER_ID. Inak ti to spadne kvôli neplatnému prístupu do poľa (PlayerInfo[INVALID_PLAYER_ID][pKills], teda PlayerInfo[65535][pKills]) a nezvýši sa ti ani počet smrtí.
  23. DuFF

    pomoc GTA - bug

    Skús možno ešte spustiť hru ako administrátor. Možno bude iba problém s právami na zápis do dokumentov.
  24. DuFF

    pomoc GTA - bug

    Používaš niečo na zmenu client ID? Tieto veci väčšinou prepisujú path k user files. Ukladá ti chatlog alebo screenshoty?
  25. DuFF

    pomoc Define

    Možno by bolo fajn aspoň napísať, aký error dostaneš. Tá definícia je v poriadku. Ako sa snažíš to SCM použiť?
×
×
  • Create New...