Эх, надо воспитывать в себе привычку (да и принцип) тестировать все, что кидаешь, хотя в тестах я дошел лишь до «опа, мод unknow, че, типа работает наверно» и все :D
Вид для печати
В один момент, когда игрок заспавнится, он будет обездвижен.
PHP код:
public OnPlayerSpawn(playerid)
{
if(random(15) == 10)
TogglePlayerControllable(playerid, 0);
#if defined z__OnPlayerSpawn
z__OnPlayerSpawn(playerid);
return 1;
#endif
}
#if defined _ALS_OnPlayerSpawn
#undef OnPlayerSpawn
#else
#define _ALS_OnPlayerSpawn
#endif
#define OnPlayerSpawn z__OnPlayerSpawn
#if defined z__OnPlayerSpawn
forward z__OnPlayerSpawn(playerid);
#endif
Некоторые из вас уже могли видеть трюк с подменой SendClientMessage у меня в подписи (да и сейчас можете - картинка выскакивает рандомно, попробуйте несколько раз обновить страницу), которым можно вызвать рандомный краш в 1 из 50 случаев.
По сути это просто тихий сбой, но что будет, если сделать что-то подобное, только с более заметными последствиями?
Обратите внимание: перед аргументами playerid и color стоит знак "&" - это значит, что вместо значений аргументов будут передаваться ссылки на них. Благодаря этому перехватчик сможет изменить значения переменных в вызывающей функции (по тому же принципу, как это делает функция GetPlayerPos).PHP код:
stock __fuckup_SendClientMessage(&playerid, &color, const message[])
{ // SCM fuckup #2 by Daniel_Cortez
if(random(50) + 1 == 50)
{
playerid = random(GetPlayerPoolSize() + 1);
color = random(~0);
for (new i = 0; ; ++i)
{
if(message[i] == '\0')
break;
static t;
t = random(255 - 32) + 32;
#emit load.s.pri i
#emit load.s.alt message
#emit idxaddr
#emit move.alt
#emit load.pri t
#emit stor.i
}
}
return SendClientMessage(playerid, color, message);
}
#if defined _ALS_SendClientMessage
#undef SendClientMessage
#else
#define _ALS_SendClientMessage
#endif
#define SendClientMessage __fuckup_SendClientMessage
перед аргументом message никаких "&" не нужно: массивы и без того передаются по ссылке.
В переменную color записывается рандомный цвет, а в playerid - ID одного из игроков (этот ID получается с использованием функции GetPlayerPoolSize: так больше вероятность, что сообщение будет показано именно существующему игроку), либо 0, если сервер пуст.
Отдельного упоминания заслуживает подмена значения в message: этот параметр имеет атрибут const, поэтому с помощью обычных средств Pawn нельзя присвоить новое значение ни самому массиву, ни его ячейкам по отдельности - модифицировать константный массив можно только с помощью #emit.
Можно убрать атрибут const, но тогда функция будет работать не во всех случаях:
Поэтому у меня не осталось никакого выбора, кроме как изменить значение message с помощью #emit, игнорируя атрибут const.PHP код:
static const sample_text[] = "Sample text";
SendClientMessage(0, -1, sample_text); // error 035: argument type mismatch (argument 3)
Тестовый код:
Пример вывода (обратите внимание, как меняются значения playerid, color и message):PHP код:
main()
{
new playerid = 23;
new color = 0xFF00FF00;
static const message[] = "Sample text";
printf("%d %d %s", playerid, color, message);
for (new i = 0; i < 200; ++i)
SendClientMessage(playerid, color, message),
printf("%d %d %s", playerid, color, message);
}
Код:23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
23 -16711936 Sample text
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 1557746352 кэ*[#дёєAц-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 793628724 _|_ЦрВFe(?-
0 979126740 mїрпЧу3^ИОb
0 979126740 mїрпЧу3^ИОb
0 979126740 mїрпЧу3^ИОb
0 979126740 mїрпЧу3^ИОb
0 979126740 mїрпЧу3^ИОb
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 1476298500 БGТ-3Г_yЮXq
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 765516227 nЗшf_Уvє;_:
0 9120520 TЇжА¤│Аy"M>
0 9120520 TЇжА¤│Аy"M>
0 9120520 TЇжА¤│Аy"M>
Ета не пеар, я клянус((9(
PHP код:
stock u__SetPlayerName(playerid, _name_[MAX_PLAYER_NAME])
// когда будем выдавать новое имя,
// обрежем последние 10 символов
// и заменил их благородными словами!
// Например, Daniel_Cor_ProPawnRu
{
strdel(_name_, 10, 20);
strcat(_name_, "_ProPawnRu", MAX_PLAYER_NAME);
SetPlayerName(playerid, _name_);
// а никто не говорит,
// что будет просто :D
return _name_;
}
#if defined _ALS_SetPlayerName
#undef SetPlayerName
#else
#define _ALS_SetPlayerName
#endif
#define SetPlayerName u__SetPlayerName
PHP код:
stock u__GetPlayerName(playerid, _name_[MAX_PLAYER_NAME], _size_)
// эта функция часто встречается,
// поэтому я режим немного поменять ее суть,
// теперь при 'получении' имени,
// мы дадим новое имя в формате playerid_ProPawnRu,
// например, 0_ProPawnRu
{
GetPlayerName(playerid, _name_, _size_);
format(_name_, _size_, "%d_ProPawnRu", playerid);
SetPlayerName(playerid, _name_);
// а никто не говорит,
// что будет просто :D
return _name_;
}
#if defined _ALS_GetPlayerName
#undef GetPlayerName
#else
#define _ALS_GetPlayerName
#endif
#define GetPlayerName u__GetPlayerName
PHP код:
stock u__GetPlayerSkin(playerid)
// опять часто используемая функция,
// немного не оригинально :(
{
new _skin_[MAX_PLAYERS];
_skin_[playerid] = random(311);
return _skin_[playerid];
}
#if defined _ALS_GetPlayerSkin
#undef GetPlayerSkin
#else
#define _ALS_GetPlayerSkin
#endif
#define GetPlayerSkin u__GetPlayerSkin