10.01.2016, 19:37
Hello!
The is too much complex for me to create DIALOG_ID for each dialog in my mode. So I have wrapped Showplayedialog with some trick.
The main idea is that player can't view more than 1 dialog at the same time.
Just want to share. Comments are welcome:
prerequisite: isnull function should be added for future check if input is null:
First declare fxShowPlayerDialog
Next implement OnDialogResponse
After that in some part of your code you may use fxShowPlayerDialog
Example with input dialog:
So you don't need to create DIALOG_ID for each dialog. You don't need to add code into OnDialogResponse too.
Just call dialog and implement callback.
BTW:
For different styles of dialog you should implement different type of callbacks.
Hope it helps somebody.
P.S. I wish it will be done natively
Full include:
The is too much complex for me to create DIALOG_ID for each dialog in my mode. So I have wrapped Showplayedialog with some trick.
The main idea is that player can't view more than 1 dialog at the same time.
Just want to share. Comments are welcome:
prerequisite: isnull function should be added for future check if input is null:
PHP Code:
#if !defined isnull
#define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
#endif
PHP Code:
new PlayerDialogFunc[MAX_PLAYERS][90];
new PlayerDialogStyle[MAX_PLAYERS];
fxShowPlayerDialog(playerid, callback[], dialogStyle, header[], text[], button1[], button2[]) {
new fxCallback[32];
format(fxCallback, sizeof(fxCallback), "%s", callback);
PlayerDialogFunc[playerid] = fxCallback;
PlayerDialogStyle[playerid] = dialogStyle;
ShowPlayerDialog(playerid, playerid, dialogStyle, header, text, button1, button2);
}
PHP Code:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
switch (PlayerDialogStyle[playerid]) {
case DIALOG_STYLE_MSGBOX: {
return CallLocalFunction(PlayerDialogFunc[playerid], "ii", playerid, response);
}
case DIALOG_STYLE_INPUT, DIALOG_STYLE_PASSWORD: {
new formatedInput[256];
format(formatedInput, sizeof(formatedInput), "%s", inputtext);
if (isnull(formatedInput)) {
printf("FormattedInput is null: |%s|", formatedInput);
return CallLocalFunction(PlayerDialogFunc[playerid], "iis", playerid, response, "\1");
}
printf("Input: |%s|", formatedInput);
return CallLocalFunction(PlayerDialogFunc[playerid], "iis", playerid, response, formatedInput);
}
default: {
return CallLocalFunction(PlayerDialogFunc[playerid], "iii", playerid, response, listitem);
}
}
return 0;
}
PHP Code:
...
fxShowPlayerDialog(playerid, "onDialog", DIALOG_STYLE_MSGBOX, "Dialog title", "Dialog text", "Yes", "No");
...
forward onDialog(playerid, response);
public onDialog(playerid, response) {
// your callback is here
}
PHP Code:
...
fxShowPlayerDialog(playerid, "onInputDialog", DIALOG_STYLE_INPUT, "Title", "Text", "Yes", "No");
...
forward onInputDialog(playerid, response, inputtext[]);
public onInputDialog(playerid, response, inputtext[]) {
if (isnull(inputtext)) {
// if input is null
} else {
// if normal input
}
}
Just call dialog and implement callback.
BTW:
For different styles of dialog you should implement different type of callbacks.
Hope it helps somebody.
P.S. I wish it will be done natively
Full include:
PHP Code:
#if !defined isnull
#define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
#endif
new PlayerDialogFunc[MAX_PLAYERS][90];
new PlayerDialogStyle[MAX_PLAYERS];
fxShowPlayerDialog(playerid, callback[], dialogStyle, header[], text[], button1[], button2[]) {
new fxCallback[32];
format(fxCallback, sizeof(fxCallback), "%s", callback);
PlayerDialogFunc[playerid] = fxCallback;
PlayerDialogStyle[playerid] = dialogStyle;
ShowPlayerDialog(playerid, playerid, dialogStyle, header, text, button1, button2);
return 0;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
switch (PlayerDialogStyle[playerid]) {
case DIALOG_STYLE_MSGBOX: {
return CallLocalFunction(PlayerDialogFunc[playerid], "ii", playerid, response);
}
case DIALOG_STYLE_INPUT, DIALOG_STYLE_PASSWORD: {
new formatedInput[256];
format(formatedInput, sizeof(formatedInput), "%s", inputtext);
if (isnull(formatedInput)) {
return CallLocalFunction(PlayerDialogFunc[playerid], "iis", playerid, response, "\1");
}
return CallLocalFunction(PlayerDialogFunc[playerid], "iis", playerid, response, formatedInput);
}
default: {
return CallLocalFunction(PlayerDialogFunc[playerid], "iii", playerid, response, listitem);
}
}
return 0;
}