PHP код:
#include <a_samp>
#include <DC_CMD>
#include <sscanf>
new emiTimer[MAX_PLAYERS];
CMD:emi(playerid, params[])
{
if(sscanf(params, "d", params[0])) return SendClientMessage(playerid, -1, "{3399FF}[Команды]{FFFFFF} /emi [ ID игрока ]");
if(!IsPlayerConnected(params[0]))
return SendClientMessage(playerid, -1, "Ошибка. Игрока с таким ID нет на сервере.");
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) // Возможно еще сюда добавить проверку на полицейские автомобили
return SendClientMessage(playerid, -1, "Ошибка. Вы должны быть за рулём!");
if(GetPlayerState(params[0]) != PLAYER_STATE_DRIVER)
return SendClientMessage(playerid, -1, "Ошибка. Игрок должен быть за рулём!");
new Float: pos[3];
GetPlayerPos(params[0], pos[0], pos[1], pos[2]);
new Float: dist_ = GetPlayerDistanceFromPoint(playerid, pos[0], pos[1], pos[2]),
new str_[144];
if(dist_ > 30)
{
format(str_, sizeof str_, "Ошибка. Между вами %0.2f метров. Использование ЭМИ невозможно.", dist_);
return true;
}
format(str_, sizeof str_, "Между вами %0.2f метров. Преследуйте игрока 20 секунд, чтобы воспользоваться действием ЭМИ.", dist_);
SendClientMessage(playerid, -1, str_);
emiTimer[playerid] = SetTimerEx("emiTimerPlayer", 1000, true, "dd", playerid, params[0]);
return true;
}
new totalSec[MAX_PLAYERS] = 0;
forward emiTimerPlayer(playerid, target_ID);
public emiTimerPlayer(playerid, target_ID)
{
GetPlayerPos(playerid, SetPVarFloat(playerid, "posX_emi"), SetPVarFloat(playerid, "posY_emi"), SetPVarFloat(playerid, "posZ_emi"));
GetPlayerPos(target_ID, SetPVarFloat(target_ID, "posX_emi"), SetPVarFloat(target_ID, "posY_emi"), SetPVarFloat(target_ID, "posZ_emi"));
new meters = DistancePointToPoint(GetPVarFloat(playerid, "posX_emi"), GetPVarFloat(playerid, "posY_emi"), GetPVarFloat(playerid, "posZ_emi"), GetPVarFloat(target_ID, "posX_emi"), GetPVarFloat(target_ID, "posY_emi"), GetPVarFloat(target_ID, "posZ_emi"));
if(meters > 30)
{
DeletePVar(playerid, "posX_emi"), DeletePVar(playerid, "posY_emi"), DeletePVar(playerid, "posZ_emi");
DeletePVar(target_ID, "posX_emi"), DeletePVar(target_ID, "posY_emi"), DeletePVar(target_ID, "posZ_emi");
KillTimer(emiTimer[playerid]);
totalSec[playerid] = 0;
SendClientMessage(playerid, -1, "Игрок далеко от вас. Зарядка ЭМИ остановлена. НЕобходимо начать заново.");
return true;
}
totalSec[playerid]++;
if(totalSec == 20)
{
// Тут действие над целью
KillTimer(emiTimer[playerid]);
totalSec[playerid] = 0;
}
DeletePVar(playerid, "posX_emi"), DeletePVar(playerid, "posY_emi"), DeletePVar(playerid, "posZ_emi");
DeletePVar(target_ID, "posX_emi"), DeletePVar(target_ID, "posY_emi"), DeletePVar(target_ID, "posZ_emi");
return true;
}
stock DistancePointToPoint(Float: x, Float: y, Float: z, Float: fx, Float:fy, Float: fz) return floatround(floatsqroot(floatpower(fx - x, 2) + floatpower(fy - y, 2) + floatpower(fz - z, 2)));
Писалось на коленке, поэтому работоспособность не проверялась. Возможны баги и тем, кому нужно, доработают сами для себя.