local isRequestAnim = false local requestedemote = '' -- Some of the work here was done by Super.Cool.Ninja / rubbertoe98 -- https://forum.fivem.net/t/release-nanimstarget/876709 ----------------------------------------------------------------------------------------------------- -- Commands / Events -------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------- if Config.SharedEmotesEnabled then RegisterNetEvent('animations:client:Nearby', function(args) if #args > 0 then local emotename = string.lower(args[1]) target, distance = GetClosestPlayer() if(distance ~= -1 and distance < 3) then if DP.Shared[emotename] ~= nil then dict, anim, ename = table.unpack(DP.Shared[emotename]) TriggerServerEvent("ServerEmoteRequest", GetPlayerServerId(target), emotename) SimpleNotify(Config.Languages[lang]['sentrequestto']..GetPlayerName(target).." ~w~(~g~"..ename.."~w~)") else EmoteChatMessage("'"..emotename.."' "..Config.Languages[lang]['notvalidsharedemote'].."") end else SimpleNotify(Config.Languages[lang]['nobodyclose']) end else MearbysOnCommand() end end) end RegisterNetEvent("SyncPlayEmote") AddEventHandler("SyncPlayEmote", function(emote, player) EmoteCancel() Wait(300) -- wait a little to make sure animation shows up right on both clients after canceling any previous emote if DP.Shared[emote] ~= nil then if OnEmotePlay(DP.Shared[emote]) then end return elseif DP.Dances[emote] ~= nil then if OnEmotePlay(DP.Dances[emote]) then end return end end) RegisterNetEvent("SyncPlayEmoteSource") AddEventHandler("SyncPlayEmoteSource", function(emote, player) -- Thx to Poggu for this part! local pedInFront = GetPlayerPed(GetClosestPlayer()) local heading = GetEntityHeading(pedInFront) local coords = GetOffsetFromEntityInWorldCoords(pedInFront, 0.0, 1.0, 0.0) if (DP.Shared[emote]) and (DP.Shared[emote].AnimationOptions) then local SyncOffsetFront = DP.Shared[emote].AnimationOptions.SyncOffsetFront if SyncOffsetFront then coords = GetOffsetFromEntityInWorldCoords(pedInFront, 0.0, SyncOffsetFront, 0.0) end end SetEntityHeading(PlayerPedId(), heading - 180.1) SetEntityCoordsNoOffset(PlayerPedId(), coords.x, coords.y, coords.z, 0) EmoteCancel() Wait(300) if DP.Shared[emote] ~= nil then if OnEmotePlay(DP.Shared[emote]) then end return elseif DP.Dances[emote] ~= nil then if OnEmotePlay(DP.Dances[emote]) then end return end end) RegisterNetEvent("ClientEmoteRequestReceive") AddEventHandler("ClientEmoteRequestReceive", function(emotename, etype) isRequestAnim = true requestedemote = emotename if etype == 'Dances' then _,_,remote = table.unpack(DP.Dances[requestedemote]) else _,_,remote = table.unpack(DP.Shared[requestedemote]) end PlaySound(-1, "NAV", "HUD_AMMO_SHOP_SOUNDSET", 0, 0, 1) SimpleNotify(Config.Languages[lang]['doyouwanna']..remote.."~w~)") end) Citizen.CreateThread(function() while true do Citizen.Wait(5) if IsControlJustPressed(1, 246) and isRequestAnim then target, distance = GetClosestPlayer() if(distance ~= -1 and distance < 3) then if DP.Shared[requestedemote] ~= nil then _,_,_,otheremote = table.unpack(DP.Shared[requestedemote]) elseif DP.Dances[requestedemote] ~= nil then _,_,_,otheremote = table.unpack(DP.Dances[requestedemote]) end if otheremote == nil then otheremote = requestedemote end TriggerServerEvent("ServerValidEmote", GetPlayerServerId(target), requestedemote, otheremote) isRequestAnim = false else SimpleNotify(Config.Languages[lang]['nobodyclose']) end elseif IsControlJustPressed(1, 182) and isRequestAnim then SimpleNotify(Config.Languages[lang]['refuseemote']) isRequestAnim = false end end end) ----------------------------------------------------------------------------------------------------- ------ Functions and stuff -------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------- function GetPlayerFromPed(ped) for _,player in ipairs(GetActivePlayers()) do if GetPlayerPed(player) == ped then return player end end return -1 end function GetPedInFront() local player = PlayerId() local plyPed = GetPlayerPed(player) local plyPos = GetEntityCoords(plyPed, false) local plyOffset = GetOffsetFromEntityInWorldCoords(plyPed, 0.0, 1.3, 0.0) local rayHandle = StartShapeTestCapsule(plyPos.x, plyPos.y, plyPos.z, plyOffset.x, plyOffset.y, plyOffset.z, 10.0, 12, plyPed, 7) local _, _, _, _, ped2 = GetShapeTestResult(rayHandle) return ped2 end function MearbysOnCommand(source, args, raw) local NearbysCommand = "" for a in pairsByKeys(DP.Shared) do NearbysCommand = NearbysCommand .. ""..a..", " end EmoteChatMessage(NearbysCommand) EmoteChatMessage(Config.Languages[lang]['emotemenucmd']) end function SimpleNotify(message) SetNotificationTextEntry("STRING") AddTextComponentString(message) DrawNotification(0,1) end function GetClosestPlayer() local players = GetPlayers() local closestDistance = -1 local closestPlayer = -1 local ply = PlayerPedId() local plyCoords = GetEntityCoords(ply, 0) for index,value in ipairs(players) do local target = GetPlayerPed(value) if(target ~= ply) then local targetCoords = GetEntityCoords(GetPlayerPed(value), 0) local distance = #(targetCoords - plyCoords) if(closestDistance == -1 or closestDistance > distance) then closestPlayer = value closestDistance = distance end end end return closestPlayer, closestDistance end function GetPlayers() local players = {} for i = 0, 255 do if NetworkIsPlayerActive(i) then table.insert(players, i) end end return players end