Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 5 из 5
  1. #1
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,123
    Репутация:
    2503 ±

    dc_movobj - управление объектами ворот, шлагбаумов, дверей

    Всем привет.

    При разработке своего мода вам наверняка приходилось иметь дело с созданием передвижных дверей, ворот и/или шлагбаумов.
    Что обычно для этого нужно (помимо создания самого объекта)?
    • Сделать перемещение объекта с помощью MoveObject().
    • Установить таймер.
    • Сделать таймерную функцию, которая возвращает объект на исходные координаты.
    • А что, если игрок, например, захочет, чтобы ворота оставались открытыми подольше? Возможно, стоит как-то сделать задержку закрытия при повторном нажатии клавиши или вводе команды? (К примеру, уничтожить старый таймер и установить новый - но тогда ID таймера нужно заранее сохранять куда-то.)

    И, делая всё это, вы наверняка задумывались: "Неужели нельзя сделать всё это как-то проще?" Можно. Именно для этого и предназначен сегодняшний релиз.


    Описание

    Основная цель инклуда dc_movobj.inc - упростить управление временно перемещаемыми объектами. Установка таймера, возвращение объекта на исходные координаты, продление времени открытия - всё это инклуд берёт на себя, от Вас требуется только вызвать функцию MoveObjectTemporarily().

    Для сравнения рассмотрим перемещение объекта ворот обычным методом:
    1. MoveObject(lspd_door, 246.4375, 72.4375, 1006.5, 3.0);
    2. SetTimer("GateClose", 3000, false);
    3. // ...
    4. forward GateClose();
    5. public GateClose()
    6. {
    7. return MoveObject(lspd_door, 246.4375, 72.4375, 1004.25, 3.0);
    8. }

    Перемещение с помощью dc_movobj:
    1. MoveObjectTemporarily(lspd_door, 3000, 246.4375, 72.4375, 1006.5, 3.0);

    С использованием инклуда всё, что вам остаётся сделать - это вызвать одну функцию, остальное инклуд сделает за вас.


    Использование
    1. Подключить инклуд.
      1. #include <dc_movobj>


    2. Если объекты ворот/дверей/шлагбаумов статические (т.е. созданы не с помощью стримера), перед подключением инклуда добавить объявление "DC_MOVOBJ_DONT_USE_STREAMER", чтобы сообщить инклуду, что от него требуется работа со статическими объектами.
      1. #define DC_MOVOBJ_DONT_USE_STREAMER
      2. #include <dc_movobj>

      Если же вам требуется работа с динамическими объектами, то ничего объявлять не нужно, по умолчанию инклуд уже работает с объектами стримера.

    3. Для временного перемещения объектов использовать функцию MoveObjectTemporarily().

    Функция MoveObjectTemporarily():

    Параметры:
    • objectid - ID перемещаемого объекта;
    • time - время (в миллисекундах), по истечению которого объект возвращается на исходные координаты;
    • Float:x, Float:y, Float:z - координаты, на которые требуется временно переместить объект;
    • Float:speed - скорость перемещения (ед./сек.);
    • Float:rx, Float:ry, Float:rz - углы поворота объекта на новых координатах.

    Возвращаемые значения:
    • DC_MOVOBJ_ERROR (0) - неудачное выполнение: указан неправильный ID объекта, или же объект уже возвращается на исходные координаты;
    • DC_MOVOBJ_MOVED (1) - успешно начато перемещение объекта на новые координаты;
    • DC_MOVOBJ_DELAYED (2) - объект уже был временно перемещён, поэтому с повторным вызовом функции было продлено время нахождения объекта на новых координатах.


    Пример использования (простой):
    1. MoveObjectTemporarily(lspd_door, 5_000, 246.4375, 72.4375, 1006.5, 2.0);

    Ещё один пример (посложнее, с использованием возвращаемого значения):
    1. new moveresult = MoveObjectTemporarily(lspd_door, 5_000, 246.4375, 72.4375, 1006.5, 2.0);
    2. if (moveresult == DC_MOVOBJ_MOVED)
    3. SendClientMessage(playerid, -1, "Бронированная дверь открыта");
    4. else if (moveresult == DC_MOVOBJ_DELAYED) // дверь уже была открыта
    5. SendClientMessage(playerid, -1, "Время открытия двери продлено");


    Скачать: https://www.dropbox.com/s/3orqz11ddj...ovobj.zip?dl=1
    Автор: Daniel_Cortez


    Специально для Pro-Pawn.ru
    Копирование данной статьи на других ресурсах без разрешения автора запрещено!
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 11 пользователя(ей) сказали cпасибо:
    DeimoS (14.06.2020) execution (31.05.2020) Kovshevoy (31.05.2020) MassonNN (01.06.2020) Osetin (17.06.2020) oukibt (01.06.2020) punkochel (31.05.2020) Seregamil (01.06.2020) Unreal (23.06.2020) Web (31.05.2020) whale (01.06.2020)
  3. #2
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    67
    Репутация:
    13 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    1. new moveresult = MoveObjectTemporarily(lspd_door, 5_000, 246.4375, 72.4375, 1006.5, 2.0);
    2. if (moveresult == 1)
    3. SendClientMessage(playerid, -1, "Бронированная дверь открыта");
    4. else if (moveresult == 2) // дверь уже была открыта
    5. SendClientMessage(playerid, -1, "Время открытия двери продлено");
    Возможно, что стоит внутри самого инклуда сделать константы? (для состояния объекта?)

  4. Пользователь сказал cпасибо:
    Daniel_Cortez (07.06.2020)
  5. #3
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,123
    Репутация:
    2503 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    Возможно, что стоит внутри самого инклуда сделать константы? (для состояния объекта?)
    В смысле, сделать константы для возвращаемых функцией значений? Да, можно попробовать.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. #4
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    67
    Репутация:
    13 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    В смысле, сделать константы для возвращаемых функцией значений?
    Именно

  7. #5
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,123
    Репутация:
    2503 ±
    Версия 1.1.
    • Функция @__MoveObjectBack() переименована в @_dc_movobj__MoveObjectBack().
    • Коды возвращаемых функцией MoveObjectTemporarily() значений заменены на константы:
      • 0 => DC_MOVOBJ_ERROR
      • 1 => DC_MOVOBJ_MOVED
      • 2 => DC_MOVOBJ_DELAYED
      Новые константы не имеют тега, поэтому сравнение результата функции "по-старому" (с 0, 1 и 2) будет работать без варнингов.

    Скачать: https://www.dropbox.com/s/3orqz11ddj...ovobj.zip?dl=1
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  8. Пользователь сказал cпасибо:
    punkochel (15.06.2020)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •