SA-MP Forums Archive
Коллекция функций / макросов - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Коллекция функций / макросов (/showthread.php?tid=118026)

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14


Re: Коллекция функций / макросов - Seregamil1 - 12.06.2014

Функция, рисующая луч в игровом мире от одной точки до другой и возвращающая позицию, в которой луч столкнулся с объектом/машиной/игроком.

Аргументы:
PHP Code:
processLineOfSight
//координаты старта
Floatstart_x
Floatstart_y
Floatstart_z
//координаты конца, в них же записываются координаты последней доступной точки
&Floatend_x
&
Floatend_y
&
Floatend_z
//параметры проверки
boolcheck_vehicles//true - проверять машины, false - пропускать машины
boolcheck_players //true - проверять игроков, false - пропускать игроков 
Функция:
PHP Code:
#define radiusCollision 3.0
processLineOfSightFloatstart_xFloatstart_yFloatstart_z, &Floatend_x, &Floatend_y, &Floatend_zboolcheck_vehiclesboolcheck_players ){//by Seregamil
     
new distance_between_points floatroundVectorSizeend_x start_xend_y start_yend_z start_z ) );
    if( 
distance_between_points == )
        return ;
    new 
Floatpack_pos_x floatdivend_x start_xfloatdistance_between_points ) ),
        
Floatpack_pos_y floatdivend_y start_yfloatdistance_between_points ) ),
        
Floatpack_pos_z floatdivend_z start_zfloatdistance_between_points ) ),
        
Floatmap_z 0.0,
        
= -1Floatpos_xFloatpos_yFloatpos_z 1;
    do{
        
start_x += pack_pos_x;
        
start_y += pack_pos_y;
        
start_z += pack_pos_z;
        if( 
check_vehicles ){
            for( ; 
!= MAX_VEHICLESi++ ){
                if( !
IsValidVehicle) ) continue;
                
GetVehiclePosipos_xpos_ypos_z );
                if( 
VectorSizepos_x start_xpos_y start_ypos_z start_z ) > radiusCollision ) continue;
                
end_x start_x;
                
end_y start_y;
                
end_z start_z;
                return ;
            }
        }
        
        if( 
check_players ){
            for( 
GetMaxPlayers() - 1!= -1i-- ){
                if( 
IsPlayerNPC) || !IsPlayerConnected) ) continue;
                
GetPlayerPosipos_xpos_ypos_z );
                if( !
IsPlayerInRangeOfPointradiusCollisionpos_xpos_ypos_z ) ) continue;
                
end_x start_x;
                
end_y start_y;
                
end_z start_z;
                return ;
            }
        }
        
MapAndreas_FindZ_For2DCoordstart_xstart_ymap_z );
        if( 
map_z start_z )
            continue;
        
end_x start_x;
        
end_y start_y;
        
end_z start_z;
          break;
    }
    while( ++
distance_between_points );

Дополнительные функции, используемые в системе:
native IsValidVehicle(vehicleid);
Плагин MapAndreas: https://sampforum.blast.hk/showthread.php?tid=275492

Пример использования:
PHP Code:
new Float:0.0Float:0.0Float:0.0Object CreateObject2000, -10.4548,55.2839,12.16760.00.00.0 );
        
processLineOfSight( -10.4548,55.2839,12.1676x,y,zfalsetrue );
        
MoveObject(Objectx,y,z,3.0); 



Re: Коллекция функций / макросов - White_116 - 14.06.2014

Quote:
Originally Posted by Seregamil1
View Post
Функция, рисующая луч в игровом мире от одной точки до другой и возвращающая позицию, в которой луч столкнулся с объектом/машиной/игроком.
Никогда и не при каких обстоятельствах не используйте с алгоритмами поиска пути или видимости для НПС/зомби. Ибо сие творение для разового использования и при большой дистанции способно повесить сервер.


Re: Коллекция функций / макросов - Seregamil1 - 24.07.2014

Функция, которая равномерно развивает скорость объекта от заданной минимальной, до заданной максимальной, за заданное количество времени.

[ame]http://www.youtube.com/watch?v=b2Z0PsWKRQg[/ame]

Сама функция:

PHP Code:
forward MoveObjectWithAccelerationobjectidFloatstartSpeedFloatendSpeedFloatxFloatyFloatzaccelerationTime );
public 
MoveObjectWithAccelerationobjectidFloatstartSpeedFloatendSpeedFloatxFloatyFloatzaccelerationTime ){//by Seregamil
    
if( !IsValidObjectobjectid ) )
        return ;
    new 
FloatnewSpeed = ( endSpeed startSpeed ) / 10 startSpeed ;
    if( 
newSpeed >= endSpeed )
        return ;
    
MoveObjectobjectidxyznewSpeed );
    
SetTimerEx"MoveObjectWithAcceleration"accelerationTime 10false"ifffffi"objectidnewSpeedendSpeedxyzaccelerationTime );

Использование:
PHP Code:
MoveObjectWithAccelerationОбъектначальная скоростьконечная скоростькоординаты XYZ финальной позицииВремя в мсза которое объект должен ускориться ); 



Re: Коллекция функций / макросов - Strix - 29.07.2014

GetVehicleDriftAngle
Данная функция получает угол и направление заноса транспортного средства.

pawn Code:
stock GetVehicleDriftAngle(vehicleid, &Float:fVehDriftAngle)
{
    static
        Float: fVehVelocity[3],
        Float: fVehAngle,
        Float: fVehMoveAngle;

    if (!GetVehicleVelocity(vehicleid, fVehVelocity[0], fVehVelocity[1], fVehVelocity[2])) {
        return 0;
    }

    if (!floatcmp(fVehVelocity[0], 0.0) && !floatcmp(fVehVelocity[1], 0.0)) {
        fVehDriftAngle = 0.0;
        return 1;
    }

    fVehMoveAngle = -atan2(fVehVelocity[0], fVehVelocity[1]);

    GetVehicleZAngle(vehicleid, fVehAngle);
    if (floatcmp(fVehAngle, 180.0) == 1) {
        fVehAngle -= 360.0;
    }

    fVehDriftAngle = floatsub(fVehMoveAngle, fVehAngle);

    if (floatcmp(fVehDriftAngle, -180.0) == -1) {
        fVehDriftAngle += 360.0;
    }
    else if (floatcmp(fVehDriftAngle, 180.0) == 1) {
        fVehDriftAngle -= 360.0;
    }
    return 1;
}
Направление заноса


Re: Коллекция функций / макросов - stabker - 24.08.2014

Вчера обнаружил баг IsPlayerConnected. Если указать число больше 65535, то из-за типа данных оно будет идти по кругу, т.е. 65536 > 0, 65537 > 1 и т.д. (то же самое можно проделать со значениями, которые меньше 0). Функция вернет 1, а в вашем скрипте произойдет обращение к несуществующей ячейке.

pawn Code:
Fix_IsPlayerConnected(playerid) return (0 <= playerid <= 65535) ? (IsPlayerConnected(playerid)) : (0);
#define IsPlayerConnected(%0) Fix_IsPlayerConnected(%0)



Re: Коллекция функций / макросов - Stepashka - 24.08.2014

Quote:
Originally Posted by stabker
View Post
Вчера обнаружил баг IsPlayerConnected. Если указать число больше 65535, то из-за типа данных оно будет идти по кругу, т.е. 65536 > 0, 65537 > 1 и т.д. (то же самое можно проделать со значениями, которые меньше 0). Функция вернет 1, а в вашем скрипте произойдет обращение к несуществующей ячейке.

pawn Code:
Fix_IsPlayerConnected(playerid) return (0 <= playerid <= 65535) ? (IsPlayerConnected(playerid)) : (0);
#define IsPlayerConnected(%0) Fix_IsPlayerConnected(%0)
это не баг, это переполнение ячейки.


Re: Коллекция функций / макросов - stabker - 24.08.2014

Quote:
Originally Posted by Stepashka
View Post
это не баг, это переполнение ячейки.
Я это и имел ввиду =>
Quote:
Originally Posted by stabker
View Post
... Если указать число больше 65535, то из-за типа данных оно будет идти по кругу ...



Re: Коллекция функций / макросов - Stepashka - 25.08.2014

Quote:
Originally Posted by stabker
View Post
Я это и имел ввиду =>
Я не об этом. Править надо не это, а то место где у вас сюда приходит невалидное значение. Вы боритесь со следствием, а бороться надо с причиной!

Да и код для темы по оптимизации не оптимизирован:
pawn Code:
#define IsPlayerConnected(%0) ((0 <= %0 < MAX_PLAYERS) ? IsPlayerConnected(%0) : false)



Re: Коллекция функций / макросов - stabker - 25.08.2014

Quote:
Originally Posted by Stepashka
View Post
Я не об этом. Править надо не это а то место где у вас сюда приходит невалидное значение. Вы боритесь со следствием, а бороться надо с причиной!

Да и код для темы по оптимизации не оптимизирован:
pawn Code:
#define IsPlayerConnected(%0) ((0 <= %0 < MAX_PLAYERS) ? IsPlayerConnected(%0) : false)
По поводу причины - прочитайте мой пост выше. Возможно вы и правы, но меня такое решение вполне устраивает, учитывая, что причин может быть много.

65535 вместо MAX_PLAYERS специально использовал, чтобы функционал оставался в пределах разрешенного (мало ли, что я с ней делать хочу).

Ваша оптимизация радует, особенно бесконечный цикл, из-за которого компиляция так и не закончится.

В общем, мое дело предложить, ваше дело отказаться.


Re: Коллекция функций / макросов - ZiGGi - 26.08.2014

Quote:
Originally Posted by stabker
Посмотреть сообщение
Ваша оптимизация радует, особенно бесконечный цикл, из-за которого компиляция так и не закончится.
В его коде нет бесконечного цикла, вообще цикла нет.


Re: Коллекция функций / макросов - Stepashka - 26.08.2014

Quote:
Originally Posted by ZiGGi
Посмотреть сообщение
В его коде нет бесконечного цикла, вообще цикла нет.
Он имеет в виду внутри замены есть код который заменяется и дефайн начинает бесконечно сам себя заменять.
Особенность компилятора


Re: Коллекция функций / макросов - ZiGGi - 26.08.2014

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Он имеет в виду внутри замены есть код который заменяется и дефайн начинает, бесконечно сам себя заменять.
Особенность компилятора
А, ну да.


Re: Коллекция функций / макросов - stabker - 28.08.2014

Узнал о интересной возможности:

pawn Код:
native Copy_IsPlayerConnected(playerid) = IsPlayerConnected;
#define IsPlayerConnected(%0) ((0 <= (%0) < MAX_PLAYERS) ? (Copy_IsPlayerConnected(%0)) : (0))



Re: Коллекция функций / макросов - Jon_De - 03.09.2014

Есть у кого urlencode? Или принцип ее работы. На какие символы она заменяет буквы?


Re: Коллекция функций / макросов - Stepashka - 03.09.2014

Quote:
Originally Posted by Jon_De
Посмотреть сообщение
Есть у кого urlencode? Или принцип ее работы. На какие символы она заменяет буквы?
Кодирование URL


Re: Коллекция функций / макросов - Makar007 - 06.09.2014

Quote:
Originally Posted by stabker
Посмотреть сообщение
Узнал о интересной возможности:

pawn Код:
native Copy_IsPlayerConnected(playerid) = IsPlayerConnected;
#define IsPlayerConnected(%0) ((0 <= (%0) < MAX_PLAYERS) ? (Copy_IsPlayerConnected(%0)) : (0))
Описать принцип кто может? Что делает эта "интересная возможность"


Re: Коллекция функций / макросов - Stepashka - 06.09.2014

Quote:
Originally Posted by Makar007
Посмотреть сообщение
Описать принцип кто может? Что делает эта "интересная возможность"
Copy_IsPlayerConnected объявляется копией метода IsPlayerConnected.


Re: Коллекция функций / макросов - OKStyle - 07.09.2014

А почему в первом случае есть аргумент, а во втором нет?


Re: Коллекция функций / макросов - White_116 - 07.09.2014

Quote:
Originally Posted by OKStyle
Посмотреть сообщение
А почему в первом случае есть аргумент, а во втором нет?
Определение прототипа функции и присвоение ему указателя на другую функцию (по сути funcidx)


Re: Коллекция функций / макросов - SoNikMells - 29.12.2014

OKStyle, любитель толстого кода?

Твоя функция ошибочна, она обязана вернуть значение

pawn Код:
stock GetFreeAttachSlot(playerid)
{
    for(new i = 10; i--;) if(!IsPlayerAttachedObjectSlotUsed(playerid, i)) return i;
    return 0;
}