05.08.2013, 18:08
(
Last edited by White_116; 09/08/2013 at 11:26 AM.
)
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 не корректно работает если машина пуста.
- В связи с тем, что данные мной не отфильтрованы, возможно не правильное положение или поиск колёс и крышки бензобака.
- Подправлен код и изменены названия некоторых функций.
- Добавлены функции для нахождения колёс.
- Исправил недочёт, когда двери расположенные сзади, где багажник, считались боковыми.
- Подправлен код и немного оптимизации.
- Исправил bug, при поиске третьей двери.
►►Просмотреть v1.2: Pastebin
►►Скачать v1.2: SolidFiles
►►Просмотреть v1.1: Pastebin
►►Скачать v1.1: SolidFiles