Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- Фикс бага, когда игрок с оружием в руках не может ходить
- в стороны прицелившись, если его 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement