GTA Közösség - A magyar GTA fórum

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Segítségkérés => A témát indította: eniko0513 - 2014. augusztus 24. - 13:52:18

Cím: OnDialogResponse return 1; kerdes
Írta: eniko0513 - 2014. augusztus 24. - 13:52:18
Sziasztok.  :wave:
Bocsi most tanulok scriptelni es nem igazan tudom, hogy pl. erdemese vagy vane ertelme a dialogoknal return 1et hasznalni a dialogok kozott amikor 1 veget er es jon a masik, vagy eleg simman } jel.
Koszonom. :)
Cím: OnDialogResponse return 1; kerdes
Írta: slre14 - 2014. augusztus 24. - 13:55:45
Hello! Én ez alapján tudtam meg hogy kell csinálni
http://sampforum.hu/index.php?topic=11685.0
Cím: OnDialogResponse return 1; kerdes
Írta: eniko0513 - 2014. augusztus 24. - 14:26:29
Azt tudom, hogy kell hasznalni szerencsere :)
Csak lattam olyan peldakat ahol van es olyant is ahol nincs es nem tudom eldonteni, hogy melyik jobb?!
Cím: OnDialogResponse return 1; kerdes
Írta: Dfoglalo - 2014. augusztus 24. - 15:11:13
Kötelezõ visszatérési értéket megadni, különben a módot sem tudod lefordítani, elvégre hibás lenne. Ez lehet false/hamis (0), true/igaz (1), vagy akár egy függvény is, vagy szinte bármi más, amire szükséged van. Ha egyszerûen elég neked, hogy visszatér a callback, akkor használj return 1;-et. Most pedig jön 2 példa, hogy hol.
 
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case 1:
        {
            if(response) SendClientMessage(playerid, 0xFFFFFFFF, \"Ez az 1-es számú dialog, 1. gombja.\");
            else SendClientMessage(playerid, 0xFFFFFFFF, \"Ez az 1-es számú dialog, 2. gombja.\");
        }
        case 2:
        {
            if(response) SendClientMessage(playerid, 0xFFFFFFFF, \"Ez a 2-es számú dialog, 1. gombja.\");
            else SendClientMessage(playerid, 0xFFFFFFFF, \"Ez a 2-es számú dialog, 2. gombja.\");
        }
    }
    SendClientMessage(playerid, 0xFFFFFFFF, \"Ha ezt látod, egészen idáig lefutott a kód.\");
    return 1;
}

 
Ebben az esetben egy érték szerinti elágazásban történnek meg a dolgok aszerint, hogy mely dialogot mutattuk meg a játékos számára. Amennyiben az 1-es dialogról van szó és kattintunk az 1. gombra, kiíródik az \"Ez az 1-es számú dialog, 1. gombja.\" szöveg. Ekkor - mivel pawn nyelvben nem szükséges a break; használata érték szerinti elágazás esetében - ugyan a case 2-rõl szinte már nem vesz tudomást, de tovább fut egészen a callback legaljáig, amely igen sok sor is lehet, pl. 100 db igen sok dologgal megtömött dialog esetében. Ekkor pedig kiíródik a \"Ha ezt látod, egészen idáig lefutott a kód.\" szöveg is. Azonban ha ezt a példát vesszük:
 
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case 1:
        {
            if(response) SendClientMessage(playerid, 0xFFFFFFFF, \"Ez az 1-es számú dialog, 1. gombja.\");
            else SendClientMessage(playerid, 0xFFFFFFFF, \"Ez az 1-es számú dialog, 2. gombja.\");
            return 1; // BEJELÖLÉS
        }
        case 2:
        {
            if(response) SendClientMessage(playerid, 0xFFFFFFFF, \"Ez a 2-es számú dialog, 1. gombja.\");
            else SendClientMessage(playerid, 0xFFFFFFFF, \"Ez a 2-es számú dialog, 2. gombja.\");
            return 1;
        }
    }
    SendClientMessage(playerid, 0xFFFFFFFF, \"Ha ezt látod, egészen idáig lefutott a kód.\");
    return 1;
}

 
Akkor már nem fog kiíródni a szöveg, hacsak nem egy itt nem lecsekkolt ID-vel rendelkezõ dialogott használunk, mert ha az 1-es dialogról beszélünk, akkor a zöld színû megjegyzéses bejelölésnél már fog tovább futni a kód. Eléggé bonyolultan lett elmagyarázva ez az egyszerû dolog, de azért remélem, hogy érthetõ. A lényeg, hogyha visszatér valamivel, onnantól kezdve nem fut tovább. Igazándiból nyugodtan írhatod csak a végére is, nem nagyon lesz észrevehetõ a különbség. Valami oknál fogva én is csak a végére rakom, ellentétben az OnPlayerCommandText beli parancsokkal; ugyanis ott minden egyes parancs végén visszatérek, hogy a többit ne csekkolja le. Bár az érhetõ is, mert jobban lassítaná és felesleges lenne, nem úgy, mint jelen esetben egy darab hosszú érték szerinti elágazásnál.
Cím: OnDialogResponse return 1; kerdes
Írta: eniko0513 - 2014. augusztus 24. - 15:29:39
Ertem es koszonom :)
ez egy pelda, ennel is kell tenni visszaterest?
 
public OnDialogResponse ( playerid, dialogid, response, listitem, inputtext [ ] )
    {
        if (dialogid == 0 )
        {
            return 1;
        }
if(dialogid == 1)
{
    return 1;
}
if(dialogid == 2)
{
    return 1;
}
return 0;
}

 
[mod]Javítottam helyetted a

taget

tagre![/mod]
Cím: OnDialogResponse return 1; kerdes
Írta: Dfoglalo - 2014. augusztus 24. - 15:40:41
Én így csinálnám:
 

#define DIALOG_XYZ 1
#define DIALOG_SAJT 2
#define DIALOG_AHA 3
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DIALOG_XYZ:
        {
            // Cuccok
            return 1;
        }
        case DIALOG_SAJT:
        {
            // Cuccok
            return 1;
        }
        case DIALOG_AHA:
        {
            // Cuccok
            return 1;
        }
    }
    return 1;
}
Cím: OnDialogResponse return 1; kerdes
Írta: BackUP - 2014. augusztus 24. - 15:55:33
Nem mindig kötelezõ ott visszatérni, csak sok dialognál nagy játékosszámnál van észrevehetõbb hatása, hogy lassú mivel hiába van meg amit kerestél még tovább fut a callback és mindent leellenõriz.
Ha ott kötelezõ visszatérni, akkor a fordító szólni fog. Ez abban az esetben van, ha pl. csináltál egy ellenõrzést, hogy a játékos ezt megnyitotta e már, és ha igaz a feltétel visszatéréssel szakítod meg a továbbfutását. Valahogy így: \'if(Megnyitotta[playerid] == true) return SendClientMessage(playerid, -1, \"Ezt te már megnyitottad!\");\'
Ebben az esetben ha a feltétel igaz, akkor nem fut tovább, hanem ott megáll.
Cím: OnDialogResponse return 1; kerdes
Írta: eniko0513 - 2014. augusztus 26. - 09:17:52
Koszonom a segitseget :)