Просмотр полной версии : [Вопрос] По поводу автомобильных дверей
Всем привет.
Раньше никогда не связывался с автомобилями.: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, закрытие\открытие автомобиля. Как ключи дать фракции от своих машин, это вторая проблема уже, но мне же, нужно, что бы я подошел к двери автомобиля, ввел команду, и если ключи у меня есть то открыл дверь, если нету, он напишет мол у тебя нет ключей от авто, ты чего дубина. :) и в таком духе.
Ну во-первых у тебя /lock работает только для транспорта,в котором ты сидишь.Стоит разделить этот блок на 2 с соответствующей проверкой.Когда ты не за рулем, находишь ближайшую машину(алгоритм довольно простой) и изменяешь состояние замков на противоположенное.А про ключи,так это просто: делаешь проверку на нахождение данных ключей у игрока.Например,в массив игрока добавь одно поле, в котором будет хранится id транспорта,от которого у данного игрока ключи(или массив,если хочешь,чтобы игрок одновременно владел большим кол-ом ключей).Я не знаю как ты хочешь реализовать систему получения ключей,думаю,что сам разберешься.А в команде /lock проверяй if(PlayerInfo[playerid][pVehKey] == vehicleid) {} (пример).
да, точно. :) по другому не знаю, как сделать. сделал, как знаю, но теперь уверенно могу сказать, что открыть закрыть работает точно. :))
приступим, тооообишь, нужно написать проверку на ближайший находящийся транспорт в округе игрока. Затем добавить массив в игрока для сохранения ключей от каров, далее выдавать ключи игрокам. и по логике, при принятии во фракцию, просто выдавать список ключей игроку, и дело с концом. Начнем проверочку.
я близко:
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
Всем спасибо.
Сложно, и времени не мало потратил, но сделал.
Может кому пригодится:
функция на ближайший авто в округе:
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 по скану всех авто.
Всем спасибо.
Сложно, и времени не мало потратил, но сделал.
Может кому пригодится:
функция на ближайший авто в округе:
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 проходит по уже существующему транспорту?!
на знал, буду иметь ввиду. исправил.
как закрыть двери при спавне каров? добавил в onvehiclespawn следующее:
doors_car{vehicleid} = true;
Эффект 0.
А разве нужна проверка на существования транспорта?(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;
}
SetVehicleParamsForPlayer(vehicleid, playerid, 0, doors_car{vehicleid});
Это не то? Вначале обновляю переменную, а потом значение самой переменной считываю в SetVehicleParamsForPlayer
SetVehicleParamsForPlayer(vehicleid, playerid, 0, doors_car{vehicleid});
Это не то? Вначале обновляю переменную, а потом значение самой переменной считываю в SetVehicleParamsForPlayer
Вроде бы нельзя закрывать машины при их спавне.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot