Это решение для оптимизаций вашего мода. Это заменит 3 строки кода 1 строку
Код
stock SendFormattedMessage(playerid, color, fstring[], {Float, _}:...) { // This is the number of parameters which are not variable that are passed // to this function (i.e. the number of named parameters). static const STATIC_ARGS = 3, BYTES_PER_CELL = cellbits / 8; // Get the number of variable arguments. new n = (numargs() - STATIC_ARGS) * BYTES_PER_CELL; if (n) { new message[128], arg_start, arg_end;
// Load the real address of the last static parameter. Do this by // loading the address of the last known static parameter and then // adding the value of [FRM]. #emit CONST.alt fstring #emit LCTRL 5 #emit ADD #emit STOR.S.pri arg_start
// Load the address of the last variable parameter. Do this by adding // the number of variable parameters on the value just loaded. #emit LOAD.S.alt n #emit ADD #emit STOR.S.pri arg_end
// Push the variable arguments. This is done by loading the value of // each one in reverse order and pushing them. I'd love to be able to // rewrite this to use the values of pri and alt for comparison, // instead of having to constantly load and reload two variables. do { #emit LOAD.I #emit PUSH.pri arg_end -= BYTES_PER_CELL; #emit LOAD.S.pri arg_end } while (arg_end > arg_start);
// Push the static format parameters. #emit PUSH.S fstring #emit PUSH.C 128 #emit PUSH.ADR message
// Now push the number of arguments passed to format, including both // static and variable ones and call the function. n += BYTES_PER_CELL * 3; #emit PUSH.S n #emit SYSREQ.C format
// Remove all data, including the return value, from the stack. n += BYTES_PER_CELL; #emit LCTRL 4 #emit LOAD.S.alt n #emit ADD #emit SCTRL 4
public OnPlayerCommandText(playerid, cmdtext[]) { if (strcmp("/pos", cmdtext, true, 10) == 0) { new Float:x; new Float:y; new Float:z;
GetPlayerPos(playerid, x, y, z); SendFormattedMessage(playerid, 0x00FFFFFF, "Ваша позиция: %f, %f, %f", x, y, z); return 1; } return 0; }
Без этой функций мы писали код так:
Код
new name[24],msgstr[128]; GetPlayerName(playerid,str,24); format(msgstr,sizeof msgstr,"%s ! Добро пожаловать на сервер!",name); SendClientMessage(playerid,1,msgstr);
С нашей функцией код будет выглядит вот так:
Код
new name[24]; GetPlayerName(playerid,name,24); SendFormattedMessage(playerid, 0x00FFFFFF, "%s ! Добро пожаловать на сервер!",name);
Для больших модов это лучшее решение для оптимизаций. Важно! Для того чтобы компилятор PAWN не ругался вставьте в любое место мода функцию format. Например при загрузки мода/скрипта