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)