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

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

    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. 12 пользователя(ей) сказали cпасибо:
    20th century (08.10.2020) 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
    Сообщений
    121
    Репутация:
    26 ±
    Цитата Сообщение от 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,192
    Репутация:
    2589 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    Возможно, что стоит внутри самого инклуда сделать константы? (для состояния объекта?)
    В смысле, сделать константы для возвращаемых функцией значений? Да, можно попробовать.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

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

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

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

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

  8. Пользователь сказал cпасибо:
    punkochel (15.06.2020)
  9. #6
    Аватар для punkochel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Только-что столкнулся с проблемой, при которой не открывались шлагбаумы, если перед этим был открыт (и не закрыт) другой шлагбаум.
    Проблема решается увеличением размера массива.
    Предлагаю это пофиксить, так как ID объекта запросто может быть более 9999.

    1. new svar_name[sizeof(dc_movobj__svar_fmt) - 2 + 4];

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Хм... да, действительно. Изначально инклуд задумывался под стандартные, статические объекты, и, похоже, я забыл увеличить размер массивов, когда адаптировал инклуд под работу со стримером.

    Спасибо, что заметили.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Версия 1.2.
    • Исправлен баг, из-за которого инклуд не работал с объектами стримера, имеющими ID более 9999.
      (Отдельное спасибо пользователю punkochel за сообщение о баге.)

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

 

 

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

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

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

Ваши права

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