Jump to content

DuFF

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

    207
  • Registrován

  • Aktivní

  • Vítězných dnů

    43

Příspěvky posted by DuFF

  1. Ja by som to vyriešil tak, že by som v dialogu zobrazil najskôr všetky dostupné losy a potom všetky kúpené. Najjednoduchšie to budeš mať 2 for cyklami cez všetky losy... V prvom cykle do bufferu nahádžeš všetky dostupné a v druhom všetky nedostupné. Takto zároveň docieliš, že losy v obidvoch skupinách budú v dialogu zoradené podľa čísla losu

    • Líbí se mi to! (+1) 1
  2. S javascriptom nerobím, mám niečo málo cez rok komerčnej praxe v C# (považujem sa za juniora) a neprišlo mi to príliš zložité - do hodiny som to zbúchal. Dešifrovanie zadania som zvládol bez väčších problémov, ale viem si predstaviť, že Češi by z toho neboli nadšení... Najväčšia bolesť bolo asi dodržiavanie názvov funkcií a premenných v slovenčine.
    Máš k tomu nejaké referenčné riešenie? Celkom by ma zaujímalo aj to riešenie od ChatGPT.
    Ja som vypracoval toto:

    Spoiler
    function rieka(x, y, pole) {  
        var vystup = [];
        for (let i = 0; i < pole.length; ++i) {
            let arr = [];
            for (let j = 0; j < pole[i].length; ++j) {
                arr.push(0);
            }
            vystup.push(arr);
        }
        
        rekurzivnaRieka(x, y, pole, vystup);
       
        printArray(vystup);
    }
    
    function rekurzivnaRieka(x, y, vstup, vystup) {
        //console.log(`rekurzivnaRieka(${x}, ${y})`);
        vystup[x][y] = 1;
        
        const smery = [
            [0, 1],
            [0, -1],
            [1, 1],
            [1, 0],
            [1, -1],
            [-1, 1],
            [-1, 0],
            [-1, -1]
        ];
        
        const validneSmery = smery.filter(smer => {
            const [xSmer, ySmer] = smer;
            const noveX = x + xSmer;
            if (noveX < 0 || noveX >= vstup.length)
                return false;
                
            const noveY = y + ySmer;
            if (noveY < 0 || noveY >= vstup[noveX].length)
                return false;
            
            return true;
        })
        
        let minimalnaVyska = vstup[x][y];
        for (const [xSmer, ySmer] of validneSmery) {
            const vyska = vstup[x + xSmer][y + ySmer];
            if (vyska < minimalnaVyska) {
                minimalnaVyska = vyska;
            }
        }
        
        //console.log(`minimalna vyska: ${minimalnaVyska}`);
        
        for (const [xSmer, ySmer] of validneSmery) { 
            const noveX = x + xSmer;
            const noveY = y + ySmer;
            if (vstup[noveX][noveY] <= minimalnaVyska 
                && vystup[noveX][noveY] === 0) {
                rekurzivnaRieka(noveX, noveY, vstup, vystup);
            }
        }
    
        return vystup;
    }

     

    Každopádne cool obrázky ako odmena za vypracovanie určite potešili

    image.png

    • Paráda! (+1) 1
    • Líbí se mi to! (+1) 1
  3. Zdravím,
    skúsim trochu doplniť Hipa.
    Obrázok nižšie predstavuje pohľad zhora. Hráč stojí v bode A a jeho postava je natočená smerom α.
    Hľadáme súradnice bodu X, ktorý je od hráča (bodu A) vzdialený 2 jednotky smerom α.
    Pre zjednodušenie súradnicu z ignorujeme; predpokladáme, že body A a X sú v rovnakej výške; zaujímajú nás teda iba súradnice x a y bodu X.
    Na obrázku sú už všetky hodnoty vyplnené, ale na začiatku poznáme iba hráčovu pozíciu (v tomto prípade [0;0]) a uhol α (v tomto prípade 37°). Zvyšok musíme dopočítať...
    image.png.e0b6f5a701b56cacdeb5615897e9be2e.png

    Začneme tým, že si okolo hráča predstavíme jednotkovú kružnicu (t.j. kružnicu s polomerom 1). Akonáhle vypočítame súradnice bodu B, ktorý je priesečníkom jednotkovej kružnice a úsečky spájajúcej body A a X, dostaneme jednotkový vektor (t.j. vektor dĺžky 1), ktorý potom stačí iba prenásobiť požadovanou vzdialenosťou, pripočítať ho k hráčovej pozícii a dostaneme tak súradnice bodu X.

    Ako vypočítať súradnice bodu B...
    Na obrázku je vyznačený pravouhlý trojuholník ABC, ktorý má strany a, b, c. Súradnica x bodu B je zhodná s dĺžkou strany b v trojuholníku. Podobne, súradnica y bodu B je zhodná s dĺžkou strany a.

    Začnime výpočtom dĺžky strany a...
    V pravouhlom trojuholníku platí, že sínus uhla = veľkosť protiľahlej strany / veľkosť prepony. V našom prípade to môžeme zapísať takto: sin(α) = a / c. Keďže v našom prípade má prepona (c) dĺžku 1, delenie číslom 1 môžeme vynechať a zjednodušiť to na: sin(α) = a. Po konzultácii s kalkulačkou zistíme, že sínus 37 stupňov; teda dĺžka strany a; je približne 0.6 (ako ukazuje obrázok).

    Podobne výpočet dĺžky strany b...
    V pravouhlom trojuholníku platí, že kosínus uhla = veľkosť priľahlej strany / veľkosť prepony. V našom prípade to môžeme zapísať takto: cos(α) = b / c. Keďže v našom prípade má prepona (c) dĺžku 1, delenie číslom 1 môžeme vynechať a zjednodušiť to na: cos(α) = b. Po konzultácii s kalkulačkou zistíme, že kosínus 37 stupňov; teda dĺžka strany b; je približne 0.8 (ako ukazuje obrázok).

    Získali sme jednotkový vektor (0.8;0.6). V našom prípade nás zaujíma bod vzdialený 2 jednotky, takže k hráčovej pozícii [0;0] pripočítame 2-násobok jednotkového vektoru (0.8;0.6). Dostávame tak súradnice bodu X: [0 + 2*0.8; 0 + 2*0.6] = [1.6; 1.2]. Ak by nás zaujímal bod vzdialený napríklad 5 jednotiek, pripočítal by sa 5-násobok jednotkového vektoru (dostali by sme súradnice [0 + 5*0.8; 0 + 5*0.6] = [4;3].

    Ak by si sa chcel hrať s GeoGebrou: https://www.geogebra.org/classic/dfydudkd

    Ako to bude vyzerať v pawne...

    stock GetPositionInFrontOfPlayer(playerid, &Float:x, &Float:y, &Float:z, Float:distance = 5.0)
    {
        new Float:facingAngle;
        GetPlayerFacingAngle(playerid, facingAngle);
        facingAngle += 90.0; // 0° v GTA je sever, ale 0° na obrázku je východ, preto korekcia o 90°
        GetPlayerPos(playerid, x, y, z);
        x += distance * floatcos(facingAngle, degrees);
        y += distance * floatsin(facingAngle, degrees);
    }
    
    CMD:warp(playerid, params[])
    {
        new Float:distance;
        if (sscanf(params, "f", distance))
            return SendClientMessage(playerid, -1, "Usage: /warp [distance]");
            
        new Float:x, Float:y, Float:z;
        GetPositionInFrontOfPlayer(playerid, x, y, z, distance);
        SetPlayerPos(playerid, x, y, z);
        return 1;
    }

    Ak chceš, aby sa výška cieľového bodu prispôsobila terénu (aby ťa newarplo do textúry), namiesto SetPlayerPos môžeš skúsiť https://sampwiki.blast.hk/wiki/SetPlayerPosFindZ ako radí Hip, alebo ideálnejšie MapAndreas plugin.

    • Paráda! (+1) 1
  4. Zdravím,
    dnes som po dlhšom čase zavítal na web sa-mp.com a v sekcii Downloads ma prekvapila nová verzia klienta 0.3.7-R5.

    Vyzerá to tak, že vyšla v novembri tohto roku a na ruskom fóre (https://pawn-wiki.ru/index.php?/topic/56298-sa-mp-037-r5-1-klient/) som sa dočítal, že údajne opravuje kritický bug - remote code execution pomocou DIALOG_STYLE_LIST a DIALOG_STYLE_TABLIST. Neviem, ako veľmi je táto informácia dôveryhodná a bližšie detaily o tejto bezpečnostnej chybe som sa nedozvedel.

    Ak náhodou niekto viete viac, budem rád, keď sa s nami podelíte...

    • Líbí se mi to! (+1) 2
  5. před 17hodinami, Dave6859 said:

    warning 239: literal array/string passed to a non-const parameter

    Toto vidíš pravdepodobne kvôli tomu, že používaš pawn compiler od Zeexa, kde sa rieši const-correctness (https://github.com/pawn-lang/compiler/wiki/Const-Correctness), ale používaš a_samp.inc od samp teamu bez nejakých úprav. Pokojne otvor ten include, nájdi v ňom PlayAudioStreamForPlayer a pred druhý parameter (pole s url) dopíš "const".

    Tento warning inak nesúvisí s problémom, že sa ti neprehráva hudba. Ako píše Hip, PlayAudioStreamForPlayer očakáva link na nejaký zvukový súbor (.mp3, .ogg, ...). Ak chceš prehrať niečo z youtube, musíš to prekonvertovať napr. na mp3, nahrať to niekam na internet a použiť link k tomuto nahranému súboru.

     

    • Líbí se mi to! (+1) 1
  6. Zdravím, Triadic Operator je operátor s aritou 3. Častejšie používaný výraz je ternary operator.

    Operátory môžu mať rôznu aritu (počet operandov). Pár príkladov:

    !isPlayerConnected -> unárny operátor ! (jediný operand je premennná isPlayerConnected)

    4 + 7 -> binárny operátor + (dva operandy 4 a 7)

    Unárnych a binárnych operátorov v programovaní existuje viac. Napríklad ďalší unárny operáror je - vo výraze -42. Príkladom ďalších binárnych operátorov je väčšina aritmetických (+, -, *, /), logických (&&, ||) alebo relačných (>, >=, <, <=, ==, !=) operátorov.

    Ternárny však poznáme iba jeden (operátor ?:). Ukážem ho na výraze:

    new jailTime = IsPlayerVIP(playerid) ? 300 : 600;

    Do premennej jailTime sa uloží hodnota 300 ak je výraz IsPlayerVIP(playerid) pravdivý výraz, inak 600.

    Chová sa to rovnako ako nasledovný kód:

    new jailTime;

    if (IsPlayerVIP(playerid)

    {

        jailTime = 300;

    }

    else

    {

        jailTime = 600;

    }

    Je to teda in-line verzia podmienky v tvare:

    výraz ? výsledok-ak-výraz-platí : výsledok-ak-výraz-neplatí

    Hodí sa to hlavne v prípade, keď sú výrazy jednoduché a rozpisovanie pomocou podmienky by bolo zbytočne zdĺhavé.

    Na záver ešte spomeniem, že ternárne operárory môžu byť aj vnorené, napríklad vo výraze:

    new jailTime = IsPlayerAdmin(playerid) ? 0 : IsPlayerVIP(playerid) ? 300 : 600;

    Ale v takýchto prípadoch býva zvyčajne lepší nápad prepísať to klasicky pomocou podmienok kvôli oveľa lepšej čitateľnosti kódu.

    • Líbí se mi to! (+1) 3
  7. před 11minutami, Dave6859 said:

    Díky, ale stále je tu ten problém, že to ta funkce jde použít jen na player model a nejde na zbraně

    Proste hráčovi givneš katanu, vytvoríš nejaký svietiaci model a pripevníš ho hráčovi na ruku tak, aby to vyzeralo, že svieti katana

  8. před 4hodinami, Om3n said:

    ok DuFFe, připadam ti teď jako chudák :D

    Neber to nijak zle :D Ja som mal iba zlý pocit z toho, že by som bez tohto fóra urobil pár životných rozhodnutí inak, nie nutne lepšie, a že som mu to ešte dostatočne nesplatil pridaným obsahom

    • Děkuji (+1) 1
  9. před 9minutami, darfexik said:

    Napsal jsem "stock sscanf" nic mi to nevyhledalo pak jsem šel do pawno, includes a sscanf a napsal jsem tam "stock sscanf" a vyhledalo mi to tohle https://ctrlv.cz/zrTD

    Skús ešte raz poriadne prekontrolovať, či niekde v móde nemáš kód, ktorý vyzerá nejak takto ("stock" tam nemusí byť):

    https://team.sa-mp.com/wiki/Sscanf_code.html

    Ak nič nenájdeš, skús includovať sscanf hneď po a_samp, aby sa vylúčila možnosť, že sscanf definuje nejaký z tvojich includov, ktoré includuješ skôr.

  10. před 9minutami, darfexik said:

    Ano to už jsem udělal posunul jsem se kousek dopředu, ale ted mi to zase píše tohle esktop\pawno\pawno\include\sscanf.inc(229) : fatal error 111: user error: sscanf (possibly the PAWN version) already defined. https://ctrlv.cz/tXPe

     

    Máš v móde sscanf definovaný ako funkciu? Ak vyhľadáš "stock sscanf", nájde ti to niečo? Ak áno, celú tú funkciu môžeš vymazať. Toto je pozostatok z čias, keď na sscanf ešte neexistoval plugin, a teraz sa to bije.

  11. před 2minutami, darfexik said:

    Zdravím, ještě jednou promin, že pořád otravuju, ale nechápu to co jsi napsal co mám napsat to #define SSCANF_NO_NICE_FEATURES mám odstranit, nebo jak mám to udělat v Pawnu nebo v tom includu? prosím ještě jednou o vysvětlění díky.. o tom článku jsem si přečetl..

    Vložiť do .pwn súboru módu pred riadok, na ktorom máš #include <sscanf>

  12. Toto vyrieši tvoj problém:

    Najjednoduchšie bude pre teba urobiť presne to, čo ti píše chybová hláška: Vlož do módu (pravdepodobne pred include sscanf) riadok #define SSCANF_NO_NICE_FEATURES, čím zakážeš nejaké featury, ktoré nie sú kompatibilné s kompilerom poskytnutým samp teamom.

     

    Nepovinné:

    Ak by si chcel do budúcna prejsť na komunitný kompiler (doporučuje sa), ktorý má zaujímavé featury a opravené bugy, môžeš si o tom prečítať tu:

    https://github.com/pawn-lang/compiler

    Pravdepodobne však narazíš problémy spojené s const correctness. Táto téma sa tu už tiež x-krát riešila a je o tom pekne písané aj na wiki githubu, ktorý som poslal

  13. Zo zoznamu, ktorý si napísal, používajú pluginy iba sscanf a streamer. U ostatných by ti mali stačiť tie verzie, ktoré aktuálne používaš.

    Odkazy:

    https://github.com/Y-Less/sscanf/releases

    https://github.com/samp-incognito/samp-streamer-plugin/releases

    Stiahni si najnovší release, .so/.dll (podľa toho, či ti beží server na Linuxe, alebo na Windowse) daj do serverovej zložky "plugins" a .inc súbory si vlož do zložky "include" do pawna, ktorým následne skompiluješ mód.

  14. Ak niekomu nastavíš hp na 0 alebo sa zabije sám pádom, ohňom, výbuchom, utopením, ..., počítaj s tým, že killerid je INVALID_PLAYER_ID (65535). Ak používaš index killerid na prístup do nejakého poľa, tak ti to tam spadne na ArrayIndexOfBoundsException. Z tohto dôvodu sa kód, ktorý robí niečo s killerid, zvykne dávať do tela podmienky if (killerid != INVALID_PLAYER_ID). Je možné, že niečo také robíš v UpdatePlayerKills. Inak na odhalenie takýchto chýb určite použi crashdetect plugin

  15. Ja som nepochopil ten for cyklus cez všetkých hráčov (v PHY_OnObjectUpdate). Pozerám to síce na mobile o 3 ráno a je veľmi možné, že mi niečo uniká, ale jediný výskyt premennej i vidím v SendClientMessage, čo by si mohol nahradiť SendClientMessageToAll a vonkajší for cyklus by sa dal odstrániť.

×
×
  • Create New...