Jump to content

[ФИКС] При FPS > 47 нельзя ходить прицелившись


Recommended Posts

Суть бага в названии. Ну а если быть точным: если в МТАСА/ГТАСА у вас 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 by Guest
Link to comment
  • 2 weeks later...

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...