Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //==============================================================================
- // ShowFormattedDialog
- // by Daniel_Cortez
- // www.pro-pawn.ru
- //==============================================================================
- #if !defined BYTES_PER_CELL
- #define BYTES_PER_CELL cellbits/8
- #else
- #define BYTES_PER_CELL_WAS_DEFINED
- #endif
- forward public ____ShowFmtDialog_fix__();
- public ____ShowFmtDialog_fix__()
- {
- #emit retn
- new s[1];
- format(s, 0, "");
- ShowPlayerDialog(0, 0, 0, "", "", "", "");
- }
- stock ShowFmgDialog(playerid, style, dialogid, caption[], button1[], button2[], fmtinfo[], {Float, _}:...)
- {
- #define STATIC_ARGS 7
- if(IsPlayerConnected(playerid) == 0)
- return 1;
- new count = (numargs() - STATIC_ARGS) * BYTES_PER_CELL;
- if(count == 0)
- return ShowPlayerDialog(playerid, style, dialogid, caption, fmtinfo, button1, button2);
- new fmt_str[512], arg_start, arg_end;
- // получить адрес начала динамических аргументов
- #emit const.alt fmtinfo
- #emit lctrl 5
- #emit add
- #emit stor.s.pri arg_start
- // получить адрес конца динамических аргументов
- #emit load.s.alt count
- #emit add
- #emit stor.s.pri arg_end
- // выбран цикл do-while, т.к. он не генерирует
- // лишних инструкций, приводящих к коллизии стека
- do{// помещение динамических аргументов в стек
- #emit load.i // в pri - адрес текущего аргумента в стеке
- #emit push.pri
- arg_end -= BYTES_PER_CELL;
- #emit load.s.pri arg_end
- }while (arg_end > arg_start);
- // помещение в стек статических аргументов
- #emit push.s fmtinfo
- #emit push.c 512
- #emit push.adr fmt_str
- // вызов format()
- count += BYTES_PER_CELL*3;
- #emit push.s count
- #emit sysreq.c format
- // восстановление стека
- count += BYTES_PER_CELL;
- #emit lctrl 4
- #emit load.s.alt count
- #emit add
- #emit sctrl 4
- // ну тут и так всё понятно xD
- return ShowPlayerDialog(playerid, style, dialogid, caption, fmt_str, button1, button2);
- #undef STATIC_ARGS
- }
- stock ShowFmgDialogToAll(style, dialogid, caption[], button1[], button2[], fmtinfo[], {Float, _}:...)
- {
- #define STATIC_ARGS 6
- new count = (numargs() - STATIC_ARGS) * BYTES_PER_CELL;
- new i = GetMaxPlayers();
- if(count == 0)
- {
- /*do{
- ShowPlayerDialog(--i, style, dialogid, caption, fmtinfo, button1, button2);
- }while(i != 0);*/
- #emit push.s button2
- #emit push.s button1
- #emit push.s fmtinfo
- #emit push.s caption
- #emit push.s dialogid
- #emit push.s style
- do{
- if(IsPlayerConnected(--i)==0) continue;
- #emit push.s i
- #emit push.c 28
- #emit sysreq.c ShowPlayerDialog
- #emit stack 8
- }while(i != 0);
- #emit stack 24
- return 1;
- }
- new fmt_str[512], arg_start, arg_end;
- #emit const.alt fmtinfo
- #emit lctrl 5
- #emit add
- #emit stor.s.pri arg_start
- #emit load.s.alt count
- #emit add
- #emit stor.s.pri arg_end
- do{
- #emit load.i
- #emit push.pri
- arg_end -= BYTES_PER_CELL;
- #emit load.s.pri arg_end
- }while (arg_end > arg_start);
- #emit push.s fmtinfo
- #emit push.c 512
- #emit push.adr fmt_str
- count += BYTES_PER_CELL*3;
- #emit push.s count
- #emit sysreq.c format
- count += BYTES_PER_CELL;
- #emit lctrl 4
- #emit load.s.alt count
- #emit add
- #emit sctrl 4
- /*do{
- ShowPlayerDialog(--i, style, dialogid, caption, fmt_str, button1, button2);
- }while(i != 0);*/
- #emit push.s button2
- #emit push.s button1
- #emit push.adr fmt_str
- #emit push.s caption
- #emit push.s dialogid
- #emit push.s style
- do{
- if(IsPlayerConnected(--i)==0) continue;
- #emit push.s i
- #emit push.c 28
- #emit sysreq.c ShowPlayerDialog
- #emit stack 8
- }while(i != 0);
- #emit stack 24
- return 1;
- #undef STATIC_ARGS
- }
- #if !defined BYTES_PER_CELL_WAS_DEFINED
- #undef BYTES_PER_CELL
- #else
- #undef BYTES_PER_CELL_WAS_DEFINED
- #endif
- // зато константа BYTES_PER_CELL рассчитана наперёд =/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement