2026-04-14 23:50:13 +02:00

792 lines
29 KiB
Lua

RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
TriggerServerEvent("qb-clothes:loadPlayerSkin")
TriggerServerEvent("codem-appearance:LoadClothingCategories")
TriggerServerEvent("codem-appearance:LoadSavedClothings")
TriggerServerEvent("codem-appearance:LoadUnpaidOutfits")
end)
RegisterNetEvent("esx:playerLoaded")
AddEventHandler("esx:playerLoaded", function(PlayerData, isNew)
TriggerServerEvent("codem-appearance:LoadTattoos")
TriggerServerEvent("codem-appearance:LoadClothingCategories")
TriggerServerEvent("codem-appearance:LoadSavedClothings")
TriggerServerEvent("codem-appearance:LoadUnpaidOutfits")
end)
RegisterCommand(Config.ReloadCommand, function()
local ped = PlayerPedId()
-- Animation laden
RequestAnimDict("clothingshirt")
while not HasAnimDictLoaded("clothingshirt") do
Wait(0)
end
-- Spieler freezen
FreezeEntityPosition(ped, true)
-- Animation abspielen (Kleidung anziehen)
TaskPlayAnim(ped, "clothingshirt", "try_shirt_positive_d", 8.0, -8.0, 3000, 49, 0, false, false, false)
-- Warten bis Animation durch ist
Wait(3000)
-- Skin neu laden
TriggerEvent("codem-appearance:reloadSkin")
-- Damage resetten
ClearPedBloodDamage(ped)
ResetPedVisibleDamage(ped)
ClearPedLastWeaponDamage(ped)
-- kleiner Delay für Stabilität
Wait(500)
-- Spieler wieder bewegen lassen
FreezeEntityPosition(ped, false)
-- Animation sauber stoppen
ClearPedTasks(ped)
end)
CreateThread(function()
while true do
if menuOpen then
FreezeEntityPosition(PlayerPedId(), true)
if not IsEntityPlayingAnim(PlayerPedId(), "anim@amb@clubhouse@mini@darts@", "wait_idle", 3) then
RequestAnimDict("anim@amb@clubhouse@mini@darts@")
while not HasAnimDictLoaded("anim@amb@clubhouse@mini@darts@") do
Wait(0)
end
TaskPlayAnim(PlayerPedId(), "anim@amb@clubhouse@mini@darts@", "wait_idle", 8.0, 1.0, -1, 1, 0, 0, 0, 0)
end
end
Wait(500)
end
end)
RegisterNetEvent("codem-appearance:reloadSkin")
AddEventHandler("codem-appearance:reloadSkin", function()
local pedModel = GetEntityModel(PlayerPedId())
local sexVal = (pedModel == `mp_m_freemode_01`) and 0 or 1
if Config.ClothesAsItem then
TriggerEvent('skinchanger:getSkin', function(cur)
cur.sex = sexVal
TriggerEvent('skinchanger:loadSkin', cur)
TriggerCallback("codem-appearance:SaveSkin", { skin = cur, model = pedModel })
end)
return
end
local skin = TriggerCallback("codem-appearance:GetSkin")
if skin then
if Config.Framework == 'esx' or Config.Framework == 'oldesx' then
TriggerEvent('skinchanger:loadSkin', skin)
else
TriggerEvent('skinchanger:loadSkin', FormatQBCoreData(skin))
end
end
end)
RegisterNetEvent('qb-clothing:client:loadOutfit')
AddEventHandler('qb-clothing:client:loadOutfit', function(oData)
oData = FormatQBCoreData(oData)
TriggerEvent('skinchanger:loadPedSkin', oData)
end)
function HidePlayers()
CreateThread(function()
while menuOpen do
local time = 500
time = 1
for _, player in ipairs(GetActivePlayers()) do
if player ~= PlayerId() and NetworkIsPlayerActive(player) then
NetworkFadeInEntity(GetPlayerPed(player), true)
end
end
Wait(time)
end
for _, player in ipairs(GetActivePlayers()) do
if player ~= PlayerId() and NetworkIsPlayerActive(player) then
NetworkFadeOutEntity(GetPlayerPed(player), false)
end
end
end)
end
RegisterNUICallback("mainClothes", function(data, cb)
TriggerEvent("codem-appearance:reloadSkin")
cb("ok")
end)
RegisterNetEvent("qb-clothing:client:openMenu")
AddEventHandler("qb-clothing:client:openMenu", function()
OpenMenu("charcreator")
end)
RegisterNetEvent('qb-clothing:client:loadPlayerClothing')
AddEventHandler('qb-clothing:client:loadPlayerClothing', function(skin, ped)
TriggerEvent('skinchanger:loadSkin', FormatQBCoreData(skin), nil, ped)
end)
RegisterNetEvent("qb-clothes:client:CreateFirstCharacter")
AddEventHandler("qb-clothes:client:CreateFirstCharacter", function()
OpenMenu("charcreator")
end)
RegisterNetEvent("qb-clothes:loadSkin")
AddEventHandler("qb-clothes:loadSkin", function(_, model, data)
local skin = TriggerCallback("codem-appearance:GetSkin")
if skin then
local gender = Core.Functions.GetPlayerData().charinfo.gender
if CheckSkin(skin) then
local model
if gender == 1 then -- Gender is ONE for FEMALE
model = GetHashKey("mp_f_freemode_01") -- Female Model
else
model = GetHashKey("mp_m_freemode_01") -- Male Model
end
TriggerCallback("codem-appearance:SaveSkin", { skin = FormatQBCoreData(skin), model = model})
while not migrated do
Wait(0)
end
migrated = false
end
skin = TriggerCallback("codem-appearance:GetSkin")
if gender == 1 then
TriggerEvent('skinchanger:loadDefaultModel', false, nil)
else
TriggerEvent('skinchanger:loadDefaultModel', true, nil)
end
Wait(500)
TriggerEvent('skinchanger:loadSkin', FormatQBCoreData(skin))
TriggerServerEvent("codem-appearance:LoadTattoos")
if Config.ClothesAsItem then
TriggerEvent('codem-appereance:GetClothingData')
end
else
local gender = Core.Functions.GetPlayerData().charinfo.gender
if gender == 1 then
TriggerEvent('skinchanger:loadDefaultModel', false, nil)
else
TriggerEvent('skinchanger:loadDefaultModel', true, nil)
end
TriggerEvent('skinchanger:change', "sex", gender)
TriggerEvent('skinchanger:loadSkin', { sex = gender }, OpenMenu("charcreator"))
TriggerServerEvent("codem-appearance:LoadTattoos")
end
end)
RegisterNetEvent('esx_skin:openSaveableMenu')
AddEventHandler('esx_skin:openSaveableMenu', function(submitCb, cancelCb)
OpenSaveableMenu(submitCb, cancelCb)
end)
function OpenSaveableMenu(submitCb, cancelCb)
OpenMenu("charcreator")
while menuOpen do
Wait(0)
end
submitCb()
end
AddEventHandler('esx_skin:playerRegistered', function()
CreateThread(function()
if firstSpawn then
local skin = TriggerCallback("codem-appearance:GetSkin")
if not skin then
TriggerEvent('skinchanger:change', "sex", 0)
TriggerEvent('skinchanger:loadSkin', { sex = 0 }, OpenMenu("charcreator"))
Wait(100)
else
if Config.Framework == 'esx' or Config.Framework == 'oldesx' then
TriggerEvent('skinchanger:loadSkin', skin)
if Config.ClothesAsItem then
TriggerEvent('codem-appereance:GetClothingData')
end
else
TriggerEvent('skinchanger:loadSkin', FormatQBCoreData(skin))
if Config.ClothesAsItem then
TriggerEvent('codem-appereance:GetClothingData')
end
end
Wait(100)
end
firstSpawn = false
end
end)
end)
AddEventHandler('esx_skin:resetFirstSpawn', function()
playerLoaded = false
firstSpawn = true
end)
CreateThread(function()
Wait(3000)
WaitCore()
WaitPlayer()
TriggerServerEvent("codem-appearance:LoadTattoos")
TriggerServerEvent("codem-appearance:LoadClothingCategories")
TriggerServerEvent("codem-appearance:LoadSavedClothings")
TriggerServerEvent("codem-appearance:LoadUnpaidOutfits")
local playerName = TriggerCallback("codem-appearance:GetPlayerName")
local pp = TriggerCallback("codem-appearance:GetPlayerPP")
NuiMessage("SET_PLAYER_NAME", playerName)
NuiMessage("SET_OUTFIT_PRICE", Config.Clothing.price)
NuiMessage("SET_SURGERY_PRICE", Config.Surgery.price)
NuiMessage("SET_LOCALES", Config.Locale)
NuiMessage("SELECTED_MONEY_TYPE", Config.MoneyType)
NuiMessage("SET_DEFAULT_IMAGE", Config.DefaultImage)
NuiMessage("SET_PED_PAGE", Config.PedPage)
NuiMessage("SET_SERVER_ID", GetPlayerServerId(PlayerId()))
NuiMessage("SET_PLAYER_PP", pp)
LoadPlayerInformations()
end)
RegisterNUICallback("changePedModel", function(data, cb)
local model = GetHashKey(data.model)
RequestModel(model)
while not HasModelLoaded(model) do
Wait(0)
end
SetPlayerModel(PlayerId(), model)
SetModelAsNoLongerNeeded(model)
TriggerServerEvent("codem-appearance:savePed", data.model)
end)
function GetTattoosByType(type)
local tattoos = {}
local tempData = json.decode(json.encode(Config.Tattoo.list))
for _, v in pairs(tempData) do
if v.Zone == type then
v.Name = GetLabelText(v.Name)
if v.Name == 'NULL' or v.Name == nil then
v.Name = 'Unnamed Tattoo'
end
table.insert(tattoos, v)
end
end
return tattoos
end
RegisterNUICallback("randomize", function(data, cb)
TriggerEvent("skinchanger:getData", function(components, max)
for key, v in pairs(components) do
if v.name ~= 'skin_mom' and v.name ~= 'skin_dad' and v.name ~= 'sex' and v.name ~= 'mask_1' and v.name ~= 'mask_2' and v.name ~= 'helmet_1' and v.name ~= 'helmet_2' and v.name ~= 'bags_1' and v.name ~= 'bags_2' then
local value = 0
if tonumber(v.min) > tonumber(max[v.name]) then
value = v.min
else
value = math.random(v.min, max[v.name])
end
local modelType = 'female'
if IsPedMale(PlayerPedId()) then
modelType = 'male'
end
if Config.Blacklisted[modelType][v.name] then
local check = true
TriggerEvent('skinchanger:getSkin', function(sskin)
local isBlacklisted = false
for _, item in pairs(Config.Blacklisted[modelType][v.name]) do
if item == tonumber(value) then
isBlacklisted = true
end
end
while isBlacklisted do
Wait(0)
if tonumber(v.min) > tonumber(max[v.name]) then
value = v.min + 1
else
value = math.random(v.min, max[v.name])
end
local blacklisted = false
for _, item in pairs(Config.Blacklisted[modelType][v.name]) do
if item == tonumber(value) then
blacklisted = true
end
end
isBlacklisted = blacklisted
end
check = false
end)
while check do
Wait(0)
end
end
TriggerEvent("skinchanger:change", v.name, tonumber(value))
end
end
local skin = GetSkin()
NuiMessage("SET_SKIN", skin)
end)
end)
local textUICache = {}
function ShowHelpNotification(text, location)
if Config.TextUIHandler == 'default' then
AddTextEntry('helpNotification', text)
DisplayHelpTextThisFrame('helpNotification', false)
end
if not textUICache[location] then
if Config.TextUIHandler == 'esx_textui' then
TriggerEvent('ESX:TextUI', text)
end
if Config.TextUIHandler == 'qb_default_textui' then
TriggerEvent("qb-core:client:DrawText", text)
end
if Config.TextUIHandler == 'custom' then
exports['hex_4_hud']:ShowHelpNotify(text, "E")
end
textUICache[location] = true
end
end
function HideHelpNotification(location)
if textUICache[location] then
if Config.TextUIHandler == 'esx_textui' then
TriggerEvent('ESX:HideUI')
end
if Config.TextUIHandler == 'qb_default_textui' then
TriggerEvent('qb-core:client:HideText')
end
if Config.TextUIHandler == 'custom' then
exports['hex_4_hud']:HideHelpNotify()
end
textUICache[location] = false
end
end
function Close()
SetNuiFocus(false, false)
DisableCam()
DisplayRadar(true)
accessoryCache = {}
menuOpen = false
ClearPedTasks(PlayerPedId())
local defaultHeading = GetEntityHeading(PlayerPedId())
local c = GetOffsetFromEntityInWorldCoords(PlayerPedId(), 0.0, 5.0, 0.0)
SetEntityHeading(PlayerPedId(), GetEntityHeading(PlayerPedId()) + 30.0)
TaskLookAtCoord(PlayerPedId(), c, 1, 2048, 3)
ResetBasket()
TriggerServerEvent("codem-appearance:UpdateBucket", false)
prevSkin = {}
tattooBasket = {}
if currentCharacterPage ~= 'job' then
local skin = TriggerCallback("codem-appearance:GetSkin")
if Config.Framework == 'qb' or Config.Framework == 'oldqb' then
skin = FormatQBCoreData(skin)
end
TriggerEvent('skinchanger:loadSkin', skin)
end
TriggerEvent("codem-appearance:LoadTattoos", currentTattoos)
currentCharacterPage = false
FreezeEntityPosition(PlayerPedId(), false)
Config.OnMenuClose()
end
RegisterNetEvent('codem-appearance:syncPed')
AddEventHandler('codem-appearance:syncPed', function(ped)
if ped then
local pedModel = GetHashKey(ped)
RequestModel(pedModel)
while not HasModelLoaded(pedModel) do
Wait(0)
end
SetPlayerModel(PlayerId(), pedModel)
SetModelAsNoLongerNeeded(pedModel)
else
OpenMenu("charcreator")
end
end)
RegisterCommand(Config.PedReloadCommand, function()
TriggerServerEvent('codem-appearance:LoadPeds')
end)
RegisterNUICallback('saveSkin', function(data, cb)
local success = true
local saveClothing = data and data.saveClothing or false
local clothingName = data and data.clothingName or false
if currentCharacterPage == 'barber' then
local price = GetBasketPrice()
if price > 0 then
success = TriggerCallback("codem-appearance:PayBasket", price)
end
end
if currentCharacterPage == 'binco' or currentCharacterPage == 'ponsonbys' or currentCharacterPage == 'suburban' then
local price = Config.Clothing.price
if price > 0 then
success = TriggerCallback("codem-appearance:PayBasket", price)
end
end
if currentCharacterPage == 'surgery' then
local price = Config.Surgery.price
if price > 0 then
success = TriggerCallback("codem-appearance:PayBasket", price)
end
end
if success then
if currentCharacterPage == 'barber' then
local skin = TriggerCallback("codem-appearance:GetSkin")
if Config.Framework == 'qb' or Config.Framework == 'oldqb' then
skin = FormatQBCoreData(skin)
end
for _, v in pairs(accessoryCache) do
TriggerEvent("skinchanger:change", _, tonumber(skin[_]))
end
end
TriggerEvent('skinchanger:getSkin', function(skin)
if not Config.ClothesAsItem or (currentCharacterPage == 'charcreator' or currentCharacterPage == 'barber') then
TriggerCallback("codem-appearance:SaveSkin", { skin = skin, model = GetEntityModel(PlayerPedId()) })
if saveClothing then
TriggerServerEvent("codem-appearance:SaveClothing", clothingName, skin)
end
if Config.ClothesAsItem then
TriggerEvent('codem-appereance:GetClothingData')
end
else
local outfitData = CreateOutfitData(skin)
TriggerServerEvent('codem-apperance:GiveOutfit', outfitData)
end
NuiMessage("CLOSE_PAGE")
if currentCharacterPage == 'charcreator' then
Config.OnCharacterCreated()
end
end)
else
TriggerEvent("codem-appearance:SendNotification", Config.Locale["noMoney"])
end
cb("ok")
end)
RegisterNetEvent('codem-appereance:UseOutfit')
AddEventHandler('codem-appereance:UseOutfit', function(item)
local player = PlayerPedId()
if item.name == 'torso_1' then
RequestAnimDict('missmic4')
TaskPlayAnim(player, 'missmic4', 'michael_tux_fidget', 8.0, 1.0, -1, 16, 0, 0, 0, 0)
Wait(1750)
ClearPedTasks(player)
TriggerEvent("skinchanger:change", item.name, item.info.skin)
TriggerEvent("skinchanger:change", "torso_2", item.info.texture)
end
if item.name == 'tshirt_1' then
RequestAnimDict('missmic4')
TaskPlayAnim(player, 'missmic4', 'michael_tux_fidget', 8.0, 1.0, -1, 16, 0, 0, 0, 0)
Wait(1750)
ClearPedTasks(player)
TriggerEvent("skinchanger:change", item.name, item.info.skin)
TriggerEvent("skinchanger:change", "tshirt_2", item.info.texture)
end
if item.name == 'arms' then
RequestAnimDict('nmt_3_rcm-10')
TaskPlayAnim(player, 'nmt_3_rcm-10', 'cs_nigel_dual-10', 8.0, 1.0, -1, 16, 0, 0, 0, 0)
Wait(1750)
ClearPedTasks(player)
TriggerEvent("skinchanger:change", item.name, item.info.skin)
TriggerEvent("skinchanger:change", "arms_2", item.info.texture)
end
if item.name == 'pants_1' then
RequestAnimDict('random@domestic')
TaskPlayAnim(player, 'random@domestic', 'pickup_low', 8.0, 1.0, -1, 16, 0, 0, 0, 0)
Wait(1750)
ClearPedTasks(player)
TriggerEvent("skinchanger:change", item.name, item.info.skin)
TriggerEvent("skinchanger:change", "pants_2", item.info.texture)
end
if item.name == 'shoes_1' then
RequestAnimDict('random@domestic')
TaskPlayAnim(player, 'random@domestic', 'pickup_low', 8.0, 1.0, -1, 16, 0, 0, 0, 0)
Wait(1750)
ClearPedTasks(player)
TriggerEvent("skinchanger:change", item.name, item.info.skin)
TriggerEvent("skinchanger:change", "shoes_2", item.info.texture)
end
if item.name == 'mask_1' then
RequestAnimDict('mp_masks@standard_car@ds@')
TaskPlayAnim(player, 'mp_masks@standard_car@ds@', 'put_on_mask', 8.0, 1.0, -1, 16, 0, 0, 0, 0)
Wait(1750)
ClearPedTasks(player)
TriggerEvent("skinchanger:change", item.name, item.info.skin)
TriggerEvent("skinchanger:change", "mask_2", item.info.texture)
end
if item.name == 'bproof_1' then
RequestAnimDict('clothingtie')
TaskPlayAnim(player, 'clothingtie', 'try_tie_negative_a', 8.0, 1.0, -1, 16, 0, 0, 0, 0)
Wait(1750)
ClearPedTasks(player)
TriggerEvent("skinchanger:change", item.name, item.info.skin)
TriggerEvent("skinchanger:change", "bproof_2", item.info.texture)
end
if item.name == 'chain_1' then
RequestAnimDict('clothingtie')
TaskPlayAnim(player, 'clothingtie', 'try_tie_positive_a', 8.0, 1.0, -1, 16, 0, 0, 0, 0)
Wait(1750)
ClearPedTasks(player)
TriggerEvent("skinchanger:change", item.name, item.info.skin)
TriggerEvent("skinchanger:change", "chain_2", item.info.texture)
end
if item.name == 'helmet_1' then
RequestAnimDict('clothingtie')
TaskPlayAnim(player, 'clothingtie', 'check_out_a', 8.0, 1.0, -1, 16, 0, 0, 0, 0)
Wait(1750)
ClearPedTasks(player)
TriggerEvent("skinchanger:change", item.name, item.info.skin)
TriggerEvent("skinchanger:change", "helmet_2", item.info.texture)
end
if item.name == 'glasses_1' then
RequestAnimDict('mp_masks@standard_car@ds@')
TaskPlayAnim(player, 'mp_masks@standard_car@ds@', 'put_on_mask', 8.0, 1.0, -1, 16, 0, 0, 0, 0)
Wait(1750)
ClearPedTasks(player)
TriggerEvent("skinchanger:change", item.name, item.info.skin)
TriggerEvent("skinchanger:change", "glasses_2", item.info.texture)
end
if item.name == 'watches_1' then
RequestAnimDict('nmt_3_rcm-10')
TaskPlayAnim(player, 'nmt_3_rcm-10', 'cs_nigel_dual-10', 8.0, 1.0, -1, 16, 0, 0, 0, 0)
Wait(1750)
ClearPedTasks(player)
TriggerEvent("skinchanger:change", item.name, item.info.skin)
TriggerEvent("skinchanger:change", "watches_2", item.info.texture)
end
if item.name == 'bracelets_1' then
RequestAnimDict('nmt_3_rcm-10')
TaskPlayAnim(player, 'nmt_3_rcm-10', 'cs_nigel_dual-10', 8.0, 1.0, -1, 16, 0, 0, 0, 0)
Wait(1750)
ClearPedTasks(player)
TriggerEvent("skinchanger:change", item.name, item.info.skin)
TriggerEvent("skinchanger:change", "bracelets_2", item.info.texture)
end
if item.name == 'bags_1' then
RequestAnimDict('anim@heists@ornate_bank@grab_cash')
TaskPlayAnim(player, 'anim@heists@ornate_bank@grab_cash', 'intro', 8.0, 1.0, -1, 16, 0, 0, 0, 0)
Wait(1750)
ClearPedTasks(player)
TriggerEvent("skinchanger:change", item.name, item.info.skin)
TriggerEvent("skinchanger:change", "bags_2", item.info.texture)
end
TriggerEvent('skinchanger:getSkin', function(skin)
TriggerCallback("codem-appearance:SaveSkin", { skin = skin, model = GetEntityModel(PlayerPedId()) })
end)
end)
RegisterNetEvent('codem-inventory:client:takeoffClothing', function(itemname, clotingvalue)
local pedModel = GetEntityModel(PlayerPedId())
local skinData = {}
if pedModel == `mp_m_freemode_01` then
skinData.sex = 0
else
skinData.sex = 1
end
skinData[itemname] = clotingvalue
TriggerEvent('skinchanger:loadSkin', skinData)
TriggerEvent('skinchanger:getSkin', function(curSkin)
-- print("^2[TEST] takeoff -> getSkin ok, sex="..tostring(curSkin.sex).." model="..tostring(GetEntityModel(PlayerPedId())).."^7")
-- print("^2[TEST] slot "..itemname.." after takeoff value="..tostring(curSkin[itemname]).."^7")
TriggerCallback("codem-appearance:SaveSkin", {
skin = curSkin,
model = GetEntityModel(PlayerPedId())
}, function(cbOk)
-- print("^2[TEST] SaveSkin callback result="..tostring(cbOk).." (takeoff) ^7")
end)
end)
end)
RegisterNetEvent('codem-appereance:GetClothingData')
AddEventHandler('codem-appereance:GetClothingData', function()
local pedModel = GetEntityModel(PlayerPedId())
if pedModel == `mp_m_freemode_01` then
TriggerServerEvent('codem-inventory:server:GetPlayerClothing', ClothingData(), 'man')
else
TriggerServerEvent('codem-inventory:server:GetPlayerClothing', ClothingData(), 'woman')
end
end)
function ClothingData()
local ped = PlayerPedId()
return {
arms = {
value = GetPedDrawableVariation(ped, 3),
texture = GetPedTextureVariation(ped, 3),
},
tshirt_1 = {
value = GetPedDrawableVariation(ped, 8),
texture = GetPedTextureVariation(ped, 8),
},
torso_1 = {
value = GetPedDrawableVariation(ped, 11),
texture = GetPedTextureVariation(ped, 11),
},
pants_1 = {
value = GetPedDrawableVariation(ped, 4),
texture = GetPedTextureVariation(ped, 4),
},
shoes_1 = {
value = GetPedDrawableVariation(ped, 6),
texture = GetPedTextureVariation(ped, 6),
},
mask_1 = {
value = GetPedDrawableVariation(ped, 1),
texture = GetPedTextureVariation(ped, 1),
},
bproof_1 = {
value = GetPedDrawableVariation(ped, 9),
texture = GetPedTextureVariation(ped, 9),
},
chain_1 = {
value = GetPedDrawableVariation(ped, 7),
texture = GetPedTextureVariation(ped, 7),
},
helmet_1 = {
value = GetPedPropIndex(ped, 0),
texture = GetPedPropTextureIndex(ped, 0),
},
glasses_1 = {
value = GetPedPropIndex(ped, 1),
texture = GetPedPropTextureIndex(ped, 1),
},
watches_1 = {
value = GetPedPropIndex(ped, 6),
texture = GetPedPropTextureIndex(ped, 6),
},
bracelets_1 = {
value = GetPedPropIndex(ped, 7),
texture = GetPedPropTextureIndex(ped, 7),
},
bags_1 = {
value = GetPedDrawableVariation(ped, 5),
texture = GetPedTextureVariation(ped, 5),
},
}
end
-- ══════════════════════════════════════════════════════════════
-- Gespeicherte Outfits: Client-seitige Handler
-- ══════════════════════════════════════════════════════════════
-- Kategorien vom Server empfangen → ans NUI schicken
RegisterNetEvent('codem-appearance:ReceiveClothingCategories')
AddEventHandler('codem-appearance:ReceiveClothingCategories', function(data)
SendNUIMessage({ action = "SET_CLOTHING_CATEGORIES", payload = data })
end)
-- Gespeicherte Outfits vom Server empfangen → ans NUI schicken
RegisterNetEvent('codem-appearance:ReceiveSavedClothings')
AddEventHandler('codem-appearance:ReceiveSavedClothings', function(data)
SendNUIMessage({ action = "SET_SAVED_CLOTHINGS", payload = data })
end)
-- NUI: Outfit anziehen (JETZT ANZIEHEN Button)
RegisterNUICallback('wearClothing', function(data, cb)
if not data or not data.skin then cb({}); return end
local skin = type(data.skin) == 'string' and json.decode(data.skin) or data.skin
if skin then
-- Skin auf den Charakter anwenden
TriggerEvent('codem-appearance:setPlayerSkin', skin)
-- Auch per Export falls verfügbar
if GetResourceState('codem-appearance') == 'started' then
exports['codem-appearance']:SetPlayerSkin(skin)
end
end
cb({})
end)
-- NUI: Gespeichertes Outfit löschen
RegisterNUICallback('DeleteSavedClothing', function(data, cb)
if not data or not data.id then cb({}); return end
TriggerServerEvent('codem-appearance:DeleteSavedClothing', data.id)
cb({})
end)
-- NUI: Kategorie löschen
RegisterNUICallback('DeleteClothingCategory', function(data, cb)
if not data or not data.id then cb({}); return end
TriggerServerEvent('codem-appearance:DeleteClothingCategory', data.id)
cb({})
end)
-- NUI: Neue Kategorie erstellen
RegisterNUICallback('CreateClothingCategory', function(data, cb)
if not data or not data.name then cb({}); return end
TriggerServerEvent('codem-appearance:CreateClothingCategory', data.name)
cb({})
end)
-- Skin anwenden (von wearClothing aufgerufen)
RegisterNetEvent('codem-appearance:setPlayerSkin')
AddEventHandler('codem-appearance:setPlayerSkin', function(skin)
local ped = PlayerPedId()
if not skin then return end
-- Kleidung anwenden
local components = {
{ id = 1, key = 'mask_1', tex = 'mask_2' },
{ id = 3, key = 'arms', tex = 'arms_2' },
{ id = 4, key = 'pants_1', tex = 'pants_2' },
{ id = 5, key = 'parachute_1', tex = 'parachute_2' },
{ id = 6, key = 'shoes_1', tex = 'shoes_2' },
{ id = 7, key = 'accessory_1', tex = 'accessory_2' },
{ id = 8, key = 'undershirt_1', tex = 'undershirt_2' },
{ id = 9, key = 'bproof_1', tex = 'bproof_2' },
{ id = 10, key = 'torso_1', tex = 'torso_2' },
{ id = 11, key = 'tshirt_1', tex = 'tshirt_2' },
}
for _, comp in ipairs(components) do
if skin[comp.key] ~= nil then
SetPedComponentVariation(ped, comp.id,
tonumber(skin[comp.key]) or 0,
tonumber(skin[comp.tex] or 0) or 0,
2)
end
end
-- Props anwenden
local props = {
{ id = 0, key = 'glasses_1', tex = 'glasses_2' },
{ id = 1, key = 'helmet_1', tex = 'helmet_2' },
{ id = 2, key = 'ears_1', tex = 'ears_2' },
{ id = 6, key = 'watches_1', tex = 'watches_2' },
{ id = 7, key = 'bracelets_1', tex = 'bracelets_2' },
}
for _, prop in ipairs(props) do
if skin[prop.key] ~= nil then
local val = tonumber(skin[prop.key])
if val and val >= 0 then
SetPedPropIndex(ped, prop.id, val,
tonumber(skin[prop.tex] or 0) or 0, true)
else
ClearPedProp(ped, prop.id)
end
end
end
end)