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

Тема в разделе "PAWN", создана пользователем Skillz, 23 авг 2015.

Статус темы:
Закрыта.
  1. Skillz

    Skillz Активный пользователь

    Регистрация:
    23.08.15
    Сообщения:
    30
    Лайки:
    9
    Репутация:
    3
    Всем привет с вами Skillz
    И сегодня я вам раскажу как исправить Kick/Warn/Ban а именно:
    Игроку не высвечивается причина кика бана варна.

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

    Код (Text):
    public PlayerKick(playerid) { Kick(playerid); }
    public PlayerBan(playerid) { Ban(playerid); }
    Вот и всё, удачи :)
     
    #1
  2. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.14
    Сообщения:
    412
    Лайки:
    263
    Репутация:
    39
    Старый баян.
    И на бан зачем?:facepalm:
     
    #2
  3. Dark_Knight

    Dark_Knight РКН Тян
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.103
    Лайки:
    561
    Репутация:
    181
    И шо это такое собственно?
     
    #3
  4. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.14
    Сообщения:
    412
    Лайки:
    263
    Репутация:
    39
    Фигня полная.

    С версии 0.3x баг с киком и баном, когда игрока банят, сервер не успевает отправить ему сообщение о причине бана и т.п
     
    #4
  5. kemperrr

    kemperrr Известный пользователь

    Регистрация:
    04.02.14
    Сообщения:
    104
    Лайки:
    2
    Репутация:
    1
  6. kaZax

    kaZax samp.work
    Проверенный

    Регистрация:
    18.03.13
    Сообщения:
    158
    Лайки:
    19
    Репутация:
    26
    Начиная с 0.3x. Kalcor выпустил обновление для функций кика. Обновление которое хорошо кикает.
    На всех серверах перед киком идет сообщение о причине кика.
    И после этого обновления сообщение не доходило до игрока. (Быстро кикает что сообщение не успевает отобразиться)
    И вот этот код в теме как "фиксит" это.
     
    #6
  7. Vovich

    Проверенный

    Регистрация:
    21.12.14
    Сообщения:
    449
    Лайки:
    160
    Репутация:
    51
    Бля можно же форвард создать с функцией кика, и поставить задержку в 1 сек, тогда спокойно успевает вывести сообщение и кикнуть.
     
    #7
  8. san0

    san0 Hasta la victoria siempre!
    Проверенный

    Регистрация:
    15.12.13
    Сообщения:
    300
    Лайки:
    127
    Репутация:
    51
    Как ты поставишь задержку без таймеров ?
     
    #8
  9. Vovich

    Проверенный

    Регистрация:
    21.12.14
    Сообщения:
    449
    Лайки:
    160
    Репутация:
    51
    я не сказал что я буду делать что то без таймеров.
    Добавить сток, и все дела.
    Потом использовать функу GKick(playerid);
    Код (Text):
    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;
    }
     
    #9
  10. kemperrr

    kemperrr Известный пользователь

    Регистрация:
    04.02.14
    Сообщения:
    104
    Лайки:
    2
    Репутация:
    1
    Много писанины + паблик все равно нужно создавать
     
    #10
  11. Vovich

    Проверенный

    Регистрация:
    21.12.14
    Сообщения:
    449
    Лайки:
    160
    Репутация:
    51
    ну мне так легче :sad_frog:
     
    #11
  12. kaZax

    kaZax samp.work
    Проверенный

    Регистрация:
    18.03.13
    Сообщения:
    158
    Лайки:
    19
    Репутация:
    26
    Код не правильный.
    Форвард и каллбек должен быть перед дефайном.
    А то будет что-то типа рекурсий.
     
    #12
  13. Vovich

    Проверенный

    Регистрация:
    21.12.14
    Сообщения:
    449
    Лайки:
    160
    Репутация:
    51
    У мя форварды в дме все в конце, и збс :sad_frog:
     
    #13
  14. kaZax

    kaZax samp.work
    Проверенный

    Регистрация:
    18.03.13
    Сообщения:
    158
    Лайки:
    19
    Репутация:
    26
    В начале кода стоит дефайн кика.
    В паблик с киком после дефайна.
    Это получается что кик в паблике тоже заменяется.
    И так получается рекурсия.
     
    #14
  15. Untonyst

    Untonyst Новичок

    Регистрация:
    12.03.16
    Сообщения:
    2
    Лайки:
    1
    Репутация:
    0
    Не будет рекурсии. Мы вызываем не саму функции, а макрос с именем функции, который на этапе компиляции скрипта предстает в виде таймера.

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

    Код (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;
    Это лучше, чем создавать сложные костыли...
     
    #15
    Sire нравится это.
  16. Morj

    Morj Активный пользователь

    Регистрация:
    19.01.15
    Сообщения:
    40
    Лайки:
    1
    Репутация:
    0
    Код (Text):
    Ban(playerid);
    Отличная функция, банит игрока по IP, то есть твинков он не создаст :)
    По моему данная функция самый актуальный вариант, я не знаю зачем там так распинаются с этими банами(Пишут много кода).
     
    #16
Статус темы:
Закрыта.