mta-resources/[insanity]/insanity-movement/client.lua

179 lines
4.9 KiB
Lua

local ifp = engineLoadIFP("GunMove_BWD.ifp","insanity.movement")
local rotSpeed = 0 -- 0 is instant - early and broken, do not use
local frametime = 33.3333
local aimOnly = false
function setResourceElementData(element,key,value,share)
if share == nil then share = true end
return setElementData(element,getResourceName(resource).. "." ..key,value,share)
end
function getResourceElementData(element,key)
return getElementData(element,getResourceName(resource).. "." ..key)
end
local weaponToSkillMap = {}
weaponToSkillMap[22] = 69
weaponToSkillMap[23] = 70
weaponToSkillMap[24] = 71
weaponToSkillMap[25] = 72
weaponToSkillMap[26] = 73
weaponToSkillMap[27] = 74
weaponToSkillMap[28] = 75
weaponToSkillMap[29] = 76
weaponToSkillMap[32] = 75
weaponToSkillMap[30] = 77
weaponToSkillMap[31] = 78
weaponToSkillMap[33] = 79
weaponToSkillMap[34] = 79
local weaponGangsterSkillLevels = {}
weaponGangsterSkillLevels[69] = 40
weaponGangsterSkillLevels[70] = 500
weaponGangsterSkillLevels[75] = 50
weaponGangsterSkillLevels[76] = 250
weaponGangsterSkillLevels[79] = 300
function getPedSkillLevel(ped,weapon)
local sID = weaponToSkillMap[weapon]
if sID == nil then return "pro" end
local skill = getPedStat(ped,sID)
if skill >= 999 then return "pro" end
local gangsterSkill = weaponGangsterSkillLevels[sID] or 200
if skill < gangsterSkill then return "poor" end
return "std"
end
function getPedDesiredRotation(ped,alwaysForward)
local crz = 360 - getPedCameraRotation(ped)
local right = getPedAnalogControlState(ped,"right") - getPedAnalogControlState(ped,"left")
local forward = getPedAnalogControlState(ped,"forwards") - getPedAnalogControlState(ped,"backwards")
local posRight = right
if posRight < 0 then posRight = 0 - posRight end
local posForward = forward
if posForward < 0 then posForward = 0 - posForward end
local div = posRight + posForward
if div == 0 then div = 1 end
if forward < 0 then
right = 0 - right
if not alwaysForward then
crz = crz + 180
end
end
if crz > 360 then
crz = crz - 360
end
return crz + ((right * -90) / div)
end
function updateWeaponBackward(ped,st)
if st == getResourceElementData(ped,"weapon_backward") then return false end
if st then
engineReplaceAnimation(ped,"ped","run_player","insanity.movement","GunMove_BWD")
setResourceElementData(ped,"weapon_backward",true,false)
else
setPedAnimationSpeed(ped,"GunMove_BWD",1.0)
engineRestoreAnimation(ped,"ped","run_player")
setResourceElementData(ped,"weapon_backward",false,false)
end
return true
end
function handlePed(ped)
local moveState = getPedMoveState(ped)
setPedAnimationSpeed(ped,"GunMove_BWD",2.0)
setPedAnimationSpeed(ped,"GunMove_FWD",2.0)
setPedAnimationSpeed(ped,"GunMove_L",2.0)
setPedAnimationSpeed(ped,"GunMove_R",2.0)
local task = getPedTask(ped,"primary",3)
if task == "TASK_COMPLEX_ENTER_CAR_AS_DRIVER" or task == "TASK_COMPLEX_ENTER_CAR_AS_PASSENGER" then return end
if
isPedDead(ped) or
moveState == "climb" or
isPedWearingJetpack(ped) or
getPedOccupiedVehicle(ped) or
(getPedControlState(ped,"aim_weapon") and ((
moveState == "crouch" or
moveState == "crawl"
) or (
(not getWeaponProperty(getPedWeapon(ped),getPedSkillLevel(ped,getPedWeapon(ped)),"flag_aim_arm")) or
getWeaponProperty(getPedWeapon(ped),getPedSkillLevel(ped,getPedWeapon(ped)),"flag_type_heavy")
))) or
getElementData(ped,"parachuting") or
getElementData(ped,"entering_vehicle")
then
updateWeaponBackward(ped,false)
return
end
local forward = getPedAnalogControlState(ped,"forwards") - getPedAnalogControlState(ped,"backwards")
local turnInstantly = false
local rot = 0
local weaponBackward = false
local aiming = false
if getPedControlState(ped,"aim_weapon") and (
moveState == "stand" or
moveState == "walk" or
moveState == "powerwalk" or
moveState == "jog" or
moveState == "fall"
) then
aiming = true
if forward < 0 then
weaponBackward = true
turnInstantly = true
else
weaponBackward = false
end
else
weaponBackward = false
end
rot = getPedDesiredRotation(ped,weaponBackward)
local updated = updateWeaponBackward(ped,weaponBackward)
if aimOnly == true and aiming == false then
return
end
local prx,pry,prz = getElementRotation(ped)
if turnInstantly or rotSpeed == 0 then
prz = rot
else
local direction = 1
local diff = prz - rot
if diff < -1 then diff = 0 - diff end
if prz > rot then
direction = -1
end
if diff > 180 then
direction = direction * -1
end
prz = prz + ((rotSpeed * direction) * frametime)
--if prz < 0 then prz = prz + 360 end
--if prz > 360 then prz = prz - 360 end
if direction < 0 then
if prz < rot then
prz = rot
end
else
if prz > rot then
prz = rot
end
end
end
setElementRotation(ped,prx,pry,prz,"default",true)
end
addEventHandler("onClientPreRender",root,function(slice)
frametime = slice
for _,ped in ipairs(getElementsByType("player")) do
handlePed(ped)
end
end)