PDA

Просмотр полной версии : [Include] IsPlayerNear*



Osetin
04.10.2013, 23:56
Описание:
Данный инклуд предназначен для быстрого нахождения, возле чего стоит игрок.
Алгоритм несколько отличается от классической схемы поиска. В данном инклуде перебираются только те машины, которые входят в зону стрима игрока - это даёт большое преимущество, так как проверяется не более 100 машин, в то время, как в классической схеме MAX_VEHICLES проверяются все машины на сервере. Также присутствует более простое определение, повёрнут ли игрок в сторону детали. Не каждый может похвастаться его присутствием.

Функции:
Часть первая.

Происходит поиск транспорта по указанной детали. Если персонаж стоит возле детали и повёрнут в её сторону, вернут ид транспорта в случае совпадения.
Функции возвращают ID машины или INVALID_VEHICLE_ID, если машина не найдена.
playerid - ид игрока для которого происходит поиск.
Range - допустимая дистанция. Дальше - игрок не находиться возле детали.
MaxAngle - максимальный угол поворота персонажа. Больше - игрок не повёрнут в сторону детали.


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 - ID транспорта, для которого происходит поиск координат.
x, y, z - координаты положения детали в мире.

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 - максимальный угол поворота персонажа. Больше, игрок не повёрнут в сторону детали.

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); перед инклудом.

Пример:

#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 при поиске третьей двери.

Автор: White_116

Скачать:
http://pastebin.com/UJAch5WU
http://www.solidfiles.com/d/988cb6accf/

Daniel_Cortez
05.10.2013, 15:52
Хороший инклуд, довольно функциональный.
Правда не радует метод перехвата функций и чуть менее, чем никакая, табуляция. Но это скорее придирки...

Salvacore
05.10.2013, 19:41
интересно,для чего можно использовать его

Daniel_Cortez
05.10.2013, 20:07
Например...

для взрыва машин при выстреле в бензобак :grin:
...да и для много чего ещё. Можно, например, сделать перекраску машины баллончиком (правда, это уже где-то было, но теперь такая задача решается куда проще).

UPD: Ан нет, вру, сделать взрыв бензобака только средствами данного инклуда не выйдет, а вот для перекраски машин самое то.