Advertisement
MX_Master

GTASA bug fix for MTASA: can't move while aiming when FPS>47

Apr 1st, 2011
827
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.29 KB | None | 0 0
  1. --[[
  2.     Фикс бага, когда игрок с оружием в руках не может ходить
  3.     в стороны прицелившись, если его FPS больше 47
  4.  
  5.     MX_Master, 02.04.2011 1:09:46
  6. ]]
  7.  
  8. local uMe =                     getLocalPlayer() -- я
  9. local nFPS =                    32 -- текущее значение ФПС
  10. local nFrames =                 0 -- счетчик ФПС, который раз в сек обнуляется
  11. local nBugMinFPS =              47 -- барьер ФПС для бага
  12. local bIsMeAiming =             false -- флаг: вкл ли сейчас кнопка прицеливания
  13. local tMoveKeyState =           {} -- таблица текущих состояний кнопок движения
  14. local tMoveKeyPairState =       {} -- таблица текущих состояний пар (AD,WS) кнопок движения
  15. local nTmpControlEnableTime =   70 -- мсек, время на которое включается вспомогательная кнопка движения
  16.  
  17. -- список вспомогательных кнопок движения для каждой кнопки движения
  18. local tEnableMoveControl = {
  19.     ['left'] =      'forwards',
  20.     ['right'] =     'backwards',
  21.     ['forwards'] =  'left',
  22.     ['backwards'] = 'right'
  23. }
  24. -- список кнопок противодействия для каждой кнопки движения
  25. local tMoveOppositeControl = {
  26.     ['left'] =      'right',
  27.     ['right'] =     'left',
  28.     ['forwards'] =  'backwards',
  29.     ['backwards'] = 'forwards'
  30. }
  31. -- список названий для пар кнопок движения
  32. local tMoveKeyPairName = {
  33.     ['left'] =      'AD',
  34.     ['right'] =     'AD',
  35.     ['forwards'] =  'WS',
  36.     ['backwards'] = 'WS'
  37. }
  38. -- список названий для пар противодействующих кнопок движения
  39. local tMoveKeyOppositePairName = {
  40.     ['left'] =      'WS',
  41.     ['right'] =     'WS',
  42.     ['forwards'] =  'AD',
  43.     ['backwards'] = 'AD'
  44. }
  45.  
  46.  
  47.  
  48.  
  49.  
  50. -- фактически - это обработчик для нажатия любых кнопок движения
  51. -- при любых их состояниях, но можно вызывать и вручную, указав
  52. -- имя кнопки движения
  53. local function fEnableMoveControlWhileBUG ( sKey )
  54.     if  not bIsMeAiming or -- если я не целюсь
  55.         nFPS < nBugMinFPS or -- или ФПС меньше барьера для бага
  56.         isPedDucked(uMe) or -- или я на картах сижу
  57.         ( tMoveKeyState[sKey] and tMoveKeyPairState[ tMoveKeyOppositePairName[sKey] ] ) -- или одновременно нажаты противоположные кнопки движения (AD или WS)
  58.     then
  59.         return -- ничо не делаем
  60.     end
  61.  
  62.     -- на короткое время включаем такую кнопку управления, с помощью
  63.     -- которой, нажатая кнопка начинает движение
  64.     if  ( tMoveKeyState[sKey] and not tMoveKeyState[ tMoveOppositeControl[sKey] ] ) or
  65.         ( not tMoveKeyState[sKey] and tMoveKeyState[ tMoveOppositeControl[sKey] ] )
  66.     then
  67.         setControlState( tEnableMoveControl[sKey], true )
  68.         setTimer( setControlState, nTmpControlEnableTime, 1, tEnableMoveControl[sKey], false )
  69.     end
  70. end
  71.  
  72.  
  73.  
  74.  
  75.  
  76. -- включаем счетчик ФПС
  77. addEventHandler( 'onClientRender', root, function() nFrames = nFrames + 1 end )
  78. setTimer( function() nFPS = nFrames; nFrames = 0 end, 1000, 0 )
  79.  
  80. -- включаем мониторинг кнопки прицеливания
  81. bindKey( 'aim_weapon',  'down',
  82.     function()
  83.         bIsMeAiming = true
  84.  
  85.         -- иногда не срабатывает включение движения прицелившись,
  86.         -- если игрок бежал, нажал кнопку прицеливания и потом кнопку движения.
  87.         -- поэтому нужно включить движение вручную
  88.         if tMoveKeyPairState['AD'] then
  89.             if tMoveKeyState['left'] then
  90.                 fEnableMoveControlWhileBUG('left')
  91.             else
  92.                 fEnableMoveControlWhileBUG('right')
  93.             end
  94.         else
  95.             if tMoveKeyState['forwards'] then
  96.                 fEnableMoveControlWhileBUG('forwards')
  97.             else
  98.                 fEnableMoveControlWhileBUG('backwards')
  99.             end
  100.         end
  101.     end
  102. )
  103. bindKey( 'aim_weapon',  'up',    function() bIsMeAiming = false end )
  104.  
  105. -- включаем мониторинг кнопок движения (пешком)
  106. for sKey in pairs(tEnableMoveControl) do
  107.     bindKey( sKey, 'both',
  108.         function ( sKey, sState )
  109.             if sState == 'down' then
  110.                 tMoveKeyState[sKey] = true
  111.                 tMoveKeyPairState[ tMoveKeyPairName[sKey] ] = true
  112.             else
  113.                 tMoveKeyState[sKey] = false
  114.  
  115.                 if not tMoveKeyState[ tMoveOppositeControl[sKey] ] then
  116.                     tMoveKeyPairState[ tMoveKeyPairName[sKey] ] = false
  117.                 end
  118.             end
  119.  
  120.             fEnableMoveControlWhileBUG(sKey)
  121.         end
  122.     )
  123. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement