OKStyle
Эксперт
Когда ещё не было плавного движения и поворота объектов соответствующей функцией MoveObject , шлагбаумы уже могли открываться плавно. Идея такая же, как в моём TextDraw Intro: по итерациям.
Для начала, нам нужно объявить константу объекта и одну переменную, относительно который будет считаться поворот по оси:
Теперь при старте мода или скрипта (или где вам удобно) создадим этот объект, придав константе значение, равное порядковому номеру объекта:
Напишем небольшую команду для открытия шлагбаума:
Теперь самое важное: управляющие таймеры. Начнём с того, который будет открывать шлагбаум:
Теперь напишем таймер, который будет закрывать наш шлагбаум:
ВНИМАНИЕ: при выгрузке мода или скрипта прописать:
Автор: OKStyle
Для начала, нам нужно объявить константу объекта и одну переменную, относительно который будет считаться поворот по оси:
PHP:
new Object[1], rotating = -90;
PHP:
Object[0] = CreateObject(2920, 1544.68994141, -1630.84997559, 13.0, -90.0, 0.0, 0.0);
PHP:
if(strcmp(cmdtext, "/lspd", true) == 0)
{
SetTimer("OpenLSPDBarrier", 50, 0); // таймер, который будет поворачивать шлагбаум
return 1;
}
PHP:
forward OpenLSPDBarrier();
public OpenLSPDBarrier()
{
new Float:RotX, Float:RotY, Float:RotZ; // объявим переменные, в которые будут записаны углы поворота по осям
GetObjectRot(Object[0], RotX, RotY, RotZ); // получаем уголы поворота шлагбаума по осям и записываем их в объявленные переменные
SetObjectRot(Object[0], RotX + 1.0, RotY, RotZ); // устанавливаем угол поворота побольше (по оси X должен вертеться шлагбаум, чтобы открываться и закрываться)
if(rotating < 0) // т.к. базовый поворот -90, то поворот открытого - 0, а следовательно пишем такое условие
{
rotating += 1; // если ещё призакрыт, то поворачиваем
SetTimer("OpenLSPDBarrier", 50, 0); // запускаем таймер снова для повтора поворота
}
else
{
SetTimer("CloseLSPDBarrier", 5000, 0); // если открыт полностью - запускаем таймер, который через 5 секунд начнёт закрывать шлагбаум
}
return 1;
}
PHP:
forward CloseLSPDBarrier();
public CloseLSPDBarrier()
{
if(rotating > -90) // если шлагбаум ещё не закрыт
{
new Float:RotX, Float:RotY, Float:RotZ;
GetObjectRot(Object[0], RotX, RotY, RotZ);
SetObjectRot(Object[0], RotX - 1.0, RotY, RotZ);
rotating -= 1; // уменьшаем поворот
SetTimer("CloseLSPDBarrier", 50, 0); // повторно запускаем таймер закрытия
}
return 1;
}
Код:
DestroyObject(Object[0]); // чтобы объекты не дублировались
PHP:
new Object[1], rotating = -90;
public OnFilterScriptInit()
{
// Шлагбаум (by OKStyle)
Object[0] = CreateObject(2920, 1544.68994141, -1630.84997559, 13.0, -90.0, 0.0, 0.0); //object(police_barrier) (1)
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmdtext, "/lspd", true) == 0)
{
SetTimer("OpenLSPDBarrier", 50, 0);
return 1;
}
return 0;
}
public OnFilterScriptExit()
{
DestroyObject(Object[0]);
return 1;
}
forward OpenLSPDBarrier();
public OpenLSPDBarrier()
{
new Float:RotX, Float:RotY, Float:RotZ;
GetObjectRot(Object[0], RotX, RotY, RotZ);
SetObjectRot(Object[0], RotX + 1.0, RotY, RotZ);
if(rotating < 0)
{
rotating += 1;
SetTimer("OpenLSPDBarrier", 50, 0);
}
else
{
SetTimer("CloseLSPDBarrier", 5000, 0);
}
return 1;
}
forward CloseLSPDBarrier();
public CloseLSPDBarrier()
{
if(rotating > -91)
{
new Float:RotX, Float:RotY, Float:RotZ;
GetObjectRot(Object[0], RotX, RotY, RotZ);
SetObjectRot(Object[0], RotX - 1.0, RotY, RotZ);
rotating -= 1;
SetTimer("CloseLSPDBarrier", 50, 0);
}
return 1;
}
Автор: OKStyle
