Перейти к содержанию
Авторизация  
Marvellous

Система погони

Рекомендуемые сообщения

Marvellous

Всем привет дорогие пользователи портала CR-MP

 

Сейчас хочу вам выложить систему погони за преступником!

 

Давайте расскажу вкратце,что это из себя представляет,так же пойдет для RP проектов.

 

И так,вы знаете,что на любом сервере вы сталкивались с тем,что когда вы начинаете погоню за нарушителем,то большинство игроков выходят из игры во время погони. Теперь для вас,а точнее для вашей фракции ГИБДД или УВД будет намного проще и будет намного интереснее с данной функцией!

 

И так,в чем суть данной команды, Полицейский ГИБДД или УВД водит команду и если игрок соответствует всем требованиям (т.е если он не в погоне и он находится в розыске,а так же рядом) то и полицейским и самому игроку пишет сообщение,что "Погоня начата", но тут самое улучшенное, если игрок надумает попросту выйти из игры(если крашнет,то да это плохо) то при заходе в игру он автоматически сажается в тюрьму,это тоже самое что и при задержание! Но если игрок не выйдет и будет уходить от погони,то через определенное расстояние между игроком и полицией будет большое,то погоня уже прекратиться до того момента,пока снова не ведут полицейские команду и ID игрока!

 

Фух. Думаю все понятно  с этим,теперь давайте уже перейдем к установке и настройки:

 

Ко всем new:

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

Ко всем командам,желательно возле команды наручники /cuff,что бы потом не потеряли:

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

Автор слива: Marvellous (Я)

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Demons_Queens

А если краш будет, то что делать тогда?))0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
mikilov

@Demons_Queens, я так понимаю, что если крашнет у того, кто начал погоню, надо будет начинать заново погоню, введя команду еще раз.

А если преступник, то повторюсь, его все равно посадит в тюрьму автоматически.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
фучжинейк

думаю, что в данном случае будет гуманнее не сажать игрока при краше, ибо вина-то не его

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
noname_idk

 

 


если крашнет,то да это плохо

А почему бы в OnPlayerDisconnect не проверять причину выхода из игры?

public OnPlayerDisconnect(playerid, reason)
{
	/*Ваш код*/
	if(GetPVarInt(playerid, "pursuit") == 1 && reason == 0)
	{
		/* ДАННЫЕ ФУНКЦИИ ЗАМЕНИТЬ НА СВОИ, ОБНУЛЕНИЕ РОЗЫСКА А ТАКЖЕ ВЫДАЧА ТЮРЬМЫ. 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);
	}
	/*Ваш код*/
	return true;
}


ID причин выхода из игры в public OnPlayerDisconnect:

0 - ошибка,
1 - /q,
2 - кикнут/забанен

Пример реализации для отправки информации о причине выхода тем же администраторам:

public OnPlayerDisconnect(playerid, reason)
{
	new string[39+(-2+MAX_PLAYER_NAME)+(-2+7)+1], name[MAX_PLAYER_NAME];
	GetPlayerName(playerid, name, sizeof(name));
	switch(reason)
	{
		case 0: string = "ошибка";
		case 1: string = "выход";
		case 2: string = "кик/бан".
	}
	format(string, sizeof(string), "Игрок %s покинул(а) сервер. Причина: %s", name, string);
	/*Функция отправки сообщения администраторам*/
	return true;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.