PDA

Просмотр полной версии : [Include] dc_kickfix.inc (Kick/Ban/BanEx)



Daniel_Cortez
15.11.2015, 21:29
Этот инклуд планировался к выпуску около года назад, но тогда я подумал, что кто-нибудь наверняка уже сделал что-то подобное, но с большим количеством фич. Как оказалось, нет, и было бы грех просто так выбрасывать старую работу.


Описание:

Как уже понятно из названия, этот инклуд исправляет досадную "фичу", связанную с тем, что функции Kick, Ban и BanEx начисто обрывают связь с игроком, из-за чего ему нельзя показать сообщение с причиной бана или сделать что-нибудь ещё.



Преимущества реализации:

Прозрачная замена функций Kick, Ban и BanEx.
От вас требуется лишь подключить инклуд, больше ничего изменять в моде не нужно.

Настраиваемое время задержки.
По умолчанию при вызове Kick/Ban/BanEx производится задержка в 0.5 секунды (500 мс), но эту задержку можно изменить, выставив своё время перед подключением инклуда.
Пример:


#define DC_KICKFIX_INTERVAL 1000
#include "../include/dc_kickfix.inc"


Сохранена возможность доступа к оригинальным функциям.
Для этого зарезервированы имена ImmediateKick, ImmediateBan и ImmediateBanEx, с помощью которых можно вызвать оригинальные функции SA-MP, без задержки.
Это может быть полезно для отражения атак на сервер, когда необходимо как можно быстрее избавиться от атакующего.


Пример использования:


CMD:kick(playerid, params[])
{
if(0 == IsPlayerAdmin(playerid))
return 1;
new targetid;
if(sscanf(params, "uS[126]", targetid, params))
return SendClientMessage(playerid, -1, !"Использование: /kick [ID/часть ника] {причина}");
new string[144], adm_name[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, adm_name, sizeof(adm_name);
GetPlayerName(targetid, string, sizeof(string);
format(
string, sizeof(string),
"Администратор %s кикнул игрока %s, причина: %s",
string, params
);
for(new i = GetMaxPlayers(); i-- != 0; )
if(IsPlayerAdmin(i))
SendClientMessage(i, -1, string);
format(
string, sizeof(string),
"Вы были кикнуты администратором %s, причина: %s",
adm_name, params
);
SendClientMessage(targetid, -1, string);
return Kick(targetid);
}



Скачать: https://www.dropbox.com/s/c54p003f2akgpoj/dc_kickfix.inc
Автор: Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)



Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!

$continue$
15.11.2015, 21:52
А source выложить? (На гист или пастбин)

Daniel_Cortez
18.11.2015, 07:30
А source выложить? (На гист или пастбин)
Инклуд уже залит на Dropbox, можно просто скачать и открыть его. Это не какой-то там RGhost, на котором файлы удаляются через месяц после отсутствия скачиваний.

$continue$
18.11.2015, 12:38
Скачать, что бы посмотреть сурс....

Desulaid
18.11.2015, 13:46
Скачать, что бы посмотреть сурс....

Ну не качай. Правилами не оговаривается вылаживание кода для "показа". :read:

L0ndl3m
18.11.2015, 16:45
"вылаживание", ну вы серьёзно?

Действительно, сейчас все такие ленивые, что лень скачивать готовый файл, да ещё с высокой скоростью. Будьте по умнее и выложите сами данную работу на тот хостинг, который вам удобен. А далее поделитесь ссылкой со своими единомышленниками.

Daniel_Cortez
16.12.2015, 20:26
Инклуд обновлён до версии 1.1.
В новой версии исправлено несколько багов, один из них описан здесь: http://pro-pawn.ru/showthread.php?13007

duck_123
27.01.2016, 02:56
Возникли вопросы.
Зачем #emit?
Зачем в ф-ии __dc_kickfix__DoBan(const playerid) аргумент указан как const? Как-будто playerid изменится во время выполнения.
К чему столько земли в коде? Как буд-то у кого-то явно совпадут имена переменных или ф-ий.
Далее. Зачем goto в таком казалось простом коде?
__Pawn. Никто не запрещает использовать данную константу, но это просто пипец в данном случае).
Почему в коде комментарии на английском? Ты же выложил сюда, понимая, что здесь больше половины пользователей английский могут и не знать.
+ Ещё заметил что-то про Kalcor_а было написано, переводчик мне перевёл слово "Blame" как "Обвинение", "Порицание".
Вообщем всё обсуждение данного кода сводится к тому, что без всяких этих штучек можно реализовать чистый, понятный, оптимизированный код.

Daniel_Cortez
27.01.2016, 12:21
Зачем #emit?

Как знал, что кто-нибудь про это спросит, и специально для таких случаев оставил чуть выше закомментированной строку "SetPVarString(...);".
Ок, начнём. Скомпилируйте такой код:


#include <a_samp>
#include "../include/dc_kickfix.inc"

main()
{
static const reason[] = "test";
BanEx(0, reason);
}

С оригинальным dc_kickfix.inc никаких ошибок не будет (если вы храните инклуд в папке "include", а не в "pawno/include", разумеется, иначе можете просто указать "#include <dc_kickfix>").
А теперь найдите те строки с #emit, к которым вы придираетесь, закомментируйте их и расскомментируйте чуть выше строку

//SetPVarString(playerid, str__dc_kickfix__reason, reason);
Попробуйте снова скомпилировать код. Не получилось? То-то и оно.
Я специально поставил в параметре reason атрибут const, чтобы перехват работал во всех случаях, в которых работает оригинальная функция BanEx.
Но функция SetPVarString не принимает строки с атрибутом const (компилятор выдаёт ошибку), поэтому пришлось сделать вызов этой функции через #emit.
Btw, именно об этом уже написано в комментарии внутри функции-перехватчика:


// "reason" argument should be defined with a "const" qualifier,
// as in original, but it can't be used in SetPVarString directly.





К чему столько земли в коде? Как буд-то у кого-то явно совпадут имена переменных или ф-ий.

Да, они могут совпасть, потому что никто и ничто этого не запрещает. У функций-перехватчиков должно быть своё уникальное имя, которое больше нигде не встретится (если только не сделать функцию с точно таким же именем намеренно).
Я не хочу, чтобы мои работы создавали проблемы при совместном использовании с чужими работами, которые тоже могут перехватывать функции Kick/Ban/BanEx. И уж тем более, я не собираюсь наблюдать, как люди флудят в темах с моими работами логами ошибок от компилятора, и разъяснять индивидуально каждому, как исправить эти ошибки.
У меня нет никаких рычагов перевентивного воздействия на тех, кто пользуются моими работами, поэтому вполне разумно перестраховываться самому.




Зачем в ф-ии __dc_kickfix__DoBan(const playerid) аргумент указан как const? Как-будто playerid изменится во время выполнения.

Я работаю над проектами не только на Pawn, но и над другими, на C/C++, не связанными с SA:MP. Код в таких проектах куда сложнее, и можно ожидать чего угодно, поэтому логично перестраховываться и указывать атрибут const там, где это возможно (это уже помогло избежать нескольких ошибок, на которые компилятор не указал бы без const).
Касаемо причины указания const в @__dc_kickfix__DoBan и других таймерных коллбэках, то это, скорее всего, привычка, приобретённая от работы над теми проектами, но на производительности это никак не сказывается (ИМХО, на читаемости кода тоже).




Далее. Зачем goto в таком казалось простом коде?

Чтобы не тратить время на инициализацию массива reason нулями.


goto skip_array_init;
new reason[128];
skip_array_init:

Подробно этот трюк описан здесь: http://pro-pawn.ru/showthread.php?5249&p=62879&viewfull=1#post62879
Экономия не сильно большая, но для фикса всё же важно, чтобы он создавал как можно меньше дополнительной нагрузки.




__Pawn. Никто не запрещает использовать данную константу, но это просто пипец в данном случае).

Как я уже сказал ранее, я вынужден был сделать вызов SetPVarString через #emit, но компилятор может крашнуть, если эту функцию не использовать ранее в коде на чистом Pawn.
Именно поэтому я поставил if с условием, которое никогда не выполняется, и внутри этой конструкции сделал вызов SetPVarString без #emit, чтобы обойти проблему с багом компилятора.
Тем не менее, в новой версии компилятора от Zeex этот баг был исправлен, поэтому там обход проблемы с sysreq.c не нужен, и я сделал его опциональным, добавив вокруг него "#if __Pawn < 0x030A" / "#endif", чтобы в новой версии в AMX не попадал лишний код.




+ Ещё заметил что-то про Kalcor_а было написано, переводчик мне перевёл слово "Blame" как "Обвинение", "Порицание".

Это связано с уже описанной выше проблемой в SetPVarString.
И да, я виню Kalcor'а в том, что он даже раз в год не может исправить свои же баги, из-за которых мне (да и многим другим тоже) приходится костылизировать свой код. Что-то имеете против?




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

Хорошо, попробуйте сделать свою "понятную и оптимизированную" реализацию, не имеющую всех тех изъянов, которые устранены в моём инклуде (все они описаны выше). Тогда и поговорим.

Daniel_Cortez
10.02.2016, 22:14
Инклуд обновлён до версии 1.3.
Исправлен баг с крашем стокового (стандартного) компилятора Pawn от SA:MP team (спасибо DeimoS за багрепорт).
Также добавлено больше комментариев для пояснения тех или иных фич в коде.

Nexius_Tailer
17.02.2016, 15:16
Спасибо, BanEx с задержкой как раз искал.
Упс, а в инклуде, кажется, версия ещё 1.2

И да, проверки типо


if(0 == IsPlayerConnected(playerid))

читать не удобно, лучше по моему наоборот поставить.

vovandolg
17.05.2016, 01:28
Открыл логули на ночь, а там:

[12:48:47] [join] Alex_Smirnow has joined the server (4:212.22.64.235)
[12:48:49] [kill] Andrij_Xula killed Igor_Dikun Shotgun
[12:49:54] [debug] Run time error 4: "Array index out of bounds"
[12:49:54] [debug] Accessing element at index 65535 past array upper bound 99
[12:49:54] [debug] AMX backtrace:
[12:49:54] [debug] #0 0007fa44 in public ppb_OnPlayerDisconnect (1, 2) from beta.amx
[12:49:54] [debug] #1 00008228 in public Iter_OnPlayerDisconnect (1, 2) from beta.amx
[12:49:54] [debug] #2 native CallLocalFunction () from samp03svr
[12:49:54] [debug] #3 00000ff8 in public OnPlayerDisconnect (1, 2) from beta.amx
[12:49:54] [debug] #4 native Kick () from samp03svr
[12:49:54] [debug] #5 00001868 in public @__dc_kickfix__DoKick (1) from beta.amx
[12:49:54] [part] Andrij_Xula has left the server (1:2)
[12:50:50] Incoming connection: 176.118.42.5:54676

//Ещё вот так бывает, покороче..
[19:32:55] [part] Bogdan_Dimitriy has left the server (1:2)
[19:33:08] [debug] Run time error 4: "Array index out of bounds"
[19:33:08] [debug] Accessing element at index 65535 past array upper bound 99
[19:33:08] [debug] AMX backtrace:
[19:33:08] [debug] #0 0007fa44 in public ppb_OnPlayerDisconnect (2, 1) from beta45_2.amx
[19:33:08] [debug] #1 00008228 in public Iter_OnPlayerDisconnect (2, 1) from beta45_2.amx
[19:33:08] [debug] #2 native CallLocalFunction () from samp03svr
[19:33:08] [debug] #3 00000ff8 in public OnPlayerDisconnect (2, 1) from beta45_2.amx
[19:33:08] [part] Pavel_Markech has left the server (2:1)
[19:33:41] Incoming connection: 176.119.64.38:58256

ч0зА... :dash2:

ziggi
17.05.2016, 14:34
Открыл логули на ночь, а там:

[12:48:47] [join] Alex_Smirnow has joined the server (4:212.22.64.235)
[12:48:49] [kill] Andrij_Xula killed Igor_Dikun Shotgun
[12:49:54] [debug] Run time error 4: "Array index out of bounds"
[12:49:54] [debug] Accessing element at index 65535 past array upper bound 99
[12:49:54] [debug] AMX backtrace:
[12:49:54] [debug] #0 0007fa44 in public ppb_OnPlayerDisconnect (1, 2) from beta.amx
[12:49:54] [debug] #1 00008228 in public Iter_OnPlayerDisconnect (1, 2) from beta.amx
[12:49:54] [debug] #2 native CallLocalFunction () from samp03svr
[12:49:54] [debug] #3 00000ff8 in public OnPlayerDisconnect (1, 2) from beta.amx
[12:49:54] [debug] #4 native Kick () from samp03svr
[12:49:54] [debug] #5 00001868 in public @__dc_kickfix__DoKick (1) from beta.amx
[12:49:54] [part] Andrij_Xula has left the server (1:2)
[12:50:50] Incoming connection: 176.118.42.5:54676

//Ещё вот так бывает, покороче..
[19:32:55] [part] Bogdan_Dimitriy has left the server (1:2)
[19:33:08] [debug] Run time error 4: "Array index out of bounds"
[19:33:08] [debug] Accessing element at index 65535 past array upper bound 99
[19:33:08] [debug] AMX backtrace:
[19:33:08] [debug] #0 0007fa44 in public ppb_OnPlayerDisconnect (2, 1) from beta45_2.amx
[19:33:08] [debug] #1 00008228 in public Iter_OnPlayerDisconnect (2, 1) from beta45_2.amx
[19:33:08] [debug] #2 native CallLocalFunction () from samp03svr
[19:33:08] [debug] #3 00000ff8 in public OnPlayerDisconnect (2, 1) from beta45_2.amx
[19:33:08] [part] Pavel_Markech has left the server (2:1)
[19:33:41] Incoming connection: 176.119.64.38:58256

ч0зА... :dash2:

Почему ты это запостил здесь? Твоя ошибка никак не относится к этой теме. Компилируй режим с флагом -d2 или -d3, чтобы узнать файл и строку этой ошибки

vovandolg
17.05.2016, 17:58
Почему ты это запостил здесь? Твоя ошибка никак не относится к этой теме. Компилируй режим с флагом -d2 или -d3, чтобы узнать файл и строку этой ошибки

:agree: ну так эти дебаги по описанию относяться к этой работе, позже проверю с ключами и отпишусь..

[12:49:54] [debug] #4 native Kick () from samp03svr
[12:49:54] [debug] #5 00001868 in public @__dc_kickfix__DoKick (1) from beta.amx

ziggi
17.05.2016, 18:33
:agree: ну так эти дебаги по описанию относяться к этой работе, позже проверю с ключами и отпишусь..

[12:49:54] [debug] #4 native Kick () from samp03svr
[12:49:54] [debug] #5 00001868 in public @__dc_kickfix__DoKick (1) from beta.amx

Crashdetect показывает цепочку вызовов нескольких функций, после выполнения которых возникает ошибка. В данном случае ошибка происходит в ppb_OnPlayerDisconnect. Плюс ты сам заметил, что иногда бывает так, что @__dc_kickfix__DoKick в логах нет, а это намекает на то, что проблема не здесь.
Мораль в том, что прежде чем пользоваться чем-либо, нужно научиться этим пользоваться (научиться читать крэшлог, научиться компилировать скрипт с отладочной информацией), тогда подобных вопросов бы не возникало.

newbie01
24.07.2016, 09:28
В версии 1.2 что лежит в шапке темы пропущена скобка из-за которой при подключении инклуда крашит мод.

Строка 167.

Было.


SetTimerEx(
!"@__dc_kickfix__DoBanEx", DC_KICKFIX_INTERVAL, false,
str__dc_kickfix__d, playerid
);


Стало.


SetTimerEx(
!"@__dc_kickfix__DoBanEx", DC_KICKFIX_INTERVAL, false,
str__dc_kickfix__d, playerid)
);


Но теперь не удаётся запустить сервер и даёт такую ошибку в консоль сервера.

Script[gamemodes/core.amx]: Run time error 19: "File or function is not found"

DeimoS
24.07.2016, 13:23
В версии 1.2 что лежит в шапке темы пропущена скобка из-за которой при подключении инклуда крашит мод.

Строка 167.

Было.


SetTimerEx(
!"@__dc_kickfix__DoBanEx", DC_KICKFIX_INTERVAL, false,
str__dc_kickfix__d, playerid
);


Стало.


SetTimerEx(
!"@__dc_kickfix__DoBanEx", DC_KICKFIX_INTERVAL, false,
str__dc_kickfix__d, playerid)
);


Но теперь не удаётся запустить сервер и даёт такую ошибку в консоль сервера.

Script[gamemodes/core.amx]: Run time error 19: "File or function is not found"

Ничего там не пропущено (редактор выделил пару скобок)
http://i.imgur.com/URNu8rz.png

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

Этот код выглядит так, если убрать всё извращение с переносами:

SetTimerEx(!"@__dc_kickfix__DoBanEx", DC_KICKFIX_INTERVAL, false, str__dc_kickfix__d, playerid);


Да и компилируется всё прекрасно
http://i.imgur.com/sp7NNb4.png

newbie01
24.07.2016, 14:30
Я компилировал компилятором от Zeex. У меня просто происходит зависание и всё. Изменил так как у тебя теперь компилируется нормально но на сервере в консоли ошибка.



Script[gamemodes/core.amx]: Run time error 19: "File or function is not found"


Компилировал с ключами: -d2 -O1 -w203

Если скомпилировать без ключей то опять зависание.

DeimoS
24.07.2016, 15:32
Я компилировал компилятором от Zeex. У меня просто происходит зависание и всё. Изменил так как у тебя теперь компилируется нормально но на сервере в консоли ошибка.



Script[gamemodes/core.amx]: Run time error 19: "File or function is not found"


Компилировал с ключами: -d2 -O1 -w203

Если скомпилировать без ключей то опять зависание.

Так я тоже с данным компилятором компилирую.
Если компилируешь не через Pawno, перепроверь кодировку файлов.
И скинь полный лог

underground
29.10.2016, 17:13
Вылетает компилятор при попытке скомпилировать мод с этим инклудом.

VVWVV
29.10.2016, 17:30
Вылетает компилятор при попытке скомпилировать мод с этим инклудом.

Это происходит из-за того, что в данной библиотеке используется emit операции (точнее инструкция вызова sysreq.c), которые, как минимум, вызывают краш. Вам необходимо вызвать какую-либо из измененных функции (Kick, Ban, BanEx) для того, чтобы предотвратить ошибку.

underground
29.10.2016, 19:18
Это происходит из-за того, что в данной библиотеке используется emit операции (точнее инструкция вызова sysreq.c), которые, как минимум, вызывают краш. Вам необходимо вызвать какую-либо из измененных функции (Kick, Ban, BanEx) для того, чтобы предотвратить ошибку.

Уже вызвана в моде, но все равно зависает компилятор.

$continue$
25.01.2017, 16:52
Как то отписывал Стасу в Jabber, что крашит компилятор от zeex. Сказал, что посмотрит как будет время. Видать забыл. Краш компилятора (по крайне мере месяц назад) присутствует.

VVWVV
25.01.2017, 17:48
Как то отписывал Стасу в Jabber, что крашит компилятор от zeex. Сказал, что посмотрит как будет время. Видать забыл. Краш компилятора (по крайне мере месяц назад) присутствует.

Это из-за этого (https://github.com/Zeex/pawn/blob/6a3ab7c9f4bbe4664f8b3787e553885c2baf31ee/source/compiler/sc6.c#L693). Попробую исправить.

Точнее из-за регистрации native-функций и инкремента при #еmit

https://github.com/Zeex/pawn/blob/6a3ab7c9f4bbe4664f8b3787e553885c2baf31ee/source/compiler/sc6.c#L853-L901

Daniel_Cortez
25.01.2017, 18:24
Как то отписывал Стасу в Jabber, что крашит компилятор от zeex. Сказал, что посмотрит как будет время. Видать забыл. Краш компилятора (по крайне мере месяц назад) присутствует.
Точно уже не помню, но, скорее всего, я на тот момент работал с Pawn 4 для одного из своих личных проектов (о котором пока что не хотелось бы говорить), из-за чего возиться с Pawn 3.2 не было ни времени, ни желания. С недавних пор я перешёл обратно на Pawn 3.2, поэтому теперь таких проблем возникнуть не должно.

Уже работаю над фиксом. Пока что помогло удаление "#if __Pawn < 0x030A" и "#endif" в обходе бага sysreq.c, чтобы код обхода компилировался и с модифицированным компилятором.



Это из-за этого (https://github.com/Zeex/pawn/blob/6a3ab7c9f4bbe4664f8b3787e553885c2baf31ee/source/compiler/sc6.c#L693). Попробую исправить.

Точнее из-за регистрации native-функций и инкремента при #еmit

https://github.com/Zeex/pawn/blob/6a3ab7c9f4bbe4664f8b3787e553885c2baf31ee/source/compiler/sc6.c#L853-L901
Разве они не фиксили баг sysreq.c ещё 2 года назад? -_-
Или это какой-то другой баг?

VVWVV
25.01.2017, 18:40
Разве они не фиксили баг sysreq.c ещё 2 года назад? -_-
Или это какой-то другой баг?

В том-то и дело, нынешний (https://github.com/Zeex/pawn/blob/master/source/compiler/sc2.c#L1320-L1325) код работает криво, а предыдущий (https://github.com/Zeex/pawn/blob/569f8118048f46012c583bb45fb9d59aca6f7114/source/compiler/sc2.c#L1227-L1234)хорошо.

Кстати, теперь появилась возможность использовать любые числа и float-значения (отрицательные и положительные).

Daniel_Cortez
25.01.2017, 19:36
В том-то и дело, нынешний (https://github.com/Zeex/pawn/blob/master/source/compiler/sc2.c#L1320-L1325) код работает криво, а предыдущий (https://github.com/Zeex/pawn/blob/569f8118048f46012c583bb45fb9d59aca6f7114/source/compiler/sc2.c#L1227-L1234)хорошо.
Так это получается, я только зря делал обход того бага необязательным для "3.10", раз в конечном счёте этот баг туда вернули?
Чёрд, это ж ведь теперь придётся поднимать все свои работы и посты на форуме, чтобы удалить "#if __Pawn < 0x030A".
-______-

Как бы то ни было, если не сложно, сможешь увеличить значение в той новой константе с номером билда (__PawnBuild), которую добавили на днях (или, если это неприемлемо, хотя бы оставить напоминание об этом в теме с PR)? Опираясь на эту константу вместо __Pawn, можно будет сделать опциональный фикс бага sysreq.c, как раньше, только на этот раз эта опциональность будет рабочей.

VVWVV
26.01.2017, 01:49
Так это получается, я только зря делал обход того бага необязательным для "3.10", раз в конечном счёте этот баг туда вернули?
Чёрд, это ж ведь теперь придётся поднимать все свои работы и посты на форуме, чтобы удалить "#if __Pawn < 0x030A".
-______-

Как бы то ни было, если не сложно, сможешь увеличить значение в той новой константе с номером билда (__PawnBuild), которую добавили на днях (или, если это неприемлемо, хотя бы оставить напоминание об этом в теме с PR)? Опираясь на эту константу вместо __Pawn, можно будет сделать опциональный фикс бага sysreq.c, как раньше, только на этот раз эта опциональность будет рабочей.

Вроде бы реанимировал (https://github.com/VVWVV/pawn/commit/7f634e80878b29604dd9aa92b251195299cad5bb). Теперь ненужно делать обходы..

vasyok28
27.01.2017, 15:39
Крашит компилятор( Есть фикс ?

VVWVV
27.01.2017, 15:58
Крашит компилятор( Есть фикс ?

Вы можете проверить версию моего компилятора (https://www.dropbox.com/s/2wvmdoiitkyqelo/compiler.rar?dl=0) (если она сработает, то отправлю PR).

vasyok28
27.01.2017, 16:27
Вы можете проверить версию моего компилятора (https://www.dropbox.com/s/2wvmdoiitkyqelo/compiler.rar?dl=0) (если она сработает, то отправлю PR).

Очень долго компилирует мод

VVWVV
27.01.2017, 16:34
Очень долго компилирует мод

То есть он рабочий? Другие компилируют мод быстрее?

vasyok28
27.01.2017, 16:41
То есть он рабочий? Другие компилируют мод быстрее?

Компилирует без краша, вот только долго. Который у меня компилятор справляется за 43 сек, а который вы дали за 126 сек.

VVWVV
27.01.2017, 17:30
Компилирует без краша, вот только долго. Который у меня компилятор справляется за 43 сек, а который вы дали за 126 сек.

Обновил файл.

vasyok28
27.01.2017, 17:48
Обновил файл.

Тоже самое

$continue$
27.01.2017, 17:49
не крашит, но компиляция идет значительно дольше.

Обновил файл.

Daniel_Cortez
27.01.2017, 18:12
Скорее всего, это из-за третьего прохода парсера, который добавили недавно, чтобы исправить несколько багов (https://github.com/Zeex/pawn/issues/131) в компиляторе.

vasyok28
27.01.2017, 18:14
Скорее всего, это из-за третьего прохода парсера, который добавили недавно, чтобы исправить несколько багов (https://github.com/Zeex/pawn/issues/131) в компиляторе.

Планируется пофиксить чтобы работало все нормально ?
А то придется перейти на бабушкин способ

VVWVV
27.01.2017, 18:29
Скорее всего, это из-за третьего прохода парсера, который добавили недавно, чтобы исправить несколько багов (https://github.com/Zeex/pawn/issues/131) в компиляторе.

Я уже и забыл о нём.

UPD: Время компиляции моей версии компилятора никак не отличается от версии 3.10.1.

Daniel_Cortez
27.01.2017, 19:17
Планируется пофиксить чтобы работало все нормально ?
А то придется перейти на бабушкин способ
Это и есть "нормальная работа". Добавление доп. прохода парсера было единственным адекватным решением против бага с функциями, которые используются до момента своего объявления (у компилятора на момент использования функции было недостаточно информации о ней, что и приводило к ошибкам). Хотите, чтобы компилятор работал быстрее - переходите на старую версию с багами.

Как бы то ни было, я обновил инклуд. Теперь обход бага sysreq.c снова работает для всех версий компилятора. Потом попробую снова сделать его опциональным, как только выпустят релиз с увеличенным значением в константе __PawnBuild.

VVWVV
28.01.2017, 13:39
Баг был исправлен, теперь остаётся ждать новую сборку компилятора.

$continue$
29.07.2017, 01:26
Есть какой то конфликт с sa-mp-fixes. Если отключить dc_kickfix - компилятор не крашится (компилятор от zeex, последний релиз).

Скрипт:


#include <a_samp>
#include <fixes>
#include <dc_kickfix>

main();




Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: pawncc.exe
Версия приложения: 3.10.0.0
Отметка времени приложения: 589582de
Имя модуля с ошибкой: PAWNC.dll
Версия модуля с ошибкой: 3.10.0.0
Отметка времени модуля с ошибкой: 589582de
Код исключения: c0000005
Смещение исключения: 0001f4e0
Версия ОС: 6.1.7601.2.1.0.256.1
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0419

Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
C:\Windows\system32\ru-RU\erofflps.txt


P.S: ziggi я уже отписал на счет этого, оставлю ещё тут.

VVWVV
29.07.2017, 01:49
Есть какой то конфликт с sa-mp-fixes. Если отключить dc_kickfix - компилятор не крашится (компилятор от zeex, последний релиз).

Скрипт:


#include <a_samp>
#include <fixes>
#include <dc_kickfix>

main();




Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: pawncc.exe
Версия приложения: 3.10.0.0
Отметка времени приложения: 589582de
Имя модуля с ошибкой: PAWNC.dll
Версия модуля с ошибкой: 3.10.0.0
Отметка времени модуля с ошибкой: 589582de
Код исключения: c0000005
Смещение исключения: 0001f4e0
Версия ОС: 6.1.7601.2.1.0.256.1
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0419

Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
C:\Windows\system32\ru-RU\erofflps.txt


P.S: ziggi я уже отписал на счет этого, оставлю ещё тут.

Это из-за того, что библиотека sa-mp-fixes переопределяет SetPVarString как CST_SetPVarString. Таким образом, в @__dc_kickfix_sysreq_Workaround появляется не SetPVarString, а CST_SetPVarString. В #emit же данное переопределение не работает, поскольку это директива препроцессора.

Рабочий фикс для DC:


native __dc_workaround_SetPVarString(playerid, varname[], string_value[]) = SetPVarString;
// строка 65
__dc_workaround_SetPVarString(0, str__dc_kickfix__reason, str__dc_kickfix__reason);
// строка 162
#emit sysreq.c __dc_workaround_SetPVarString

Daniel_Cortez
29.07.2017, 12:53
Есть какой то конфликт с sa-mp-fixes. Если отключить dc_kickfix - компилятор не крашится (компилятор от zeex, последний релиз).

Скрипт:


#include <a_samp>
#include <fixes>
#include <dc_kickfix>

main();




Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: pawncc.exe
Версия приложения: 3.10.0.0
Отметка времени приложения: 589582de
Имя модуля с ошибкой: PAWNC.dll
Версия модуля с ошибкой: 3.10.0.0
Отметка времени модуля с ошибкой: 589582de
Код исключения: c0000005
Смещение исключения: 0001f4e0
Версия ОС: 6.1.7601.2.1.0.256.1
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0419

Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
C:\Windows\system32\ru-RU\erofflps.txt


P.S: ziggi я уже отписал на счет этого, оставлю ещё тут.
Исправлено в версии 1.3.2, ссылка в 1-м посте.



Это из-за того, что библиотека sa-mp-fixes переопределяет SetPVarString как CST_SetPVarString. Таким образом, в @__dc_kickfix_sysreq_Workaround появляется не SetPVarString, а CST_SetPVarString. В #emit же данное переопределение не работает, поскольку это директива препроцессора.

Рабочий фикс для DC:


native __dc_workaround_SetPVarString(playerid, varname[], string_value[]) = SetPVarString;
// строка 65
__dc_workaround_SetPVarString(0, str__dc_kickfix__reason, str__dc_kickfix__reason);
// строка 162
#emit sysreq.c __dc_workaround_SetPVarString

Я исправил это немного другим способом: добавил проверку подключения fixes.inc и наличия в нём исправленном версии SetPVarString - если это всё есть, то SetPVarString вызывается обычным способом, без #emit, а функция @__dc_kickfix_sysreq_Workaround не попадает в *.amx. Но за наводку на CST_SetPVarString всё же спасибо.

alonso
18.03.2018, 07:56
Столкнулся с такой проблемой, что если я, имея ид 0, кикаю игрока с ид 1, то кикает не его, а меня. Сообщение о кике доходят как надо, игроку с id 1, вот только кикает меня.. Если использую ImmediateKick, то всё работает идеально. С чем это связано я так и не понял

DeimoS
18.03.2018, 11:25
Столкнулся с такой проблемой, что если я, имея ид 0, кикаю игрока с ид 1, то кикает не его, а меня. Сообщение о кике доходят как надо, игроку с id 1, вот только кикает меня.. Если использую ImmediateKick, то всё работает идеально. С чем это связано я так и не понял

Ищи проблему в своём коде. В инклуде мало того, что просто передаётся значение, которое ты указал в "Kick", та ещё сама библиотека проверена временем уже.

alonso
20.03.2018, 17:10
Ищи проблему в своём коде. В инклуде мало того, что просто передаётся значение, которое ты указал в "Kick", та ещё сама библиотека проверена временем уже.

Проблема возникала из-за плагина fixes2.

geneff
03.06.2018, 01:46
Не знаю, баг не баг, нооо... у меня почему-то ошибка, когда юзаю BanEx выбивает ошибку ../source/dc_kickfix.inc(165) : error 017: undefined symbol "ARGS_SIZE" (dc_kickfix__BanEx)

Daniel_Cortez
04.06.2018, 18:14
Не знаю, баг не баг, нооо... у меня почему-то ошибка, когда юзаю BanEx выбивает ошибку ../source/dc_kickfix.inc(165) : error 017: undefined symbol "ARGS_SIZE" (dc_kickfix__BanEx)
Да, это была ошибка в коде перехвата BanEx; спасибо, что сообщили. Исправил этот недочёт в версии 1.3.3 (ссылка в 1-м посте).
Заодно добавил больше комментариев по багам в функции GetPVarString, а также избавился от костылей с #emit - вместо них теперь используется собственное "исправленное" объявление SetPVarString с добавленными квалификаторами const в параметрах "varname" и "string_value".

native __dc_kickfix__SetPVarString(playerid, const varname[], const string_value[]) = SetPVarString;

VVWVV
04.06.2018, 20:30
// Also add a const-correct definition of SetPVarString because Kalcor
// is too busy counting money from the Hosted tab to fix the const-correctness issue.


lol

Daniel_Cortez
12.11.2018, 22:12
Версия 1.3.4.
Исправлена ошибка, связанная с const-корректностью, проявлявшаяся на последней версии компилятора Pawn без использования fixes.inc.

Leogin
30.12.2022, 20:28
В описание DC_KICK_FIX_INTERVAL переименуй на DC_KICKFIX_INTERVAL (в include так), пожалуйста.

Daniel_Cortez
31.12.2022, 11:08
В описание DC_KICK_FIX_INTERVAL переименуй на DC_KICKFIX_INTERVAL (в include так), пожалуйста.
Исправил. Спасибо, что заметили.