PDA

Просмотр полной версии : [Мануал] 5-ти секундная проверка координат перед телепортом



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

Добавим ко всем глобальным переменным (new):


// Массив для хранения тиков со времени начала перемещения
new tp_ticks[MAX_PLAYERS] = {cellmin, ...};


Добавим в конец мода, нужные функции:


// Функция для перемещения игроков с проверкой координат
stock SetPlayerPosSafely(playerid, Float:x, Float:y, Float:z)
{
if(tp_ticks[playerid] != cellmin)
return 0;
if(0 == IsPlayerConnected(playerid))
return 0;
SendClientMessage(playerid, 0xFF9900FF, "Выполняется проверка координат. Не двигайтесь 5 секунд.");
new Float:cur_x, Float:cur_y, Float:cur_z;
GetPlayerPos(playerid, cur_x, cur_y, cur_z);
return SetTimerEx("SetPlayerPosSafelyCheck", 5000, false, "dffffff", playerid, cur_x, cur_y, cur_z, x, y, z);
}

// Таймерная функция для проверки координат
forward SetPlayerPosSafelyCheck(playerid, Float:x2, Float:y2, Float:z2, Float:x1, Float:y1, Float:z1);
public SetPlayerPosSafelyCheck(playerid, Float:x2, Float:y2, Float:z2, Float:x1, Float:y1, Float:z1)
{
new afk_ticks = GetTickCount()-tp_ticks[playerid];
tp_ticks[playerid] = cellmin;
if(afk_ticks > 1000)
return SendClientMessage(playerid, 0xFF0000FF, "Нельзя телепортироваться, находясь в AFK!");
if(0 == IsPlayerInRangeOfPoint(playerid, 1.0, x1, y1, z1))
return SendClientMessage(playerid, 0xFF0000FF, "Проверка координат провалена.");
SetPlayerPos(playerid, x2, y2, z2);
return SendClientMessage(playerid, 0xFF9900FF, "Вы успешно телепортировались.");
}


В public OnPlayerUpdate:


if(tp_ticks[playerid] != cellmin)
tp_ticks[playerid] = GetTickCount();


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


CMD:center(playerid, params[])
return SetPlayerPosSafely(playerid, 0.0, 0.0, 0.0);


После того как игрок введёт команду "/center", он должен будет подождать 5 секунд, прежде чем телепортироваться. Если за это время он сдвинется - останется на месте, иначе - телепортнётся в середину карты

Dima_Turkow
08.01.2014, 18:19
Отлично +!!!

Mr_David
08.01.2014, 18:36
Красавец.

TimoXa32
08.01.2014, 21:09
Молодец!

Osiris
09.01.2014, 18:20
Норм:D

AndreyKa
12.01.2014, 00:37
Нормально,но для чего нужна эта проверка?

L0ndl3m
12.01.2014, 00:40
Нормально,но для чего нужна эта проверка?

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

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

DeimoS
28.01.2014, 21:09
Что-то форум совсем мёртв и я ощущаю себя лютым некропостером :с Ну да ладно.
По моему, гораздо проще проверять сам факт перестрелки. Если один игрок нанёс урон по второму игроку, ровняем определённый массив к определённому значению (числу секунд действия "анти-тп") и после в секундном таймере отнимаем по единице. Ну и после уже делаем проверки на это значение. Ещё можно сделать запись ID того, кто нанёс урон и если игрок ушёл в афк/вышел, убиваем его (прибавляем смерть, если такое предусматривается в статистике у игрока) и даём тому, кто нанёс урон, фраг. Анти-релог а-ля DayZ