Jump to content

Шлагбаум


Recommended Posts

Дайте пожалуйста оптимизированную альтернативу моему коду, так как не хочется использовать 2 таймера и 3 функции для одного шлагбаума. И есть ли авто вызываемая функция как в сампе OnObjectMoved(objectid)?

local gate = createObject(968,1622.3656000,-1318.4294000,17.1529000,0.0000000,-90.0000000,90.0000000) -- 
local endmoved = false 
  
function Step() 
   if endmoved == false then 
        moveObject ( gate, 1500, 1622.3656000,-1318.4294000,17.1529000, 0.0, 90.0, 0.0, "OutBounce") 
        endmoved = true 
        setTimer(Step2, 1500, 1) 
   end   
end 
  
function Step2() 
    if endmoved == true then 
        moveObject ( gate, 1500, 1622.3656000,-1318.4294000,17.1529000, 0.0, -90.0, 0.0, "OutBounce") 
        setTimer(Step3, 1500, 1) 
    end 
end 
  
function Step3() 
    endmoved = false 
end 
  
function bindKeys() 
    local players = exports.pool:getPoolElementsByType("player") 
    for k, arrayPlayer in ipairs(players) do 
        if not(isKeyBound(arrayPlayer, "lalt", "down", Step)) then 
            bindKey(arrayPlayer, "lalt", "down", Step) 
        end 
    end 
end 
  
function bindKeysOnJoin() 
    bindKey(source, "lalt", "down", Step) 
end 
addEventHandler("onResourceStart", getResourceRootElement(), bindKeys) 
addEventHandler("onPlayerJoin", getRootElement(), bindKeysOnJoin) 

Link to comment

Вы можете её легко сделать сами.

В самом вверху кода определите функцию для замены стандартной:

  
local _moveObject = moveObject 
function moveObject( ... ) 
    local args = { ... } 
    if _moveObject( args ) then 
        setTimer( triggerEvent, args[ 2 ], 1, 'onObjectMoved', args[ 1 ] ) 
        return true 
    end 
    return false 
end 
  

Вам лишь остаётся добавить событие и обработчик. Источник тут будет объект.

Link to comment

https://wiki.multitheftauto.com/wiki/Event_system

Я понял в moveObject другие аргументы нужно будет писать?

Нет. Я просто заменил текущую функцию, на измененную, которая вызывает событие onObjectMoved. Аргументы все теже.

  
addEvent( 'onObjectMoved', true ) 
  
local _moveObject = moveObject 
function moveObject( ... ) 
    local args = { ... } 
    if _moveObject( args ) then 
        setTimer( triggerEvent, args[ 2 ], 1, 'onObjectMoved', args[ 1 ] ) 
        return true 
    end 
    return false 
end 
  
local pObject = createObject( 1234, 0, 0, 0 ) 
  
-- Передвигаем объект по команде /move_obj 
addCommandHandler( 'move_obj', 
    function() 
        moveObject( pObject, 10000, 10, 0, 50 ) 
    end 
) 
  
addEventHandler( 'onObjectMoved', pObject, 
    function() 
        local fX, fY, fZ = getElementPosition( source ) 
        outputChatBox( 'Новая позиция объекта: ' .. fX .. ', ' .. fY .. ', ' .. fZ ) 
    end 
) 
  

Link to comment

Сделал так..

addEvent( 'onObjectMoved', true ) 
local _moveObject = moveObject 
function moveObject( ... ) 
    local args = { ... } 
    if _moveObject( args ) then 
        setTimer( triggerEvent, args[ 2 ], 1, 'onObjectMoved', args[ 1 ] ) 
        return true 
    end 
    return false 
end 
  
local gate = createObject(968,1622.3656000,-1318.4294000,17.1529000,0.0000000,-90.0000000,90.0000000) -- 
  
function Step() -- Здесь вызываю движение 
    moveObject ( gate, 1500, 1622.3656000,-1318.4294000,17.1529000, 0.0, 90.0, 0.0, "OutBounce") 
end 
  
addEventHandler( 'onObjectMoved', gate, 
    function() 
        local fX, fY, fZ = getElementPosition( gate ) 
        outputChatBox( 'Новая позиция объекта: ' .. fX .. ', ' .. fY .. ', ' .. fZ ) 
    end 
) 

пишит http://screenshot.su/show.php?img=92246 ... 829bca.jpg

в этой строке проблемма: if _moveObject( args ) then

Удалял эту if, обьект не двигается, но аргументы передаёт на onObjectMoved =(

Link to comment

Ну в принципе всё работает, но всё равно есть баги как не крути, и всё потому что там нельзя задать первоначальное положение шлагбаума как в сампе =( Лучшим решением для меня оказался следущий код автоматического открывания шлагбаума)

bargate = createObject(968,1622.3656000,-1318.4294000,17.1529000,0.0000000,-90.0000000,90.0000000) -- 
damarker = createMarker(1621.3656000,-1322.4294000,17.1529000, "cylinder", 9.5, 255, 0, 0, 0 ) 
  
isMoving = false 
function gatefunc( hitPlayer ) 
    if isMoving == false then 
        isMoving = true 
        moveObject ( bargate, 1500, 1622.3656000,-1318.4294000,17.1529000, 0.0, 90.0, 0.0, "OutBounce") 
        setTimer( triggerEvent, 2500, 1, "gatefuncclose", root) 
    end 
end 
addEventHandler( "onMarkerHit", damarker, gatefunc ) 
  
function gatefuncclose( ) 
    moveObject ( bargate, 1500, 1622.3656000,-1318.4294000,17.1529000, 0.0, -90.0, 0.0, "OutBounce") 
    setTimer ( function() 
        isMoving = false 
    end, 1500, 1 ) 
end 
addEvent ( "gatefuncclose", true ) 
addEventHandler("gatefuncclose", getRootElement(), gatefuncclose) 

Link to comment
Ну в принципе всё работает, но всё равно есть баги как не крути, и всё потому что там нельзя задать первоначальное положение шлагбаума как в сампе

Что значит нельзя задать первоначальное положение шлагбаума? Поясни

Link to comment

Как я помню в версии сампа 0.3е функция плавного открывания шлагбаума выглядела так:

blockslak = CreateObject(968, 1622.3656, -1318.4294, 17.1529, 0.0, -90.0, 90.0); --создали обьект 
MoveObject(blockslak, 1622.3656, -1318.4294, 17.1529 + 0.001, 0.001, 0.0, 0.0, 90.0); --открыли его 
MoveObject(blockslak, 1622.3656, -1318.4294, 17.1529 - 0.001, 0.001, 0.0, -90.0, 90.0); --закрыли его   

заметь что последниие цифры ротации 0.0, -90.0, 90.0 при закрывании такие-же как и у первоначального созданного обьекта, тоесть прокрутили его в определённое положение и обратно!

а вот в мта считается так:

blockslak = createObject(968,1622.3656,-1318.4294,17.1529, 0.0, -90.0, 90.0) --создали обьект 
moveObject ( blockslak , 1500, 1622.3656,-1318.4294,17.1529, 0.0, 90.0, 0.0) --открыли его 
moveObject ( blockslak , 1500, 1622.3656,-1318.4294,17.1529, 0.0, -90.0, 0.0)--закрыли его 

тут уже нужно писать аргумент на сколько обьект должен прокрутится, тоесть было при создании 0.0, -90.0, 90.0, при открывании 0.0, 90.0, 0.0 и при закрывании 0.0, -90.0, 0.0, но вот уже нельзя снова поставить аргументы такиеже как и при создании обьекта 0.0, -90.0, 90.0 чтоб вернуть его в первоначальное положение! Вот из за этого возникает масса проблем, например надо тебе шлагбаум вернуть в обратное положение, а он ещё недомувился до открытого положения и в этот момент тебе нужно его закрыть, получится так что он уйдёт под землю =( Я конешно понимаю что есть много решений этой проблеммы, но я не люблю лишних строк 8)

Думаю понятно разьяснил :wink:

Edited by Guest
Link to comment
  • Other Languages Moderators
Как я помню в версии сампа 0.3е функция плавного открывания шлагбаума выглядела так

Нет такой функции (если ты её сам не напишешь), есть только функция передвижения объектов.

Link to comment
Как я помню в версии сампа 0.3е функция плавного открывания шлагбаума выглядела так

Нет такой функции (если ты её сам не напишешь), есть только функция передвижения объектов.

да нет, плавность в изменении ротации обьекта добавили в версии сампа 0.3d, я даже помню видео снимал, а вот оно)

https://www.youtube.com/watch?v=WFGrW_47U5w

Edited by Guest
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...