Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // This is a comment
- // uncomment the line below if you want to write a filterscript
- #define FILTERSCRIPT
- #include <a_samp>
- public OnFilterScriptInit()
- {
- new msg[30];
- format(msg, sizeof(msg), "Hello, %s!", "World");
- print(msg);
- return 1;
- }
- public OnFilterScriptExit()
- {
- return 1;
- }
- 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, "Your position is: %f, %f, %f", x, y, z);
- return 1;
- }
- return 0;
- }
- 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
- return SendClientMessage(playerid, color, message);
- }
- else
- {
- return SendClientMessage(playerid, color, fstring);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement