26.04.2011, 18:34
Quote:
Yes, that's the one. That takes a variable number of parameters and pushes them to printf.
|
That's the FS:
pawn Код:
#include <a_samp>
#include <zcmd>
#include <sscanf2>
#include <ysi/y_debug>
stock bool:False = false;
#define CreateStreamedObject CreateDynamicObject
#define DIALOG_EMPTY 3
public OnFilterScriptInit()
{
return 1;
}
CMD:test(playerid, params[])
{
new pName[ MAX_PLAYER_NAME ];
GetPlayerName(playerid, pName, MAX_PLAYER_NAME);
FormatSCLMFS(playerid, -1, "Nickul tau este %s (ID: %d)", "Your nick is %s (ID: %s)", pName, playerid);
return 1;
}
stock FormatSCLMFS(playerid, color, strRO[], strENG[], {Float,_}:...) <ysi_debug:on>
{
// This uses the variable parameter passing method based on code by Zeex.
// See page 15 of the code optimisations topic.
new arguments = (numargs() - 1) * 4;
if (arguments)
{
new
arg_start,
arg_end;
// Load the real address of the last static parameter. Do this by
// loading the address of the parameter and then adding the value of
// [FRM] (frame pointer).
#emit CONST.alt playerid
#emit CONST.alt color
#emit CONST.alt strRO
#emit CONST.alt strENG
#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 variables on the value just loaded.
#emit LOAD.S.alt arguments
#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 or constantly reload two variables.
do
{
#emit LOAD.I
#emit PUSH.pri
arg_end -= 4;
#emit LOAD.S.pri arg_end
}
while (arg_end > arg_start);
// Push the static parameter.
#emit PUSH.S playerid
#emit PUSH.S color
#emit PUSH.S strRO
#emit PUSH.S strENG
// Now push the number of parameters sent and call the function.
arguments += 4;
#emit PUSH.S arguments
#emit SYSREQ.C SCLMFS
// Clear the stack, including the return.
arguments += 4;
#emit LCTRL 4
#emit LOAD.S.alt arguments
#emit ADD
#emit SCTRL 4
}
else
{
SCLMFS(playerid, color, strRO, strENG);
}
return 1;
}
stock SCLMFS(playerid, color, ro[], eng[])
{
switch(GetPVarInt(playerid,"Language"))
{
case 0: SendClientMessage(playerid, color, eng);
case 1: SendClientMessage(playerid, color, ro);
}
return 1;
}
Код:
H:\Jocuri\server sa-mp 0.3\filterscripts\testinfparams.pwn(0) : warning 230: no implementation for state "off" in function "FormatSCLMFS", no fall-back