PDA

Просмотр полной версии : [Вопрос] Выдача администратора



Unknown
27.08.2014, 16:45
прописываю админку себе, все нормально, а если кому то то.. сервер крашит..


[debug] Server crashed while executing Excellent.amx
[27/08/2014 17:40:21] [debug] AMX backtrace:
[debug] #0 native format () from samp-server.exe
[debug] #1 000bded4 in SFM (playerid=0, color=869072895, fstring[]=@0x001b26c8 "", ... <2 arguments>) at C:\****\***\****\*** ---\gamemodes\*****.pwn:9611
[debug] #2 00133634 in public OnPlayerCommandText (playerid=0, cmdtext[]=@0x0020a4c0 "/makeadmin 1 6") at C:\****\****\****\**-** ---\gamemodes\****.pwn:15224
[27/08/2014 17:40:21] [debug] Native backtrace:
[debug] #0 0046c3c0 in ?? () from samp-server.exe

вот строки..

9611

n += BYTES_PER_CELL;
15224

if(PlayerInfo[para1][pDostup] >= 1)

вот сток от 9611


stock SFM(playerid, color, fstring[], {Float, _}:...)
{
static const
STATIC_ARGS = 3,
BYTES_PER_CELL = cellbits / 8;
new
n = (numargs() - STATIC_ARGS) * BYTES_PER_CELL;
if (n)
{
new message[128],arg_start,arg_end;
#emit CONST.alt fstring
#emit LCTRL 5
#emit ADD
#emit STOR.S.pri arg_start

#emit LOAD.S.alt n
#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 fstring
#emit PUSH.C 128
#emit PUSH.ADR message
n += BYTES_PER_CELL * 3;
#emit PUSH.S n
#emit SYSREQ.C format

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);
}
}


а это сама команда /makeadmin


if(strcmp(cmd, "/makeadmin", true) == 0)
{
if(PlayerInfo[playerid][pAdmin] < 6) return error(playerid, "Нет прав на использование команды.");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return error(playerid, "/makeadmin [ ID игрока / Nick игрока ] [ Уровень Администрирования ]");
new para1, level;
para1 = ReturnUser(tmp);
tmp = strtok(cmdtext, idx);
level = strval(tmp);
if(level > 6 || level < 0) return error(playerid, "От 0 до 6.");
if(!IsPlayerConnected(para1)) return SendClientMessage(playerid, COLOR_WHITE, "Этот игрок не подключен к серверу.");
if(PlayerInfo[para1][pHelper] >= 1) return SendClientMessage(playerid, COLOR_WHITE, "Этот игрок Помощник.");
if(para1 == INVALID_PLAYER_ID) return SendClientMessage(playerid, COLOR_WHITE, "Указан неверный ID игрока.");
GetPlayerName(para1, giveplayer, sizeof(giveplayer));
GetPlayerName(playerid, sendername, sizeof(sendername));
if(PlayerInfo[para1][pDostup] <= 0)
{
PlayerInfo[para1][pDostup] = 117546+random(5364);
PlayerInfo[para1][pAdmin] = level;
format(string, sizeof(string), "%s назначил тебя до %d-го уровня Администрирования.", sendername,level);
SendClientMessage(para1, COLOR_LIGHTBLUE, string);
format(string,sizeof(string),"Ваш пароль от входа в Административную панель >> {ecca63}%d {FFFFFF}<<",PlayerInfo[para1][pDostup]);
SendClientMessage(para1, COLOR_WHITE, string);
SFM(playerid,COLOR_LIGHTBLUE,"Вы повысили/понизили %s до %d уровня Администрирования.", giveplayer,level);
}
if(PlayerInfo[para1][pDostup] >= 1)
{
PlayerInfo[para1][pAdmin] = level;
format(string, sizeof(string), "Администратор %s назначил Вас до %d уровня Администрирования.", sendername, level);
SendClientMessage(para1, COLOR_LIGHTBLUE, string);
SFM(playerid,COLOR_LIGHTBLUE,"Вы назначили %s до %d уровня Администрирования.", giveplayer,level);
return true;
}
return true;
}

L0ndl3m
27.08.2014, 18:58
Рекомендую использовать стандартную функцию для форматирования строк: format.
Если грамотно использовать, то практически никогда не возникнет проблем с форматированием.


SFM(playerid,COLOR_LIGHTBLUE,"Вы повысили/понизили %s до %d уровня Администрирования.", giveplayer,level);
на


format(string, sizeof(string), "Вы повысили/понизили %s до %d уровня Администрирования.", giveplayer, level);
SendClientMessage(playerid, COLOR_LIGHTBLUE, string);

так же

SFM(playerid,COLOR_LIGHTBLUE,"Вы назначили %s до %d уровня Администрирования.", giveplayer,level);
на


format(string, sizeof(string), "Вы назначили %s до %d уровня Администрирования.", giveplayer, level);
SendClientMessage(playerid, COLOR_LIGHTBLUE, string);