Scripts/resources/[standalone]/dpemotes/client/Pointing.lua
2024-12-29 21:02:20 +01:00

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)