Всем привет...

Начиная с версии 0.3d функция MoveObject обзавелась тремя новыми аргументами, которые отвечают за пространственное вращения объекта вокруг неподвижных осей координат. Что же это дает? Мегатонны профита для всех любителей эрпэ RP жанра - теперь можно делать плавно открывающиеся шлагбаумы, всякие там качели-карусели и прочий жанровый стафф которого так нехватало.

Однако, как этого и следовало ожидать, почти никто их местных скриптеров не может внятно объяснить какие параметры надо задавать в этой функции для придания той самой плавности. Да и я, честно признаюсь, сам не понял сначала что к чему, поскольку описание на вики не блещет подробностями:
http://wiki.sa-mp.com/wiki/MoveObject

Рассмотрим параметры, старые и новые:

objectid собственно ид объекта который мы хотим шатать двигать
Float:X X координата точки в которую будет двигаться объект
Float:Y Y координата точки в которую будет двигаться объект
Float:Z Z координата точки в которую будет двигаться объект
Float:Speed Скорость с которой объект будет двигаться (юниты в секунду)
Float:RotX ФИНАЛЬНЫЙ угол поворота вокруг оси X
Float:RotY ФИНАЛЬНЫЙ угол поворота вокруг оси Y
Float:RotZ ФИНАЛЬНЫЙ угол поворота вокруг оси Z
Возвращает эта функция время в миллисекундах необходимое на перемещения объекта в указанную точку с постоянной заданной скоростью - все просто как физика в 7 классе...
Для справки - 1 миллисекунда - это 1 тысячная доля секунды, то-есть в одной секунде 1000 миллисекунд

Что за юниты такие?
Тут все просто, юниты - это единицы измерения расстояний в играх GTA третьего поколения (GTA 3, Vice City, San Andreas). ДА, это не метры как было принято думать.

Теперь поговорим про те самые углы поворота. Первое что явно бросается в глаза - большое слово FINAL в описании этих аргументов на официальной вики. Делаем вывод что этими параметрами задается финальное положения объекта уже ПОСЛЕ поворота.

И все-таки как задавать скорость?
Многие столкнулись с проблемой, что объект поворачивается либо очень быстро, либо, вообще, мгновенно. Давайте разбираться.
САМОЕ ВАЖНОЕ ЗАКЛЮЧЕНИЕ - вращение происходит за то время, пока объект движется в точку XYZ указанную нами в старых параметрах. Вычислить это время просто: надо перемещение разделить на скорость. Именно это время функция и возвращает. Смотрим пример:

public OnGameModeInit()
{
    test_obj = CreateObject(980, 10.00, 20.00, 30.00, 0.00, 0.00, 0.00);
    // создали объект
    return 1;
}
 
public OnPlayerCommandText(playerid, cmdtext[])
{
    if(strcmp(cmdtext, "/moveobject", true) == 0)
    {
        new string[50];
        new movetime = MoveObject(test_obj, 10.00, 20.00, 30.00+10.00, 2.00);
        // задали перемещение только вдоль оси Z на 10 юнитов вверх со скоростью 2 юнита/секунду
        // Считаем время: 10 / 2 = 5 секунд, или 5000 миллисекунд
        // Переменная movetime примет значение 5000, в чем легко убедиться
        format(string, sizeof(string), "Объект закончит движение через %d миллисекунд", movetime);
        SendClientMessage(playerid, 0xFF000000, string);
        return 1;
    }
    return 0;

Все просто? а теперь модифицируем строку с MoveObject:

new movetime = MoveObject(test_obj, 10.00, 20.00, 30.00+10.00, 2.00,    90.00, 0.00, 0.00);
// добавили поворот вокруг оси X на 90 градусов
// ВЕСЬ поворот произойдет за время movetime равно по прежнему 5000 мс 

А если нам надо чтобы объект вращался стоя на месте?
К сожалению, идеально это сделать не получится, ведь стоя на месте не будет никакого перемещения, а значит при любой скорости время окажется равным нулю, и мы получим мгновенный поворот а не плавный, как хотелось бы.

Значит надо пойти на меленькую хитрость - указать малые скорость и малое перемещения, настолько малые что их едва будет заметно игроку:

new movetime = MoveObject(test_obj, 10.00, 20.00, 30.00 + 0.1, 0.05,    90.00, 0.00, 0.00);
// задали малое перемещение вдоль оси Z на 0.1 юнитов вверх со скоростью 0.05 юнита/секунду
// Считаем время: 0.1 / 0.05 = 2 секунды, или 2000 миллисекунд 

Вот и все - получили плавное вращение при едва заметном перемещении)

Вывод: Чтобы получить плавное вращение надо чтобы время перемещения было соизмеримо с секундами (1,2,3 ... 10 секунд)
Это время считается на калькуляторе по формуле: time = dr / Speed, где dr - это перемещение.

Ставить слишком маленькие значения я крайне не рекомендую, чем сильнее вы уменьшаете значения, тем больший вклад вносят ошибки при вычислении Float чисел