Sergey_Walter Posted February 7, 2013 Share Posted February 7, 2013 Дайте пожалуйста оптимизированную альтернативу моему коду, так как не хочется использовать 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
Kenix Posted February 7, 2013 Share Posted February 7, 2013 Вы можете её легко сделать сами. В самом вверху кода определите функцию для замены стандартной: 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
Sergey_Walter Posted February 7, 2013 Author Share Posted February 7, 2013 Я понял в moveObject другие аргументы нужно будет писать? И что значит "Источник тут будет объект" ? Напишите пример плиз... Link to comment
Kenix Posted February 7, 2013 Share Posted February 7, 2013 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
Sergey_Walter Posted February 7, 2013 Author Share Posted February 7, 2013 Сделал так.. 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
Kenix Posted February 7, 2013 Share Posted February 7, 2013 Я опечатался, там в аргументах нужно unpack использовать. if _moveObject( args ) then на if _moveObject( unpack( args ) ) then Link to comment
Sergey_Walter Posted February 8, 2013 Author Share Posted February 8, 2013 Ну в принципе всё работает, но всё равно есть баги как не крути, и всё потому что там нельзя задать первоначальное положение шлагбаума как в сампе =( Лучшим решением для меня оказался следущий код автоматического открывания шлагбаума) 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
Vamp1r Posted February 8, 2013 Share Posted February 8, 2013 Ну в принципе всё работает, но всё равно есть баги как не крути, и всё потому что там нельзя задать первоначальное положение шлагбаума как в сампе Что значит нельзя задать первоначальное положение шлагбаума? Поясни Link to comment
Sergey_Walter Posted February 9, 2013 Author Share Posted February 9, 2013 (edited) Как я помню в версии сампа 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 чтоб вернуть его в первоначальное положение! Вот из за этого возникает масса проблем, например надо тебе шлагбаум вернуть в обратное положение, а он ещё недомувился до открытого положения и в этот момент тебе нужно его закрыть, получится так что он уйдёт под землю =( Я конешно понимаю что есть много решений этой проблеммы, но я не люблю лишних строк Думаю понятно разьяснил Edited February 9, 2013 by Guest Link to comment
Other Languages Moderators Disinterpreter Posted February 9, 2013 Other Languages Moderators Share Posted February 9, 2013 Как я помню в версии сампа 0.3е функция плавного открывания шлагбаума выглядела так Нет такой функции (если ты её сам не напишешь), есть только функция передвижения объектов. Link to comment
Sergey_Walter Posted February 9, 2013 Author Share Posted February 9, 2013 (edited) Как я помню в версии сампа 0.3е функция плавного открывания шлагбаума выглядела так Нет такой функции (если ты её сам не напишешь), есть только функция передвижения объектов. да нет, плавность в изменении ротации обьекта добавили в версии сампа 0.3d, я даже помню видео снимал, а вот оно) https://www.youtube.com/watch?v=WFGrW_47U5w Edited February 9, 2013 by Guest Link to comment
Sergey_Walter Posted February 9, 2013 Author Share Posted February 9, 2013 Короче вот что получилось, м.б комунить потом пригодится) Link to comment
Kernell Posted February 9, 2013 Share Posted February 9, 2013 класс CGate от моего мода, мб что-то полезное найдёшь для себя http://pastebin.com/a4N6r1Dr Link to comment
Sergey_Walter Posted February 9, 2013 Author Share Posted February 9, 2013 класс CGate от моего мода, мб что-то полезное найдёшь для себяhttp://pastebin.com/a4N6r1Dr Не врубился чё делает твой скрипт Вроде ничё не мувит, мб запоминает статус обьекта? Link to comment
Kernell Posted February 9, 2013 Share Posted February 9, 2013 109-ая строчка двигает объект. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now