From 99beb64645073091c50a188e34edded0533783be Mon Sep 17 00:00:00 2001 From: andristum <47616367+andristum@users.noreply.github.com> Date: Sun, 17 Nov 2019 05:54:02 +0100 Subject: [PATCH] 1.6 - Shared Emotes --- Client/AnimationList.lua | 84 +++++++++++++++++++-- Client/Emote.lua | 2 +- Client/EmoteMenu.lua | 46 +++++++++++- Client/Syncing.lua | 156 +++++++++++++++++++++++++++++++++++++++ Config.lua | 47 ++++++++++-- Server/Syncing.lua | 10 +++ 6 files changed, 330 insertions(+), 15 deletions(-) create mode 100644 Client/Syncing.lua create mode 100644 Server/Syncing.lua diff --git a/Client/AnimationList.lua b/Client/AnimationList.lua index b9dc339..bca8b88 100644 --- a/Client/AnimationList.lua +++ b/Client/AnimationList.lua @@ -105,6 +105,70 @@ DP.Walks = { --["Wading"] = {"move_m@wading"}, } +DP.Shared = { + --[emotename] = {dictionary, animation, displayname, targetemotename, additionalanimationoptions} + -- you dont have to specify targetemoteanem, if you do dont it will just play the same animation on both. + -- targetemote is used for animations that have a corresponding animation to the other player. + ["handshake"] = {"mp_ped_interaction", "handshake_guy_a", "Handshake", "handshake2", AnimationOptions = + { + EmoteMoving = true, + EmoteDuration = 3000 + }}, + ["handshake2"] = {"mp_ped_interaction", "handshake_guy_b", "Handshake 2", "handshake", AnimationOptions = + { + EmoteMoving = true, + EmoteDuration = 3000 + }}, + ["hug"] = {"mp_ped_interaction", "kisses_guy_a", "Hug", "hug2"}, + ["hug2"] = {"mp_ped_interaction", "kisses_guy_b", "Hug 2", "hug", AnimationOptions = + { + EmoteMoving = true, + EmoteDuration = 5000 + }}, + ["bro"] = {"mp_ped_interaction", "hugs_guy_a", "Bro", "bro2"}, + ["bro2"] = {"mp_ped_interaction", "hugs_guy_b", "Bro 2", "bro"}, + ["give"] = {"mp_common", "givetake1_a", "Give", "give2", AnimationOptions = + { + EmoteMoving = true, + EmoteDuration = 2000 + }}, + ["give2"] = {"mp_common", "givetake1_b", "Give 2", "give", AnimationOptions = + { + EmoteMoving = true, + EmoteDuration = 2000 + }}, + ["baseball"] = {"anim@arena@celeb@flat@paired@no_props@", "baseball_a_player_a", "Baseball", "baseballthrow"}, + ["baseballthrow"] = {"anim@arena@celeb@flat@paired@no_props@", "baseball_a_player_b", "Baseball Throw", "baseball"}, + ["stickup"] = {"random@countryside_gang_fight", "biker_02_stickup_loop", "Stick Up", "stickupscared", AnimationOptions = + { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["stickupscared"] = {"missminuteman_1ig_2", "handsup_base", "Stickup Scared", "stickup", AnimationOptions = + { + EmoteMoving = true, + EmoteLoop = true, + }}, + ["punch"] = {"melee@unarmed@streamed_variations", "plyr_takedown_rear_lefthook", "Punch", "punched"}, + ["punched"] = {"melee@unarmed@streamed_variations", "victim_takedown_front_cross_r", "Punched", "punch"}, + ["headbutt"] = {"melee@unarmed@streamed_variations", "plyr_takedown_front_headbutt", "Headbutt", "headbutted"}, + ["headbutted"] = {"melee@unarmed@streamed_variations", "victim_takedown_front_headbutt", "Headbutted", "headbutt"}, + ["slap2"] = {"melee@unarmed@streamed_variations", "plyr_takedown_front_backslap", "Slap 2", "slapped2", AnimationOptions = + { + EmoteLoop = true, + EmoteMoving = true, + EmoteDuration = 2000, + }}, + ["slap"] = {"melee@unarmed@streamed_variations", "plyr_takedown_front_slap", "Slap", "slapped", AnimationOptions = + { + EmoteLoop = true, + EmoteMoving = true, + EmoteDuration = 2000, + }}, + ["slapped"] = {"melee@unarmed@streamed_variations", "victim_takedown_front_slap", "Slapped", "slap"}, + ["slapped2"] = {"melee@unarmed@streamed_variations", "victim_takedown_front_backslap", "Slapped 2", "slap2"}, +} + DP.Dances = { ["dancef"] = {"anim@amb@nightclub@dancers@solomun_entourage@", "mi_dance_facedj_17_v1_female^1", "Dance F", AnimationOptions = { @@ -239,11 +303,6 @@ DP.Dances = { } DP.Emotes = { - ["healthkit"] = {"anim@amb@board_room@supervising@", "dissaproval_01_lo_amy_skater_01", "Health Kit", AnimationOptions = - { - EmoteMoving = true, - EmoteDuration = 2500, - }}, ["drink"] = {"mp_player_inteat@pnq", "loop", "Drink", AnimationOptions = { EmoteMoving = true, @@ -1221,6 +1280,7 @@ DP.Emotes = { { EmoteLoop = true, EmoteMoving = true, + EmoteDuration = 2000, }}, ["headbutt"] = {"melee@unarmed@streamed_variations", "plyr_takedown_front_headbutt", "Headbutt"}, ["fishdance"] = {"anim@mp_player_intupperfind_the_fish", "idle_a", "Fish Dance", AnimationOptions = @@ -1448,13 +1508,13 @@ DP.Emotes = { ["leanbar"] = {"Scenario", "PROP_HUMAN_BUM_SHOPPING_CART", "Lean Bar"}, ["lookout"] = {"Scenario", "CODE_HUMAN_CROSS_ROAD_WAIT", "Lookout"}, ["maid"] = {"Scenario", "WORLD_HUMAN_MAID_CLEAN", "Maid"}, - ["map"] = {"Scenario", "WORLD_HUMAN_TOURIST_MAP", "Map"}, + ["map2"] = {"Scenario", "WORLD_HUMAN_TOURIST_MAP", "Map 2"}, ["medic"] = {"Scenario", "CODE_HUMAN_MEDIC_TEND_TO_DEAD", "Medic"}, ["musician"] = {"MaleScenario", "WORLD_HUMAN_MUSICIAN", "Musician"}, ["notepad2"] = {"Scenario", "CODE_HUMAN_MEDIC_TIME_OF_DEATH", "Notepad 2"}, ["parkingmeter"] = {"Scenario", "PROP_HUMAN_PARKING_METER", "Parking Meter"}, ["party"] = {"Scenario", "WORLD_HUMAN_PARTYING", "Party"}, - ["phone"] = {"Scenario", "WORLD_HUMAN_STAND_MOBILE", "Phone 3"}, + ["phone"] = {"Scenario", "WORLD_HUMAN_STAND_MOBILE", "Phone"}, ["prosthigh"] = {"Scenario", "WORLD_HUMAN_PROSTITUTE_HIGH_CLASS", "Prostitue High"}, ["prostlow"] = {"Scenario", "WORLD_HUMAN_PROSTITUTE_LOW_CLASS", "Prostitue Low"}, ["puddle"] = {"Scenario", "WORLD_HUMAN_BUM_WASH", "Puddle"}, @@ -1495,7 +1555,7 @@ DP.Emotes = { EmoteMoving = true, EmoteDuration = 4000 }}, - ["stink"] = {"anim@mp_player_intcelebrationfemale@stinker", "stink", "Stink", AnimationOptions = + ["stink"] = {"anim@mp_player_intcelebrationfemale@stinker", "stinker", "Stink", AnimationOptions = { EmoteMoving = true, EmoteLoop = true @@ -1795,4 +1855,12 @@ DP.PropEmotes = { EmoteMoving = true, EmoteLoop = true }}, + ["map"] = {"amb@world_human_tourist_map@male@base", "base", "Map", AnimationOptions = + { + Prop = 'prop_tourist_map_01', + PropBone = 28422, + PropPlacement = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + EmoteMoving = true, + EmoteLoop = true + }}, } \ No newline at end of file diff --git a/Client/Emote.lua b/Client/Emote.lua index aefd1a4..05e2a17 100644 --- a/Client/Emote.lua +++ b/Client/Emote.lua @@ -44,7 +44,7 @@ RegisterCommand('emote', function(source, args, raw) end) RegisterCommand('emotes', function(source, args, raw) - EmotesOnCommand() -- If anyone has a better solution for this please let me know, copied a the pairsByKeys func from stackoverflow and it wokrs a little bit better + EmotesOnCommand() end) RegisterCommand('emotemenu', function(source, args, raw) diff --git a/Client/EmoteMenu.lua b/Client/EmoteMenu.lua index 7abadaa..0340545 100644 --- a/Client/EmoteMenu.lua +++ b/Client/EmoteMenu.lua @@ -37,6 +37,7 @@ local DanceTable = {} local PropETable = {} local WalkTable = {} local FaceTable = {} +local ShareTable = {} local FavoriteEmote = "" Citizen.CreateThread(function() @@ -61,6 +62,12 @@ function AddEmoteMenu(menu) local submenu = _menuPool:AddSubMenu(menu, Config.Languages[lang]['emotes'], "", "", Menuthing, Menuthing) local dancemenu = _menuPool:AddSubMenu(submenu, Config.Languages[lang]['danceemotes'], "", "", Menuthing, Menuthing) local propmenu = _menuPool:AddSubMenu(submenu, Config.Languages[lang]['propemotes'], "", "", Menuthing, Menuthing) + if Config.SharedEmotesEnabled then + sharemenu = _menuPool:AddSubMenu(submenu, Config.Languages[lang]['shareemotes'], Config.Languages[lang]['shareemotesinfo'], "", Menuthing, Menuthing) + shareddancemenu = _menuPool:AddSubMenu(sharemenu, Config.Languages[lang]['danceemotes'], "", "", Menuthing, Menuthing) + table.insert(ShareTable, 'none') + table.insert(EmoteTable, Config.Languages[lang]['shareemotes']) + end local favmenu = _menuPool:AddSubMenu(submenu, Config.Languages[lang]['keybindemotes'], Config.Languages[lang]['keybindinfo'], "", Menuthing, Menuthing) unbind2item = NativeUI.CreateItem(Config.Languages[lang]['rkeybind'], Config.Languages[lang]['rkeybind']) unbinditem = NativeUI.CreateItem(Config.Languages[lang]['prop2info'], "") @@ -85,10 +92,27 @@ function AddEmoteMenu(menu) for a,b in pairsByKeys(DP.Dances) do x,y,z = table.unpack(b) danceitem = NativeUI.CreateItem(z, "/e ("..a..")") + sharedanceitem = NativeUI.CreateItem(z, "") dancemenu:AddItem(danceitem) + if Config.SharedEmotesEnabled then + shareddancemenu:AddItem(sharedanceitem) + end table.insert(DanceTable, a) end + if Config.SharedEmotesEnabled then + for a,b in pairsByKeys(DP.Shared) do + x,y,z,otheremotename = table.unpack(b) + if otheremotename == nil then + shareitem = NativeUI.CreateItem(z, "/nearby (~g~"..a.."~w~)") + else + shareitem = NativeUI.CreateItem(z, "/nearby (~g~"..a.."~w~) "..Config.Languages[lang]['makenearby'].." (~y~"..otheremotename.."~w~)") + end + sharemenu:AddItem(shareitem) + table.insert(ShareTable, a) + end + end + for a,b in pairsByKeys(DP.PropEmotes) do x,y,z = table.unpack(b) propitem = NativeUI.CreateItem(z, "/e ("..a..")") @@ -115,6 +139,24 @@ function AddEmoteMenu(menu) EmoteMenuStart(DanceTable[index], "dances") end + if Config.SharedEmotesEnabled then + sharemenu.OnItemSelect = function(sender, item, index) + if ShareTable[index] ~= 'none' then + target, distance = GetClosestPlayer() + _,_,rename = table.unpack(DP.Shared[ShareTable[index]]) + TriggerServerEvent("ServerEmoteRequest", GetPlayerServerId(target), ShareTable[index]) + SimpleNotify(Config.Languages[lang]['sentrequestto']..GetPlayerName(target)) + end + end + + shareddancemenu.OnItemSelect = function(sender, item, index) + target, distance = GetClosestPlayer() + _,_,rename = table.unpack(DP.Dances[DanceTable[index]]) + TriggerServerEvent("ServerEmoteRequest", GetPlayerServerId(target), DanceTable[index], 'Dances') + SimpleNotify(Config.Languages[lang]['sentrequestto']..GetPlayerName(target)) + end + end + propmenu.OnItemSelect = function(sender, item, index) EmoteMenuStart(PropETable[index], "props") end @@ -188,14 +230,16 @@ function AddFaceMenu(menu) end function AddInfoMenu(menu) - local infomenu = _menuPool:AddSubMenu(menu, Config.Languages[lang]['infoupdate'], "(1.5.2)", "", Menuthing, Menuthing) + local infomenu = _menuPool:AddSubMenu(menu, Config.Languages[lang]['infoupdate'], "(1.6.0)", "", Menuthing, Menuthing) contact = NativeUI.CreateItem(Config.Languages[lang]['suggestions'], Config.Languages[lang]['suggestionsinfo']) + u160 = NativeUI.CreateItem("1.6.0", "Added shared emotes /nearby, or in menu, also fixed some emotes!") u152 = NativeUI.CreateItem("1.5.2", "Added language options for server owners") u151a = NativeUI.CreateItem("1.5.1a", "Fixed tryclothes/2, changed the guitar emotes slightly and changed facial expressions to 'moods'") u151 = NativeUI.CreateItem("1.5.1", "Added /walk and /walks, for walking styles without menu") u150 = NativeUI.CreateItem("1.5.0", "Added Facial Expressions menu (if enabled by server owner)") u142 = NativeUI.CreateItem("1.4.2", "Added many new prop emotes (guitar-guitar3, book, bouquet, teddy, backpack, burger and more)") infomenu:AddItem(contact) + infomenu:AddItem(u160) infomenu:AddItem(u152) infomenu:AddItem(u151a) infomenu:AddItem(u151) diff --git a/Client/Syncing.lua b/Client/Syncing.lua new file mode 100644 index 0000000..a9d560c --- /dev/null +++ b/Client/Syncing.lua @@ -0,0 +1,156 @@ +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 + RegisterCommand('nearby', function(source, args, raw) + 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, false) +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) + local heading = GetEntityHeading(GetPedInFront()) -- clean this + SetEntityHeading(ped, heading - 180.1) + 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("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 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 = GetPlayerPed(-1) + 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 = GetDistanceBetweenCoords(targetCoords["x"], targetCoords["y"], targetCoords["z"], plyCoords["x"], plyCoords["y"], plyCoords["z"], true) + 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 \ No newline at end of file diff --git a/Config.lua b/Config.lua index 84bd45f..ee3c9e1 100644 --- a/Config.lua +++ b/Config.lua @@ -29,7 +29,8 @@ Config = { ExpressionsEnabled = true, -- You can disable the Walking Styles menu here. WalkingStylesEnabled = true, - +-- You can disable the Shared Emotes here. + SharedEmotesEnabled = true, } Config.Languages = { @@ -53,11 +54,20 @@ Config.Languages = { ['infoupdate'] = "Info / Update notes", ['suggestions'] = "Suggestions?", ['suggestionsinfo'] = "'dullpear_dev' on FiveM forums for any feature/emote suggestions! ✉️", - ['notvaliddance'] = "is not a valid dance", - ['notvalidemote'] = "is not a valid emote", - ['nocancel'] = "No emote to cancel", + ['notvaliddance'] = "is not a valid dance.", + ['notvalidemote'] = "is not a valid emote.", + ['nocancel'] = "No emote to cancel.", ['maleonly'] = "This emote is male only, sorry!", - ['emotemenucmd'] = "Do /emotemenu for a menu", + ['emotemenucmd'] = "Do /emotemenu for a menu.", + ['shareemotes'] = "👫 Shared Emotes", + ['shareemotesinfo'] = "Invite a nearby person to emote", + ['sharedanceemotes'] = "🕺 Shared Dances", + ['notvalidsharedemote'] = "is not a valid shared emote.", + ['sentrequestto'] = "Sent request to ~y~", + ['nobodyclose'] = "Nobody ~r~close~w~ enough.", + ['doyouwanna'] = "~y~Y~w~ to accept, ~r~L~w~ to refuse (~g~", + ['refuseemote'] = "Emote refused.", + ['makenearby'] = "makes the nearby player play", }, ['fr'] = { ['emotes'] = 'Emotes', @@ -84,6 +94,15 @@ Config.Languages = { ['nocancel'] = "Pas d'emote à annuler", ['maleonly'] = "Cet emote est réservé aux hommes, désolé!", ['emotemenucmd'] = "Do /emotemenu pour un menu", + ['shareemotes'] = "👫 Em Emotes partagées", + ['shareemotesinfo'] = "Inviter une personne proche à emoter", + ['sharedanceemotes'] = "🕺 Dances partagées", + ['notvalidsharedemote'] = "n'est pas un emote partagé valide.", + ['sentrequestto'] = "Demande envoyée à ~g~", + ['nobodyclose'] = "Personne assez proche.", + ['doyouwanna'] = "~y~Y~w~ accepter, ~r~L~w~ refuser (~g~", + ['refuseemote'] = "Emote refusée.", + ['makenearby'] = "fait jouer le joueur à proximité", }, ['de'] = { ['emotes'] = 'Emotes', @@ -110,6 +129,15 @@ Config.Languages = { ['nocancel'] = "Kein Emote zum Abbrechen", ['maleonly'] = "Dieses Emote ist nur männlich, sorry!", ['emotemenucmd'] = "Do /emotemenu für ein Menü", + ['shareemotes'] = "👫 Geteilte Emotes", + ['shareemotesinfo'] = "Laden Sie eine Person in Ihrer Nähe zum Emoten ein", + ['sharedanceemotes'] = "🕺 Geteilte Tänze", + ['notvalidsharedemote'] = "ist kein gültiges geteiltes Emote.", + ['sentrequestto'] = "Gesendete Anfrage an ~g~", + ['nobodyclose'] = "Niemand ist nah genug dran.", + ['doyouwanna'] = "~y~Y~w~ zu akzeptieren, ~r~L~w~ zu verweigern (~g~", + ['refuseemote'] = "Emote abgelehnt.", + ['makenearby'] = "Lässt den Spieler in der Nähe spielen", }, ['sv'] = { ['emotes'] = 'Emotes', @@ -136,5 +164,14 @@ Config.Languages = { ['nocancel'] = "Ingen emote att avbryta", ['maleonly'] = "Den här emoten är endast för män, ledsen!", ['emotemenucmd'] = "Gör /emotemenu för en meny", + ['shareemotes'] = "👫 Delade Emotes", + ['shareemotesinfo'] = "Bjud in en någon nära för en emote", + ['sharedanceemotes'] = "🕺 Delade Danser", + ['notvalidsharedemote'] = "är inte en giltig delad emote.", + ['sentrequestto'] = "Skickad förfrågan till ~g~", + ['nobodyclose'] = "Ingen ~r~nära~w~ tillräckligt.", + ['doyouwanna'] = "~y~Y~w~ för att acceptera, ~r~L~w~ för att vägra (~g~", + ['refuseemote'] = "Emote vägrades.", + ['makenearby'] = "andra personen spelar", }, } \ No newline at end of file diff --git a/Server/Syncing.lua b/Server/Syncing.lua new file mode 100644 index 0000000..34e3b7e --- /dev/null +++ b/Server/Syncing.lua @@ -0,0 +1,10 @@ +RegisterServerEvent("ServerEmoteRequest") +AddEventHandler("ServerEmoteRequest", function(target, emotename, etype) + TriggerClientEvent("ClientEmoteRequestReceive", target, emotename, etype) +end) + +RegisterServerEvent("ServerValidEmote") +AddEventHandler("ServerValidEmote", function(target, requestedemote, otheremote) + TriggerClientEvent("SyncPlayEmote", source, otheremote, source) + TriggerClientEvent("SyncPlayEmoteSource", target, requestedemote) +end) \ No newline at end of file