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)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!
При разработке своего мода вам наверняка приходилось иметь дело с созданием передвижных дверей, ворот и/или шлагбаумов.
Что обычно для этого нужно (помимо создания самого объекта)?
Сделать перемещение объекта с помощью 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)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!