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. DuFF

    pomoc Problém s freeze

    Myslím, že môžete LOCK. Táto metóda zrejme k ničomu nevedie.
  2. DuFF

    pomoc Problém s freeze

    OnPlayerUpdate sa síce volá každých xy milisekúnd, ale nie dosť často. Ako píšem, som schopný prehodiť zbrane (aj bez cheatov) na päsť a na sawny medzi 2 volaniami, (teda v 1. volaní mám sawny a v ďalšom volaní mám tiež sawny - nič sa nezistí). Kontrolovať rýchlosť prepínania zbraní som tiež skúšal, ale zistil som, že to k ničomu nevedie. Jednak sa dá v niektorých verziách tohto cheatu rýchlosť prehadzovania nastaviť a hlavne som nenašiel žiadnu hranicu, ktorú by bez cheatov nebolo možné dosiahnuť (tvojich 50ms). Napríklad stlačením Q a E dokážem prehodiť do pár ms (spravil som si script, ktorý stláčanie q a e simuluje, testoval som to s ním)
  3. Popis problému: Zdravím, v rámci prokrastinácie sa pokúšam vymyslieť nový spôsob, ako otestovať hráča na autoscroll, ale vyskytlo sa pár problémov. Čo je to autoscroll: Väčšina dostupných autoscrollov prehadzuje zbrane "natvrdo" pomocou "01B9: set_actor $PLAYER_ACTOR armed_weapon_to 0". Práve toto sa snažím využiť na detekciu. Pozorovaním som si všimol, že freeznutý hráč bez použitia cheatov nedokáže prehodiť zbrane, ale prehodiť pomocou 01B9 dokáže. Myšlienka: V momente, keď hráč prehodí na päsť, treba ho freeznuť. Ak hráč autoscroll nemá, po uplynutí nejakej doby (pár ms) bude jeho aktuálna zbraň stále päsť (freeznutý hráč bez cheatov nemôže prehodiť zbraň). Ak však hráč autoscroll používa, jeho script bude chcieť prehodiť aj naspäť na sawny, takže po uplynutí pár ms bude jeho aktuálna zbraň iná ako päsť (čo nemôže nastať v prípade, že by hráč cheaty nemal). Problém: Vo svojom kóde sa snažím túto myšlienku zrealizovať, ale narazil som na komplikácie. Ukazuje sa, že public OnPlayerUpdate sa nevolá dostatočne často na to, aby dokázal detekovať každú jednu zmenu zbrane - môže sa stať, že medzi 2 volaniami OnPlayerUpdate prehodím zo sawn na päsť, naspäť na sawny (aj bez cheatov) a žiadne prehodenie sa nezistí. To by ale až tak nevadilo, nie je potrebné testovať každú zmenu... Skutočný problém je ten, že mám pocit, že krátko po freeznutí sa hráč ešte môže pohybovať alebo prehadzovať zbrane. Pri testovaní priloženého kódu občas nastala situácia, že sa mi po zmrazení (nie som si istý, či to bolo po zmrazení, každopádne GetPlayerWeapon(playerid) v TestStart vždy vrátilo 0) podarilo prehodiť zbraň z päste na sawny, čo samozrejme rozbilo úplne celý test, pretože tesne pred odmrazením (v TestEnd) som mal v ruke sawny a tým pádom detekovalo autoscroll. Bol by som vďačný, keby ste sa mi na to pozreli, overili správnosť myšlienky / overili, či je naozaj možné prehodiť zbraň krátko po freeznutí hráča, prípadne poskytli nejaké riešenie problému - či už toho s OnPlayerUpdate alebo toho s freeze. Chyby/varování kompilátoru a při běhu: - Kód: Dodatečné poznámky: --
  4. DuFF

    pomoc Info hráče

    Atomas, určite sa dá použiť strcat týmto spôsobom: "strcat(string,"%s\nPeníze v ruce: %d",string,GetPlayerMoney(playerid));"? Mám dojem, že strcat nemá variabilný počet parametrov a skôr by sa mala použiť funkcia format. http://wiki.sa-mp.com/wiki/Strcat
  5. DuFF

    pomoc VIP

    Ok, zrozumiteľnejšie:
  6. DuFF

    pomoc VIP

    Možno riadky INI_WriteInt(File,"Time",PlayerInfo[ID][VIP] = DATE); INI_WriteInt(File,"VIP",PlayerInfo[ID][VIP] = vlvl); INI_WriteInt(File,"VIP",PlayerInfo[ID][VIP] = 0); nahradiť týmito? INI_WriteInt(File,"Time",DATE); INI_WriteInt(File,"VIP",vlvl); INI_WriteInt(File,"VIP",0);
  7. DuFF

    pomoc Firmy

    Keď zavoláš Create3DTextLabel, ulož si vrátenú hodnotu (ID vytvoreného 3D textu) ideálne do poľa NemovitostInfo (do enumu PROPERTY_INFO pridáš Ne_Text). Túto hodnotu potom použiješ v Update3DTextLabelText, link na wiki: http://wiki.sa-mp.com/wiki/Update3DTextLabelText.
  8. Možno offtopic: Všimol som si chybu v stocku GetPlayerSpeed. Rovnaká chyba je aj v rze. Velocity môže byť aj kladné aj záporné číslo (záleží, či sa pohybuješ v kladom alebo v zápornom smere). To znamená, že Vx + Vy + Vz ti môže vrátiť 0 aj v prípade, že nestojíš na mieste. Napríklad keď sa pohybuješ kolmo na pristávaciu dráhu letiska SF: Vz = 0 a Vx = -Vy, teda súčet je 0.
  9. DuFF

    pomoc Timeban

    Takéto veci zrejme robiť nechceš: INI_WriteInt(Fi,"Ip", GetPlayerIp(playerid, plrIP, 64)); INI_WriteInt(Fi,"Name", GetPlayerName(playerid,name,sizeof(name))); GetPlayerIp nevráti hráčovu ip, iba ti ju uloží do premennej plrIP, pre GetPlayerName platí to samé (hráčov nick uloží do name). A asi tiež nebudeš chcieť ukladať reťazce pomocou WriteInt.
  10. Keď už chceme zverejňovať riešenia.. Chcel som ťa nasmerovať na niečo takéto (vyhneš sa potrebe includovať math): Prípadne na niečo takéto (vyhneš sa operátoru <<, ak mu nerozumieš):
  11. Mal som za to, že ^ je operátor pre XOR a nie pre mocninu. Aj keby vykonával mocninu, výsledok by bol na konci vždy 1. (Inty sa podelia celočíselne, 1/1 = 1, 1/2 = 0, 1/4 = 0...). Takže si nie som istý, či to bude najšťastnejšie riešenie. Možno sa mýlim.
  12. Určite for cyklom (počet opakovaní cyklu je známy - n). Ako hovorím, pred cyklom si inicializuješ nejakú premennú na 0, do ktorej budeš v cykle pripočítavať prvky postupnosti. Musíš už len vymyslieť, ako jednotlivé prvky postupnosti vypočítať. Hint: Existuje operátor << (bitový posun vľavo), x << y = x * 2y .
  13. DuFF

    pomoc Dini => Y_ini

    Schválne som priložil link na sa-mp wiki pre prípad, že by niekomu nebolo jasné, ako funguje static, keď sa použije v kombinácii s lokálnou premennou. Takáto premenná si pamätá svoju hodnotu z predchádzajúceho volania aj v ďalšom volaní. V tom, v čom som navrhoval, by sa inicializovala na 0, potom by sa vykonal kód pre HouseCount = 0, hodnota by sa zvýšila na 1. V ďalšom volaní by bola hodnota HouseCount na začiatku stocku 1, vykonal by sa kód pre HouseCount = 1 a na konci by sa hodnota zvýšila na 2... Tým pádom by stock ani nemusel vracať žiadnu hodnotu (ktorú zrejme aktuálna verzia scriptu ukladá naspäť do globalu). Možno by v tomto prípade bolo vhodnejšie pomenovať premennú ako HouseMaxID, či nejak podobne (indexujeme od 0. teda počet domov by bol HouseMaxID + 1). Ak niekto preferuje indexovanie od 1, HouseCount++ by mohlo nasledovať hneď po static HouseCount na začiatku stocku. Samozrejme, tento topic sa nemá zaoberať tým, čo robí "static". S daným problémom to nemá nič spoločné a keďže si s y_ini veľmi netykám, nechám priestor skúsenejším YSI používateľom.
  14. Zdravím, to "N" je nejaký parameter, ktorý má zadať užívateľ? Ak áno, znie to ako úloha na precvičenie for cyklu, ktorý n-krát pripočíta k nejakej premennej (akumulátoru) hodnotu i-tého člena postupnosti (i je riadiaca premenná cyklu).
  15. DuFF

    pomoc Dini => Y_ini

    Ahoj, ako píše NeoRevCrew, problém je v tom, že tam máš zátvorku navyše. Píše ti to aj sám compiler - očakával ';', ale našiel ')'. Ten samý problém máš aj v kóde, ktorý je v spoileri. Do budúcna (snáď) už budeš vedieť podobný problém vyriešiť. Čo sa týka tej dĺžky: Povedzme, že by si mal max. ID domu 999, potom "Houses/House999.txt" je 19 znakov, takže by ti stačilo new s[20]; (stringy v pawne potrebujú jeden znak navyše - koncová nula). https://en.wikipedia.org/wiki/Null-terminated_string S INI som ešte nikdy nepracoval, ale myslím si, že INI_WriteInt(File,"Owner","none"); a INI_WriteInt(File,"Locked",false); bude problém. Používaš INI_WriteInt na zapísanie reťazca / boolu. Google mi vyhodil, že na to slúžia INI_WriteString / INI_WriteBool. Problém bude zrejme aj v riadkoch podobným tomuto: INI_String(s,"Interior"); - Podľa tutorialu INI_String neberie ako argument cestu k súboru, ale do toho sa neodvážim vŕtať (ako som spomínal, s y_ini som nikdy nerobil). Link na tutorial: http://forum.sa-mp.com/showthread.php?t=570912 PS: HouseCount nemusí byť global, môžeš použiť: static HouseCount; // na začiatku stocku HouseCount++; // na konci stocku http://wiki.sa-mp.com/wiki/Scripting_Basics#static_local
  16. DuFF

    pomoc /ann a ukládání

    else if(sscanf(params, "us", playerid))SendClientMessage(playerid, GP, "Použij: /ann [TEXT]"); Nejak som sa stratil v tomto riadku... 1. else tam vôbec nemusíš použiť (o 2 riadky vyššie používaš return) 2. Používaš "us", kde 'u' načítava hráčov nick / ID do premennej playerid (k čomu to využiješ?) a 's' načítava string bez definovanej dĺžky a dokonca ho nikam neukladáš. Ako napísal Matthew_Bennet, plugin sscanf vôbec nepotrebuješ využívať, stačí ti nastaviť text textdrawu na params. Čo som si všimol ďalej... Používanie GetMaxPlayers() vo for cykle väčšinou nebýva dobrý nápad. Navyše for cyklus vôbec nepotrebuješ, ako napísal Hip, existujú funkcie GameTextForAll, TextDrawShowForAll, TextDrawHideForAll. Ďalej vidím, že si chcel spraviť automatické vypnutie annu po 60 sekundách a držíš si kvôli tomu informáciu, či je momentálne zobrazený nejaký ann. Mám dojem, že túto informáciu si nepotrebuješ ukladať, pretože ak zavoláš KillTimer na timer, ktorý nebeží, alebo TextDrawHideForAll na textdraw, ktorý nie je zobrazený, nebude to mať žiadne nežiadúce účinky (dúfam). Takže riešenie by mohlo možno vyzerať nejak takto:
  17. Ak potrebuješ zastaviť hráča na každom checkpointe, SetVehicleVelocity to vyrieši, ako už bolo povedané vyššie. Navyše mám pre teba pár rád, ktoré by sa ti mohli hodiť:
  18. DuFF

    pomoc Nemizne CP

    Skús: case 0: { cpautobusar[playerid] = 1; .... } case 1: { cpautobusar[playerid] = 2; .... } case 2: { cpautobusar[playerid] = 3; .... } ...
  19. DuFF

    pomoc Problém s enumom

    Ak majiteľ otvorí menu podnikov, jednou z možností je "Upgrade", ktorá otvorí nový dialog, preto keď majiteľ DIALOG_UPGRADE zavrie, zobrazujem mu ten, z ktorého sa tam dostal. Čo chcem spraviť: DIALOG_UPGRADE má 3 listitemy (vylepšiť trezor, personál a ochranku). Kliknutím na jeden z listitemov sa príslušná vlastnosť podniku vylepší o 1 a chcem zakázať, aby bolo možné vylepšovať cez limit (MAX_UPGRADE_VIP). Každopádne mojím problémom bolo sčítať prvok z enumu s listitemom, zvyšok sú nepodstatné informácie. Vďaka, na možnosť pretypovania listitemu som prišiel tesne po postnutí príspevku (funguje), tvoju druhú možnosť som skúšal ešte pred postnutím, ale warningu som sa ňou nezbavil. rep+ Môžete LOCK, problém bol vyriešený.
  20. Popis problému: Zdravím, pri pawnení podnikov som narazil na problém s enumom. Vzhľadom na to, že enumom a tagom príliš nerozumiem, píšem radšej sem. Problém je s výrazom "up_safe + listitem" (tag mismatch), aj keď po skompilovaní všetko funguje tak, ako má, rád by som sa zbavil warningu. Chyby/varování kompilátoru a při běhu: warning 213: tag mismatch Kód: Dodatečné poznámky: EDIT: Problém vyriešený spôsobom: up_safe + propInfo:listitem, dúfam, že to nebude mať nežiadúce následky.
  21. DuFF

    pomoc Nefunguje

    Riadok: if(GetVehicleModel(vehicleid) == 437) prepíš na: if (GetVehicleModel(GetPlayerVehicleID(playerid)) == 437)
  22. Možno skús toto: https://pastebin.com/Hbs1zCGR, testoval som to iba s ID 0, nezaručujem funkčnosť. Je tam ešte problém s tým, že SCMTA spracuje iba reťazec dlhý max 144, čo je dosť málo.
  23. Keď sťahujete GTA SA v rare, treba si dať pozor na to, aby ste nainštalovali aj DirectX, vzhľadom na to, že sa v rare nemusí nachádzať, zatiaľ čo inštalačka ho obsahuje. Kamarát mal tento samý problém, inštalácia DirectX 9 pomohla (aj napriek tomu, že mal v pc DirectX 12, to by mohol niekto objasniť).
  24. Možno by som sa uistil, že je v scriptfiles vytvorená zložka "TitulSystem". Aj keď by si mal mať pri chýbajúcej zložke v logu error, radšej pripomínam.
  25. ZaKlaus, nebolo by lepšie počítať znaky rovno vo while cykle? Myslím, že tu je zbytočné obsah stdinu ukladať do nejakej premennej, vzhľadom na to, že nás zaujíma iba počet znakov. Možno by si sa tak vyhol dynamickej alokácii a realokácii v každej iterácii. #include <stdio.h> int main(int argc, char *argv[]) { unsigned int len = 0; while (getchar() != '\n') len++; printf("%u\n", len); return 0; } // EDIT: Neviem čítať ďalšie príspevky Čo sa týka toho opakovania úlohy, môžeš si spraviť nekonečný cyklus, napríklad:
×
×
  • Create New...