MX_Master Posted April 1, 2011 Share Posted April 1, 2011 (edited) Суть бага в названии. Ну а если быть точным: если в МТАСА/ГТАСА у вас FPS больше 47, то прицелившись из оружия ходить в стороны/вперед/назад не совсем получиться, что затрудняет игру, особенно в ДМ модах. Тут я просто хотел выложить свой фикс для этого бага. И, возможно, кто-то сможет внести свои правки, которые улучшат этот скрипт: Это клиентский файл http://pastebin.com/NKfCDJpP --[[ Фикс бага, когда игрок с оружием в руках не может ходить в стороны прицелившись, если его FPS больше 47 MX_Master, 02.04.2011 1:09:46 ]] local uMe = getLocalPlayer() -- я local nFPS = 32 -- текущее значение ФПС local nFrames = 0 -- счетчик ФПС, который раз в сек обнуляется local nBugMinFPS = 47 -- барьер ФПС для бага local bIsMeAiming = false -- флаг: вкл ли сейчас кнопка прицеливания local tMoveKeyState = {} -- таблица текущих состояний кнопок движения local tMoveKeyPairState = {} -- таблица текущих состояний пар (AD,WS) кнопок движения local nTmpControlEnableTime = 70 -- мсек, время на которое включается вспомогательная кнопка движения -- список вспомогательных кнопок движения для каждой кнопки движения local tEnableMoveControl = { ['left'] = 'forwards', ['right'] = 'backwards', ['forwards'] = 'left', ['backwards'] = 'right' } -- список кнопок противодействия для каждой кнопки движения local tMoveOppositeControl = { ['left'] = 'right', ['right'] = 'left', ['forwards'] = 'backwards', ['backwards'] = 'forwards' } -- список названий для пар кнопок движения local tMoveKeyPairName = { ['left'] = 'AD', ['right'] = 'AD', ['forwards'] = 'WS', ['backwards'] = 'WS' } -- список названий для пар противодействующих кнопок движения local tMoveKeyOppositePairName = { ['left'] = 'WS', ['right'] = 'WS', ['forwards'] = 'AD', ['backwards'] = 'AD' } -- фактически - это обработчик для нажатия любых кнопок движения -- при любых их состояниях, но можно вызывать и вручную, указав -- имя кнопки движения local function fEnableMoveControlWhileBUG ( sKey ) if not bIsMeAiming or -- если я не целюсь nFPS < nBugMinFPS or -- или ФПС меньше барьера для бага isPedDucked(uMe) or -- или я на картах сижу ( tMoveKeyState[sKey] and tMoveKeyPairState[ tMoveKeyOppositePairName[sKey] ] ) -- или одновременно нажаты противоположные кнопки движения (AD или WS) then return -- ничо не делаем end -- на короткое время включаем такую кнопку управления, с помощью -- которой, нажатая кнопка начинает движение if ( tMoveKeyState[sKey] and not tMoveKeyState[ tMoveOppositeControl[sKey] ] ) or ( not tMoveKeyState[sKey] and tMoveKeyState[ tMoveOppositeControl[sKey] ] ) then setControlState( tEnableMoveControl[sKey], true ) setTimer( setControlState, nTmpControlEnableTime, 1, tEnableMoveControl[sKey], false ) end end -- включаем счетчик ФПС addEventHandler( 'onClientRender', root, function() nFrames = nFrames + 1 end ) setTimer( function() nFPS = nFrames; nFrames = 0 end, 1000, 0 ) -- включаем мониторинг кнопки прицеливания bindKey( 'aim_weapon', 'down', function() bIsMeAiming = true -- иногда не срабатывает включение движения прицелившись, -- если игрок бежал, нажал кнопку прицеливания и потом кнопку движения. -- поэтому нужно включить движение вручную if tMoveKeyPairState['AD'] then if tMoveKeyState['left'] then fEnableMoveControlWhileBUG('left') else fEnableMoveControlWhileBUG('right') end else if tMoveKeyState['forwards'] then fEnableMoveControlWhileBUG('forwards') else fEnableMoveControlWhileBUG('backwards') end end end ) bindKey( 'aim_weapon', 'up', function() bIsMeAiming = false end ) -- включаем мониторинг кнопок движения (пешком) for sKey in pairs(tEnableMoveControl) do bindKey( sKey, 'both', function ( sKey, sState ) if sState == 'down' then tMoveKeyState[sKey] = true tMoveKeyPairState[ tMoveKeyPairName[sKey] ] = true else tMoveKeyState[sKey] = false if not tMoveKeyState[ tMoveOppositeControl[sKey] ] then tMoveKeyPairState[ tMoveKeyPairName[sKey] ] = false end end fEnableMoveControlWhileBUG(sKey) end ) end Скрипт учитывает только основные нюансы поведения кнопок движения при баге. Поэтому этот фикс может в редких ситуациях не сработать. Желательно, выявить эти закономерности и добавить для них код. Проверено при 60-70 FPS. Edited April 2, 2011 by Guest Link to comment
_Vincent_ Posted April 2, 2011 Share Posted April 2, 2011 Ээ, спасибо за этот фикс. Только вот с чем его есть? Кинуть в lua-файлик код и подгрузить как ресурс? Link to comment
MX_Master Posted April 2, 2011 Author Share Posted April 2, 2011 Это клиентский файл, создай новый скрипт в своем моде или ресурсе и в meta.xml укажи его как клиентский. Link to comment
MX_Master Posted April 16, 2011 Author Share Posted April 16, 2011 http://code.google.com/p/mtasa-blue/source/detail?r=2557 исправлен этот баг. Теперь можно обойтись и без этого фикса при ФПС до 70, ну а дальше только с фиксом Link to comment
_Vincent_ Posted April 16, 2011 Share Posted April 16, 2011 Да-да, я тоже заметил, класс! 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