07.03.2015, 10:16
Confirmation Dialog
IntroductionI haven't posted a work of mine in this section for quite a while. A couple months ago, when I was putting confirmation dialogs across the game mode, I didn't want to do them all manually but instead I made a dynamic system for easy implementation. Simply said, you're able to state your question and pass necessary information in a single line with easy call-back processing later on. This script is a little advanced (while its usage is fairly basic) so if you don't understand parts of it feel free to ask! Here's an example usage that should speak for itself:
Syntax: ConfirmDialog(playerid, caption[], info[], callback[], ...);
Example: ConfirmDialog(playerid, "Confirmation", "Are you sure you want to purchase a Deagle for $5000?", "OnPlayerPurchaseWeapon", WEAPON_DEAGLE, AMMO, PRICE);
Example Processing:
Код:
public OnPlayerPurchaseWeapon(playerid, response, weaponid, ammo, price){
if(response){
GivePlayerMoney(playerid, -price);
GivePlayerWeapon(playerid, weaponid, ammo);
SendClientMessage(playerid, -1, "You bought a gun!");
}else{
SendClientMessage(playerid, -1, "You cancelled the purchase!");
}
}
Dependencies
- sscanf
- DIALOG_CONFIRM_SYS dialog ID defined
- OnDialogResponse ->
Код:if(dialogid == DIALOG_CONFIRM_SYS){ ConfirmDialog_Response(playerid, response); return 1; }
Код:
/*
Created by Mmartin, 2014. Free to use.
Confirmation dialogs:
"Are you sure?" made simple, without unnecessary additional dialog ID's
How does this work:
Syntax: ConfirmDialog(playerid, caption[], info[], callback[], ...);
Example:
ConfirmDialog(playerid, "Confirmation", "Are you sure you want to purchase a Deagle for $5000?",
"OnPlayerPurchaseWeapon", WEAPON_DEAGLE, AMMO, PRICE);
Example explanation:
playerid - playerid that needs something confirmed
"Confirmation" - Title / caption of the dialog window
"Are you su..." - Content / info / text of the dialog window
"OnPlayerPu..." - Callback that is called after answering the dialog
WEAPON_DEAGLE - Additional argument to be passed
AMMO - Additional argument to be passed
PRICE - Additional argument to be passed
^ The above will call the callback specified when answered. The callback has
two default arguments, "playerid" and "response". Then, the rest of your
additional arguments follow. Example callback for the ConfirmDialog used
in example:
public OnPlayerPurchaseWeapon(playerid, response, weaponid, ammo, price){
if(response){
GivePlayerMoney(playerid, -price);
GivePlayerWeapon(playerid, weaponid, ammo);
SendClientMessage(playerid, -1, "You bought a gun!");
}else{
SendClientMessage(playerid, -1, "You cancelled the purchase!");
}
}
[ ! ] NOTE: Right now, the additional arguments only work for integer values
*/
stock ConfirmDialog(playerid, caption[], info[], callback[], ...){
new n = numargs(), // number of arguments, static + optional
szParamHash[64]; // variable where the passed arguments will be stored
for(new arg = 4; arg < n; arg++){ // loop all additional arguments
format(szParamHash, sizeof(szParamHash), "%s%d|", szParamHash, getarg(arg)); // store them in szParamHash
}
SetPVarInt(playerid, "confDialogArgs", n -4); // store the amount of additional arguments
SetPVarString(playerid, "confDialCallback", callback); // store the callback that needs to be called after response
SetPVarString(playerid, "confDialog_arg", szParamHash); // store the additional arguments
ShowPlayerDialog(playerid, DIALOG_CONFIRM_SYS, DIALOG_STYLE_MSGBOX, caption, info, "Yes", "No"); // display the dialog message itself
return;
}
stock ConfirmDialog_Response(playerid, response){
new szCallback[33], // variable to fetch our callback to
szParamHash[64], // variable to check raw compressed argument string
n, // variable to fetch the amount of additional arguments
szForm[12]; // variable to generate the CallLocalFunction() "format" argument
n = GetPVarInt(playerid, "confDialogArgs"); // Fetch the amount of additional arguments
GetPVarString(playerid, "confDialCallback", szCallback, sizeof(szCallback)); // fetch the callback
GetPVarString(playerid, "confDialog_arg", szParamHash, sizeof(szParamHash)); // fetch the raw compressed additional arguments
new hashDecoded[12]; // variable to store extracted additional arguments from the ConfirmDialog() generated string
sscanf(szParamHash, "p<|>A<d>(0)[12]", hashDecoded); // extraction of the additional arguments
new args, // amount of cells passed to CallLocalFunction
addr, // pointer address variable for later use
i; // i
format(szForm, sizeof(szForm), "dd"); // static parameters for the callback, "playerid" and "response"
#emit ADDR.pri hashDecoded // get pointer address of the extracted additional arguments
#emit STOR.S.pri addr // store the pointer address in variable 'addr'
if(n){ // if there's any additional arguments
for(i = addr + ((n-1) * 4); i >= addr; i-=4){ // loops all additional arguments by their addresses
format(szForm, sizeof(szForm), "%sd", szForm); // adds an aditional specifier to the "format" parameter of CallLocalFunction
#emit load.s.pri i // load the argument at the current address
#emit push.pri // push it to the CallLocalFunction argument list
args+=4; // increase used cell number by 4
}
}
args+=16; // preserve 4 more arguments for CallLocalFunction (16 cause 4 args by 4 cells (4*4))
#emit ADDR.pri response // fetch "response" pointer address to the primary buffer
#emit push.pri // push it to the argument list
#emit ADDR.pri playerid // fetch "playerid" pointer address to the primary buffer
#emit push.pri // push it to the argument list
#emit push.adr szForm // push the szForm ("format") to the argument list by its referenced address
#emit push.adr szCallback // push the szCallback (custom callback) to the argument list by its referenced address
#emit push.s args // push the amount of arguments
#emit sysreq.c CallLocalFunction // call the function
// Clear used data
#emit LCTRL 4
#emit LOAD.S.ALT args
#emit ADD.C 4
#emit ADD
#emit SCTRL 4
// Clear used PVars
DeletePVar(playerid, "confDialCallback");
DeletePVar(playerid, "confDialog_arg");
DeletePVar(playerid, "confDialogArgs");
return;
}
If you've any questions or concerns feel free to ask!



That's Cool Man