PDA

Просмотр полной версии : [Include] dc_movobj - управление объектами ворот, шлагбаумов, дверей



Daniel_Cortez
31.05.2020, 15:48
Всем привет.

При разработке своего мода вам наверняка приходилось иметь дело с созданием передвижных дверей, ворот и/или шлагбаумов.
Что обычно для этого нужно (помимо создания самого объекта)?

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

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


Описание

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

Для сравнения рассмотрим перемещение объекта ворот обычным методом:

MoveObject(lspd_door, 246.4375, 72.4375, 1006.5, 3.0);
SetTimer("GateClose", 3000, false);
// ...
forward GateClose();
public GateClose()
{
return MoveObject(lspd_door, 246.4375, 72.4375, 1004.25, 3.0);
}

Перемещение с помощью dc_movobj:

MoveObjectTemporarily(lspd_door, 3000, 246.4375, 72.4375, 1006.5, 3.0);

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


Использование

Подключить инклуд.
#include <dc_movobj>

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

#define DC_MOVOBJ_DONT_USE_STREAMER
#include <dc_movobj>

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

Для временного перемещения объектов использовать функцию 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) - объект уже был временно перемещён, поэтому с повторным вызовом функции было продлено время нахождения объекта на новых координатах.


Пример использования (простой):

MoveObjectTemporarily(lspd_door, 5_000, 246.4375, 72.4375, 1006.5, 2.0);

Ещё один пример (посложнее, с использованием возвращаемого значения):

new moveresult = MoveObjectTemporarily(lspd_door, 5_000, 246.4375, 72.4375, 1006.5, 2.0);
if (moveresult == DC_MOVOBJ_MOVED)
SendClientMessage(playerid, -1, "Бронированная дверь открыта");
else if (moveresult == DC_MOVOBJ_DELAYED) // дверь уже была открыта
SendClientMessage(playerid, -1, "Время открытия двери продлено");




Скачать: https://www.dropbox.com/s/3orqz11ddjd142z/dc_movobj.zip?dl=1
Автор: Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)



Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!

tnc
05.06.2020, 16:03
new moveresult = MoveObjectTemporarily(lspd_door, 5_000, 246.4375, 72.4375, 1006.5, 2.0);
if (moveresult == 1)
SendClientMessage(playerid, -1, "Бронированная дверь открыта");
else if (moveresult == 2) // дверь уже была открыта
SendClientMessage(playerid, -1, "Время открытия двери продлено");



Возможно, что стоит внутри самого инклуда сделать константы? (для состояния объекта?)

Daniel_Cortez
07.06.2020, 18:06
Возможно, что стоит внутри самого инклуда сделать константы? (для состояния объекта?)
В смысле, сделать константы для возвращаемых функцией значений? Да, можно попробовать.

tnc
07.06.2020, 18:24
В смысле, сделать константы для возвращаемых функцией значений?

Именно

Daniel_Cortez
14.06.2020, 19:01
Версия 1.1.
Функция @__MoveObjectBack() переименована в @_dc_movobj__MoveObjectBack().
Коды возвращаемых функцией MoveObjectTemporarily() значений заменены на константы:
0 => DC_MOVOBJ_ERROR
1 => DC_MOVOBJ_MOVED
2 => DC_MOVOBJ_DELAYED
Новые константы не имеют тега, поэтому сравнение результата функции "по-старому" (с 0, 1 и 2) будет работать без варнингов.
(Отдельное спасибо пользователю tnc (https://pro-pawn.ru/member.php?9450-tnc) за идею с константами.)

Скачать: https://www.dropbox.com/s/3orqz11ddjd142z/dc_movobj.zip?dl=1

punkochel
19.09.2020, 22:56
Только-что столкнулся с проблемой, при которой не открывались шлагбаумы, если перед этим был открыт (и не закрыт) другой шлагбаум.
Проблема решается увеличением размера массива.
Предлагаю это пофиксить, так как ID объекта запросто может быть более 9999.

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

Daniel_Cortez
20.09.2020, 14:43
Хм... да, действительно. Изначально инклуд задумывался под стандартные, статические объекты, и, похоже, я забыл увеличить размер массивов, когда адаптировал инклуд под работу со стримером.

Спасибо, что заметили.

Daniel_Cortez
20.09.2020, 15:04
Версия 1.2.
Исправлен баг, из-за которого инклуд не работал с объектами стримера, имеющими ID более 9999.
(Отдельное спасибо пользователю punkochel (https://pro-pawn.ru/member.php?9227-punkochel) за сообщение о баге.)

Скачать: https://www.dropbox.com/s/3orqz11ddjd142z/dc_movobj.zip?dl=1