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!