forked from Simnation/Main
177 lines
6.5 KiB
Lua
177 lines
6.5 KiB
Lua
-----------------------------------------------------------------------------------------------------
|
|
-- Shared Emotes Syncing ---------------------------------------------------------------------------
|
|
-----------------------------------------------------------------------------------------------------
|
|
|
|
RegisterNetEvent("ServerEmoteRequest", function(target, emotename, etype)
|
|
if not Player(source).state.canEmote then return end
|
|
|
|
local ped = GetPlayerPed(source)
|
|
|
|
if target == -1 then
|
|
return
|
|
end
|
|
local tped = GetPlayerPed(target)
|
|
local pedcoord = GetEntityCoords(ped)
|
|
local targetcoord = GetEntityCoords(tped)
|
|
|
|
local distance = #(pedcoord - targetcoord)
|
|
|
|
if distance > 3 then
|
|
return
|
|
end
|
|
|
|
TriggerClientEvent("ClientEmoteRequestReceive", target, emotename, etype, source)
|
|
end)
|
|
|
|
RegisterNetEvent("ServerValidEmote", function(target, requestedemote, otheremote)
|
|
local ped = GetPlayerPed(source)
|
|
|
|
if target == -1 then
|
|
return
|
|
end
|
|
local tped = GetPlayerPed(target)
|
|
local pedcoord = GetEntityCoords(ped)
|
|
local targetcoord = GetEntityCoords(tped)
|
|
|
|
local distance = #(pedcoord - targetcoord)
|
|
|
|
if distance > 3 then
|
|
return
|
|
end
|
|
|
|
TriggerClientEvent("SyncPlayEmote", source, otheremote, target)
|
|
TriggerClientEvent("SyncPlayEmoteSource", target, requestedemote, source)
|
|
end)
|
|
|
|
RegisterNetEvent("ServerEmoteCancel", function(target)
|
|
TriggerClientEvent("SyncCancelEmote", target, source)
|
|
end)
|
|
|
|
--#region ptfx
|
|
RegisterNetEvent("rpemotes:ptfx:sync", function(asset, name, offset, rot, bone, scale, color)
|
|
if type(asset) ~= "string" or type(name) ~= "string" or type(offset) ~= "vector3" or type(rot) ~= "vector3" then
|
|
print("[rpemotes] ptfx:sync: invalid arguments for source:", source)
|
|
return
|
|
end
|
|
|
|
local srcPlayerState = Player(source).state
|
|
|
|
srcPlayerState:set("ptfxAsset", asset, true)
|
|
srcPlayerState:set("ptfxName", name, true)
|
|
srcPlayerState:set("ptfxOffset", offset, true)
|
|
srcPlayerState:set("ptfxRot", rot, true)
|
|
srcPlayerState:set("ptfxBone", bone, true)
|
|
srcPlayerState:set("ptfxScale", scale, true)
|
|
srcPlayerState:set("ptfxColor", color, true)
|
|
srcPlayerState:set("ptfxPropNet", false, true)
|
|
srcPlayerState:set("ptfx", false, true)
|
|
end)
|
|
|
|
RegisterNetEvent("rpemotes:ptfx:syncProp", function(propNet)
|
|
local srcPlayerState = Player(source).state
|
|
if propNet then
|
|
-- Prevent infinite loop to get entity
|
|
local waitForEntityToExistCount = 0
|
|
while waitForEntityToExistCount <= 100 and not DoesEntityExist(NetworkGetEntityFromNetworkId(propNet)) do
|
|
Wait(10)
|
|
waitForEntityToExistCount = waitForEntityToExistCount + 1
|
|
end
|
|
|
|
-- If below 100 then we could find the loaded entity
|
|
if waitForEntityToExistCount < 100 then
|
|
srcPlayerState:set("ptfxPropNet", propNet, true)
|
|
return
|
|
end
|
|
end
|
|
-- If we reach this point then we couldn"t find the entity
|
|
srcPlayerState:set("ptfxPropNet", false, true)
|
|
end)
|
|
--#endregion ptfx
|
|
|
|
-- Emote props extractor
|
|
local function ExtractEmoteProps(format)
|
|
local format = tonumber(format)
|
|
local xt, c, total = "", "", 0
|
|
if format == 1 then
|
|
print("Selected format: ^2\"prop_name\",")
|
|
xt = "\""; c = ","
|
|
elseif format == 2 then
|
|
print("Selected format: ^2\"prop_name\",")
|
|
xt = "\""; c = ","
|
|
elseif format == 3 then
|
|
print("Selected format: ^2prop_name,")
|
|
elseif format == 4 then
|
|
print("Selected to calculate ^2total amount of emotes^0.")
|
|
else
|
|
print(
|
|
"\n### RPEmotes - Props Extractor ###\n\n^3Select output format^0\nAvailable formats:\n^11^0 - ^2\"prop_name\",\n^12^0 - ^2\"prop_name\",\n^13^0 - ^2prop_name\n^14^0 - ^2calculate total emotes\n\n^0Command usage example: ^5emoteextract 1^0\n")
|
|
return
|
|
end
|
|
|
|
local animationFile = LoadResourceFile(GetCurrentResourceName(), "client/AnimationList.lua")
|
|
if not animationFile then return nil end
|
|
|
|
local f, err = load(animationFile .. " return RP")
|
|
if err then return nil end
|
|
|
|
local success, res = pcall(f)
|
|
if not success then return nil end
|
|
|
|
if format == 4 then
|
|
local emoteTypes = { "Shared", "Dances", "AnimalEmotes", "Emotes", "PropEmotes", "Expressions", "Walks" }
|
|
local countEmotesWith = 0
|
|
local countEmotes = 0
|
|
|
|
for i = 1, #emoteTypes do
|
|
local emoteType = emoteTypes[i]
|
|
for _, _ in pairs(res[emoteType]) do
|
|
if emoteType == "Expressions" or emoteType == "Walks" then
|
|
countEmotesWith += 1
|
|
else
|
|
countEmotes += 1
|
|
end
|
|
end
|
|
end
|
|
|
|
local totalEmotes = countEmotesWith + countEmotes
|
|
|
|
print("Total Expressions and Walks: ^3" .. countEmotesWith .. "^0")
|
|
print("Total Emotes without Expressions and Walks: ^3" .. countEmotes .. "^0")
|
|
print("Total Emotes: ^3" .. totalEmotes .. "^0")
|
|
else
|
|
-- table to keep track of exported values
|
|
local exportedValues = {}
|
|
-- open file for writing
|
|
local file = assert(io.open(GetResourcePath(GetCurrentResourceName()) .. "/prop_list.lua", "w"))
|
|
|
|
-- tables that has props:
|
|
-- RP.PropEmotes
|
|
-- RP.Shared (most likely all props mentioned in here is used in PropEmotes, so I don"t check it)
|
|
for _, value in pairs(res.PropEmotes) do
|
|
-- check if the current value is a table and has an AnimationOptions field
|
|
if type(value) == "table" and value.AnimationOptions then
|
|
-- extract the Prop and SecondProp values and check if they"re nil and not already exported
|
|
local propValue = value.AnimationOptions.Prop
|
|
local secondPropValue = value.AnimationOptions.SecondProp
|
|
if propValue and not exportedValues[propValue] then
|
|
file:write(xt .. propValue .. xt .. c .. "\n")
|
|
exportedValues[propValue] = true
|
|
total += 1
|
|
end
|
|
if secondPropValue and not exportedValues[secondPropValue] then
|
|
file:write(xt .. secondPropValue .. c .. "\n")
|
|
exportedValues[secondPropValue] = true
|
|
total += 1
|
|
end
|
|
end
|
|
end
|
|
|
|
print("Exported props: " .. total)
|
|
file:close()
|
|
end
|
|
end
|
|
|
|
RegisterCommand("emoteextract", function(source, args)
|
|
if source > 0 then return end
|
|
ExtractEmoteProps(args[1])
|
|
end, true)
|