Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  1. #1
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±

    5-ти секундная проверка координат перед телепортом

    На многих серверах видел такое: У игрока остаётся мало здоровья и он вводит команду для телепорта, и тем самым уходит от боя. Также есть хитрецы, которые уходят в режим AFK после того, как выполняется проверка координат и ждут, когда сервер их телепортирует.

    Добавим ко всем глобальным переменным (new):
    PHP код:
    // Массив для хранения тиков со времени начала перемещения
    new tp_ticks[MAX_PLAYERS] = {cellmin, ...}; 
    Добавим в конец мода, нужные функции:
    PHP код:
    // Функция для перемещения игроков с проверкой координат
    stock SetPlayerPosSafely(playeridFloat:xFloat:yFloat:z)
    {
        if(
    tp_ticks[playerid] != cellmin)
            return 
    0;
        if(
    == IsPlayerConnected(playerid))
            return 
    0;
        
    SendClientMessage(playerid0xFF9900FF"Выполняется проверка координат. Не двигайтесь 5 секунд.");
        new 
    Float:cur_xFloat:cur_yFloat:cur_z;
        
    GetPlayerPos(playeridcur_xcur_ycur_z);
        return 
    SetTimerEx("SetPlayerPosSafelyCheck"5000false"dffffff"playeridcur_xcur_ycur_zxyz);
    }

    // Таймерная функция для проверки координат
    forward SetPlayerPosSafelyCheck(playeridFloat:x2Float:y2Float:z2Float:x1Float:y1Float:z1);
    public 
    SetPlayerPosSafelyCheck(playeridFloat:x2Float:y2Float:z2Float:x1Float:y1Float:z1)
    {
        new 
    afk_ticks GetTickCount()-tp_ticks[playerid];
        
    tp_ticks[playerid] = cellmin;
        if(
    afk_ticks 1000)
            return 
    SendClientMessage(playerid0xFF0000FF"Нельзя телепортироваться, находясь в AFK!");
        if(
    == IsPlayerInRangeOfPoint(playerid1.0x1y1z1))
            return 
    SendClientMessage(playerid0xFF0000FF"Проверка координат провалена.");
        
    SetPlayerPos(playeridx2y2z2);
        return 
    SendClientMessage(playerid0xFF9900FF"Вы успешно телепортировались.");

    В public OnPlayerUpdate:
    PHP код:
    if(tp_ticks[playerid] != cellmin)
        
    tp_ticks[playerid] = GetTickCount(); 
    Пример использования:
    PHP код:
    CMD:center(playeridparams[])
        return 
    SetPlayerPosSafely(playerid0.00.00.0); 
    После того как игрок введёт команду "/center", он должен будет подождать 5 секунд, прежде чем телепортироваться. Если за это время он сдвинется - останется на месте, иначе - телепортнётся в середину карты
    Последний раз редактировалось L0ndl3m; 02.06.2014 в 18:54.

  2. 5 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (29.03.2014) Dima_Turkow (08.01.2014) Mr_David (08.01.2014) Osiris (09.01.2014) TimoXa32 (08.01.2014)
  3. #2
    Аватар для Dima_Turkow
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.12.2013
    Адрес
    Екатеринбург
    Сообщений
    124
    Репутация:
    8 ±
    Отлично +!!!

  4. #3
    Аватар для Mr_David
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.04.2013
    Сообщений
    63
    Репутация:
    54 ±
    Красавец.
    Последний раз редактировалось Mr_David; 08.01.2014 в 18:41.

  5. #4
    Аватар для TimoXa32
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.11.2013
    Сообщений
    195
    Репутация:
    21 ±
    Молодец!
    Двойной класс

  6. #5
    Аватар для Osiris
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.01.2014
    Сообщений
    5
    Репутация:
    0 ±
    Норм:D

  7. #6
    Аватар для AndreyKa
    Пользователь

    Статус
    Оффлайн
    Регистрация
    12.01.2014
    Адрес
    Архангельск
    Сообщений
    53
    Репутация:
    1 ±
    Нормально,но для чего нужна эта проверка?
     Уважаю

    Osetin
    Dron_Turbo
    MR_BEN

     Мои проекты

     Контакты

    skype: andreyordin1
    Вконтакте

     Мои работы

    Помог? Ставь +

  8. #7
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Цитата Сообщение от AndreyKa Посмотреть сообщение
    Нормально,но для чего нужна эта проверка?
    Во время боя, если у игрока остаётся мало здоровья, то он вводит команду для телепорта куда либо, и тем самым уходит от боя.

    Здесь же, прежде чем телепортироваться, надо подождать 5 секунд, и не быть в режиме AFK.

  9. Пользователь сказал cпасибо:
    Osiris (12.01.2014)
  10. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Что-то форум совсем мёртв и я ощущаю себя лютым некропостером :с Ну да ладно.
    По моему, гораздо проще проверять сам факт перестрелки. Если один игрок нанёс урон по второму игроку, ровняем определённый массив к определённому значению (числу секунд действия "анти-тп") и после в секундном таймере отнимаем по единице. Ну и после уже делаем проверки на это значение. Ещё можно сделать запись ID того, кто нанёс урон и если игрок ушёл в афк/вышел, убиваем его (прибавляем смерть, если такое предусматривается в статистике у игрока) и даём тому, кто нанёс урон, фраг. Анти-релог а-ля DayZ

  11. Пользователь сказал cпасибо:
    Daniel_Cortez (28.01.2014)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •