Sign in to follow this  
Followers 0
Guest stibs

Система погони - /pursuit

4 posts in this topic

Всем привет! Наверное, почти в каждом RP моде есть такая фракция как полиция. И работники этой фракции часто сталкивались с тем, что нарушители попросту выходят из игры во время погони. Данная команда позволит избежать данных проблем. 

Суть: 

Игрок(полицейский) вводит команду /pursuit [id] и если он соответствует всем требованиям (т.е. в данный момент он не ведет погоню и преступник не слишком далеко), то преступнику и полицейскому напишет в чат, что погоня начата. Если игрок в данный момент выйдет из игры - при заходе его посадит в тюрьму. Если полицейские отдалятся на слишком далекое расстояние, погоня также прекратится. 

Требования: 

  • Командный процессор ZCMD / DC_CMD или Pawn.CMD. 
  • Уметь пользоваться клавишами CTRL + C и CTRL+V. 

Переходим к самой системе: 

Ко всем new:

#define SendClientMessage SCM // если такой уже есть, этот не вставлять
#define COLOR_WARNING 0xF7CA18AA
new PursuitTimer[MAX_PLAYERS]; 

Ко всем командам: 

Спойлер

CMD:ps(playerid, params[])
{
	//проверку на фракцию
	if(sscanf(params, "d", params[0])) return SCM(playerid, COLOR_WARNING, "USAGE: /pursuit [id]");
	if(GetPVarInt(playerid, "pursuited")) return SCM(playerid, COLOR_WARNING, "Вы уже ведете погоню! Для отмены /cancelps");
	if(params[0] == playerid) return SCM(playerid, COLOR_WARNING, "Невозможно выполнить для самого себя!");
	if(GetPVarInt(playerid, "paf") > gettime()) return SCM(playerid, COLOR_WARNING, "Можно использовать раз в 10 секунд!");
	if(!IsPlayerConnected(params[0])) return SCM(playerid, COLOR_WARNING, "Игрок не подключен!");
	new Float:x, Float:y, Float:z;
	GetPlayerPos(params[0], x, y, z);
	if(GetPlayerDistanceFromPoint(playerid, x, y, z) > 30) return SCM(playerid, COLOR_WARNING, "Вы слишком далеко от приследуемого! (более 30м)");

	
	SetPVarInt(params[0], "pursuit", 1);
	SetPVarInt(playerid, "pursuited", params[0]);
	SCM(params[0], COLOR_WARNING, "[ВНИМАНИЕ!] За вами начали погоню полицейские. Если вы выйдите из игры, вы автоматически попадете в КПЗ!");
	static const fmt_str[] = "[Dispatch Police] За вами начал погоню полицейский %s[%d]";
	PlayCrimeReportForPlayer(playerid, params[0], 3);
	new name[MAX_PLAYER_NAME];
	GetPlayerName(playerid, name, MAX_PLAYER_NAME];
	new str[sizeof(fmt_str)+MAX_PLAYER_NAME+12];
	format(str, sizeof(str), fmt_str, name, playerid);
	SCM(params[0], COLOR_WARNING, str);
	SCM(playerid, COLOR_WARNING, "Вы начали погоню за подозреваемым. Оставайтесь в радиусе 70 м, иначе погоня будет прекращена!");
	SetPVarInt(playerid, "paf", gettime()+10);
	
	PursuitTimer[playerid] = SetTimerEx("TimerPursuit", 1000*3, true, "ii", playerid, params[0]);
	
	return true;
}
CMD:cancelps(playerid)
{
	//проверка на фракцию
	if(!GetPVarInt(playerid, "pursuited")) return SCM(playerid, COLOR_WARNING, "Вы никого не приследовали! Действие невозможно!");

	SCM(GetPVarInt(playerid, "pursuited"), COLOR_WARNING, "Погоня за вами прекращена!");
	SCM(playerid, COLOR_WARNING, "Погоня прекращена!");
	DeletePVar(GetPVarInt(playerid, "pursuited"), "pursuit");
	DeletePVar(playerid, "pursuit");
	DeletePVar(playerid, "paf");
	
	return true;
}

 

В конец мода: 

Спойлер

forward TimerPursuit(playerid, pursuitid);
public TimerPursuit(playerid, pursuitid)
{
	new Float:x, Float:y, Float:z;
	GetPlayerPos(pursuitid, x, y, z);
	if(GetPlayerDistanceFromPoint(playerid, x, y, z) > 70)
	{
	    SCM(pursuitid, COLOR_WARNING, "Погоня прекращена, так как полицейские отдалились более, чем на 70 м");
	    SCM(playerid, COLOR_WARNING, "Погоня завершена, вы отдалились более чем на 70 метров!");
	    DeletePVar(pursuitid, "pursuit");
	    DeletePVar(playerid, "pursuitid");
	    DeletePVar(playerid, "paf");
	    KillTimer(PursuitTimer[playerid]);
	    return true;
	}
	return true;
}

 

В OnPlayerDisconnect:
 

if(GetPVarInt(playerid, "pursuit") == 1)
{
  	/* ДАННЫЕ ФУНКЦИИ ЗАМЕНИТЬ НА СВОИ, ОБНУЛЕНИЕ РОЗЫСКА А ТАКЖЕ ВЫДАЧА ТЮРЬМЫ. 3600 - ЭТО ВРЕМЯ, 60 минут*/
    PLAYER_DATA[playerid][data_JAIL] = 1;
    PLAYER_DATA[playerid][data_JAILTIME] = 3600;
    PLAYER_DATA[playerid][data_WANTED] = 0;
  	/*КОНЕЦ ЗАМЕНЫ ОСТАЛЬНОЕ ВСЕ МОЖНО ОСТАВИТЬ*/
    static const fmt_str[] = "%s был посажен в кпз на 60 минут. Причина: выход при погоне";
    new text[sizeof(fmt_str)+MAX_PLAYER_NAME], names[MAX_PLAYER_NAME]; 
    GetPlayerName(playerid, names, MAX_PLAYER_NAME]; 
    format(text,sizeof(text),fmt_str, names);
    SendClientMessageToAll(-1,text);
}

Автор: @stibs

Копирование на другие порталы запрещено. 

Share this post


Link to post
Share on other sites

А если человека крашнет? Его же все равно посадит..

Share this post


Link to post
Share on other sites

@DustonPlayZ Для этого можете использовать параметр reason в паблике OnPlayerDisconnect, подробнее см. https://wiki.sa-mp.com/wiki/OnPlayerDisconnect

Share this post


Link to post
Share on other sites

зачетная тема! 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • nocare.
      By nocare.
      Фризит(замораживает) при телепортах, переходах через пикапы, и так далее. Помогите, не могу понять в чем проблемма
    • Tony_Cannabis
      By Tony_Cannabis
      К сути, что собственно нужно и кто нужен...
       
      Нужно:
       
      Все дальнейшие работы расскажу в лс, если интересно пишите и называйте свою цену
      Так-же неплохо бы было найти пиарщика и дизайнера