Szerző Téma: OnDialogResponse return 1; kerdes  (Megtekintve 1206 alkalommal)

OnDialogResponse return 1; kerdes
« Dátum: 2014. augusztus 24. - 13:52:18 »
0 Show voters
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. :)
« Utoljára szerkesztve: 2014. augusztus 24. - 14:59:53 írta Dfoglalo »

OnDialogResponse return 1; kerdes
« Válasz #1 Dátum: 2014. augusztus 24. - 13:55:45 »
0 Show voters
Hello! Én ez alapján tudtam meg hogy kell csinálni
http://sampforum.hu/index.php?topic=11685.0

OnDialogResponse return 1; kerdes
« Válasz #2 Dátum: 2014. augusztus 24. - 14:26:29 »
0 Show voters
Azt tudom, hogy kell hasznalni szerencsere :)
Csak lattam olyan peldakat ahol van es olyant is ahol nincs es nem tudom eldonteni, hogy melyik jobb?!

Nem elérhető Dfoglalo

  • 4069
  • Globális Moderátor
    • Profil megtekintése
OnDialogResponse return 1; kerdes
« Válasz #3 Dátum: 2014. augusztus 24. - 15:11:13 »
0 Show voters
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.

OnDialogResponse return 1; kerdes
« Válasz #4 Dátum: 2014. augusztus 24. - 15:29:39 »
0 Show voters
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]
« Utoljára szerkesztve: 2014. augusztus 24. - 15:38:34 írta Dfoglalo »

Nem elérhető Dfoglalo

  • 4069
  • Globális Moderátor
    • Profil megtekintése
OnDialogResponse return 1; kerdes
« Válasz #5 Dátum: 2014. augusztus 24. - 15:40:41 »
0 Show voters
É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;
}

Nem elérhető BackUP

  • 908
    • Profil megtekintése
OnDialogResponse return 1; kerdes
« Válasz #6 Dátum: 2014. augusztus 24. - 15:55:33 »
0 Show voters
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.

OnDialogResponse return 1; kerdes
« Válasz #7 Dátum: 2014. augusztus 26. - 09:17:52 »
0 Show voters
Koszonom a segitseget :)

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal