mirror of
https://github.com/jimathy/rpemotes.git
synced 2026-06-11 01:31:40 -04:00
* refactor: separate out pointing Separate out and improve pointing. New version includes: Better and working configs More checks Export The reason why it's separated into i's own file is to make the mail file less cluttered. The new checks also solves issues with pointing and aiming guns etc. * style: whitespace
119 lines
3.7 KiB
Lua
119 lines
3.7 KiB
Lua
Pointing = false
|
|
|
|
local function IsPlayerAiming(player)
|
|
return IsPlayerFreeAiming(player) or IsAimCamActive() or IsAimCamThirdPersonActive()
|
|
end
|
|
|
|
local function CanPlayerPoint(playerId, playerPed)
|
|
if not DoesEntityExist(playerPed) or not IsPedOnFoot(playerPed) or IsPlayerAiming(playerId) or IsPedFalling(playerPed) or IsPedInjured(playerPed) or IsPedInMeleeCombat(playerPed) or IsPedRagdoll(playerPed) then
|
|
return false
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
local function PointingStopped()
|
|
local playerPed = PlayerPedId()
|
|
|
|
RequestTaskMoveNetworkStateTransition(playerPed, 'Stop')
|
|
SetPedConfigFlag(playerPed, 36, false)
|
|
if not IsPedInjured(playerPed) then
|
|
ClearPedSecondaryTask(playerPed)
|
|
end
|
|
RemoveAnimDict("anim@mp_point")
|
|
end
|
|
|
|
local function PointingThread()
|
|
CreateThread(function()
|
|
local playerId = PlayerId()
|
|
local playerPed = PlayerPedId()
|
|
|
|
while Pointing do
|
|
Wait(0)
|
|
|
|
if not CanPlayerPoint(playerId, playerPed) then
|
|
Pointing = false
|
|
break
|
|
end
|
|
|
|
local camPitch = GetGameplayCamRelativePitch()
|
|
if camPitch < -70.0 then
|
|
camPitch = -70.0
|
|
elseif camPitch > 42.0 then
|
|
camPitch = 42.0
|
|
end
|
|
|
|
camPitch = (camPitch + 70.0) / 112.0
|
|
|
|
local camHeading = GetGameplayCamRelativeHeading()
|
|
local cosCamHeading = math.cos(camHeading)
|
|
local sinCamHeading = math.sin(camHeading)
|
|
|
|
if camHeading < -180.0 then
|
|
camHeading = -180.0
|
|
elseif camHeading > 180.0 then
|
|
camHeading = 180.0
|
|
end
|
|
|
|
camHeading = (camHeading + 180.0) / 360.0
|
|
local coords = GetOffsetFromEntityInWorldCoords(playerPed, (cosCamHeading * -0.2) - (sinCamHeading * (0.4 * camHeading + 0.3)), (sinCamHeading * -0.2) + (cosCamHeading * (0.4 * camHeading + 0.3)), 0.6)
|
|
local _rayHandle, blocked = GetShapeTestResult(StartShapeTestCapsule(coords.x, coords.y, coords.z - 0.2, coords.x, coords.y, coords.z + 0.2, 0.4, 95, playerPed, 7))
|
|
|
|
SetTaskMoveNetworkSignalFloat(playerPed, 'Pitch', camPitch)
|
|
SetTaskMoveNetworkSignalFloat(playerPed, 'Heading', (camHeading * -1.0) + 1.0)
|
|
SetTaskMoveNetworkSignalBool(playerPed, 'isBlocked', blocked)
|
|
SetTaskMoveNetworkSignalBool(playerPed, 'isFirstPerson', GetCamViewModeForContext(GetCamActiveViewModeContext()) == 4)
|
|
end
|
|
|
|
PointingStopped()
|
|
end)
|
|
end
|
|
|
|
local function StartPointing()
|
|
-- Don't start to point if we are prone
|
|
if IsProne then
|
|
EmoteChatMessage("You can't point while crawling.")
|
|
return
|
|
end
|
|
|
|
local playerPed = PlayerPedId()
|
|
if not CanPlayerPoint(PlayerId(), playerPed) then
|
|
return
|
|
end
|
|
|
|
Pointing = not Pointing
|
|
|
|
-- If we should point and the animation was loaded, then start pointing
|
|
if Pointing and LoadAnim("anim@mp_point") then
|
|
SetPedConfigFlag(playerPed, 36, true)
|
|
TaskMoveNetworkByName(playerPed, 'task_mp_pointing', 0.5, false, 'anim@mp_point', 24)
|
|
|
|
-- Start thread
|
|
PointingThread()
|
|
end
|
|
end
|
|
|
|
|
|
-- Commands & KeyMapping --
|
|
if Config.PointingEnabled then
|
|
RegisterCommand('pointing', function()
|
|
StartPointing()
|
|
end, false)
|
|
|
|
if Config.PointingKeybindEnabled then
|
|
RegisterKeyMapping("pointing", "Finger pointing", "keyboard", Config.PointingKeybind)
|
|
end
|
|
|
|
TriggerEvent('chat:addSuggestion', '/pointing', 'Finger pointing.')
|
|
end
|
|
|
|
|
|
-- Exports --
|
|
-- Returns if the player is pointing
|
|
---@return boolean
|
|
local function IsPlayerPointing()
|
|
return Pointing
|
|
end
|
|
|
|
exports('IsPlayerPointing', IsPlayerPointing)
|