PDA

Просмотр полной версии : [Вопрос] По поводу автомобильных дверей



BadPawn
09.02.2016, 18:54
Всем привет.
Раньше никогда не связывался с автомобилями.:rtfm:

Вот моя команда:

CMD:lock(playerid)
{
new
vehicleid = GetPlayerVehicleID(playerid),
Float:vehicle_pos_x,
Float:vehicle_pos_y,
Float:vehicle_pos_z;
GetVehiclePos(vehicleid, vehicle_pos_x, vehicle_pos_y, vehicle_pos_z);

if(!IsPlayerInRangeOfPoint(playerid, 3.0, vehicle_pos_x, vehicle_pos_y, vehicle_pos_z))
return SendClientMessage(playerid, -1,
"* Нет рядом машин.");

if(doors_car{vehicleid} == true)
{
doors_car{vehicleid} = false;
SetVehicleParamsForPlayer(vehicleid, playerid, 0, doors_car{vehicleid});
GameTextForPlayer(playerid, "~w~Vehicle ~g~Unlocked", 2000, 1);
}
else
{
doors_car{vehicleid} = true;
SetVehicleParamsForPlayer(vehicleid, playerid, 0, doors_car{vehicleid});
GameTextForPlayer(playerid, "~w~Vehicle ~r~Locked", 2000, 1);
}
return true;
}

Ребят, подскажите, легонько подтолкните в нужное русло.

Нужно сделать отлично команду /lock, закрытие\открытие автомобиля. Как ключи дать фракции от своих машин, это вторая проблема уже, но мне же, нужно, что бы я подошел к двери автомобиля, ввел команду, и если ключи у меня есть то открыл дверь, если нету, он напишет мол у тебя нет ключей от авто, ты чего дубина. :) и в таком духе.

Profyan
09.02.2016, 19:27
Ну во-первых у тебя /lock работает только для транспорта,в котором ты сидишь.Стоит разделить этот блок на 2 с соответствующей проверкой.Когда ты не за рулем, находишь ближайшую машину(алгоритм довольно простой) и изменяешь состояние замков на противоположенное.А про ключи,так это просто: делаешь проверку на нахождение данных ключей у игрока.Например,в массив игрока добавь одно поле, в котором будет хранится id транспорта,от которого у данного игрока ключи(или массив,если хочешь,чтобы игрок одновременно владел большим кол-ом ключей).Я не знаю как ты хочешь реализовать систему получения ключей,думаю,что сам разберешься.А в команде /lock проверяй if(PlayerInfo[playerid][pVehKey] == vehicleid) {} (пример).

BadPawn
09.02.2016, 20:15
да, точно. :) по другому не знаю, как сделать. сделал, как знаю, но теперь уверенно могу сказать, что открыть закрыть работает точно. :))

приступим, тооообишь, нужно написать проверку на ближайший находящийся транспорт в округе игрока. Затем добавить массив в игрока для сохранения ключей от каров, далее выдавать ключи игрокам. и по логике, при принятии во фракцию, просто выдавать список ключей игроку, и дело с концом. Начнем проверочку.


я близко:

stock GetSearchVehicle(playerid, Float:distance)
{
new
Float:vehicle_pos_x,
Float:vehicle_pos_y,
Float:vehicle_pos_z,
search = -1;

foreach(Vehicle, vehicleid)
{
GetVehiclePos(vehicleid, vehicle_pos_x, vehicle_pos_y, vehicle_pos_z);
if(search == -1)
{
search = vehicleid;
distance = GetPlayerDistanceFromPoint(playerid, vehicle_pos_x, vehicle_pos_y, vehicle_pos_z);
}
else if(GetPlayerDistanceFromPoint(playerid, vehicle_pos_x, vehicle_pos_y, vehicle_pos_z) < distance)
{
search = vehicleid;
distance = GetPlayerDistanceFromPoint(playerid, vehicle_pos_x, vehicle_pos_y, vehicle_pos_z);
}
}
return search;
}

С использованием инклуда от DC.

использование простое:
название_функции(ид, дистанция в округе)

vovandolg
10.02.2016, 01:35
Ещё тут можно заюзать перебор каров от DC, чтобы быстрее работала функция.
Клац (http://pro-pawn.ru/showthread.php?13061-dc_foreach_veh-%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80-%D1%82%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D0%B0)


//By DeimoS: Так же не стоит создавать переменные внутри циклов, ибо каждую итерацию такая переменная сначала будет создаваться, а потом уничтожаться. Стэк вам спасибо явно не скажет за это :3

BadPawn
10.02.2016, 10:33
Всем спасибо.

Сложно, и времени не мало потратил, но сделал.
Может кому пригодится:

функция на ближайший авто в округе:

GetSearchVehicle(playerid, Float:distance)
{
new
Float:vehicle_pos_x,
Float:vehicle_pos_y,
Float:vehicle_pos_z,
Float:pos_veh,
search_vehicle = INVALID_VEHICLE_ID;

foreach(Vehicle, veh)
{
GetVehiclePos(veh, vehicle_pos_x, vehicle_pos_y, vehicle_pos_z);
pos_veh = GetPlayerDistanceFromPoint(playerid, vehicle_pos_x, vehicle_pos_y, vehicle_pos_z);

if(pos_veh <= distance)
search_vehicle = veh,
distance = pos_veh;
}
return search_vehicle;
}


Команда DC_CMD:

CMD:lock(playerid)
{
new
vehicleid = GetPlayerVehicleID(playerid);

if(vehicleid == 0) vehicleid = GetSearchVehicle(playerid, 3.0);
if(vehicleid == INVALID_VEHICLE_ID)
return SendClientMessage(playerid, -1,
"Далеко от машины");

if(doors_car{vehicleid} == true)
doors_car{vehicleid} = false,
SetVehicleParamsForPlayer(vehicleid, playerid, 0, doors_car{vehicleid});
else
doors_car{vehicleid} = true,
SetVehicleParamsForPlayer(vehicleid, playerid, 0, doors_car{vehicleid});

SendClientMessage(playerid, 0xA9A9A9AA, doors_car{vehicleid} ? ("* Закрыли дверь.") : ("* Открыли дверь."));
return true;
}

Спасибо за помощь.

Создание переменной убрал, форич DC по скану всех авто.

Profyan
10.02.2016, 12:20
Всем спасибо.

Сложно, и времени не мало потратил, но сделал.
Может кому пригодится:

функция на ближайший авто в округе:

GetSearchVehicle(playerid, Float:distance)
{
new
Float:vehicle_pos_x,
Float:vehicle_pos_y,
Float:vehicle_pos_z,
Float:pos_veh,
search_vehicle = INVALID_VEHICLE_ID;

foreach(Vehicle, veh)
{
GetVehiclePos(veh, vehicle_pos_x, vehicle_pos_y, vehicle_pos_z);
pos_veh = GetPlayerDistanceFromPoint(playerid, vehicle_pos_x, vehicle_pos_y, vehicle_pos_z);

if(pos_veh <= distance && veh != INVALID_VEHICLE_ID)
search_vehicle = veh,
distance = pos_veh;
}
return search_vehicle;
}


Команда DC_CMD:

CMD:lock(playerid)
{
new
vehicleid = GetPlayerVehicleID(playerid);

if(vehicleid == 0) vehicleid = GetSearchVehicle(playerid, 3.0);
if(vehicleid == INVALID_VEHICLE_ID)
return SendClientMessage(playerid, -1,
"Далеко от машины");

if(doors_car{vehicleid} == true)
doors_car{vehicleid} = false,
SetVehicleParamsForPlayer(vehicleid, playerid, 0, doors_car{vehicleid});
else
doors_car{vehicleid} = true,
SetVehicleParamsForPlayer(vehicleid, playerid, 0, doors_car{vehicleid});

SendClientMessage(playerid, 0xA9A9A9AA, doors_car{vehicleid} ? ("* Закрыли дверь.") : ("* Открыли дверь."));
return true;
}

Спасибо за помощь.

Создание переменной убрал, форич DC по скану всех авто.

А разве нужна проверка на существования транспорта?(veh != INVALID_VEHICLE_ID)
foreach проходит по уже существующему транспорту?!

BadPawn
10.02.2016, 14:31
на знал, буду иметь ввиду. исправил.

как закрыть двери при спавне каров? добавил в onvehiclespawn следующее:

doors_car{vehicleid} = true;
Эффект 0.

VVWVV
10.02.2016, 15:11
А разве нужна проверка на существования транспорта?(veh != INVALID_VEHICLE_ID)

Функция SetVehicleParamsEx автоматически проверяет на наличие транспорта в игре. Для перехода к следующей итерации, вам, соответственно, понадобится оператор continue. (если это цикл)


как закрыть двери при спавне каров? добавил в onvehiclespawn следующее:

doors_car{vehicleid} = true;
Эффект 0.

Вы обновляете только переменную, но не значение в игре.


CMD:lock(playerid, params[])
{
new vehicleid;
if ((vehicleid = GetSearchVehicle(playerid, 3.0)) == INVALID_VEHICLE_ID)
return SendClientMessage(playerid, -1, !"Вы далеко от своей машины!");
SetVehicleParamsForPlayer(vehicleid, playerid, 0, doors_car{playerid}
? doors_car{playerid} = true
: doors_car{playerid} = false);
SendClientMessage(playerid, -1,
doors_car{playerid}
? (!"* Закрыли дверь.")
: (!"* Открыли дверь."));
return 1;
}

BadPawn
10.02.2016, 15:31
SetVehicleParamsForPlayer(vehicleid, playerid, 0, doors_car{vehicleid});
Это не то? Вначале обновляю переменную, а потом значение самой переменной считываю в SetVehicleParamsForPlayer

VVWVV
10.02.2016, 15:35
SetVehicleParamsForPlayer(vehicleid, playerid, 0, doors_car{vehicleid});
Это не то? Вначале обновляю переменную, а потом значение самой переменной считываю в SetVehicleParamsForPlayer

Вроде бы нельзя закрывать машины при их спавне.