Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 12
  1. #1
    Аватар для punkochel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±

    Система шлагбаумов

    Друзья, подскажите пожалуйста как лучше организовать систему шлагбаумов в моде, а конкретнее его возврат в начальные координаты через определенный промежуток времени.
    В моей голове созрело только два более менее разумных варианта:
    1) Создание для каждого шлагбаума отдельного колбэка с вызовом его через таймер;
    2) Создание цикличного таймера, а так-же переменную для каждого шлагбаума которая будет хранить в себе время, по истечении которого он вернется в начало.

  2. #2
    Аватар для alonso
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.09.2017
    Сообщений
    11
    Репутация:
    0 ±
    Думаю достаточно вызывать в коллбэке OnObjectMoved таймер, запускающийся через конкретное время и возвращающий шлагбаум на место

  3. #3
    Аватар для punkochel
    Пользователь

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

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

    Статус
    Оффлайн
    Регистрация
    25.09.2017
    Сообщений
    11
    Репутация:
    0 ±
    Таймер не продлит свою работу, а создастся новый
    Как-то так
    PHP код:
    public OnObjectMoved(objectid)
    {
        
    SetTimerEx("OnBarrierReturn"1000false"i"objectid);
        return 
    1;
    }

    public 
    OnBarrierReturn(barrierid)
    {
        if(
    barrierid == /*массив с идами шлагбаумов*/)
        {
            
    MoveObject(barrierid, ...);
        }

        return 
    1;


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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Можно обойтись и одним коллбэком, в который ID объекта и исходные координаты передаются через таймер, т.е. примерно так:
    1. stock MoveObjectTemporarily(objectid, time, Float:x, Float:y, Float:z, Float:speed,
    2. Float:rx = -1000.0, Float:ry = -1000.0, Float:rz = -1000.0)
    3. {
    4. // Перед перемещением объекта передадим его координаты и угол поворота в таймер
    5. new Float:_x, Float:_y, Float:_z, Float:_rx, Float:_ry, Float:_rz;
    6. GetObjectPos(objectid, _x, _y, _z);
    7. GetObjectRot(objectid, _rx, _ry, _rz);
    8. SetTimerEx(!"@__MoveObjectBack", time, false, !"ifffffff", objectid, speed, _x, _y, _z, _rx, _ry, _rz);
    9.  
    10. // Исходные координаты "запомнены" таймером, теперь можно переместить объект
    11. return MoveObject(objectid, x, y, z, speed, rx, ry, rz);
    12. }

    1. @__MoveObjectBack(objectid, Float:speed, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz);
    2. @__MoveObjectBack(objectid, Float:speed, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
    3. {
    4. return MoveObject(objectid, x, y, z, speed, rx, ry, rz);
    5. }


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

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

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Можно обойтись и одним коллбэком, в который ID объекта и исходные координаты передаются через таймер, т.е. примерно так:
    1. stock MoveObjectTemporarily(objectid, Float:x, Float:y, Float:z, Float:speed,
    2. Float:rx = -1000.0, Float:ry = -1000.0, Float:rz = -1000.0)
    3. {
    4. // Перед перемещением объекта передадим его координаты и угол поворота в таймер
    5. new Float:_x, Float:_y, Float:_z, Float:_rx, Float:_ry, Float:_rz;
    6. GetObjectPos(barrier, _x, _y, _z);
    7. GetObjectRot(barrier, _rx, _ry, _rz);
    8. SetTimerEx(!"@__MoveObjectBack", 10_000, false, !"ifffffff", barrier, speed, _x, _y, _z, _rx, _ry, _rz);
    9.  
    10. // Исходные координаты "запомнены" таймером, теперь можно переместить объект
    11. return MoveObject(barrier, x, y, z, speed, rx, ry, rz);
    12. }

    1. @__MoveObjectBack(objectid, Float:speed, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz);
    2. @__MoveObjectBack(objectid, Float:speed, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
    3. {
    4. return MoveObject(objectid, x, y, z, speed, rx, ry, rz);
    5. }


    P.S.: Проверить работоспособность кода на данный момент не могу, поэтому никаких гарантий.
    Вместо barrier должен быть objectid?

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

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

  8. #8
    Аватар для punkochel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
      Открыть/закрыть
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Можно обойтись и одним коллбэком, в который ID объекта и исходные координаты передаются через таймер, т.е. примерно так:
    1. stock MoveObjectTemporarily(objectid, time, Float:x, Float:y, Float:z, Float:speed,
    2. Float:rx = -1000.0, Float:ry = -1000.0, Float:rz = -1000.0)
    3. {
    4. // Перед перемещением объекта передадим его координаты и угол поворота в таймер
    5. new Float:_x, Float:_y, Float:_z, Float:_rx, Float:_ry, Float:_rz;
    6. GetObjectPos(objectid, _x, _y, _z);
    7. GetObjectRot(objectid, _rx, _ry, _rz);
    8. SetTimerEx(!"@__MoveObjectBack", time, false, !"ifffffff", objectid, speed, _x, _y, _z, _rx, _ry, _rz);
    9.  
    10. // Исходные координаты "запомнены" таймером, теперь можно переместить объект
    11. return MoveObject(objectid, x, y, z, speed, rx, ry, rz);
    12. }

    1. @__MoveObjectBack(objectid, Float:speed, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz);
    2. @__MoveObjectBack(objectid, Float:speed, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
    3. {
    4. return MoveObject(objectid, x, y, z, speed, rx, ry, rz);
    5. }


    P.S.: Проверить работоспособность кода на данный момент не могу, поэтому никаких гарантий.


    Спасибо, удружил конечно... Очень оригинально!) Работает все супер)

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от punkochel Посмотреть сообщение
      Открыть/закрыть


    Спасибо, удружил конечно... Очень оригинально!) Работает все супер)
    Забыл упомянуть, помимо вызова MoveObjectTemporarily() нужно самостоятельно запоминать время открытия шлагбаума и разрешать заново открывать ворота только через N секунд с момента предыдущего открытия, где N - время, переданное в MoveObjectTemporarily() + время закрытия шлагбаума. Если этого не делать, то объект может застрять в открытом положении.

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

  10. #10
    Аватар для punkochel
    Пользователь

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

    Завтра, как сделаю релиз в разделе "Функции", попробую добавить подобного рода защиту.

    Жду не дождусь уже этого релиза)

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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