24.07.2009, 06:06
here, the 2 best things in the world of scripting: dcmd and sscanf
paste that at the top of your gamemode or filterscript, where you will see the other #defines.
now for sscanf
that one is long, copy and paste that at the VERY BOTTOM of your filterscript/gamemode
How to use dcmd
dcmd is way better than regular command text, but it is also confusing. For the explode thing you want to do, its the best though.
copy and paste that between the brackets of "public OnPlayerCommandText"
copy and paste this AFTER the brackets in OnPlayerCommandText, but BEFORE the next public callback
note: this will let anyone type /boom <player ID> and it will explode that player. however, if you take away the // up in the code, it will make it to where only admins may use that command. :P
Код:
#define dcmd(%1,%2,%3) if (!strcmp((%3)[1], #%1, true, (%2)) && ((((%3)[(%2) + 1] == '\0') && (dcmd_%1(playerid, ""))) || (((%3)[(%2) + 1] == ' ') && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1
now for sscanf
Код:
stock sscanf(string[], format[], {Float,_}:...) { #if defined isnull if (isnull(string)) #else if (string[0] == 0 || (string[0] == 1 && string[1] == 0)) #endif { return format[0]; } #pragma tabsize 4 new formatPos = 0, stringPos = 0, paramPos = 2, paramCount = numargs(), delim = ' '; while (string[stringPos] && string[stringPos] <= ' ') { stringPos++; } while (paramPos < paramCount && string[stringPos]) { switch (format[formatPos++]) { case '\0': { return 0; } case 'i', 'd': { new neg = 1, num = 0, ch = string[stringPos]; if (ch == '-') { neg = -1; ch = string[++stringPos]; } do { stringPos++; if ('0' <= ch <= '9') { num = (num * 10) + (ch - '0'); } else { return -1; } } while ((ch = string[stringPos]) > ' ' && ch != delim); setarg(paramPos, 0, num * neg); } case 'h', 'x': { new num = 0, ch = string[stringPos]; do { stringPos++; switch (ch) { case 'x', 'X': { num = 0; continue; } case '0' .. '9': { num = (num << 4) | (ch - '0'); } case 'a' .. 'f': { num = (num << 4) | (ch - ('a' - 10)); } case 'A' .. 'F': { num = (num << 4) | (ch - ('A' - 10)); } default: { return -1; } } } while ((ch = string[stringPos]) > ' ' && ch != delim); setarg(paramPos, 0, num); } case 'c': { setarg(paramPos, 0, string[stringPos++]); } case 'f': { setarg(paramPos, 0, _:floatstr(string[stringPos])); } case 'p': { delim = format[formatPos++]; continue; } case '\'': { new end = formatPos - 1, ch; while ((ch = format[++end]) && ch != '\'') {} if (!ch) { return -1; } format[end] = '\0'; if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1) { if (format[end + 1]) { return -1; } return 0; } format[end] = '\''; stringPos = ch + (end - formatPos); formatPos = end + 1; } case 'u': { new end = stringPos - 1, id = 0, bool:num = true, ch; while ((ch = string[++end]) && ch != delim) { if (num) { if ('0' <= ch <= '9') { id = (id * 10) + (ch - '0'); } else { num = false; } } } if (num && IsPlayerConnected(id)) { setarg(paramPos, 0, id); } else { #if !defined foreach #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2)) #define __SSCANF_FOREACH__ #endif string[end] = '\0'; num = false; new name[MAX_PLAYER_NAME]; id = end - stringPos; foreach (Player, playerid) { GetPlayerName(playerid, name, sizeof (name)); if (!strcmp(name, string[stringPos], true, id)) { setarg(paramPos, 0, playerid); num = true; break; } } if (!num) { setarg(paramPos, 0, INVALID_PLAYER_ID); } string[end] = ch; #if defined __SSCANF_FOREACH__ #undef foreach #undef __SSCANF_FOREACH__ #endif } stringPos = end; } case 's', 'z': { new i = 0, ch; if (format[formatPos]) { while ((ch = string[stringPos++]) && ch != delim) { setarg(paramPos, i++, ch); } if (!i) { return -1; } } else { while ((ch = string[stringPos++])) { setarg(paramPos, i++, ch); } } stringPos--; setarg(paramPos, i, '\0'); } default: { continue; } } while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ') { stringPos++; } while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' ')) { stringPos++; } paramPos++; } do { if ((delim = format[formatPos++]) > ' ') { if (delim == '\'') { while ((delim = format[formatPos++]) && delim != '\'') {} } else if (delim != 'z') { return delim; } } } while (delim > ' '); return 0; }
How to use dcmd
dcmd is way better than regular command text, but it is also confusing. For the explode thing you want to do, its the best though.
Код:
dcmd(boom, 4, cmdtext);
Код:
dcmd_boom(playerid, params[]) { new id, str[128], Float:posX, Float:posY, Float:posZ, pname[24], tname[24]; //if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xFF0000AA, "Admins command only"); if(sscanf(params, "i", id)) return SendClientMessage(playerid, 0xFF0000AA, "USAGE: /boom (player ID)"); if(!IsPlayerConnected(id)) return SendClientMessage(playerid, 0xFF0000AA, "That player is not online"); GetPlayerPos(id, posX, posY, posZ); CreateExplosion(posX, posY, posZ, 7, 10.0); GetPlayerName(playerid, pname, sizeof(pname)); GetPlayerName(id, tname, sizeof(tname)); format(str, sizeof(str), "%s exploded %s", pname, tname); SendClientMessageToAll(0xf0f080EE, str); return 1;
note: this will let anyone type /boom <player ID> and it will explode that player. however, if you take away the // up in the code, it will make it to where only admins may use that command. :P