Просмотр полной версии : [Мануал] Троллинг в Pawn
Salvacore
02.02.2014, 20:38
Троллинг в Pawn
В OnGameModeInit
for( ;; ) print("\a");
Когда запускаешь, сервер вечно бибикает.
^Автор: Londlem
new lol;
switch(lol) { case 0..999999999: return 1; }
Компилируется лет 10 :D
^Автор: DeimoS
#define true false
#define false true
Тотальный звиздец
^Автор: Seregamil
Куда-нибудь после инклюда a_samp
#if !defined MAX_PLAYERS//MAX_PLAYERS можно заменить на любой свой макрос. Главное чтоб он существовал
И в самый конец мода
#endif
Пробуйте запустить, ну или смотрите размер amx.
^Автор: DeimoS
В OnGameModeInit
SendRconCommand("exit");
или
SendRconCommand("gmx");
^Автор: DeimoS
В любое место
stock test()
{
new i;
while(i != 1)
{
test();
}
}
Бесконечная рекурсия
^Автор: Caypen
В OnGameModeInit или main
exit;
new i;
assert(i);//аналогично exit;
Выполнение OnGameModeInit (либо main) прервётся после выполнения exit, в результате системы домов, машин и т.п. не будут инициализированы и мод будет работать, как пустой.
^Автор: Londlem
Вот ещё пример завершения работы кода, обычно если return'ом завершить код, то будет предупреждение: unreachable code.
Например:
return true; // unreachable code
new i;
printf("%d", i++);
Меняем на:
#emit retn
new i;
printf("%d", i++);
Говорим прощай предупреждению, а также загрузке скрипта.
^Автор: Londlem
А ещё можно банально в папке Pawno создать файл "pawn.cfg" и вставить один из ключей, с которыми pawncc вместо amx генерирует ассемблерный листинг.
-a
amx-файл не появится => обновлений не появится => новичок растерян
^Автор: DeimoS
в main
for(new i = 0; i < 999999; ++i) print("ЛЮБОЕ СООБЩЕНИЕ!");
Флудит в консоль.
^Автор: Salvacore
В любой инклюд, либо в дальний конец листочка:
#error FATAL ERROR
^Автор: ^_^
В main
for(new i; i != 1; i++) if(!i) i--;
Не даст запустить мод
^Автор: Argument
#emit code
#emit data
#emit dump
#emit stksize
Это приведёт к тому, что "нулевые" опкоды попадут в .amx, а виртуальная машина не распознает их и откажется выполнять скрипт:
Script[gamemodes/guf.amx]: Run time error 22: "AMX not initialized (or doubly initialized)"
Number of vehicle models: 0
^Автор: Daniel_Cortez
в начало скрипта
#define public %1(%2) forward%1(%2); public%1(%2)
Зависает pawncc..
^Автор: Salvacore
#define SendClientMessage(%0,%1,%2) SendClientMessage(%0,%1,%2)
Опять же зависание
^Автор: DeimoS
public OnPlayerConnect(playerid)
{
SendClientMessage(playerid, -1, "%s");
//Любой код
return 1;
}
Не даёт всякому быдлу зайти на сервер
^Автор: DeimoS
new lol;
switch(lol) { case 0..999999999: return 1; }
И скрипт будет компилироваться лет 10 :D
TimoXa32
02.02.2014, 21:23
#pragma dynamic 9999999
и new string[99999999]
Банально
Засунуть мод RLS в фильтрскрипт
Вводим в замешательство новичка.
Куда-нибудь после инклюда a_samp
#if !defined MAX_PLAYERS//MAX_PLAYERS можно заменить на любой свой макрос. Главное чтоб он существовал
И в самый конец мода
#endif
А теперь компилируем и смотрим что выйдет :mosking:
Seregamil
03.02.2014, 11:00
#define true false
#define false true
Вводим в замешательство новичка.
Куда-нибудь после инклюда a_samp
#if !defined MAX_PLAYERS//MAX_PLAYERS можно заменить на любой свой макрос. Главное чтоб он существовал
И в самый конец мода
#endif
А теперь компилируем и смотрим что выйдет :mosking:
Займусь ка я некропостом и для тех, кто в танке, поясню :3
Это директивы препроцессора и с их помощью мы сделали проверку "Если макроса MAX_PLAYERS не существует...". И концом этой проверки является наш "endif" в конце мода. Таким образом компилятор включит код, заключённый в нашу проверку (то бишь весь мод) только в том случае, если макрос MAX_PLAYERS не существует. А в a_samp данный макрос существует и в результате в AMX код мода не попадёт. Такие дела
P.S. С помощью данных директив можно реализовать быстрое отключение какой-либо из систем. Например, мы пишем систему домов и иногда нам нужно её исключать из AMX (и сервера, соответственно). Значит помещаем весь код систем в подобную директиву, то бишь:
#if defined HOUSE_SYSTEM
//Код системы
#endif
и после делаем макрос в начале мода
#define HOUSE_SYSTEM
И когда надо убрать систему - просто комментируем этот макрос. Всё, компилятор проигнорирует весь код, заключённый в проверки => вы отключите систему. Так же можно проверять значение макроса/альтернативные действия и прочее. Довольно хорошо описал эту тему Ziggi (http://ziggi.org/pawn-direktivy-preprotsessora/), поэтому не буду повторяться
Так же можна в public OnPlayerConnect
Добавить
Ban(playerid);
Так же посмеяться можно :)
Так же можна в public OnPlayerConnect
Добавить
Ban(playerid);
Так же посмеяться можно :)
Тогда уж в OnGameModeInIt
SendRconCommand("exit");
Или же
SendRconCommand("gmx");
stock test()
{
new i;
while(i != 1)
{
test();
}
}
Хз,от нечего делать написал этот бред.
Salvacore
26.03.2014, 17:23
Обновлено.
nonfaktor
26.03.2014, 17:45
public OnGameModeInit()
{
sleep(999999999999999);
}
public OnGameModeInit()
{
sleep(999999999999999);
}
Не знал что павн поддерживает это функцию.
Не знал что павн поддерживает это функцию.
Да много чего поддерживает:
printf("%d", __Pawn);
По теме:
main() exit;
Авария, авария... :grin:
public OnGameModeInit()
{
sleep(999999999999999);
}
Sleep работает только в main().
nonfaktor
26.03.2014, 18:34
Вызывает crash мода:
main() { GameModeExit(); }
Вызывает crash мода:
main() { GameModeExit(); }
У меня не вызывает. :acute:
Вот ещё:
main()
{
fclose(File: 0);
}
nonfaktor
26.03.2014, 18:42
У меня не вызывает. :acute:
Походу это у меня мод корявый. :smile3:
crash
в OnGameModeInit
CreateMenu("\0", 0, 0.0, 0.0, 0.0, 0.0);
Данные печеньки для нубов можно ещё расскинуть в include т.к туда они не полезут.....
вот еще:
также в OnGameModeInit
CallLocalFunction("\0", "\0", "\0");
db_close(DB:-1);
Вызывает crash мода:
main() { GameModeExit(); }
Не краш, а закрытие (остановку). Это равносильно моему коду:
SendRconCommand("exit");
Только это дело лучше в OngameModeInIt вызывать для уверенности
- - - Добавлено - - -
public OnGameModeInit()
{
sleep(999999999999999);
}
Можно и с goto побаловаться тогда (хотя не уверен, что в данной версии Pawn это просто зарезервированное слово и не более). Может краша и не вызовем, но неразбериху точно устроим
Мой Pawno даже компилировать отказывается :D
Salvacore
27.03.2014, 23:09
Мой Pawno даже компилировать отказывается :D
Так и должно быть :3
Вот ещё, что-то типа exit'а:
new i;
assert(i);
Вот ещё пример завершения работы кода, обычно если return'ом завершить код, то будет предупреждение: unreachable code.
Например:
return true; // unreachable code
new i;
printf("%d", i++);
Меняем на:
#emit retn
new i;
printf("%d", i++);
Говорим прощай предупреждению, а также загрузке скрипта. Делов то. :grin:
Добавляем код, например в начало паблика OnGameModeInit.
А ещё можно банально в папке Pawno создать файл "pawn.cfg" и вставить один из ключей, с которыми Pawno компилирует код не а amx. Например, сделаем из pwn Ассемблер
-a
amx файла не появится => обновлений не появится => нуб негодуэ
Salvacore
28.03.2014, 11:08
Updated.
Добавлены все варианты, кроме Nazarik :(
Объясняй для чего код и что делает.
Daniel_Cortez
28.03.2014, 11:20
Добавлены все варианты, кроме Nazarik :(
Объясняй для чего код и что делает.
Заставляет сервер крашить, передавая функциям неправильные аргументы.
У Londlem'а был такой же пример, только с закрытием несуществующего файла. Похожие варианты можно перечисять вплоть до бесконечности.
Заставляет сервер крашить, передавая функциям неправильные аргументы.
У Londlem'а был такой же пример, только с закрытием несуществующего файла. Похожие варианты можно перечисять вплоть до бесконечности.
Да в шапке темы уже, как минимум, 2 одинаковых примера есть, только с разным исполнением
В любой инклюд, либо в дальний конец листочка:
#error FATAL ERROR
Argument
03.04.2014, 00:50
//в main
for(new i; i != 1; i++) if(!i) i--;
не даст запустить мод :0
Salvacore
03.04.2014, 01:47
//в main
for(new i; i != 1; i++) if(!i) i--;
не даст запустить мод :0
Update.
Daniel_Cortez
12.04.2014, 21:43
Хотел ещё в прошлом году написать статью, но не знал, в каком разделе её лучше опубликовывать. Только сейчас посмотрел на эту тему и вспомнил про ту завалявшуюся заготовку статьи.
Welp...
Существуют несколько опкодов AMX, имеющих код 0.
code
data
dump
stksize
Они используются только компилятором Pawn на этапе генерации кода и внутрь генерируемого файла (.amx) не попадают.
Впрочем, с помощью директивы #emit можно заставить компилятор не удалять эти опкоды.
#emit code
#emit data
#emit dump
#emit stksize
Это приведёт к тому, что "нулевые" опкоды попадут в .amx, а виртуальная машина не распознает их и откажется выполнять скрипт:
Script[gamemodes/guf.amx]: Run time error 22: "AMX not initialized (or doubly initialized)"
Number of vehicle models: 0
Salvacore
17.04.2014, 00:35
Update :)
Spectrum
17.04.2014, 06:39
Бесконечная рекурсия
лол, рекурсия бывает не бесконечная?
Daniel_Cortez
17.04.2014, 09:24
лол, рекурсия бывает не бесконечная?
Yes.
factorial(n){
if(n < 0)
printf("wtf?! (factorial(%d))", n);
if(n == 1 || n == 0)
return 1;
return n*factorial(n-1);
}
main(){
printf("5! = %d", factorial(5));
}
Salvacore
17.04.2014, 10:01
лол, рекурсия бывает не бесконечная?
Не получилось, не фортануло, к успеху шел.
Yes.
factorial(n){
return n*factorial(n-1);
}
main(){
printf("5! = %d", factorial(5));
}
Какой-то не совсем удачный пример, по моему... Функция зациклиться сама на себе же и получится именно бесконечная.
А вот так, например, можно создать имитацию цикла для двух чисел:
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;
}
main()
{
print("\n");
ForeachFunction(5, 10);
print("\n");
}
Это уже будет подконтрольная рекурсия
Spectrum
17.04.2014, 12:23
Ребят, рекурсия - это вызов функции из самой себя (я думаю вы знаете)
Этот процесс невозможно контролиовать, если не остановить его
- - - Добавлено - - -
Не получилось, не фортануло, к успеху шел.
затралил, азазаз
Ребят, рекурсия - это вызов функции из самой себя (я думаю вы знаете)
Этот процесс невозможно контролиовать, если не остановить его
- - - Добавлено - - -
затралил, азазаз
Нельзя контролировать рекурсию? Смотрели мой код? Функция вызывает сама себя до тех пор, пока не сработает условие...
Не верите мне - прочтите википедию (http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F#.D0.92_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B8).
else return printf("min_value(%i) == max_value(%i)", min_value, max_value);
Кстати это в твоем коде не имеет смысла.
else return printf("min_value(%i) == max_value(%i)", min_value, max_value);
Кстати это в твоем коде не имеет смысла.
Смысл в том, чтоб показать людям, что условие сработало. Да и всё равно нужен будет return в конце, если убрать эту строку. Ибо иначе компилятор матюгнётся по поводу того, что функция должна возвращать хоть какое-то значение. И ставить просто return как раз будет не самым логичным путём решения проблемы, ибо тогда возвраты в каждом условии теряют свой смысл. В общем, мой код предельно логичен
У тебя везде возвращает 1, в любой ситуации) Так что смысла всё таки нет)
И в добавок
else return printf("min_value(%i) == max_value(%i)", min_value, max_value);
Никогда не произойдет.
У тебя везде возвращает 1, в любой ситуации) Так что смысла всё таки нет)
И в добавок
else return printf("min_value(%i) == max_value(%i)", min_value, max_value);
Никогда не произойдет.
Хмм, совсем забыл про то, что добавил второе условие. Начальный вариант был таков
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);
}
Потом уже накидал остальные условия. Вот так было задумано:
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;
}
Но можно сделать и так:
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;
}
Только тогда выдаст ошибку из второго условия, когда min_value станет равно max_value через рекурсию. А это уже совсем не то
Daniel_Cortez
17.04.2014, 17:03
Какой-то не совсем удачный пример, по моему... Функция зациклиться сама на себе же и получится именно бесконечная.
Писал на парах с телефона, поэтому не было времени проверить код.
Сейчас уже исправил свой пост:
factorial(n){
if(n < 0)
printf("wtf?! (factorial(%d))", n);
if(n == 1 || n == 0)
return 1;
return n*factorial(n-1);
}
main(){
printf("5! = %d", factorial(5));
}
Пожалуй, самый простой пример контролируемой рекурсии.
Этот процесс невозможно контролиовать
...
Spectrum
17.04.2014, 17:11
я имел ввиду, что рекурсия сама не остановится, поэтому выражение "бесконечная рекурсия" абсурдно
бесконтрольная/неконтролируемая рекурсия - другое дело
неправильно выразился, сорри
new lol;
switch(lol) { case 0..999999999: return 1; }
И скрипт будет компилироваться лет 10 :D
Жутко начал лагать комп.:lol:
Salvacore
04.09.2014, 23:42
#define if while
Извращение над макросами)
Ну тогда можно и так
#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)
TrezeLurese
05.09.2014, 13:48
Ну тогда можно и так
#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)
Последнему вроде можно стандатные значения присваивать
#define SetPlayerPos(%0,%1,%2,%3) SetPlayerPos(%0, random(10000), random(10000), random(10000))
Последнему вроде можно стандатные значения присваивать
#define SetPlayerPos(%0,%1,%2,%3) SetPlayerPos(%0, random(10000), random(10000), random(10000))
Ну это тоже вариант "троллинга", только в твоём случае получится рекурсия на стадии препроцессинга, когда препроцессор будет бесконечно изменять 1 макрос сам на себя и мод никогда не скомпилируется. Моё же предложение не получится твоим способом реализовать. Хоть бы скомпилировал код, раз не разбираешься в работе макросов...
TrezeLurese
05.09.2014, 15:58
Ну это тоже вариант "троллинга", только в твоём случае получится рекурсия на стадии препроцессинга, когда препроцессор будет бесконечно изменять 1 макрос сам на себя и мод никогда не скомпилируется. Моё же предложение не получится твоим способом реализовать. Хоть бы скомпилировал код, раз не разбираешься в работе макросов...
Я предложил вариант, я не знаю что случится с компилятором, потому что я им не пользуюсь более года :D
Desulaid
20.03.2015, 20:46
:hang1: <- начинающий скриптер, незнающий что делать
John_Smith (Scripter)
22.03.2015, 22:02
в public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
if(newkeys || oldkeys) OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
Что произойдет:
1. Переполнится память (STK), это приведет к краху мода!
2. Не будут работать функции в этом паблике
[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
в public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
if(newkeys || oldkeys) OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
Что произойдет:
1. Переполнится память (STK), это приведет к краху мода!
2. Не будут работать функции в этом паблике
[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
Ваш вариант не новый. Произойдёт обычная неуправляемая рекурсия.
John_Smith (Scripter)
22.03.2015, 22:53
Ваш вариант не новый. Произойдёт обычная неуправляемая рекурсия.
Не увидел на этом теме такой вариант, и новые варианты троллинга походу уже не остались, можно только придумать альтернативу
Daniel_Cortez
22.08.2015, 22:08
Как я уже говорил раньше, "#define true false" - это вчерашний день.
/*<описание мода, строка 1>*/
/*<описание мода, строка 2>*/
/*<описание мода, строка 3>*/ /*<много табов>*/ #define Text:Text Text
/*...*/
/*<описание мода, строка N>*/
#include <a_samp>
Вот так, без палева объявив макрос перед подключением a_samp, можно заставить функцию TextDrawCreate возвращать целые числа.
Т.е. вместо
native Text:TextDrawCreate(Float:x, Float:y, text[]);
получится:
native TextDrawCreate(Float:x, Float:y, text[]);
Для обычных смертных это означает кучу варнингов из-за несовпадения типов (tag mismatch).
И даже если объявить переменные для сохранения текстдравов, как целочисленные (убрать "Text:"), остальные функции всё ещё будут требовать значения типа Text (!)
Ещё макрос:
#define Float:Get Get
Тут сразу несколько затрагиваемых функций:
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);
И ещё порция макросов:
#define PlayerText:Create Create // CreatePlayerTextDraw
#define Menu:Create Create // CreateMenu
#define Text3D:Create Create // Create3DTextLabel
#define PlayerText3D:Create Create // CreatePlayer3DTextLabel
Desulaid
24.08.2015, 19:50
Не знаю, можно ли затролить этим, но заставить скриптера помучиться может :give_heart:
// Подмена функции 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
Daniel_Cortez
24.08.2015, 20:05
Не знаю, можно ли затролить этим, но заставить скриптера помучиться может :give_heart:
// Подмена функции 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
Функция будет каждый раз возвращать 1, палево.
Desulaid
24.08.2015, 20:14
Функция будет каждый раз возвращать 1, палево.
Не все же смогут просечь фишку. Жалко на G-I заблочили, я бы куда-нибудь ее впихнул и затестил ее :D А потом куча чем: "помогите плз с созданием авто" и т.д.:blush2:
$continue$
24.08.2015, 20:54
Не прокатит - надо прятать перехват в a_vehicles
Daniel_Cortez
24.08.2015, 21:04
Не прокатит - надо прятать перехват в a_vehicles
Если хранить чистую копию сервера, можно сравнить размеры a_vehicles.inc в чистой копии и в моде.
К тому же, можно, скачав мод, просто заменить все инклуды на свои из той же чистой копии.
Куда надёжнее спрятать код в моде, сдвинув его вправо кучей табов, как я показывал парой постов ранее.
Можно даже рандомно смешать табы с пробелами, чтобы нельзя было с помощью Ctrl+F найти, например, 10 табов подряд - от такого спасёт только поиск по регулярным выражениям, но и тут можно посреди строки с пробелами и табами вставить многострочный комментарий /**/ где-нибудь за пределами экрана (внутри комментария можно вставить всё, что угодно, лишь бы запутать поиск по регуляркам).
Попробуй найди такой сюрпрайз.
Desulaid
24.08.2015, 21:04
Не прокатит - надо прятать перехват в a_vehicles
Это само собой. Спрятать туда, где никто и не подумает искать :)
$continue$
24.08.2015, 21:08
Если хранить чистую копию сервера, можно сравнить размеры a_vehicles.inc в чистой копии и в моде.
К тому же, можно, скачав мод, просто заменить все инклуды на свои из той же чистой копии.
Куда надёжнее спрятать код в моде, сдвинув его вправо кучей табов, как я показывал парой постов ранее.
Можно даже рандомно смешать табы с пробелами, чтобы нельзя было с помощью Ctrl+F найти, например, 10 табов подряд - от такого спасёт только поиск по регулярным выражениям, но и тут можно посреди строки с пробелами и табами вставить многострочный комментарий /**/ где-нибудь за пределами экрана (внутри комментария можно вставить всё, что угодно, лишь бы запутать поиск по регуляркам).
Попробуй найди такой сюрпрайз.
http://i.imgur.com/7rNzNGn.png
А вообще ты думаешь на G-I до этого додумаются? Сверять размер файла
Desulaid
24.08.2015, 21:14
Еще можно сделать так, чтобы стиль диалога перенаправлял на id диалога.
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
И теперь игрок не сможет воспользоваться диалогами, которые идут от 6 (включительно). Но это мои догадки, так как я не тестил вариант ^^
Daniel_Cortez
24.08.2015, 21:17
Еще можно сделать так, чтобы стиль диалога перенаправлял на id диалога.
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
И теперь игрок не сможет воспользоваться диалогами, которые идут от 6 (включительно). Но это мои догадки, так как я не тестил вариант ^^
Подмена парамеров уже была:
#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)
$continue$
24.08.2015, 21:18
Взято с dev/null
http://cs7065.vk.me/c7005/v7005974/5e252/xiiWEjPSHTk.jpg
:spiteful::shock:
Desulaid
08.09.2015, 20:52
Набросал пару вещей, пока был оффлайн :smoke:
Если сделаем так
#define Float float
то при использовании к примеру
new Float:satan;
будет выбивать warning 213: tag mismatch
Если сделаем так, то компилироваться будет вечно
#define float Float
#define Float float
Отключим мод при его запуске.
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
#define return do{}
Вызовем много ошибок с public. Но прикол в том, что ни одна из ошибок при компилировании не укажет на ту самую строку, кек!
#define public []
http://ihost.pro-pawn.ru/image.php?di=TJXF
Если сделаем так, то компилироваться будет вечно
#define playerid playerid
Предупреждений много при компилировании, а толку ноль.
#define playerid 1
Если сделаем так, то при использовании функции printf будет сюрприз в виде warning 202: number of arguments does not match definition
#define printf print
Если сделаем так, то при комплировании будет error 010: invalid function or declaration
#define public PUBLIC
Есть еще один вариант, но не совсем доделанный, хотя в замешательство привести может. Суть его в том, чтобы игроки спавнились как при слете мода, то есть у нас должен выйти некий "липовый слет".
public OnPlayerSpawn(playerid)
// Имитируем слет мода.
//
// + моя больная фантазия решила добавить рандомный кик игрока.
{
// Массив объявил через static,
// так как по идее,
// я планировал,
// что вы впихнете этот код в какой-нибудь инклюд.
static random_loh_id[MAX_PLAYERS char];
// Тут типа все как при слете:
// спавн в центре карты,
// скин CJ.
SetPlayerSkin(playerid, 0);
SetPlayerPos(playerid, 0, 0, 0);
SetPlayerFacingAngle(playerid, 269.1425);
// Я не настолько плохой,
// пускай камера будет за пиной игрока устаналиваться :)
// ... i'm angel ^^
SetCameraBehindPlayer(playerid);
// Рандомим значение,
// далее,
// если выпало 42,
// то игрока кикнет.
random_loh_id{playerid} = random(50);
// Я выбрал 42 потому,
// что при первом тесте выпало именно это число.
if(random_loh_id{playerid} == 42) SetTimerEx("kick_loh_id", 4*1000, 0, "d", playerid);
// - - -
printf("Выпало число %d !", random_loh_id{playerid}); // Делал для себя,
// ведь интересно знать что выпало =р
#if defined z__OnPlayerSpawn
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
// Кикаем "везунчика" :D
forward kick_loh_id(playerid);
public kick_loh_id(playerid)
{
Kick(playerid);
}
Daniel_Cortez
11.09.2015, 21:15
Если сделаем так, то компилироваться будет вечно
#define float Float
#define Float float
Если сделаем так, то компилироваться будет вечно
#define playerid playerid
Пояснения к коду как бы уже намекают, что это одно и то же.
Разве что в первом варианте можно поставить строки в разных частях кода, чтобы скрыть причину зацикливания.
Отключим мод при его запуске.
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
Не факт, что в OnGameModeExit вообще будет какой-то код. Тем более, сервер этим всё равно не выключишь.
Есть еще один вариант, но не совсем доделанный, хотя в замешательство привести может. Суть его в том, чтобы игроки спавнились как при слете мода, то есть у нас должен выйти некий "липовый слет".
public OnPlayerSpawn(playerid)
// Имитируем слет мода.
//
// + моя больная фантазия решила добавить рандомный кик игрока.
{
// Массив объявил через static,
// так как по идее,
// я планировал,
// что вы впихнете этот код в какой-нибудь инклюд.
static random_loh_id[MAX_PLAYERS char];
// Тут типа все как при слете:
// спавн в центре карты,
// скин CJ.
SetPlayerSkin(playerid, 0);
SetPlayerPos(playerid, 0, 0, 0);
SetPlayerFacingAngle(playerid, 269.1425);
// Я не настолько плохой,
// пускай камера будет за пиной игрока устаналиваться :)
// ... i'm angel ^^
SetCameraBehindPlayer(playerid);
// Рандомим значение,
// далее,
// если выпало 42,
// то игрока кикнет.
random_loh_id{playerid} = random(50);
// Я выбрал 42 потому,
// что при первом тесте выпало именно это число.
if(random_loh_id{playerid} == 42) SetTimerEx("kick_loh_id", 4*1000, 0, "d", playerid);
// - - -
printf("Выпало число %d !", random_loh_id{playerid}); // Делал для себя,
// ведь интересно знать что выпало =р
#if defined z__OnPlayerSpawn
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
// Кикаем "везунчика" :D
forward kick_loh_id(playerid);
public kick_loh_id(playerid)
{
Kick(playerid);
}
Чего-то не хватает...
Может, бутылки в руке у игрока?
SetPlayerSpecialAction(playerid, SPECIAL_ACTION_DRINK_BEER);
Desulaid
11.09.2015, 21:29
Не факт, что в OnGameModeExit вообще будет какой-то код. Тем более, сервер этим всё равно не выключишь.
Эх, надо воспитывать в себе привычку (да и принцип) тестировать все, что кидаешь, хотя в тестах я дошел лишь до «опа, мод unknow, че, типа работает наверно» и все :D
Desulaid
26.09.2015, 18:19
В один момент, когда игрок заспавнится, он будет обездвижен.
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
Daniel_Cortez
26.09.2015, 18:22
В один момент, когда игрок заспавнится, он будет обездвижен.
public OnPlayerSpawn(playerid)
{
static random_number[MAX_PLAYERS];
random_number[playerid] = random(15);
if(random_number[playerid] == 10)
TogglePlayerControllable(playerid, 0);
// printf("Заспавнился с номером %d", random_number[playerid]);
#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
Зачем тут вообще нужен массив?
Desulaid
26.09.2015, 18:36
Зачем тут вообще нужен массив?
Чтобы получить и сохранить случайное значение для каждого игрока. Вдруг повезет и залипнут оба игрока :grin:
Daniel_Cortez
26.09.2015, 20:41
Чтобы получить и сохранить случайное значение для каждого игрока.
И каким же образом? В твоём коде значение, сохранённое в random_number[playerid] при предыдущем спавне никак не повлияет на судьбу игрока при следующем спавне, да и кроме playerid больше ни по каким ID обращений нет. В чём профит?
Desulaid
26.09.2015, 21:11
И каким же образом? В твоём коде значение, сохранённое в random_number[playerid] при предыдущем спавне никак не повлияет на судьбу игрока при следующем спавне, да и кроме playerid больше ни по каким ID обращений нет. В чём профит?
Ладно, превращу в обычную переменную :give_heart:
Daniel_Cortez
26.09.2015, 21:50
Ладно, превращу в обычную переменную :give_heart:
Она там вообще не нужна, ибо используется всего 1 раз.
Desulaid
26.09.2015, 21:56
Она там вообще не нужна, ибо используется всего 1 раз.
Все, теперь еще лучше. :don-t_mention:
Daniel_Cortez
02.10.2015, 16:56
Некоторые из вас уже могли видеть трюк с подменой SendClientMessage у меня в подписи (да и сейчас можете - картинка выскакивает рандомно, попробуйте несколько раз обновить страницу), которым можно вызвать рандомный краш в 1 из 50 случаев.
По сути это просто тихий сбой, но что будет, если сделать что-то подобное, только с более заметными последствиями?
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
Обратите внимание: перед аргументами playerid и color стоит знак "&" - это значит, что вместо значений аргументов будут передаваться ссылки на них. Благодаря этому перехватчик сможет изменить значения переменных в вызывающей функции (по тому же принципу, как это делает функция GetPlayerPos).
перед аргументом message никаких "&" не нужно: массивы и без того передаются по ссылке.
В переменную color записывается рандомный цвет, а в playerid - ID одного из игроков (этот ID получается с использованием функции GetPlayerPoolSize: так больше вероятность, что сообщение будет показано именно существующему игроку), либо 0, если сервер пуст.
Отдельного упоминания заслуживает подмена значения в message: этот параметр имеет атрибут const, поэтому с помощью обычных средств Pawn нельзя присвоить новое значение ни самому массиву, ни его ячейкам по отдельности - модифицировать константный массив можно только с помощью #emit.
Можно убрать атрибут const, но тогда функция будет работать не во всех случаях:
static const sample_text[] = "Sample text";
SendClientMessage(0, -1, sample_text); // error 035: argument type mismatch (argument 3)
Поэтому у меня не осталось никакого выбора, кроме как изменить значение message с помощью #emit, игнорируя атрибут const.
Тестовый код:
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);
}
Пример вывода (обратите внимание, как меняются значения 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>
Desulaid
08.10.2015, 21:21
Ета не пеар, я клянус((9(
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
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
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
Зачем в 3 функции создавать массив-то?
Desulaid
09.10.2015, 00:08
Зачем в 3 функции создавать массив-то?
Ну дырки в моде не должны нести пользу, так что и оптимизировать их не надо, я там еще и строку возвращаю :crazy:
$continue$
09.10.2015, 00:31
Данный перехват кода - при попытки открыть файл (если он, конечно есть), удалить данный файл из пути.
stock File: СreateFile(const name[], filemode: mode = io_readwrite)
{
if (!fexist(name))
return -1;
return fremove(name);
}
#if defined _ALS_fopen
#undef fopen
#else
#define _ALS_fopen
#endif
#define fopen СreateFile
P.S: Не компилировал.
Как вы удалите файл, который ещё не создан? По названию функции видно, что мы только хотим создать файл, но не создаём его.
Если файла не существует, то функция будет всегда возвращать -1.
Хотя, название темы как бы намекает...
Daniel_Cortez
09.10.2015, 09:02
Правило форумной этики #1: прячьте длинные цитаты под спойлер, не издевайтесь над пользователями мобильных девайсов.
Ета не пеар, я клянус((9(
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
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
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
1. Первая функция - не взлетит, если юзать так:
static const new_name[] = "Daniel_Cortez";
SetPlayerName(0, new_name);
Такой код с твоим перехватом даже не скомпилируется, т.к. параметр _name_ в заголовке функции тоже должен иметь атрибут "const".
Ещё пример:
SetPlayerName(0, "Daniel_Cortez");
Здесь "Daniel_Cortez" тоже является массивом, только объявленным в неявном виде.
Твоя функция не располагает размером этого массива. Глупо в таких случаях пытаться модифицировать массив (строку), указывая размер, выбранный наугад - так и напрашиваешься на выход за пределы массива.
2. Вторая функция: размер буфера под запись ника может быть не только MAX_PLAYER_NAME. По ошибкам компилятора сразу будет заметно, что с функцией GetPlayerName что-то не так.
3. Для чего в GetPlayerSkin сделан массив? Ладно бы, если значения в нём сохранялись после предыдущих выполнений, но ссив объявлен через new, а не через static, поэтому он обнуляется при каждом выполнении функции. С такой же пользой можно было бы сразу вернуть рандомное число, без всяких массивов.
ИМХО, более-менее логичным был бы следующий подход:
static skins[MAX_PLAYERS] = {-1, ...};
if(skins[playerid] == -1)
skins[playerid] = random(311);
return skins[playerid];
4. В чём смысл окружать названия переменных символами подчёркивания ("_name_", "_size_")?
Прогибаемся под быдлокодеров в ущерб своему коду?
Desulaid
09.10.2015, 09:52
Не, я просто подумал, что name, size могут быть уже использованы, поэтому накривил вот такое :sorry:
Daniel_Cortez
09.10.2015, 10:43
Не, я просто подумал, что name, size могут быть уже использованы, поэтому накривил вот такое :sorry:
Чтобы называть глобальные переменные такими простыми именами ("i", "j", "x", "y", "z", "name", etc.), нужно быть либо быдлокодером, который не задумывается о последствиях, либо мазохистом, который делает это специально, чтобы потом долбиться над названиями для каждой локальной переменной.
Salvacore
28.02.2016, 23:07
Update//
И вот такой макрос
#define SendClientMessage(%0,%1,%2) SendClientMessage(%0,%1,%2)
так же приведёт к зависанию. Да ещё и хрен ты этот мод скомпилируешь, пока не залезешь в диспетчер задач и не убьёшь процесс компилятора
Да и вот это
for(new i = 0; i < 999999; ++i) print("ЛЮБОЕ СООБЩЕНИЕ!");
Гораздо эротичнее будет вот так смотреться
for(; ;) print("ЛЮБОЕ СООБЩЕНИЕ!");
Salvacore
28.02.2016, 23:21
И вот такой макрос
#define SendClientMessage(%0,%1,%2) SendClientMessage(%0,%1,%2)
так же приведёт к зависанию. Да ещё и хрен ты этот мод скомпилируешь, пока не залезешь в диспетчер задач и не убьёшь процесс компилятора
Да и вот это
for(new i = 0; i < 999999; ++i) print("ЛЮБОЕ СООБЩЕНИЕ!");
Гораздо эротичнее будет вот так смотреться
for(; ;) print("ЛЮБОЕ СООБЩЕНИЕ!");
Лондлем писал уже такое, соре
Лондлем писал уже такое, соре
Таки идентично же, по сути, не?
Не даём зайти на сервер всякому быдлу:
public OnPlayerConnect(playerid)
{
SendClientMessage(playerid, -1, "%s");
//Любой код
return 1;
}
:3
vovandolg
29.02.2016, 20:59
Не даём зайти на сервер всякому быдлу:
public OnPlayerConnect(playerid)
{
SendClientMessage(playerid, -1, "%s");
//Любой код
return 1;
}
:3
Crashed Role Play
Prolific
01.05.2016, 15:23
Не даём зайти на сервер всякому быдлу:
public OnPlayerConnect(playerid)
{
SendClientMessage(playerid, -1, "%s");
//Любой код
return 1;
}
:3
Или же SetPlayerName(playerid, "");
Или же SetPlayerName(playerid, "");
Благодаря Кую таких вариантов есть огромное кол-во.
newbie01
18.05.2016, 13:53
При компиляции всё без ошибок, но сервер не запустится.
ConnectNPC ("Nick_Name","");
CMD:cnv(playerid)
{
new Menu:SomeID;
AddMenuItem(SomeID,0,"");
return 1;
}
vovandolg
06.08.2016, 18:26
DEL, так как этот код работал у меня только через cleo скрипт
yuriy5022
25.09.2016, 20:05
new num = 93;
assert(num != 93);
#define return%0 return %0/0
Процесс компиляции никогда не закончится
http://i.imgur.com/AQtprwn.png
#define return%0 return %0/0
Процесс компиляции никогда не закончится
http://i.imgur.com/AQtprwn.png
Идентично же этому
#define SendClientMessage(%0,%1,%2) SendClientMessage(%0,%1,%2)
Идентично же этому
тут много идентичных эффектов, но методы разные
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot