IsPlayerNear* -
White_116 - 05.08.2013
IsPlayerNear* v1.2 by White_116
Здравствуйте, уважаемые пользователи форума. Хочу представить вам результат моей проделанной работы. Изначально, по просьбе одного человека я сделал небольшую функцию для быстрого определения стоит ли игрок рядом с багажником машины. Спустя некоторое время я решил сделать определение не только багажника но и капота, крышки бензобака, дверей транспорта.
Описание:
Данный инклуд предназначен для быстрого нахождения возле чего стоит игрок.
Алгоритм несколько отличается от классической схемы поиска. В данном инклуде перебираются только те машины, которые входят в зону стрима игрока - это даёт большое преимущество, так как проверяется не более 100 машин, в то время, как в классической схеме MAX_VEHICLES. Так же присутствует более простое определение повёрнут ли игрок в сторону детали. Не каждый может похвастаться его присутствием.
Функции:
Часть первая.
Происходит поиск транспорта по указанной детали. Если персонаж стоит возле детали и повёрнут в её сторону, вернут ид транспорта в случае совпадения.
Возвращают: INVALID_VEHICLE_ID или
vehicleid.
playerid - ид игрока для которого происходит поиск.
Range - допустимая дистанция. Дальше, игрок не находиться возле детали.
MaxAngle - максимальный угол поворота персонажа. Больше, игрок не повёрнут в сторону детали.
PHP Code:
native GetVehicleIfPlayerNearVehicle(playerid, Float:Range=15.0, Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearBoot(playerid, Float:Range=1.5, Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearBonnet(playerid, Float:Range=1.5, Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearPetrolCap(playerid, Float:Range=0.75, Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearDoor(playerid, door, Float:Range=0.75, Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearDoor0(playerid, Float:Range=0.75, Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearDoor1(playerid, Float:Range=0.75, Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearDoor2(playerid, Float:Range=0.75, Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearDoor3(playerid, Float:Range=0.75, Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearWheel(playerid, wheel, Float:Range=0.75, Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearWheel0(playerid, Float:Range=0.75, Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearWheel1(playerid, Float:Range=0.75, Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearWheel2(playerid, Float:Range=0.75, Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearWheel3(playerid, Float:Range=0.75, Float:MaxAngle=30.0);
Часть вторая.
Вернут положения детали транспорта в глобальных(мировых) координатах.
Возвращают: 0 или
1.
vehicleid - ид транспорта для которого происходит поиск координат.
x, y, z - координаты положение детали в мире.
PHP Code:
native GetVehicleBootPos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleBonnetPos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehiclePetrolCapPos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleDoorPos(vehicleid, door, &Float:x, &Float:y, &Float:z);
native GetVehicleDoor0Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleDoor1Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleDoor2Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleDoor3Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleWheelPos(vehicleid, wheel, &Float:x, &Float:y, &Float:z);
native GetVehicleWheel0Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleWheel1Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleWheel2Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleWheel3Pos(vehicleid, &Float:x, &Float:y, &Float:z);
Часть третья.
Происходит проверка, находится ли персонаж возле заданного транспорта и детали а так же повёрнут ли в её сторону.
Возвращают: 0 или
1.
playerid - ид игрока для которого происходит поиск.
vehicleid - ид транспорта относительно которого происходит поиск координат.
Range - допустимая дистанция. Дальше, игрок не находиться возле детали.
MaxAngle - максимальный угол поворота персонажа. Больше, игрок не повёрнут в сторону детали.
PHP Code:
native IsPlayerNearVehicle(playerid, vehicleid, Float:Range=15.0, Float:MaxAngle=30.0);
native IsPlayerNearVehicleBoot(playerid, vehicleid, Float:Range=1.5, Float:MaxAngle=30.0);
native IsPlayerNearVehicleBonnet(playerid, vehicleid, Float:Range=1.5, Float:MaxAngle=30.0);
native IsPlayerNearVehiclePetrolCap(playerid, vehicleid, Float:Range=0.75, Float:MaxAngle=30.0);
native IsPlayerNearVehicleDoor(playerid, vehicleid, door, Float:Range=0.75, Float:MaxAngle=30.0);
native IsPlayerNearVehicleDoor0(playerid, vehicleid, Float:Range=0.75, Float:MaxAngle=30.0);
native IsPlayerNearVehicleDoor1(playerid, vehicleid, Float:Range=0.75, Float:MaxAngle=30.0);
native IsPlayerNearVehicleDoor2(playerid, vehicleid, Float:Range=0.75, Float:MaxAngle=30.0);
native IsPlayerNearVehicleDoor3(playerid, vehicleid, Float:Range=0.75, Float:MaxAngle=30.0);
native IsPlayerNearVehicleWheel(playerid, vehicleid, wheel, Float:Range=0.75, Float:MaxAngle=30.0);
native IsPlayerNearVehicleWheel0(playerid, vehicleid, Float:Range=0.75, Float:MaxAngle=30.0);
native IsPlayerNearVehicleWheel1(playerid, vehicleid, Float:Range=0.75, Float:MaxAngle=30.0);
native IsPlayerNearVehicleWheel2(playerid, vehicleid, Float:Range=0.75, Float:MaxAngle=30.0);
native IsPlayerNearVehicleWheel3(playerid, vehicleid, Float:Range=0.75, Float:MaxAngle=30.0);
Примечание:- Boot-багажник, Bonnet-капот, PetrolCap-крышка бензобака, Wheel-колесо, Door-дверь (число соответствует номеру пассажирского места)
- Для того, чтобы не учитывать, повёрнут ли персонаж в сторону детали, нужно MaxAngle указывать больше или ровно 180.0. Если вы укажите отрицательное число, то поиск не даст результат.
- Для работы необходим инклуд: foreach
- Для тех у кого выскакивает ошибка undefined symbol "IsValidVehicle" нужно сделать так, как показано в примере, т.е. добавить native IsValidVehicle(vehicleid); перед инклудом.
Примемер:
PHP Code:
#define FILTERSCRIPT
native IsValidVehicle(vehicleid);
#include <IsPlayerNear>
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys & KEY_FIRE)
{
new str[128];
newkeys=GetVehicleIfPlayerNearVehicle(playerid, 10.0, 30.0);//вернёт ид машины.
if(newkeys)format(str,128,"Ты стоишь рядом и смотришь на машину номер: %d", newkeys);
else str="Ты не смотришь на машину или не стоишь рядом с ней.";
return SendClientMessage(playerid,-1,str);
}
return 1;
}
Ошибки и баги:- Есть возможность не нахождения, стоит ли игрок возле детали машины, когда машина стоит на не ровной поверхности. Фискисть пытался, но GetVehicleRotationQuat не корректно работает если машина пуста.
- В связи с тем, что данные мной не отфильтрованы, возможно не правильное положение или поиск колёс и крышки бензобака.
Изменения v1.1:- Подправлен код и изменены названия некоторых функций.
- Добавлены функции для нахождения колёс.
- Исправил недочёт, когда двери расположенные сзади, где багажник, считались боковыми.
Изменения v1.2:- Подправлен код и немного оптимизации.
- Исправил bug, при поиске третьей двери.
►►Просмотреть v1.2: Pastebin
►►Скачать v1.2: SolidFiles
►►Просмотреть v1.1: Pastebin
►►Скачать v1.1: SolidFiles
Re: IsPlayerNear* -
Mutha_X - 05.08.2013
Несколько вопросов не разглядывая кода:
* Для Ромзеса делал?)
* Если я встану сзади вертолёта за чего малыми лопастями, то я там обнаружу багажник?))
* Что выдаёт при 2 и 3 позиции "у двери" в случае с мотоциклом? Или этим способом можно найти справа или слева мотака стоит чел?
* Комментарий про двери и бензобаки ясен - вопрос с буррито,и прочими мелковозами отпадает.
* Предложение: сделать проверку и определение позиции колёс.
* Зачем записывать факт застрименности машины игроку?
Re: IsPlayerNear* -
White_116 - 05.08.2013
Quote:
Originally Posted by Mutha_X
Несколько вопросов не разглядывая кода:
* Для Ромзеса делал?)
* Если я встану сзади вертолёта за чего малыми лопастями, то я там обнаружу багажник?))
* Что выдаёт при 2 и 3 позиции "у двери" в случае с мотоциклом? Или этим способом можно найти справа или слева мотака стоит чел?
* Комментарий про двери и бензобаки ясен - вопрос с буррито,и прочими мелковозами отпадает.
* Предложение: сделать проверку и определение позиции колёс.
* Зачем записывать факт застрименности машины игроку?
|
1) Нет.
2) Да, так как у меня нет массива с информацией присутствия багажника или капота а также крышки бензобака.
3) Массив с пассажирскими дверьми присутствует. У мотоцикла нет 2, 3, позиции - значит и проверка идёт мимо.
5) Если нужно то сделаю, опять же как быть с танком и 6 колёсными грузовиками?
6) Чтобы не проверять те машины до которых он не дотягивается, прочти описание.
Re: IsPlayerNear* -
Stepashka - 05.08.2013
Функции
Is*** не могут возвращать ничего кроме логических значений истины или лжи. Я рекомендую переименовать функции которые возвращают идентификатор машины в
Get***, а вместо 0 возвращать задефайненое значение
INVALID_VEHICLE_ID.
ЗЫ
Quote:
Для работы не обходим инклуд:
|
Необходим пишется слитно.
Re: IsPlayerNear* -
White_116 - 05.08.2013
Всем спасибо, завтра наверное будет готово. Если скинете массивы с информацией присутствия багажника или капота а также крышки бензобака, будет вообще шикарно.
Re: IsPlayerNear* -
stabker - 05.08.2013
Максимальный ангел
. MaxAn
gle правильно
Re: IsPlayerNear* -
AirKite - 06.08.2013
Да, с релизом поспешил... Хотел написать, насчёт Is и INVALID_VEHICLE_ID, но Stepashka опередил
Re: IsPlayerNear* -
White_116 - 06.08.2013
Quote:
Originally Posted by AirKite
Да, с релизом поспешил.
|
Есть такое. Обновил инклуд.
Re: IsPlayerNear* -
Stepashka - 06.08.2013
pawn Code:
if((GetVehicleModel(vehicleid)-400) < 0)continue;
замени на IsValidVehicle.
- Всю арифметику и сравнения с дробными числами выполнять средствами специальных функций.
- И самое глобальное:
- Удаляешь весь дублирующий код по определению ближайшей машины.
- Помещаешь определение ближайшей машины и расстояния до неё в OnVehicleStreamIn и OnVehicleStreamOut.
- Храниь эти данные глобально для каждого игрока.
- Во всех твоих проверках работаешь с данными из глобального массива.
Для точности, вдруг события стримминга машин не вызывались пока человек бегал в определенной зоне, можно добавить параметр релевантности данных и если он превысил какой-то порог, обновлять данные ближайшей машины.
Re: IsPlayerNear* -
White_116 - 06.08.2013
Quote:
Originally Posted by Stepashka
pawn Code:
if((GetVehicleModel(vehicleid)-400) < 0)continue;
замени на IsValidVehicle.
|
-Ок.
Quote:
Originally Posted by Stepashka
Помещаешь определение ближайшей машины и расстояния до неё в OnVehicleStreamIn и OnVehicleStreamOut.
|
А тут я встал в ступор. Как это определять расстояние? Его можно получить один раз при стриме транспорта и оно будет потом меняться. Допустим я с другом еду на разных машинах, можно так кататься вечно и я не выйду из стрима его машины а расстояние будет меняться.