PDA

Просмотр полной версии : [Мануал] Троллинг в 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

DeimoS
02.02.2014, 21:01
new lol;
switch(lol) { case 0..999999999: return 1; }
И скрипт будет компилироваться лет 10 :D

TimoXa32
02.02.2014, 21:23
#pragma dynamic 9999999
и new string[99999999]

Банально

Accord
03.02.2014, 03:11
Засунуть мод RLS в фильтрскрипт

DeimoS
03.02.2014, 10:50
Вводим в замешательство новичка.
Куда-нибудь после инклюда a_samp

#if !defined MAX_PLAYERS//MAX_PLAYERS можно заменить на любой свой макрос. Главное чтоб он существовал
И в самый конец мода

#endif
А теперь компилируем и смотрим что выйдет :mosking:

Seregamil
03.02.2014, 11:00
#define true false
#define false true

DeimoS
05.02.2014, 22:36
Вводим в замешательство новичка.
Куда-нибудь после инклюда 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/), поэтому не буду повторяться

Копюшон
22.03.2014, 22:02
Так же можна в public OnPlayerConnect
Добавить

Ban(playerid);
Так же посмеяться можно :)

DeimoS
23.03.2014, 12:16
Так же можна в public OnPlayerConnect
Добавить

Ban(playerid);
Так же посмеяться можно :)

Тогда уж в OnGameModeInIt

SendRconCommand("exit");
Или же

SendRconCommand("gmx");

Caypen
26.03.2014, 16:49
stock test()
{
new i;
while(i != 1)
{
test();
}
}
Хз,от нечего делать написал этот бред.

Salvacore
26.03.2014, 17:23
Обновлено.

nonfaktor
26.03.2014, 17:45
public OnGameModeInit()
{
sleep(999999999999999);
}

Caypen
26.03.2014, 17:53
public OnGameModeInit()
{
sleep(999999999999999);
}

Не знал что павн поддерживает это функцию.

L0ndl3m
26.03.2014, 17:55
Не знал что павн поддерживает это функцию.

Да много чего поддерживает:


printf("%d", __Pawn);

По теме:


main() exit;

Авария, авария... :grin:

^_^
26.03.2014, 18:12
public OnGameModeInit()
{
sleep(999999999999999);
}
Sleep работает только в main().

nonfaktor
26.03.2014, 18:34
Вызывает crash мода:

main() { GameModeExit(); }

L0ndl3m
26.03.2014, 18:39
Вызывает crash мода:

main() { GameModeExit(); }

У меня не вызывает. :acute:

Вот ещё:



main()
{
fclose(File: 0);
}

nonfaktor
26.03.2014, 18:42
У меня не вызывает. :acute:

Походу это у меня мод корявый. :smile3:

Nazarik
26.03.2014, 19:44
crash

в OnGameModeInit

CreateMenu("\0", 0, 0.0, 0.0, 0.0, 0.0);

bredvix
26.03.2014, 20:02
Данные печеньки для нубов можно ещё расскинуть в include т.к туда они не полезут.....

Nazarik
26.03.2014, 20:04
вот еще:

также в OnGameModeInit

CallLocalFunction("\0", "\0", "\0");

db_close(DB:-1);

DeimoS
27.03.2014, 08:26
Вызывает crash мода:

main() { GameModeExit(); }

Не краш, а закрытие (остановку). Это равносильно моему коду:

SendRconCommand("exit");
Только это дело лучше в OngameModeInIt вызывать для уверенности

- - - Добавлено - - -



public OnGameModeInit()
{
sleep(999999999999999);
}

Можно и с goto побаловаться тогда (хотя не уверен, что в данной версии Pawn это просто зарезервированное слово и не более). Может краша и не вызовем, но неразбериху точно устроим

Chery*
27.03.2014, 23:00
Мой Pawno даже компилировать отказывается :D

Salvacore
27.03.2014, 23:09
Мой Pawno даже компилировать отказывается :D
Так и должно быть :3

L0ndl3m
27.03.2014, 23:17
Вот ещё, что-то типа exit'а:



new i;
assert(i);

L0ndl3m
28.03.2014, 00:09
Вот ещё пример завершения работы кода, обычно если return'ом завершить код, то будет предупреждение: unreachable code.

Например:



return true; // unreachable code
new i;
printf("%d", i++);


Меняем на:



#emit retn
new i;
printf("%d", i++);


Говорим прощай предупреждению, а также загрузке скрипта. Делов то. :grin:

Добавляем код, например в начало паблика OnGameModeInit.

DeimoS
28.03.2014, 07:37
А ещё можно банально в папке 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'а был такой же пример, только с закрытием несуществующего файла. Похожие варианты можно перечисять вплоть до бесконечности.

DeimoS
28.03.2014, 11:46
Заставляет сервер крашить, передавая функциям неправильные аргументы.
У Londlem'а был такой же пример, только с закрытием несуществующего файла. Похожие варианты можно перечисять вплоть до бесконечности.

Да в шапке темы уже, как минимум, 2 одинаковых примера есть, только с разным исполнением

^_^
02.04.2014, 22:07
В любой инклюд, либо в дальний конец листочка:

#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
лол, рекурсия бывает не бесконечная?
Не получилось, не фортануло, к успеху шел.

DeimoS
17.04.2014, 11:16
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
Ребят, рекурсия - это вызов функции из самой себя (я думаю вы знаете)
Этот процесс невозможно контролиовать, если не остановить его

- - - Добавлено - - -


Не получилось, не фортануло, к успеху шел.
затралил, азазаз

DeimoS
17.04.2014, 12:49
Ребят, рекурсия - это вызов функции из самой себя (я думаю вы знаете)
Этот процесс невозможно контролиовать, если не остановить его

- - - Добавлено - - -


затралил, азазаз

Нельзя контролировать рекурсию? Смотрели мой код? Функция вызывает сама себя до тех пор, пока не сработает условие...
Не верите мне - прочтите википедию (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).

Caypen
17.04.2014, 14:07
else return printf("min_value(%i) == max_value(%i)", min_value, max_value);
Кстати это в твоем коде не имеет смысла.

DeimoS
17.04.2014, 14:17
else return printf("min_value(%i) == max_value(%i)", min_value, max_value);
Кстати это в твоем коде не имеет смысла.

Смысл в том, чтоб показать людям, что условие сработало. Да и всё равно нужен будет return в конце, если убрать эту строку. Ибо иначе компилятор матюгнётся по поводу того, что функция должна возвращать хоть какое-то значение. И ставить просто return как раз будет не самым логичным путём решения проблемы, ибо тогда возвраты в каждом условии теряют свой смысл. В общем, мой код предельно логичен

Caypen
17.04.2014, 15:08
У тебя везде возвращает 1, в любой ситуации) Так что смысла всё таки нет)
И в добавок

else return printf("min_value(%i) == max_value(%i)", min_value, max_value);
Никогда не произойдет.

DeimoS
17.04.2014, 15:55
У тебя везде возвращает 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
я имел ввиду, что рекурсия сама не остановится, поэтому выражение "бесконечная рекурсия" абсурдно
бесконтрольная/неконтролируемая рекурсия - другое дело
неправильно выразился, сорри

#ball
28.07.2014, 23:15
new lol;
switch(lol) { case 0..999999999: return 1; }
И скрипт будет компилироваться лет 10 :D
Жутко начал лагать комп.:lol:

Salvacore
04.09.2014, 23:42
#define if while
Извращение над макросами)

DeimoS
05.09.2014, 12:19
Ну тогда можно и так

#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))

DeimoS
05.09.2014, 14:12
Последнему вроде можно стандатные значения присваивать

#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

L0ndl3m
22.03.2015, 22:08
в 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

L0ndl3m
08.10.2015, 23:52
Зачем в 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: Не компилировал.

L0ndl3m
09.10.2015, 08:12
Как вы удалите файл, который ещё не создан? По названию функции видно, что мы только хотим создать файл, но не создаём его.
Если файла не существует, то функция будет всегда возвращать -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//

DeimoS
28.02.2016, 23:19
И вот такой макрос

#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("ЛЮБОЕ СООБЩЕНИЕ!");

Лондлем писал уже такое, соре

DeimoS
28.02.2016, 23:24
Лондлем писал уже такое, соре

Таки идентично же, по сути, не?

DeimoS
29.02.2016, 06:25
Не даём зайти на сервер всякому быдлу:

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, "");

DeimoS
01.05.2016, 16:40
Или же SetPlayerName(playerid, "");

Благодаря Кую таких вариантов есть огромное кол-во.

newbie01
18.05.2016, 13:53
При компиляции всё без ошибок, но сервер не запустится.



ConnectNPC ("Nick_Name","");

Unreal
06.08.2016, 10:41
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);

Geebrox
21.10.2016, 12:43
#define return%0 return %0/0

Процесс компиляции никогда не закончится

http://i.imgur.com/AQtprwn.png

DeimoS
24.10.2016, 10:15
#define return%0 return %0/0

Процесс компиляции никогда не закончится

http://i.imgur.com/AQtprwn.png

Идентично же этому



#define SendClientMessage(%0,%1,%2) SendClientMessage(%0,%1,%2)

Geebrox
24.10.2016, 11:44
Идентично же этому

тут много идентичных эффектов, но методы разные