Main/resources/[standalone]/rpemotes-reborn/client/Syncing.lua

165 lines
5.7 KiB
Lua
Raw Permalink Normal View History

2025-06-07 08:51:21 +02:00
local isRequestAnim = false
local targetPlayerId
if Config.SharedEmotesEnabled then
RegisterCommand('nearby', function(source, args, raw)
if not LocalPlayer.state.canEmote then return end
if IsPedInAnyVehicle(PlayerPedId(), true) then
return EmoteChatMessage(Translate('not_in_a_vehicle'))
end
if #args > 0 then
local emotename = string.lower(args[1])
local target, distance = GetClosestPlayer()
if (distance ~= -1 and distance < 3) then
2025-06-12 03:36:12 +02:00
if RP[emotename] ~= nil and RP[emotename].category == "Shared" then
local _, _, ename = table.unpack(RP[emotename])
TriggerServerEvent("rpemotes:server:requestEmote", GetPlayerServerId(target), emotename)
2025-06-07 08:51:21 +02:00
SimpleNotify(Translate('sentrequestto') ..
GetPlayerName(target) .. " ~w~(~g~" .. ename .. "~w~)")
else
EmoteChatMessage("'" .. emotename .. "' " .. Translate('notvalidsharedemote') .. "")
end
else
SimpleNotify(Translate('nobodyclose'))
end
else
NearbysOnCommand()
end
end, false)
end
2025-06-12 03:36:12 +02:00
RegisterNetEvent("rpemotes:client:syncEmote", function(emote, player)
2025-06-07 08:51:21 +02:00
EmoteCancel()
Wait(300)
targetPlayerId = player
local plyServerId = GetPlayerFromServerId(player)
if IsPedInAnyVehicle(GetPlayerPed(plyServerId ~= 0 and plyServerId or GetClosestPlayer()), true) then
return EmoteChatMessage(Translate('not_in_a_vehicle'))
end
2025-06-12 03:36:12 +02:00
if RP[emote] then
local options = RP[emote].AnimationOptions
2025-06-07 08:51:21 +02:00
if options and options.Attachto then
2025-06-12 03:36:12 +02:00
local targetEmote = RP[emote][4]
if not targetEmote or not RP[targetEmote] or not RP[targetEmote].AnimationOptions or not RP[targetEmote].AnimationOptions.Attachto then
2025-06-07 08:51:21 +02:00
local ped = PlayerPedId()
local pedInFront = GetPlayerPed(plyServerId ~= 0 and plyServerId or GetClosestPlayer())
AttachEntityToEntity(
ped,
pedInFront,
GetPedBoneIndex(pedInFront, options.bone or -1),
options.xPos or 0.0,
options.yPos or 0.0,
options.zPos or 0.0,
options.xRot or 0.0,
options.yRot or 0.0,
options.zRot or 0.0,
false,
false,
false,
true,
1,
true
)
end
end
2025-06-12 03:36:12 +02:00
OnEmotePlay(emote)
2025-06-07 08:51:21 +02:00
return
else
2025-06-12 03:36:12 +02:00
DebugPrint("rpemotes:client:syncEmote : Emote not found")
2025-06-07 08:51:21 +02:00
end
end)
2025-06-12 03:36:12 +02:00
RegisterNetEvent("rpemotes:client:syncEmoteSource", function(emote, player)
2025-06-07 08:51:21 +02:00
local ped = PlayerPedId()
local plyServerId = GetPlayerFromServerId(player)
local pedInFront = GetPlayerPed(plyServerId ~= 0 and plyServerId or GetClosestPlayer())
if IsPedInAnyVehicle(ped, true) or IsPedInAnyVehicle(pedInFront, true) then
return EmoteChatMessage(Translate('not_in_a_vehicle'))
end
2025-06-12 03:36:12 +02:00
local options = RP[emote] and RP[emote].AnimationOptions
2025-06-07 08:51:21 +02:00
if options then
if (options.Attachto) then
AttachEntityToEntity(
ped,
pedInFront,
GetPedBoneIndex(pedInFront, options.bone or -1),
options.xPos or 0.0,
options.yPos or 0.0,
options.zPos or 0.0,
options.xRot or 0.0,
options.yRot or 0.0,
options.zRot or 0.0,
false,
false,
false,
true,
1,
true
)
end
end
2025-06-12 03:36:12 +02:00
local coords = GetOffsetFromEntityInWorldCoords(pedInFront, (options and options.SyncOffsetSide or 0) + 0.0, (options and options.SyncOffsetFront or 1) + 0.0, (options and options.SyncOffsetHeight or 0) + 0.0)
2025-06-07 08:51:21 +02:00
local heading = GetEntityHeading(pedInFront)
2025-06-12 03:36:12 +02:00
SetEntityHeading(ped, heading - (options and options.SyncOffsetHeading or 180) + 0.0)
2025-06-07 08:51:21 +02:00
SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z)
EmoteCancel()
Wait(300)
targetPlayerId = player
2025-06-12 03:36:12 +02:00
if RP[emote] ~= nil then
OnEmotePlay(emote)
2025-06-07 08:51:21 +02:00
return
end
end)
2025-06-12 03:36:12 +02:00
RegisterNetEvent("rpemotes:client:cancelEmote", function(player)
2025-06-07 08:51:21 +02:00
if targetPlayerId and targetPlayerId == player then
targetPlayerId = nil
EmoteCancel()
end
end)
function CancelSharedEmote()
if targetPlayerId then
2025-06-12 03:36:12 +02:00
TriggerServerEvent("rpemotes:server:cancelEmote", targetPlayerId)
2025-06-07 08:51:21 +02:00
targetPlayerId = nil
end
end
2025-06-12 03:36:12 +02:00
RegisterNetEvent("rpemotes:client:requestEmote", function(emotename, etype, target)
2025-06-07 08:51:21 +02:00
isRequestAnim = true
2025-06-12 03:36:12 +02:00
local displayed = RP[emotename] and select(3, table.unpack(RP[emotename]))
2025-06-07 08:51:21 +02:00
PlaySound(-1, "NAV", "HUD_AMMO_SHOP_SOUNDSET", false, 0, true)
SimpleNotify(Translate('doyouwanna') .. displayed .. "~w~)")
-- The player has now 10 seconds to accept the request
local timer = 10 * 1000
while isRequestAnim do
Wait(5)
timer = timer - 5
if timer <= 0 then
isRequestAnim = false
SimpleNotify(Translate('refuseemote'))
end
if IsControlJustPressed(1, 246) then
isRequestAnim = false
2025-06-12 03:36:12 +02:00
local otheremote = RP[emotename] and RP[emotename][4] or emotename
TriggerServerEvent("rpemotes:server:confirmEmote", target, emotename, otheremote)
2025-06-07 08:51:21 +02:00
elseif IsControlJustPressed(1, 182) then
isRequestAnim = false
SimpleNotify(Translate('refuseemote'))
end
end
end)