forked from Simnation/Main
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
|