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

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   You have pasted content with formatting.   Remove formatting

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

Loading...
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • Раксон Фаркрай
      By Раксон Фаркрай
      SAMP CEF
      Просмотр файла cef_create_browser(player_id, browser_id, const url[], hidden, focused)
      Создает браузер для указанного игрока.
      cef_destroy_browser(player_id, browser_id)
      Удаляет браузер.
      cef_hide_browser(player_id, browser_id, hide)
      Скрывает браузер.
      cef_emit_event(player_id, const event_name[], args…)
      Вызвать событие у клиента. Поддерживаемые типы аргументов: string, integer, float.
      cef_subscribe(const event_name[], const callback[])
      Подписаться на событие от клиента. Сигнатура функции колбека: Callback(player_id, const arguments[])
      cef_player_has_plugin(player_id)
      Проверка на наличие плагина у клиента.
      cef_create_ext_browser(player_id, browser_id, const texture[], const url[], scale)
      Создает браузер как и в первом случае, но с пометкой, что он будет отображаться на объектах на определенной текстуре. Параметр scale указывает во сколько раз нужно увеличить стандартную текстуру. Например, если стандартная текстура имеет размер 250x30 будет иметь размер 1250x150 при переданном параметре в 5 единиц.
      cef_append_to_object(player_id, browser_id, object_id)
      Заменяет текстуру переданного объекта на изображение браузера у клиента. Браузер должен быть создан с помощью cef_create_ext_browser, а так же должна присутствовать текстура, указанная при создании, для корректного отображения.
      cef_remove_from_object(player_id, browser_id, object_id)
      Возвращает оригинальную текстуру объекта.
      cef_toggle_dev_tools(player_id, browser_id, enabled)
      Включает / выключает инструменты разработчика.
      Добавил Раксон Фаркрай Добавлено 27.07.2021 Категория Плагины / инклуды Автор ZOTTCE Совместимость с версией мультиплеера ALL  
    • Раксон Фаркрай
      By Раксон Фаркрай
      cef_create_browser(player_id, browser_id, const url[], hidden, focused)
      Создает браузер для указанного игрока.
      cef_destroy_browser(player_id, browser_id)
      Удаляет браузер.
      cef_hide_browser(player_id, browser_id, hide)
      Скрывает браузер.
      cef_emit_event(player_id, const event_name[], args…)
      Вызвать событие у клиента. Поддерживаемые типы аргументов: string, integer, float.
      cef_subscribe(const event_name[], const callback[])
      Подписаться на событие от клиента. Сигнатура функции колбека: Callback(player_id, const arguments[])
      cef_player_has_plugin(player_id)
      Проверка на наличие плагина у клиента.
      cef_create_ext_browser(player_id, browser_id, const texture[], const url[], scale)
      Создает браузер как и в первом случае, но с пометкой, что он будет отображаться на объектах на определенной текстуре. Параметр scale указывает во сколько раз нужно увеличить стандартную текстуру. Например, если стандартная текстура имеет размер 250x30 будет иметь размер 1250x150 при переданном параметре в 5 единиц.
      cef_append_to_object(player_id, browser_id, object_id)
      Заменяет текстуру переданного объекта на изображение браузера у клиента. Браузер должен быть создан с помощью cef_create_ext_browser, а так же должна присутствовать текстура, указанная при создании, для корректного отображения.
      cef_remove_from_object(player_id, browser_id, object_id)
      Возвращает оригинальную текстуру объекта.
      cef_toggle_dev_tools(player_id, browser_id, enabled)
      Включает / выключает инструменты разработчика.
    • Джеймс
      By Джеймс
      Здравствуйте Ув.Участиники PAWNO-RUS,
      Столкнулся с проблемой - *Транспорт сломанный при загрузке на сервер* То есть загружаешь Т.С после покупки с 50% состоянии
      С исправлением затрудняюсь, может вы можете как то помочь.
      Заранее спасибо!