Нельзя контролировать рекурсию? Смотрели мой код? Функция вызывает сама себя до тех пор, пока не сработает условие...
Не верите мне - прочтите википедию.
Вид для печати
Нельзя контролировать рекурсию? Смотрели мой код? Функция вызывает сама себя до тех пор, пока не сработает условие...
Не верите мне - прочтите википедию.
Кстати это в твоем коде не имеет смысла.PHP код:
else return printf("min_value(%i) == max_value(%i)", min_value, max_value);
Смысл в том, чтоб показать людям, что условие сработало. Да и всё равно нужен будет return в конце, если убрать эту строку. Ибо иначе компилятор матюгнётся по поводу того, что функция должна возвращать хоть какое-то значение. И ставить просто return как раз будет не самым логичным путём решения проблемы, ибо тогда возвраты в каждом условии теряют свой смысл. В общем, мой код предельно логичен
У тебя везде возвращает 1, в любой ситуации) Так что смысла всё таки нет)
И в добавок
Никогда не произойдет.PHP код:
else return printf("min_value(%i) == max_value(%i)", min_value, max_value);
Хмм, совсем забыл про то, что добавил второе условие. Начальный вариант был таков
Потом уже накидал остальные условия. Вот так было задумано:PHP код:
stock ForeachFunction(min_value, max_value)
{
if(min_value != max_value)
{
printf("-min_value(%i) != max_value(%i)", min_value, max_value);
ForeachFunction(++min_value, max_value);
return 1;
}
else return printf("min_value(%i) == max_value(%i)", min_value, max_value);
}
Но можно сделать и так:PHP код:
stock ForeachFunction(min_value, max_value)
{
static Start;
if(max_value < min_value)
{
printf("[Error ForeachFunction]: Значение максимального аргумента меньше значения минимального (%i|%i)", min_value, max_value);
return 1;
}
else if(max_value == min_value && !Start)
{
printf("[Error ForeachFunction]: Значение максимального аргумента равно значению минимального (%i|%i)", min_value, max_value);
return 1;
}
else if(min_value != max_value)
{
Start = 1;
printf("-min_value(%i) != max_value(%i)", min_value, max_value);
ForeachFunction(++min_value, max_value);
return 1;
}
else return printf("min_value(%i) == max_value(%i)", min_value, max_value), Start = 0;
}
Только тогда выдаст ошибку из второго условия, когда min_value станет равно max_value через рекурсию. А это уже совсем не тоPHP код:
stock ForeachFunction(min_value, max_value)
{
if(max_value < min_value) printf("[Error ForeachFunction]: Значение максимального аргумента меньше значения минимального (%i|%i)", min_value, max_value);
else if(max_value == min_value) printf("[Error ForeachFunction]: Значение максимального аргумента равно значению минимального (%i|%i)", min_value, max_value);
else if(min_value != max_value)
{
printf("-min_value(%i) != max_value(%i)", min_value, max_value);
ForeachFunction(++min_value, max_value);
}
return 1;
}
я имел ввиду, что рекурсия сама не остановится, поэтому выражение "бесконечная рекурсия" абсурдно
бесконтрольная/неконтролируемая рекурсия - другое дело
неправильно выразился, сорри
Извращение над макросами)PHP код:
#define if while
Ну тогда можно и так
PHP код:
#define ShowPlayerDialog(%0,%1,%2,%3,%4,%5,%6) SendClientMessage(%0, -1, %4)
stock SetPlayerPosEx_(playerid) return SetPlayerPos(playerid, random(10000), random(10000), random(10000));
#define SetPlayerPos(%0,%1,%2,%3) SetPlayerPosEx_(%0)
Ну это тоже вариант "троллинга", только в твоём случае получится рекурсия на стадии препроцессинга, когда препроцессор будет бесконечно изменять 1 макрос сам на себя и мод никогда не скомпилируется. Моё же предложение не получится твоим способом реализовать. Хоть бы скомпилировал код, раз не разбираешься в работе макросов...
:hang1: <- начинающий скриптер, незнающий что делать
в public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
Что произойдет:PHP код:
if(newkeys || oldkeys) OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
1. Переполнится память (STK), это приведет к краху мода!
2. Не будут работать функции в этом паблике
PHP код:
[23:04:44] [debug] #98 00019ed0 in public OnPlayerKeyStateChange (0, 8, 0) from new.amx
[23:04:44] [debug] #99 00019ed0 in public OnPlayerKeyStateChange (0, 8, 0) from new.amx
[23:04:44] [debug] #100 00019ed0 in public OnPlayerKeyStateChange (0, 8, 0) from new.amx
[23:04:45] [debug] Run time error 3: "Stack/heap collision (insufficient stack size)"
[23:04:45] [debug] Stack pointer (STK) is 0xA6984, heap pointer (HEA) is 0xA6948
[23:04:45] [debug] AMX backtrace:
[23:04:45] [debug] #0 000190b8 in public OnPlayerKeyStateChange (0, 0, 8) from new.amx
[23:04:45] [debug] #1 00019ed0 in public OnPlayerKeyStateChange (0, 0, 8) from new.amx
[23:04:45] [debug] #2 00019ed0 in public OnPlayerKeyStateChange (0, 0, 8) from new.amx
[23:04:45] [debug] #3 00019ed0 in public OnPlayerKeyStateChange (0, 0, 8) from new.amx
Не увидел на этом теме такой вариант, и новые варианты троллинга походу уже не остались, можно только придумать альтернативуЦитата:
Ваш вариант не новый. Произойдёт обычная неуправляемая рекурсия.
Как я уже говорил раньше, "#define true false" - это вчерашний день.
Вот так, без палева объявив макрос перед подключением a_samp, можно заставить функцию TextDrawCreate возвращать целые числа.PHP код:
/*<описание мода, строка 1>*/
/*<описание мода, строка 2>*/
/*<описание мода, строка 3>*/ /*<много табов>*/ #define Text:Text Text
/*...*/
/*<описание мода, строка N>*/
#include <a_samp>
Т.е. вместо
получится:PHP код:
native Text:TextDrawCreate(Float:x, Float:y, text[]);
Для обычных смертных это означает кучу варнингов из-за несовпадения типов (tag mismatch).PHP код:
native TextDrawCreate(Float:x, Float:y, text[]);
И даже если объявить переменные для сохранения текстдравов, как целочисленные (убрать "Text:"), остальные функции всё ещё будут требовать значения типа Text (!)
Ещё макрос:
Тут сразу несколько затрагиваемых функций:PHP код:
#define Float:Get Get
PHP код:
native Float:GetSVarFloat(varname[]);
native Float:GetPlayerDistanceFromPoint(playerid, Float:X, Float:Y, Float:Z);
native Float:GetPVarFloat(playerid, varname[]);
native Float:GetPlayerCameraAspectRatio(playerid);
native Float:GetPlayerCameraZoom(playerid);
native Float:GetVehicleDistanceFromPoint(vehicleid, Float:X, Float:Y, Float:Z);
И ещё порция макросов:
PHP код:
#define PlayerText:Create Create // CreatePlayerTextDraw
#define Menu:Create Create // CreateMenu
#define Text3D:Create Create // Create3DTextLabel
#define PlayerText3D:Create Create // CreatePlayer3DTextLabel
Не знаю, можно ли затролить этим, но заставить скриптера помучиться может :give_heart:
PHP код:
// Подмена функции CreateVehicle.
// Теперь эта функция не создает авто, а удаляет его.
stock z_CreateVehicle(vehicletype, Float:x, Float:y, Float:z, Float:rotation, color1, color2, respawn_delay, addsiren)
{
return DestroyVehicle(CreateVehicle(vehicletype, Float:x, Float:y, Float:z, Float:rotation, color1, color2, respawn_delay, addsiren));
}
#define CreateVehicle z_CreateVehicle
Не прокатит - надо прятать перехват в a_vehicles
Если хранить чистую копию сервера, можно сравнить размеры a_vehicles.inc в чистой копии и в моде.
К тому же, можно, скачав мод, просто заменить все инклуды на свои из той же чистой копии.
Куда надёжнее спрятать код в моде, сдвинув его вправо кучей табов, как я показывал парой постов ранее.
Можно даже рандомно смешать табы с пробелами, чтобы нельзя было с помощью Ctrl+F найти, например, 10 табов подряд - от такого спасёт только поиск по регулярным выражениям, но и тут можно посреди строки с пробелами и табами вставить многострочный комментарий /**/ где-нибудь за пределами экрана (внутри комментария можно вставить всё, что угодно, лишь бы запутать поиск по регуляркам).
Попробуй найди такой сюрпрайз.
http://i.imgur.com/7rNzNGn.png
А вообще ты думаешь на G-I до этого додумаются? Сверять размер файла
Еще можно сделать так, чтобы стиль диалога перенаправлял на id диалога.
И теперь игрок не сможет воспользоваться диалогами, которые идут от 6 (включительно). Но это мои догадки, так как я не тестил вариант ^^PHP код:
stock z_ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[])
{
/*
style = dialogid;
return ShowPlayerDialog(playerid, dialogid, style, caption, info, button1, button2);
*/
return ShowPlayerDialog(playerid, style, style, caption, info, button1, button2);
}
#define ShowPlayerDialog z_ShowPlayerDialog
// Player GUI Dialog
#define DIALOG_STYLE_MSGBOX 0
#define DIALOG_STYLE_INPUT 1
#define DIALOG_STYLE_LIST 2
#define DIALOG_STYLE_PASSWORD 3
#define DIALOG_STYLE_TABLIST 4
#define DIALOG_STYLE_TABLIST_HEADERS 5
Взято с dev/null
http://cs7065.vk.me/c7005/v7005974/5...iiWEjPSHTk.jpg
:spiteful::shock:
Набросал пару вещей, пока был оффлайн :smoke:
- Если сделаем так
то при использовании к примеруPHP код:
#define Float float
будет выбивать warning 213: tag mismatchPHP код:
new Float:satan;
- Если сделаем так, то компилироваться будет вечно
PHP код:
#define float Float
#define Float float
- Отключим мод при его запуске.
PHP код:
public OnGameModeInit()
// Выключим мод при его включении
// (читать зловещим смехом)
// УВАХАХААХАХААХАХАХАХАХАХАХА
{
OnGameModeExit();
#if defined z__OnGameModeInit
return 1;
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit z__OnGameModeInit
#if defined z__OnGameModeInit
forward z__OnGameModeInit();
#endif
- И будут все искать проблему с do..while
PHP код:
#define return do{}
- Вызовем много ошибок с public. Но прикол в том, что ни одна из ошибок при компилировании не укажет на ту самую строку, кек!
PHP код:
#define public []
- Если сделаем так, то компилироваться будет вечно
PHP код:
#define playerid playerid
- Предупреждений много при компилировании, а толку ноль.
PHP код:
#define playerid 1
- Если сделаем так, то при использовании функции printf будет сюрприз в виде warning 202: number of arguments does not match definition
PHP код:
#define printf print
- Если сделаем так, то при комплировании будет error 010: invalid function or declaration
PHP код:
#define public PUBLIC
- Есть еще один вариант, но не совсем доделанный, хотя в замешательство привести может. Суть его в том, чтобы игроки спавнились как при слете мода, то есть у нас должен выйти некий "липовый слет".
Пояснения к коду как бы уже намекают, что это одно и то же.
Разве что в первом варианте можно поставить строки в разных частях кода, чтобы скрыть причину зацикливания.
Не факт, что в OnGameModeExit вообще будет какой-то код. Тем более, сервер этим всё равно не выключишь.
Чего-то не хватает...
Может, бутылки в руке у игрока?
PHP код:
SetPlayerSpecialAction(playerid, SPECIAL_ACTION_DRINK_BEER);
В один момент, когда игрок заспавнится, он будет обездвижен.
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