179 lines
4.9 KiB
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) |