mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-08-30 17:58:54 +00:00
331 lines
15 KiB
Lua
331 lines
15 KiB
Lua
local Components = {
|
|
{label = _U('sex'), name = 'sex', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65}, --
|
|
{label = _U('face'), name = 'face', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65}, --
|
|
{label = _U('skin'), name = 'skin', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65}, --
|
|
{label = _U('wrinkles'), name = 'age_1', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('wrinkle_thickness'), name = 'age_2', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('beard_type'), name = 'beard_1', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('beard_size'), name = 'beard_2', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('beard_color_1'), name = 'beard_3', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('beard_color_2'), name = 'beard_4', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('hair_1'), name = 'hair_1', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65}, --
|
|
{label = _U('hair_2'), name = 'hair_2', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65}, --
|
|
{label = _U('hair_color_1'), name = 'hair_color_1', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65}, --
|
|
{label = _U('hair_color_2'), name = 'hair_color_2', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65}, --
|
|
{label = _U('eyebrow_type'), name = 'eyebrows_1', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('eyebrow_size'), name = 'eyebrows_2', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('eyebrow_color_1'), name = 'eyebrows_3', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('eyebrow_color_2'), name = 'eyebrows_4', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('makeup_type'), name = 'makeup_1', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('makeup_thickness'), name = 'makeup_2', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('makeup_color_1'), name = 'makeup_3', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('makeup_color_2'), name = 'makeup_4', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('lipstick_type'), name = 'lipstick_1', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('lipstick_thickness'), name = 'lipstick_2', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('lipstick_color_1'), name = 'lipstick_3', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('lipstick_color_2'), name = 'lipstick_4', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('ear_accessories'), name = 'ears_1', value = -1, min = -1, zoomOffset = 0.4, camOffset = 0.65}, --
|
|
{label = _U('ear_accessories_color'), name = 'ears_2', value = 0, min = 0, zoomOffset = 0.4, camOffset = 0.65, textureof = 'ears_1'}, --
|
|
{label = _U('tshirt_1'), name = 'tshirt_1', value = 0, min = 0, zoomOffset = 0.75, camOffset = 0.15}, --
|
|
{label = _U('tshirt_2'), name = 'tshirt_2', value = 0, min = 0, zoomOffset = 0.75, camOffset = 0.15, textureof = 'tshirt_1'}, --
|
|
{label = _U('torso_1'), name = 'torso_1', value = 0, min = 0, zoomOffset = 0.75, camOffset = 0.15}, --
|
|
{label = _U('torso_2'), name = 'torso_2', value = 0, min = 0, zoomOffset = 0.75, camOffset = 0.15, textureof = 'torso_1'}, --
|
|
{label = _U('decals_1'), name = 'decals_1', value = 0, min = 0, zoomOffset = 0.75, camOffset = 0.15}, --
|
|
{label = _U('decals_2'), name = 'decals_2', value = 0, min = 0, zoomOffset = 0.75, camOffset = 0.15, textureof = 'decals_1'}, --
|
|
{label = _('arms'), name = 'arms', value = 0, min = 0, zoomOffset = 0.75, camOffset = 0.15}, --
|
|
{label = _U('pants_1'), name = 'pants_1', value = 0, min = 0, zoomOffset = 0.8, camOffset = -0.5}, --
|
|
{label = _U('pants_2'), name = 'pants_2', value = 0, min = 0, zoomOffset = 0.8, camOffset = -0.5, textureof = 'pants_1'}, --
|
|
{label = _U('shoes_1'), name = 'shoes_1', value = 0, min = 0, zoomOffset = 0.8, camOffset = -0.8},
|
|
{label = _U('shoes_2'), name = 'shoes_2', value = 0, min = 0, zoomOffset = 0.8, camOffset = -0.8, textureof = 'shoes_1'},
|
|
{label = _U('mask_1'), name = 'mask_1', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65}, --
|
|
{label = _U('mask_2'), name = 'mask_2', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65, textureof = 'mask_1'}, --
|
|
{label = _U('bproof_1'), name = 'bproof_1', value = 0, min = 0, zoomOffset = 0.75, camOffset = 0.15}, --
|
|
{label = _U('bproof_2'), name = 'bproof_2', value = 0, min = 0, zoomOffset = 0.75, camOffset = 0.15, textureof = 'bproof_1'}, --
|
|
{label = U('chain_1'), name = 'chain_1', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65}, --
|
|
{label = _U('chain_2'), name = 'chain_2', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65, textureof = 'chain_1'}, --
|
|
{label = _U('helmet_1'), name = 'helmet_1', value = -1, min = -1, componentId = 0, zoomOffset = 0.6, camOffset = 0.65}, --
|
|
{label = _U('helmet_2'), name = 'helmet_2', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65, textureof = 'helmet_1'}, --
|
|
{label = _U('glasses_1'), name = 'glasses_1', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65}, --
|
|
{label = _U('glasses_2'), name = 'glasses_2', value = 0, min = 0, zoomOffset = 0.6, camOffset = 0.65, textureof = 'glasses_1'}, --
|
|
{label = _U('bag'), name = 'bags_1', value = 0, min = 0, zoomOffset = 0.75, camOffset = 0.15},
|
|
{label = _U('bag_color'), name = 'bags_2', value = 0, min = 0, zoomOffset = 0.75, camOffset = 0.15, textureof = 'bags_1'}
|
|
}
|
|
|
|
local LastSex = 0
|
|
local LoadSkin = nil
|
|
local LoadClothes = nil
|
|
local Character = {}
|
|
|
|
for i=1, #Components, 1 do
|
|
Character[Components[i].name] = Components[i].value
|
|
end
|
|
|
|
function LoadDefaultModel(loadMale)
|
|
|
|
local playerPed = GetPlayerPed(-1)
|
|
local characterModel
|
|
|
|
if loadMale then
|
|
characterModel = GetHashKey('mp_m_freemode_01')
|
|
else
|
|
characterModel = GetHashKey('mp_f_freemode_01');
|
|
end
|
|
|
|
RequestModel(characterModel)
|
|
|
|
Citizen.CreateThread(function()
|
|
|
|
while not HasModelLoaded(characterModel) do
|
|
RequestModel(characterModel)
|
|
Citizen.Wait(0)
|
|
end
|
|
|
|
if IsModelInCdimage(characterModel) and IsModelValid(characterModel) then
|
|
SetPlayerModel(PlayerId(), characterModel)
|
|
SetPedDefaultComponentVariation(playerPed)
|
|
end
|
|
|
|
SetModelAsNoLongerNeeded(characterModel)
|
|
|
|
TriggerEvent('skinchanger:modelLoaded')
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
function GetMaxVals()
|
|
|
|
local playerPed = GetPlayerPed(-1)
|
|
|
|
local data = {
|
|
sex = 1,
|
|
face = 45,
|
|
skin = 45,
|
|
age_1 = GetNumHeadOverlayValues(3)-1,
|
|
age_2 = 10,
|
|
beard_1 = GetNumHeadOverlayValues(1)-1,
|
|
beard_2 = 10,
|
|
beard_3 = GetNumHairColors()-1,
|
|
beard_4 = GetNumHairColors()-1,
|
|
hair_1 = GetNumberOfPedDrawableVariations(playerPed, 2) - 1,
|
|
hair_2 = GetNumberOfPedTextureVariations(playerPed, 2, Character['hair_1']) - 1,
|
|
hair_color_1 = GetNumHairColors()-1,
|
|
hair_color_2 = GetNumHairColors()-1,
|
|
eyebrows_1 = GetNumHeadOverlayValues(2)-1,
|
|
eyebrows_2 = 10,
|
|
eyebrows_3 = GetNumHairColors()-1,
|
|
eyebrows_4 = GetNumHairColors()-1,
|
|
makeup_1 = GetNumHeadOverlayValues(4)-1,
|
|
makeup_2 = 10,
|
|
makeup_3 = 74,
|
|
makeup_4 = 74,
|
|
lipstick_1 = GetNumHeadOverlayValues(8)-1,
|
|
lipstick_2 = 10,
|
|
lipstick_3 = 9,
|
|
lipstick_4 = 9,
|
|
ears_1 = GetNumberOfPedPropDrawableVariations(playerPed, 1) - 1,
|
|
ears_2 = GetNumberOfPedPropTextureVariations(playerPed, 1, Character['ears_1'] - 1),
|
|
tshirt_1 = GetNumberOfPedDrawableVariations(playerPed, 8) - 1,
|
|
tshirt_2 = GetNumberOfPedTextureVariations(playerPed, 8, Character['tshirt_1']) - 1,
|
|
torso_1 = GetNumberOfPedDrawableVariations(playerPed, 11) - 1,
|
|
torso_2 = GetNumberOfPedTextureVariations(playerPed, 11, Character['torso_1']) - 1,
|
|
decals_1 = GetNumberOfPedDrawableVariations(playerPed, 10) - 1,
|
|
decals_2 = GetNumberOfPedTextureVariations(playerPed, 10, Character['decals_1']) - 1,
|
|
arms = GetNumberOfPedDrawableVariations(playerPed, 3) - 1,
|
|
pants_1 = GetNumberOfPedDrawableVariations(playerPed, 4) - 1,
|
|
pants_2 = GetNumberOfPedTextureVariations(playerPed, 4, Character['pants_1']) - 1,
|
|
shoes_1 = GetNumberOfPedDrawableVariations(playerPed, 6) - 1,
|
|
shoes_2 = GetNumberOfPedTextureVariations(playerPed, 6, Character['shoes_1']) - 1,
|
|
mask_1 = GetNumberOfPedDrawableVariations(playerPed, 1) - 1,
|
|
mask_2 = GetNumberOfPedTextureVariations(playerPed, 1, Character['mask_1']) - 1,
|
|
bproof_1 = GetNumberOfPedDrawableVariations(playerPed, 9) - 1,
|
|
bproof_2 = GetNumberOfPedTextureVariations(playerPed, 9, Character['bproof_1']) - 1,
|
|
chain_1 = GetNumberOfPedDrawableVariations(playerPed, 7) - 1,
|
|
chain_2 = GetNumberOfPedTextureVariations(playerPed, 7, Character['chain_1']) - 1,
|
|
bags_1 = GetNumberOfPedDrawableVariations(playerPed, 5) - 1,
|
|
bags_2 = GetNumberOfPedTextureVariations(playerPed, 5, Character['bags_1']) - 1,
|
|
helmet_1 = GetNumberOfPedPropDrawableVariations(playerPed, 0) - 1,
|
|
helmet_2 = GetNumberOfPedTextureVariations(playerPed, 0, Character['helmet_1']) - 1,
|
|
glasses_1 = GetNumberOfPedPropDrawableVariations(playerPed, 1) - 1,
|
|
glasses_2 = GetNumberOfPedTextureVariations(playerPed, 1, Character['glasses_1'] - 1),
|
|
}
|
|
|
|
return data
|
|
|
|
end
|
|
|
|
function ApplySkin(skin, clothes)
|
|
|
|
local playerPed = GetPlayerPed(-1)
|
|
|
|
for k,v in pairs(skin) do
|
|
Character[k] = v
|
|
end
|
|
|
|
if clothes ~= nil then
|
|
|
|
for k,v in pairs(clothes) do
|
|
if
|
|
k ~= 'sex' and
|
|
k ~= 'face' and
|
|
k ~= 'skin' and
|
|
k ~= 'age_1' and
|
|
k ~= 'age_2' and
|
|
k ~= 'beard_1' and
|
|
k ~= 'beard_2' and
|
|
k ~= 'beard_3' and
|
|
k ~= 'beard_4' and
|
|
k ~= 'hair_1' and
|
|
k ~= 'hair_2' and
|
|
k ~= 'hair_color_1' and
|
|
k ~= 'hair_color_2' and
|
|
k ~= 'eyebrows_1' and
|
|
k ~= 'eyebrows_2' and
|
|
k ~= 'eyebrows_3' and
|
|
k ~= 'eyebrows_4' and
|
|
k ~= 'makeup_1' and
|
|
k ~= 'makeup_2' and
|
|
k ~= 'makeup_3' and
|
|
k ~= 'makeup_4' and
|
|
k ~= 'lipstick_1' and
|
|
k ~= 'lipstick_2' and
|
|
k ~= 'lipstick_3' and
|
|
k ~= 'lipstick_4'
|
|
then
|
|
Character[k] = v
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
SetPedHeadBlendData(playerPed, Character['face'], Character['face'], Character['face'], Character['skin'], Character['skin'], Character['skin'], 1.0, 1.0, 1.0, true)
|
|
|
|
SetPedHeadOverlay(playerPed, 3, Character['age_1'], (Character['age_2'] / 10) + 0.0) -- Age + opacity
|
|
SetPedHeadOverlay(playerPed, 1, Character['beard_1'], (Character['beard_2'] / 10) + 0.0) -- Beard + opacity
|
|
SetPedHeadOverlayColor(playerPed, 1, 1, Character['beard_3'], Character['beard_4']) -- Beard Color
|
|
SetPedHeadOverlay(playerPed, 2, Character['eyebrows_1'], (Character['eyebrows_2'] / 10) + 0.0) -- Eyebrows + opacity
|
|
SetPedHeadOverlayColor(playerPed, 1, 1, Character['eyebrows_3'], Character['eyebrows_4']) -- Eyebrows Color
|
|
SetPedHeadOverlay(playerPed, 4, Character['makeup_1'], (Character['makeup_2'] / 10) + 0.0) -- Makeup + opacity
|
|
SetPedHeadOverlayColor(playerPed, 1, 1, Character['makeup_3'], Character['makeup_4']) -- Makeup Color
|
|
SetPedHeadOverlay(playerPed, 8, Character['lipstick_1'], (Character['lipstick_2'] / 10) + 0.0) -- Lipstick + opacity
|
|
SetPedHeadOverlayColor(playerPed, 2, 1, Character['lipstick_3'], Character['lipstick_4']) -- Lipstick Color
|
|
SetPedComponentVariation(playerPed, 2, Character['hair_1'], Character['hair_2'], 2) -- Hair
|
|
SetPedHairColor(playerPed, Character['hair_color_1'], Character['hair_color_2']) -- Hair Color
|
|
|
|
if Character['ears_1'] == -1 then
|
|
ClearPedProp(playerPed, 2)
|
|
else
|
|
SetPedPropIndex(playerPed, 2, Character['ears_1'], Character['ears_2'], 2) -- Ears Accessories
|
|
end
|
|
|
|
SetPedComponentVariation(playerPed, 8, Character['tshirt_1'],Character['tshirt_2'], 2) -- Tshirt
|
|
SetPedComponentVariation(playerPed, 11, Character['torso_1'], Character['torso_2'], 2) -- torso parts
|
|
SetPedComponentVariation(playerPed, 3, Character['arms'], 0, 2) -- torso
|
|
SetPedComponentVariation(playerPed, 10, Character['decals_1'], Character['decals_2'], 2) -- decals
|
|
SetPedComponentVariation(playerPed, 4, Character['pants_1'], Character['pants_2'], 2) -- pants
|
|
SetPedComponentVariation(playerPed, 6, Character['shoes_1'], Character['shoes_2'], 2) -- shoes
|
|
SetPedComponentVariation(playerPed, 1, Character['mask_1'], Character['mask_2'], 2) -- mask
|
|
SetPedComponentVariation(playerPed, 9, Character['bproof_1'], Character['bproof_2'], 2) -- bulletproof
|
|
SetPedComponentVariation(playerPed, 7, Character['chain_1'], Character['chain_2'], 2) -- chain
|
|
SetPedComponentVariation(playerPed, 5, Character['bags_1'], Character['bags_2'], 2) -- Bag
|
|
|
|
if Character['helmet_1'] == -1 then
|
|
ClearPedProp(playerPed, 0)
|
|
else
|
|
SetPedPropIndex(playerPed, 0, Character['helmet_1'], Character['helmet_2'], 2) -- Helmet
|
|
end
|
|
|
|
SetPedPropIndex(playerPed, 1, Character['glasses_1'], Character['glasses_2'], 2) -- Glasses
|
|
|
|
end
|
|
|
|
AddEventHandler('skinchanger:loadDefaultModel', function(loadMale)
|
|
LoadDefaultModel(loadMale)
|
|
end)
|
|
|
|
AddEventHandler('skinchanger:getData', function(cb)
|
|
|
|
local components = json.decode(json.encode(Components))
|
|
|
|
for k,v in pairs(Character) do
|
|
for i=1, #components, 1 do
|
|
if k == components[i].name then
|
|
components[i].value = v
|
|
--components[i].zoomOffset = Components[i].zoomOffset
|
|
--components[i].camOffset = Components[i].camOffset
|
|
end
|
|
end
|
|
end
|
|
|
|
cb(components, GetMaxVals())
|
|
end)
|
|
|
|
AddEventHandler('skinchanger:change', function(key, val)
|
|
|
|
Character[key] = val
|
|
|
|
if key == 'sex' then
|
|
TriggerEvent('skinchanger:loadSkin', Character)
|
|
else
|
|
ApplySkin(Character)
|
|
end
|
|
|
|
end)
|
|
|
|
AddEventHandler('skinchanger:getSkin', function(cb)
|
|
cb(Character)
|
|
end)
|
|
|
|
AddEventHandler('skinchanger:modelLoaded', function()
|
|
|
|
ClearPedProp(GetPlayerPed(-1), 0)
|
|
|
|
if LoadSkin ~= nil then
|
|
|
|
ApplySkin(LoadSkin)
|
|
LoadSkin = nil
|
|
|
|
end
|
|
|
|
if LoadClothes ~= nil then
|
|
|
|
ApplySkin(LoadClothes.playerSkin, LoadClothes.clothesSkin)
|
|
LoadClothes = nil
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
RegisterNetEvent('skinchanger:loadSkin')
|
|
AddEventHandler('skinchanger:loadSkin', function(skin)
|
|
|
|
LoadSkin = skin
|
|
|
|
if skin['sex'] == 0 then
|
|
TriggerEvent('skinchanger:loadDefaultModel', true)
|
|
else
|
|
TriggerEvent('skinchanger:loadDefaultModel', false)
|
|
end
|
|
|
|
LastSex = skin['sex']
|
|
|
|
end)
|
|
|
|
RegisterNetEvent('skinchanger:loadClothes')
|
|
AddEventHandler('skinchanger:loadClothes', function(playerSkin, clothesSkin)
|
|
|
|
LoadClothes = {
|
|
playerSkin = playerSkin,
|
|
clothesSkin = clothesSkin
|
|
}
|
|
|
|
if playerSkin['sex'] == 0 then
|
|
TriggerEvent('skinchanger:loadDefaultModel', true)
|
|
else
|
|
TriggerEvent('skinchanger:loadDefaultModel', false)
|
|
end
|
|
|
|
LastSex = playerSkin['sex']
|
|
|
|
end)
|