Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Команда прокола шины авто

Статус
В этой теме нельзя размещать новые ответы.

Fescobalt

Новичок
Приветствую Вас, пользователи P-I. Сегодня я решил поделиться такой незамысловатой командой, как прокол шины. Работа её довольно проста и должна быть знакома, так как в ней используются простые алгоритмы, которые известны даже школьнику. Результат её работы Вас приятно удивит. На первый взгляд такая простая команда, по описанию, а оказывается не такой уж и легко реализуемой.

Код писал глубокой ночью, работу кода проверял лично я.

Если каких-то проверок не хватает, можете добавить, так как, на мой взгляд, команда достаточно универсальна и отлично подойдёт для сервера как с RP, так и с Full RP режимом. Подойдёт бандам и полицейским.

Кстати, поменяв пару строчек можно сделать систему по починке отдельного колеса и отлично подойдет для отыгрывания RP ситуации с механиком.

А вот собственно и код:

Код команды:
PHP:
CMD:useneedle(playerid, params[])
{
	if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Вы не можете сделать это из машины");
	new vehicleid = GetVehicleByPlayer(playerid);
	if(vehicleid == -1) return SendClientMessage(playerid, COLOR_GREY, "Вы не рядом с машиной");
	new tire = GetTireByPlayer(playerid, vehicleid);
	if(tire == -1) return SendClientMessage(playerid, COLOR_GREY, "Вы не у колеса");
        new Panel, Door, Light, Tires;
        if(Tires != 0) return SendClientMessage(playerid, COLOR_GREY, "У этой машины уже проколото колесо");
	GetVehicleDamageStatus(vehicleid, Panel, Door, Light, Tires);
	new bool:tirestatus[4];
	new Tires_temp = Tires;
	for(new i = 0; i < 4; i++)
	{
		if(Tires_temp % 2 == 1) tirestatus[i] = true;
		Tires_temp = Tires_temp / 2;
	}
	switch (tire)
	{
	    case 4:
		{
		    if(tirestatus[0]) return SendClientMessage(playerid, COLOR_GREY, "Колесо уже проколото");
			Tires += 8; //1000
		}
	    case 3:
	    {
		    if(tirestatus[1]) return SendClientMessage(playerid, COLOR_GREY, "Колесо уже проколото");
			Tires += 4; //0100
		}
	    case 2:
	    {
		    if(tirestatus[2]) return SendClientMessage(playerid, COLOR_GREY, "Колесо уже проколото");
			Tires += 2; //0010
		}
	    case 1:
	    {
		    if(tirestatus[3]) return SendClientMessage(playerid, COLOR_GREY, "Колесо уже проколото");
			Tires += 1; //0001
		}
	}
	UpdateVehicleDamageStatus(vehicleid, Panel, Door, Light, Tires);
	return 1;
}
Коды функций:
PHP:
stock GetVehicleByPlayer(playerid) //вернёт ид авто в радиусе 2.5, если авто нет, то вернёт -1
{
	new vehicleid = -1;
	new Float:carX, Float:carY, Float:carZ;
	for(new i = 0; i < MAX_VEHICLES; i++)
	{
	    GetVehiclePos(i, carX, carY, carZ);
	    if(IsPlayerInRangeOfPoint(playerid, 2.4, carX, carY,carZ)) {
	        vehicleid = i;
	        break;
	    }
	}
	return vehicleid;
}
PHP:
stock GetTireByPlayer(playerid, vehicleid)
{
	new Float:x, Float:y, Float:z, Float:carX, Float:carY, Float:carZ;
	GetPlayerPos(playerid, x, y, z);
	GetVehiclePos(vehicleid, carX, carY, carZ);
	
	new totalX;
	totalX = floatround(x - carX, floatround_floor);
	new totalY;
	totalY = floatround(y- carY, floatround_floor);
	
	//более точный вариант
	
	/*if ((1.45 <= totalX <= 1.5) && (-2.0 <= totalY <= -1.95)) return 1;	// 1
	else if ((1.52 <= totalX <= 1.57) && (1.56 <= totalY <= 1.61)) return 2;	//2
	else if ((-1.56 <= totalX <= -1.51) && (-173 <= totalY <= -1.68)) return 3;	//3
	else if ((-1.46 <= totalX <= -1.41) && (1.87 <= totalY <= 1.92)) return 4;	//4
	else return -1;*/
	

        //логически ужасный вариант, но работает
	if ((totalX >= 1) && (totalY <= -1)) return 1;	// 1
	else if ((totalX >= 1) && (totalY >= 1)) return 2;	//2
	else if ((totalX <= -1) && (totalY <= -1)) return 3;	//3
	else if ((totalX <= -1) && (totalY >= 1)) return 4;	//4
	else return -1;
}
Специально для Вас от fescobalt'a

Плюсик лишним не будет =(^_^)=
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу