tattooBasket = {} currentTattoos = {} RegisterNetEvent("qb-clothing:client:openTattooMenu") AddEventHandler("qb-clothing:client:openTattooMenu", function() OpenTattooMenu() end) function SetTattoos() NuiMessage("SET_TATTOOS", { torso = GetTattoosByType("ZONE_TORSO"), head = GetTattoosByType("ZONE_HEAD"), leftarm = GetTattoosByType("ZONE_LEFT_ARM"), rightarm = GetTattoosByType("ZONE_RIGHT_ARM"), leftleg = GetTattoosByType("ZONE_LEFT_LEG"), rightleg = GetTattoosByType("ZONE_RIGHT_LEG"), }) end RegisterNetEvent("codem-appearance:LoadTattoos") AddEventHandler("codem-appearance:LoadTattoos", function(tattoos) ClearPedDecorations(PlayerPedId()) for _, v in pairs(tattoos) do SetPedDecoration(PlayerPedId(), v.collection, v.hash) end LoadTattooBasket() currentTattoos = tattoos NuiMessage("SET_CURRENT_TATTOOS", currentTattoos) end) RegisterNUICallback('removeTattoo', function(data, cb) local tattoo = data.tattoo TriggerServerEvent("codem-appearance:RemoveTattoo", tattoo) end) function LoadTattooBasket() if GetEntityModel(PlayerPedId()) == `mp_m_freemode_01` then for _, v in pairs(tattooBasket) do SetPedDecoration(PlayerPedId(), v.Collection, v.HashNameMale) end else for _, v in pairs(tattooBasket) do SetPedDecoration(PlayerPedId(), v.Collection, v.HashNameFemale) end end end RegisterNUICallback('getTattooBasketData', function(data, cb) tattooBasket = data.basket end) RegisterNUICallback('buyTattoo', function(data, cb) local basket = data.basket local totalPrice = 0 for _, v in pairs(basket) do totalPrice = totalPrice + v.Price end if totalPrice > 0 then local success = TriggerCallback("codem-appearance:PayBasket", totalPrice) if success then local formattedBasket = {} if GetEntityModel(PlayerPedId()) == `mp_m_freemode_01` then for _, v in pairs(basket) do if v.Collection then table.insert(formattedBasket, { collection = v.Collection, hash = v.HashNameMale, zone = v.Zone }) end end else for _, v in pairs(basket) do if v.Collection then table.insert(formattedBasket, { collection = v.Collection, hash = v.HashNameFemale, zone = v.Zone }) end end end TriggerServerEvent("codem-appearance:SaveTattoo", formattedBasket) tattooBasket = {} NuiMessage("CLOSE_PAGE") cb(true) else TriggerEvent("codem-appearance:SendNotification", Config.Locale["noMoney"]) cb(false) end else cb(false) end end) RegisterNUICallback('RemoveTattooZone', function(data, cb) TriggerServerEvent("codem-appearance:RemoveTattooZone", data.zones) end) RegisterNUICallback('previewTatto', function(data, cb) local tattoo = data.tattoo local value = 0 if tattoo.Zone == "ZONE_HEAD" then value = 1 end if tattoo.Zone == "ZONE_TORSO" or tattoo.Zone == "ZONE_RIGHT_ARM" or tattoo.Zone == "ZONE_LEFT_ARM" then value = 2 end if tattoo.Zone == "ZONE_RIGHT_LEG" or tattoo.Zone == "ZONE_LEFT_LEG" then value = 3 end ChangeCamera(value) PreviewTattoo(tattoo.Collection, tattoo.HashNameMale, tattoo.HashNameFemale) cb("ok") end) function PreviewTattoo(collection, hashMale, hashFemale) local alreadyPurchased = false for _, v in pairs(currentTattoos) do if v.hash == hashMale or v.hash == hashFemale then alreadyPurchased = true end end if not alreadyPurchased then ClearPedDecorations(PlayerPedId()) TriggerEvent("codem-appearance:LoadTattoos", currentTattoos) if GetEntityModel(PlayerPedId()) == `mp_m_freemode_01` then SetPedDecoration(PlayerPedId(), collection, hashMale) else SetPedDecoration(PlayerPedId(), collection, hashFemale) end end end function GetNaked() if GetEntityModel(PlayerPedId()) == `mp_m_freemode_01` then TriggerEvent('skinchanger:loadSkin', { sex = 0, tshirt_1 = 15, tshirt_2 = 0, arms = 15, arms_2 = 0, torso_1 = 91, torso_2 = 0, pants_1 = 14, pants_2 = 0, shoes_1 = 5, mask_1 = 0, -- Maske aus mask_2 = 0, helmet_1 = -1, -- Hut aus helmet_2 = 0, glasses_1 = -1, -- Brille aus glasses_2 = 0, bproof_1 = 0, bproof_2 = 0, chain_1 = 0, -- Ketten aus (optional) chain_2 = 0, }) else TriggerEvent('skinchanger:loadSkin', { sex = 1, tshirt_1 = 34, tshirt_2 = 0, arms = 15, arms_2 = 0, torso_1 = 101, torso_2 = 1, pants_1 = 16, pants_2 = 0, shoes_1 = 5, mask_1 = 0, -- Maske aus mask_2 = 0, helmet_1 = -1, -- Hut aus helmet_2 = 0, glasses_1 = -1, -- Brille aus glasses_2 = 0, bproof_1 = 0, bproof_2 = 0, chain_1 = 0, -- Ketten aus (optional) chain_2 = 0, }) end end function OpenTattooMenu() OpenMenu("tattoo") GetNaked() SetTattoos() TriggerServerEvent("codem-appearance:LoadTattoos") Wait(500) local torso = GetTattoosByType("ZONE_TORSO") if torso[1] then PreviewTattoo(torso[1].Collection, torso[1].HashNameMale, torso[1].HashNameFemale) end end local isTextUiOpen = false CreateThread(function() while true do local cooldown = 1500 local coords = GetEntityCoords(PlayerPedId()) local near = false local isInZone = false for _, v in pairs(Config.Tattoo.coords) do local dist = #(coords - v) if dist < 3.0 and not menuOpen then cooldown = 0 near = true isInZone = true if Config.Tattoo.marker.enable then local rgba = Config.Tattoo.marker.rgba local size = Config.Tattoo.marker.size local type = Config.Tattoo.marker.type DrawMarker(type, v, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, size, size, size, rgba[1] or 255, rgba[2] or 255, rgba[3] or 0, rgba[4] or 255, false, false, 0, true, false, false, false) end if Config.Tattoo.drawText.enable then DrawText3D(v.x, v.y, v.z, Config.Tattoo.drawText.text) end if Config.Tattoo.textui.enable then ShowHelpNotification(Config.Tattoo.textui.text, 'tatto') end if not isTextUiOpen and Config.Tattoo.codemtextui.enable then isTextUiOpen = true exports["codem-textui"]:OpenTextUI(Config.Tattoo.codemtextui.text, Config.Tattoo.codemtextui.keytext, Config.Tattoo.codemtextui.theme) end if not isTextUiOpen and Config.Tattoo.okoktextui.enable then isTextUiOpen = true exports['okokTextUI']:Open(Config.Tattoo.okoktextui.text, Config.Tattoo.okoktextui.color, Config.Tattoo.okoktextui.position) end if not isTextUiOpen and Config.Tattoo.ethTextUI.enable then isTextUiOpen = true exports['eth-textUi']:Show(Config.Tattoo.ethTextUI.header, Config.Tattoo.ethTextUI.text) end -- HEX HUD if not isTextUiOpen and Config.TextUIHandler == 'custom' then isTextUiOpen = true exports['hex_4_hud']:ShowHelpNotify(Config.Tattoo.textui.text, "E") end if IsControlJustPressed(0, Config.Tattoo.openKey) then OpenTattooMenu() end end end if isTextUiOpen and not isInZone and Config.Tattoo.codemtextui.enable then exports["codem-textui"]:CloseTextUI() isTextUiOpen = false end if isTextUiOpen and not isInZone and Config.Tattoo.okoktextui.enable then exports['okokTextUI']:Close() isTextUiOpen = false end if isTextUiOpen and not isInZone and Config.Tattoo.ethTextUI.enable then exports['eth-textUi']:Close() isTextUiOpen = false end -- HEX HUD schließen if isTextUiOpen and not isInZone and Config.TextUIHandler == 'custom' then exports['hex_4_hud']:HideHelpNotify() isTextUiOpen = false end if not near then HideHelpNotification('tatto') end Wait(cooldown) end end) CreateThread(function() for k, v in pairs(Config.Tattoo.coords) do local blip = AddBlipForCoord(v) SetBlipSprite(blip, Config.Tattoo.blip.type) SetBlipColour(blip, Config.Tattoo.blip.color) SetBlipAsShortRange(blip, true) SetBlipScale(blip, Config.Tattoo.blip.size) BeginTextCommandSetBlipName('STRING') AddTextComponentString(Config.Tattoo.blip.label) EndTextCommandSetBlipName(blip) end end)