Гайд [Урок] Фикс Kick/Warn/Ban

Статус
В этой теме нельзя размещать новые ответы.

Skillz

Новичок
Автор темы
28
9
Всем привет с вами Skillz
И сегодня я вам раскажу как исправить Kick/Warn/Ban а именно:
Игроку не высвечивается причина кика бана варна.

Для начала мы идём ко всем #define и добавляем:
Код:
#define Kick(%0) SetTimerEx("PlayerKick",100,false,"i",%0)
#define Ban(%0) SetTimerEx("PlayerBan",100,false,"i",%0)

Далее идём к ко всем forward и добавляем:
Код:
forward PlayerKick(playerid);
forward PlayerBan(playerid);

И наконец ко всем public добавляем:

Код:
public PlayerKick(playerid) { Kick(playerid); }
public PlayerBan(playerid) { Ban(playerid); }

Вот и всё, удачи =)
 

kaZax

samp.work
Проверенный
150
23
И шо это такое собственно?
Начиная с 0.3x. Kalcor выпустил обновление для функций кика. Обновление которое хорошо кикает.
На всех серверах перед киком идет сообщение о причине кика.
И после этого обновления сообщение не доходило до игрока. (Быстро кикает что сообщение не успевает отобразиться)
И вот этот код в теме как "фиксит" это.
 

Vovich

HOT
Проверенный
717
197
Бля можно же форвард создать с функцией кика, и поставить задержку в 1 сек, тогда спокойно успевает вывести сообщение и кикнуть.
 

Vovich

HOT
Проверенный
717
197
Как ты поставишь задержку без таймеров ?
я не сказал что я буду делать что то без таймеров.
Добавить сток, и все дела.
Потом использовать функу GKick(playerid);
Код:
stock GKick(playerid)
{
   if(GetPVarInt(playerid, "Kicker") == 1) return 1;
   SetPVarInt(playerid, "Kicker", 1), SetTimerEx("Kicking", 300, false, "d", playerid);
   SetPVarInt(playerid, "Kicker", 1);
  SetTimerEx("Kicking", 300, false, "d", playerid);
  return 1;
}
 

kemperrr

Известный
104
2
я не сказал что я буду делать что то без таймеров.
Добавить сток, и все дела.
Потом использовать функу GKick(playerid);
Код:
stock GKick(playerid)
{
   if(GetPVarInt(playerid, "Kicker") == 1) return 1;
   SetPVarInt(playerid, "Kicker", 1), SetTimerEx("Kicking", 300, false, "d", playerid);
   SetPVarInt(playerid, "Kicker", 1);
  SetTimerEx("Kicking", 300, false, "d", playerid);
  return 1;
}
Много писанины + паблик все равно нужно создавать
 

kaZax

samp.work
Проверенный
150
23
Код не правильный.
Форвард и каллбек должен быть перед дефайном.
А то будет что-то типа рекурсий.
 

Untonyst

Новичок
2
1
В начале кода стоит дефайн кика.
В паблик с киком после дефайна.
Это получается что кик в паблике тоже заменяется.
И так получается рекурсия.

Не будет рекурсии. Мы вызываем не саму функции, а макрос с именем функции, который на этапе компиляции скрипта предстает в виде таймера.

Но, этот вариант будет плохим, например, для античита, а именно для читеров. Есть моменты, когда нам будет просто необходимо кикнуть игрока с сервера моментально. Как вариант, можно перехватить нативную функцию и добавить ей новый параметр.

C++:
@__CallKickFunc(playerid);
@__CallKickFunc(playerid)
{
    Kick(playerid);
}

stock fix_Kick(playerid, fix=0)
{
    if (0 == IsPlayerConnected(playerid))
    {
        return 0;
    }
    if (fix == 1)
    {
        SetTimerEx("@__CallKickFunc", 200, 0, "i", playerid);
    }
    return 1;
}
#if defined _ALS_Kick
    #undef Kick
#else
    #define _ALS_Kick
#endif
#define Kick fix_Kick

И используйте как
C++:
Kick(playerid); // кикнем моментально
Kick(playerid, 1); // кикнем через некоторое время

Для удобства, можете определить себе константы, что-то типа

C++:
const KICK_FIX_PARAMS = 1;

Это лучше, чем создавать сложные костыли...
 
  • Нравится
Реакции: Sire Like
Статус
В этой теме нельзя размещать новые ответы.