Fescobalt
Новичок
Приветствую Вас, пользователи P-I. Сегодня я решил поделиться такой незамысловатой командой, как прокол шины. Работа её довольно проста и должна быть знакома, так как в ней используются простые алгоритмы, которые известны даже школьнику. Результат её работы Вас приятно удивит. На первый взгляд такая простая команда, по описанию, а оказывается не такой уж и легко реализуемой.
Код писал глубокой ночью, работу кода проверял лично я.
Если каких-то проверок не хватает, можете добавить, так как, на мой взгляд, команда достаточно универсальна и отлично подойдёт для сервера как с RP, так и с Full RP режимом. Подойдёт бандам и полицейским.
Кстати, поменяв пару строчек можно сделать систему по починке отдельного колеса и отлично подойдет для отыгрывания RP ситуации с механиком.
А вот собственно и код:
Код команды:
Коды функций:
Специально для Вас от fescobalt'a
Плюсик лишним не будет =(^_^)=
Код писал глубокой ночью, работу кода проверял лично я.
Если каких-то проверок не хватает, можете добавить, так как, на мой взгляд, команда достаточно универсальна и отлично подойдёт для сервера как с 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;
}
Плюсик лишним не будет =(^_^)=
