На многих серверах видел такое: У игрока остаётся мало здоровья и он вводит команду для телепорта, и тем самым уходит от боя. Также есть хитрецы, которые уходят в режим AFK после того, как выполняется проверка координат и ждут, когда сервер их телепортирует.
Добавим ко всем глобальным переменным (new):
PHP код:
// Массив для хранения тиков со времени начала перемещения
new tp_ticks[MAX_PLAYERS] = {cellmin, ...};
Добавим в конец мода, нужные функции:
PHP код:
// Функция для перемещения игроков с проверкой координат
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:
PHP код:
if(tp_ticks[playerid] != cellmin)
tp_ticks[playerid] = GetTickCount();
Пример использования:
PHP код:
CMD:center(playerid, params[])
return SetPlayerPosSafely(playerid, 0.0, 0.0, 0.0);
После того как игрок введёт команду "/center", он должен будет подождать 5 секунд, прежде чем телепортироваться. Если за это время он сдвинется - останется на месте, иначе - телепортнётся в середину карты