This relys on the default server file to handle most, but we have opening menus and when rcore_clothing provides as qb/esx_skin this should resolve the errors if the framework didnt match the bridged option. Formatting fixed, debug commands disabled as this is for production.
151 lines
4.6 KiB
Lua
151 lines
4.6 KiB
Lua
---@diagnostic disable: duplicate-set-field
|
|
Clothing = Clothing or {}
|
|
|
|
ClothingBackup = {}
|
|
Callback = Callback or Require("lib/utility/shared/callbacks.lua")
|
|
Ultility = Utility or Require('lib/utility/client/utility.lua')
|
|
Cache = Cache or Require('lib/cache/shared/cache.lua')
|
|
|
|
|
|
function Clothing.IsMale()
|
|
local ped = PlayerPedId()
|
|
if not ped then return end
|
|
if GetEntityModel(ped) == `mp_m_freemode_01` then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
---Get the skin data of a ped
|
|
---@param entity number
|
|
---@return table
|
|
function Clothing.GetAppearance(entity)
|
|
if not entity and not DoesEntityExist(entity) then return end
|
|
local model = GetEntityModel(entity)
|
|
local skinData = { model = model, components = {}, props = {} }
|
|
for i = 0, 11 do
|
|
table.insert(skinData.components,
|
|
{ component_id = i, drawable = GetPedDrawableVariation(entity, i), texture = GetPedTextureVariation(entity, i) })
|
|
end
|
|
for i = 0, 13 do
|
|
table.insert(skinData.props,
|
|
{ prop_id = i, drawable = GetPedPropIndex(entity, i), texture = GetPedPropTextureIndex(entity, i) })
|
|
end
|
|
return skinData
|
|
end
|
|
|
|
function Clothing.CopyAppearanceToClipboard()
|
|
local ped = PlayerPedId()
|
|
if not ped or not DoesEntityExist(ped) then return end
|
|
local skinData = Clothing.GetAppearance(ped)
|
|
if not skinData then return end
|
|
Ultility.CopyToClipboard(skinData)
|
|
end
|
|
|
|
Callback.Register('community_bridge:cb:GetAppearance', function()
|
|
local ped = PlayerPedId()
|
|
if not ped or not DoesEntityExist(ped) then return end
|
|
local skinData = Clothing.GetAppearance(ped)
|
|
return skinData
|
|
end)
|
|
|
|
---Apply skin data to a ped
|
|
---@param entity number
|
|
---@param skinData table
|
|
---@return boolean
|
|
function Clothing.SetAppearance(entity, skinData)
|
|
for k, v in pairs(skinData.components or {}) do
|
|
if v.component_id then
|
|
SetPedComponentVariation(entity, v.component_id, v.drawable, v.texture, 0)
|
|
end
|
|
end
|
|
for k, v in pairs(skinData.props or {}) do
|
|
if v.prop_id then
|
|
SetPedPropIndex(entity, v.prop_id, v.drawable, v.texture, 0)
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
---This will return the peds components to the previously stored components
|
|
---@return boolean
|
|
Clothing.RestoreAppearance = function(entity)
|
|
Clothing.SetAppearance(entity, ClothingBackup)
|
|
return true
|
|
end
|
|
|
|
Clothing.UpdateAppearanceBackup = function(data)
|
|
ClothingBackup = data
|
|
end
|
|
|
|
Clothing.RunningDebug = false
|
|
Clothing.Cache = nil -- maybe change this to the actual cache system???!? For future not lazy me
|
|
|
|
Cache.Create('Clothing', function()
|
|
local ped = Cache.Get('Ped')
|
|
local appearance = Clothing.GetAppearance(ped)
|
|
if Table.Compare(Clothing.Cache, appearance) then
|
|
return false
|
|
end
|
|
return appearance
|
|
end, 1000)
|
|
|
|
local onChange = nil
|
|
Clothing.ToggleDebugging = function()
|
|
if Clothing.RunningDebug then
|
|
Clothing.RunningDebug = false
|
|
print("Clothing Debugging Disabled")
|
|
return Cache.RemoveOnChange('Clothing', onChange)
|
|
end
|
|
Clothing.RunningDebug = true
|
|
print("Clothing Debugging Enabled")
|
|
|
|
if Clothing.OpenMenu then
|
|
Clothing.OpenMenu()
|
|
end
|
|
|
|
onChange = Cache.OnChange('Clothing', function(new, old)
|
|
print("Clothing Debugging", new)
|
|
for k, v in pairs(old.components) do
|
|
if v.component_id then
|
|
if new.components[k].drawable ~= v.drawable or new.components[k].texture ~= v.texture then
|
|
print("Component ID: " ..
|
|
v.component_id ..
|
|
" Drawable: " .. new.components[k].drawable .. " Texture: " .. new.components[k].texture)
|
|
end
|
|
end
|
|
end
|
|
for k, v in pairs(old.props) do
|
|
if v.prop_id then
|
|
if new.props[k].drawable ~= v.drawable or new.props[k].texture ~= v.texture then
|
|
print("Prop ID: " ..
|
|
v.prop_id .. " Drawable: " .. new.props[k].drawable .. " Texture: " .. new.props[k].texture)
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
RegisterNetEvent('community_bridge:client:SetAppearance', function(data)
|
|
Clothing.SetAppearance(PlayerPedId(), data)
|
|
end)
|
|
|
|
RegisterNetEvent('community_bridge:client:GetAppearance', function()
|
|
Clothing.GetAppearance(PlayerPedId())
|
|
end)
|
|
|
|
RegisterNetEvent('community_bridge:client:RestoreAppearance', function()
|
|
Clothing.RestoreAppearance(PlayerPedId())
|
|
end)
|
|
|
|
-- RegisterCommand("clothing:enabledebug", function(source, args, rawCommand)
|
|
-- Clothing.ToggleDebugging()
|
|
-- end)
|
|
|
|
-- RegisterCommand("clothing:copy", function(source, args, rawCommand)
|
|
-- Clothing.CopyAppearanceToClipboard()
|
|
-- end)
|
|
|
|
|
|
return Clothing
|