12.06.2014, 03:13
(
Last edited by Seregamil1; 12/06/2014 at 02:42 PM.
)
Функция, рисующая луч в игровом мире от одной точки до другой и возвращающая позицию, в которой луч столкнулся с объектом/машиной/игроком.
Аргументы:
Функция:
Дополнительные функции, используемые в системе:
native IsValidVehicle(vehicleid);
Плагин MapAndreas: https://sampforum.blast.hk/showthread.php?tid=275492
Пример использования:
Аргументы:
PHP Code:
processLineOfSight(
//координаты старта
Float: start_x,
Float: start_y,
Float: start_z,
//координаты конца, в них же записываются координаты последней доступной точки
&Float: end_x,
&Float: end_y,
&Float: end_z,
//параметры проверки
bool: check_vehicles, //true - проверять машины, false - пропускать машины
bool: check_players ) //true - проверять игроков, false - пропускать игроков
PHP Code:
#define radiusCollision 3.0
processLineOfSight( Float: start_x, Float: start_y, Float: start_z, &Float: end_x, &Float: end_y, &Float: end_z, bool: check_vehicles, bool: check_players ){//by Seregamil
new distance_between_points = floatround( VectorSize( end_x - start_x, end_y - start_y, end_z - start_z ) );
if( distance_between_points == 0 )
return ;
new Float: pack_pos_x = floatdiv( end_x - start_x, float( distance_between_points ) ),
Float: pack_pos_y = floatdiv( end_y - start_y, float( distance_between_points ) ),
Float: pack_pos_z = floatdiv( end_z - start_z, float( distance_between_points ) ),
Float: map_z = 0.0,
j = -1, Float: pos_x, Float: pos_y, Float: pos_z , i = 1;
do{
start_x += pack_pos_x;
start_y += pack_pos_y;
start_z += pack_pos_z;
if( check_vehicles ){
for( ; i != MAX_VEHICLES; i++ ){
if( !IsValidVehicle( i ) ) continue;
GetVehiclePos( i, pos_x, pos_y, pos_z );
if( VectorSize( pos_x - start_x, pos_y - start_y, pos_z - start_z ) > radiusCollision ) continue;
end_x = start_x;
end_y = start_y;
end_z = start_z;
return ;
}
}
if( check_players ){
for( i = GetMaxPlayers() - 1; i != -1; i-- ){
if( IsPlayerNPC( i ) || !IsPlayerConnected( i ) ) continue;
GetPlayerPos( i, pos_x, pos_y, pos_z );
if( !IsPlayerInRangeOfPoint( i , radiusCollision, pos_x, pos_y, pos_z ) ) continue;
end_x = start_x;
end_y = start_y;
end_z = start_z;
return ;
}
}
MapAndreas_FindZ_For2DCoord( start_x, start_y, map_z );
if( map_z < start_z )
continue;
end_x = start_x;
end_y = start_y;
end_z = start_z;
break;
}
while( ++j < distance_between_points );
}
native IsValidVehicle(vehicleid);
Плагин MapAndreas: https://sampforum.blast.hk/showthread.php?tid=275492
Пример использования:
PHP Code:
new Float:x = 0.0, Float:y = 0.0, Float:z = 0.0, Object = CreateObject( 2000, -10.4548,55.2839,12.1676, 0.0, 0.0, 0.0 );
processLineOfSight( -10.4548,55.2839,12.1676, x,y,z, false, true );
MoveObject(Object, x,y,z,3.0);