appearance done + esx stuff removed

This commit is contained in:
UIRP.Hetzner 2025-03-17 16:12:58 +00:00
parent e4b7186910
commit b849ee5785
164 changed files with 21774 additions and 11 deletions

View File

@ -1,5 +1,3 @@
### 2024-10-20 18:17:30.946
setgroup 1 owner
### 2024-10-20 18:17:39.654
setgroup 1 superadmin
### 2024-10-20 19:41:56.235
@ -78,7 +76,17 @@ ensure "ui_pmenu"
txaReportResources
### 2025-03-17 13:21:02.116
txaReportResources
### 2025-03-17 13:25:13.990
txaEvent "serverShuttingDown" "{\"delay\":5000,\"author\":\"androxaaa\",\"message\":\"Server restarting (admin request).\"}"
### 2025-03-17 13:28:58.791
quit "host shutting down"
### 2025-03-17 15:18:56.763
txaEvent "serverShuttingDown" "{\"delay\":5000,\"author\":\"androxaaa\",\"message\":\"Server shutting down (admin request).\"}"
### 2025-03-17 15:51:55.750
txaEvent "serverShuttingDown" "{\"delay\":5000,\"author\":\"androxaaa\",\"message\":\"Server restarting (admin request).\"}"
### 2025-03-17 15:55:56.729
setgroup 1 owner
### 2025-03-17 15:55:56.780
txaEvent "consoleCommand" "{\"channel\":\"txAdmin\",\"command\":\"setgroup 1 owner\",\"author\":\"androxaaa\"}"
### 2025-03-17 15:56:09.510
setgroup 1 admin
### 2025-03-17 15:56:09.536
txaEvent "consoleCommand" "{\"channel\":\"txAdmin\",\"command\":\"setgroup 1 admin\",\"author\":\"androxaaa\"}"

BIN
icon.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,85 @@
local Blips = {}
local client = client
local function ShowBlip(blipConfig, blip)
if blip.job and blip.job ~= client.job.name then
return false
elseif blip.gang and blip.gang ~= client.gang.name then
return false
end
if Config.RCoreTattoosCompatibility and blip.type == "tattoo" then
return false
end
return (blipConfig.Show and blip.showBlip == nil) or blip.showBlip
end
local function CreateBlip(blipConfig, coords)
local blip = AddBlipForCoord(coords.x, coords.y, coords.z)
SetBlipSprite(blip, blipConfig.Sprite)
SetBlipColour(blip, blipConfig.Color)
SetBlipScale(blip, blipConfig.Scale)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString(blipConfig.Name)
EndTextCommandSetBlipName(blip)
return blip
end
local function SetupBlips()
for k, _ in pairs(Config.Stores) do
local blipConfig = Config.Blips[Config.Stores[k].type]
if ShowBlip(blipConfig, Config.Stores[k]) then
local blip = CreateBlip(blipConfig, Config.Stores[k].coords)
Blips[#Blips + 1] = blip
end
end
end
function ResetBlips()
if Config.ShowNearestShopOnly then
return
end
for i = 1, #Blips do
RemoveBlip(Blips[i])
end
Blips = {}
SetupBlips()
end
local function ShowNearestShopBlip()
for k in pairs(Config.Blips) do
Blips[k] = 0
end
while true do
local coords = GetEntityCoords(cache.ped)
for shopType, blipConfig in pairs(Config.Blips) do
local closest = 1000000
local closestCoords
for _, shop in pairs(Config.Stores) do
if shop.type == shopType and ShowBlip(blipConfig, shop) then
local dist = #(coords - vector3(shop.coords.xyz))
if dist < closest then
closest = dist
closestCoords = shop.coords
end
end
end
if DoesBlipExist(Blips[shopType]) then
RemoveBlip(Blips[shopType])
end
if closestCoords then
Blips[shopType] = CreateBlip(blipConfig, closestCoords)
end
end
Wait(Config.NearestShopBlipUpdateDelay)
end
end
if Config.ShowNearestShopOnly then
CreateThread(ShowNearestShopBlip)
end

View File

@ -0,0 +1,756 @@
local client = client
local reloadSkinTimer = GetGameTimer()
local function LoadPlayerUniform(reset)
if reset then
TriggerServerEvent("illenium-appearance:server:syncUniform", nil)
return
end
lib.callback("illenium-appearance:server:getUniform", false, function(uniformData)
if not uniformData then
return
end
if Config.BossManagedOutfits then
local result = lib.callback.await("illenium-appearance:server:getManagementOutfits", false, uniformData.type, Framework.GetGender())
local uniform = nil
for i = 1, #result, 1 do
if result[i].name == uniformData.name then
uniform = {
type = uniformData.type,
name = result[i].name,
model = result[i].model,
components = result[i].components,
props = result[i].props,
disableSave = true,
}
break
end
end
if not uniform then
TriggerServerEvent("illenium-appearance:server:syncUniform", nil) -- Uniform doesn't exist anymore
return
end
TriggerEvent("illenium-appearance:client:changeOutfit", uniform)
else
local outfits = Config.Outfits[uniformData.jobName][uniformData.gender]
local uniform = nil
for i = 1, #outfits, 1 do
if outfits[i].name == uniformData.label then
uniform = outfits[i]
break
end
end
if not uniform then
TriggerServerEvent("illenium-appearance:server:syncUniform", nil) -- Uniform doesn't exist anymore
return
end
uniform.jobName = uniformData.jobName
uniform.gender = uniformData.gender
TriggerEvent("illenium-appearance:client:loadJobOutfit", uniform)
end
end)
end
function InitAppearance()
Framework.UpdatePlayerData()
lib.callback("illenium-appearance:server:getAppearance", false, function(appearance)
if not appearance then
return
end
client.setPlayerAppearance(appearance)
if Config.PersistUniforms then
LoadPlayerUniform()
end
end)
ResetBlips()
if Config.BossManagedOutfits then
Management.AddItems()
end
RestorePlayerStats()
end
AddEventHandler("onResourceStart", function(resource)
if resource == GetCurrentResourceName() then
InitAppearance()
end
end)
local function getNewCharacterConfig()
local config = GetDefaultConfig()
config.enableExit = false
config.ped = Config.NewCharacterSections.Ped
config.headBlend = Config.NewCharacterSections.HeadBlend
config.faceFeatures = Config.NewCharacterSections.FaceFeatures
config.headOverlays = Config.NewCharacterSections.HeadOverlays
config.components = Config.NewCharacterSections.Components
config.props = Config.NewCharacterSections.Props
config.tattoos = not Config.RCoreTattoosCompatibility and Config.NewCharacterSections.Tattoos
return config
end
function SetInitialClothes(initial)
client.setPlayerModel(initial.Model)
-- Fix for tattoo's appearing when creating a new character
local ped = cache.ped
client.setPedTattoos(ped, {})
client.setPedComponents(ped, initial.Components)
client.setPedProps(ped, initial.Props)
client.setPedHair(ped, initial.Hair, {})
ClearPedDecorations(ped)
end
function InitializeCharacter(gender, onSubmit, onCancel)
SetInitialClothes(Config.InitialPlayerClothes[gender])
local config = getNewCharacterConfig()
TriggerServerEvent("illenium-appearance:server:ChangeRoutingBucket")
client.startPlayerCustomization(function(appearance)
if (appearance) then
TriggerServerEvent("illenium-appearance:server:saveAppearance", appearance)
if onSubmit then
onSubmit()
end
elseif onCancel then
onCancel()
end
Framework.CachePed()
TriggerServerEvent("illenium-appearance:server:ResetRoutingBucket")
end, config)
end
function OpenShop(config, isPedMenu, shopType)
lib.callback("illenium-appearance:server:hasMoney", false, function(hasMoney, money)
if not hasMoney and not isPedMenu then
lib.notify({
title = "Cannot Enter Shop",
description = "Not enough cash. Need $" .. money,
type = "error",
position = Config.NotifyOptions.position
})
return
end
client.startPlayerCustomization(function(appearance)
if appearance then
if not isPedMenu then
TriggerServerEvent("illenium-appearance:server:chargeCustomer", shopType)
end
TriggerServerEvent("illenium-appearance:server:saveAppearance", appearance)
else
lib.notify({
title = _L("cancelled.title"),
description = _L("cancelled.description"),
type = "inform",
position = Config.NotifyOptions.position
})
end
Framework.CachePed()
end, config)
end, shopType)
end
local function OpenClothingShop(isPedMenu)
local config = GetDefaultConfig()
config.components = true
config.props = true
if isPedMenu then
config.ped = true
config.headBlend = true
config.faceFeatures = true
config.headOverlays = true
config.tattoos = not Config.RCoreTattoosCompatibility and true
end
OpenShop(config, isPedMenu, "clothing")
end
RegisterNetEvent("illenium-appearance:client:openClothingShop", OpenClothingShop)
RegisterNetEvent("illenium-appearance:client:importOutfitCode", function()
local response = lib.inputDialog(_L("outfits.import.title"), {
{
type = "input",
label = _L("outfits.import.name.label"),
placeholder = _L("outfits.import.name.placeholder"),
default = _L("outfits.import.name.default"),
required = true
},
{
type = "input",
label = _L("outfits.import.code.label"),
placeholder = "XXXXXXXXXXXX",
required = true
}
})
if not response then
return
end
local outfitName = response[1]
local outfitCode = response[2]
if outfitCode ~= nil then
Wait(500)
lib.callback("illenium-appearance:server:importOutfitCode", false, function(success)
if success then
lib.notify({
title = _L("outfits.import.success.title"),
description = _L("outfits.import.success.description"),
type = "success",
position = Config.NotifyOptions.position
})
else
lib.notify({
title = _L("outfits.import.failure.title"),
description = _L("outfits.import.failure.description"),
type = "error",
position = Config.NotifyOptions.position
})
end
end, outfitName, outfitCode)
end
end)
RegisterNetEvent("illenium-appearance:client:generateOutfitCode", function(id)
lib.callback("illenium-appearance:server:generateOutfitCode", false, function(code)
if not code then
lib.notify({
title = _L("outfits.generate.failure.title"),
description = _L("outfits.generate.failure.description"),
type = "error",
position = Config.NotifyOptions.position
})
return
end
lib.setClipboard(code)
lib.inputDialog(_L("outfits.generate.success.title"), {
{
type = "input",
label = _L("outfits.generate.success.description"),
default = code,
disabled = true
}
})
end, id)
end)
RegisterNetEvent("illenium-appearance:client:saveOutfit", function()
local response = lib.inputDialog(_L("outfits.save.title"), {
{
type = "input",
label = _L("outfits.save.name.label"),
placeholder = _L("outfits.save.name.placeholder"),
required = true
}
})
if not response then
return
end
local outfitName = response[1]
if outfitName then
Wait(500)
lib.callback("illenium-appearance:server:getOutfits", false, function(outfits)
local outfitExists = false
for i = 1, #outfits, 1 do
if outfits[i].name:lower() == outfitName:lower() then
outfitExists = true
break
end
end
if outfitExists then
lib.notify({
title = _L("outfits.save.failure.title"),
description = _L("outfits.save.failure.description"),
type = "error",
position = Config.NotifyOptions.position
})
return
end
local pedModel = client.getPedModel(cache.ped)
local pedComponents = client.getPedComponents(cache.ped)
local pedProps = client.getPedProps(cache.ped)
TriggerServerEvent("illenium-appearance:server:saveOutfit", outfitName, pedModel, pedComponents, pedProps)
end)
end
end)
RegisterNetEvent('illenium-appearance:client:updateOutfit', function(outfitID)
if not outfitID then return end
lib.callback("illenium-appearance:server:getOutfits", false, function(outfits)
local outfitExists = false
for i = 1, #outfits, 1 do
if outfits[i].id == outfitID then
outfitExists = true
break
end
end
if not outfitExists then
lib.notify({
title = _L("outfits.update.failure.title"),
description = _L("outfits.update.failure.description"),
type = "error",
position = Config.NotifyOptions.position
})
return
end
local pedModel = client.getPedModel(cache.ped)
local pedComponents = client.getPedComponents(cache.ped)
local pedProps = client.getPedProps(cache.ped)
TriggerServerEvent("illenium-appearance:server:updateOutfit", outfitID, pedModel, pedComponents, pedProps)
end)
end)
local function RegisterChangeOutfitMenu(id, parent, outfits, mType)
local changeOutfitMenu = {
id = id,
title = _L("outfits.change.title"),
menu = parent,
options = {}
}
for i = 1, #outfits, 1 do
changeOutfitMenu.options[#changeOutfitMenu.options + 1] = {
title = outfits[i].name,
description = outfits[i].model,
event = "illenium-appearance:client:changeOutfit",
args = {
type = mType,
name = outfits[i].name,
model = outfits[i].model,
components = outfits[i].components,
props = outfits[i].props,
disableSave = mType and true or false
}
}
end
table.sort(changeOutfitMenu.options, function(a, b)
return a.title < b.title
end)
lib.registerContext(changeOutfitMenu)
end
local function RegisterUpdateOutfitMenu(id, parent, outfits)
local updateOutfitMenu = {
id = id,
title = _L("outfits.update.title"),
menu = parent,
options = {}
}
for i = 1, #outfits, 1 do
updateOutfitMenu.options[#updateOutfitMenu.options + 1] = {
title = outfits[i].name,
description = outfits[i].model,
event = "illenium-appearance:client:updateOutfit",
args = outfits[i].id
}
end
table.sort(updateOutfitMenu.options, function(a, b)
return a.title < b.title
end)
lib.registerContext(updateOutfitMenu)
end
local function RegisterGenerateOutfitCodeMenu(id, parent, outfits)
local generateOutfitCodeMenu = {
id = id,
title = _L("outfits.generate.title"),
menu = parent,
options = {}
}
for i = 1, #outfits, 1 do
generateOutfitCodeMenu.options[#generateOutfitCodeMenu.options + 1] = {
title = outfits[i].name,
description = outfits[i].model,
event = "illenium-appearance:client:generateOutfitCode",
args = outfits[i].id
}
end
lib.registerContext(generateOutfitCodeMenu)
end
local function RegisterDeleteOutfitMenu(id, parent, outfits, deleteEvent)
local deleteOutfitMenu = {
id = id,
title = _L("outfits.delete.title"),
menu = parent,
options = {}
}
table.sort(outfits, function(a, b)
return a.name < b.name
end)
for i = 1, #outfits, 1 do
deleteOutfitMenu.options[#deleteOutfitMenu.options + 1] = {
title = string.format(_L("outfits.delete.item.title"), outfits[i].name),
description = string.format(_L("outfits.delete.item.description"), outfits[i].model, (outfits[i].gender and (" - Gender: " .. outfits[i].gender) or "")),
event = deleteEvent,
args = outfits[i].id
}
end
lib.registerContext(deleteOutfitMenu)
end
RegisterNetEvent("illenium-appearance:client:OutfitManagementMenu", function(args)
local outfits = lib.callback.await("illenium-appearance:server:getManagementOutfits", false, args.type, Framework.GetGender())
local managementMenuID = "illenium_appearance_outfit_management_menu"
local changeManagementOutfitMenuID = "illenium_appearance_change_management_outfit_menu"
local deleteManagementOutfitMenuID = "illenium_appearance_delete_management_outfit_menu"
RegisterChangeOutfitMenu(changeManagementOutfitMenuID, managementMenuID, outfits, args.type)
RegisterDeleteOutfitMenu(deleteManagementOutfitMenuID, managementMenuID, outfits, "illenium-appearance:client:DeleteManagementOutfit")
local managementMenu = {
id = managementMenuID,
title = string.format(_L("outfits.manage.title"), args.type),
options = {
{
title = _L("outfits.change.title"),
description = string.format(_L("outfits.change.description"), args.type),
menu = changeManagementOutfitMenuID,
},
{
title = _L("outfits.save.menuTitle"),
description = string.format(_L("outfits.save.menuDescription"), args.type),
event = "illenium-appearance:client:SaveManagementOutfit",
args = args.type
},
{
title = _L("outfits.delete.title"),
description = string.format(_L("outfits.delete.description"), args.type),
menu = deleteManagementOutfitMenuID,
}
}
}
Management.AddBackMenuItem(managementMenu, args)
lib.registerContext(managementMenu)
lib.showContext(managementMenuID)
end)
RegisterNetEvent("illenium-appearance:client:SaveManagementOutfit", function(mType)
local outfitData = {
Type = mType,
Model = client.getPedModel(cache.ped),
Components = client.getPedComponents(cache.ped),
Props = client.getPedProps(cache.ped)
}
local rankValues
if mType == "Job" then
outfitData.JobName = client.job.name
rankValues = Framework.GetRankInputValues("job")
else
outfitData.JobName = client.gang.name
rankValues = Framework.GetRankInputValues("gang")
end
local dialogResponse = lib.inputDialog(_L("outfits.save.managementTitle"), {
{
label = _L("outfits.save.name.label"),
type = "input",
required = true
},
{
label = _L("outfits.save.gender.label"),
type = "select",
options = {
{
label = _L("outfits.save.gender.male"), value = "male"
},
{
label = _L("outfits.save.gender.female"), value = "female"
}
},
default = "male",
},
{
label = _L("outfits.save.rank.label"),
type = "select",
options = rankValues,
default = "0"
}
})
if not dialogResponse then
return
end
outfitData.Name = dialogResponse[1]
outfitData.Gender = dialogResponse[2]
outfitData.MinRank = tonumber(dialogResponse[3])
TriggerServerEvent("illenium-appearance:server:saveManagementOutfit", outfitData)
end)
local function RegisterWorkOutfitsListMenu(id, parent, menuData)
local menu = {
id = id,
menu = parent,
title = _L("jobOutfits.title"),
options = {}
}
local event = "illenium-appearance:client:loadJobOutfit"
if Config.BossManagedOutfits then
event = "illenium-appearance:client:changeOutfit"
end
if menuData then
for _, v in pairs(menuData) do
menu.options[#menu.options + 1] = {
title = v.name,
event = event,
args = v
}
end
end
lib.registerContext(menu)
end
function OpenMenu(isPedMenu, menuType, menuData)
local mainMenuID = "illenium_appearance_main_menu"
local mainMenu = {
id = mainMenuID
}
local menuItems = {}
local outfits = lib.callback.await("illenium-appearance:server:getOutfits", false)
local changeOutfitMenuID = "illenium_appearance_change_outfit_menu"
local updateOutfitMenuID = "illenium_appearance_update_outfit_menu"
local deleteOutfitMenuID = "illenium_appearance_delete_outfit_menu"
local generateOutfitCodeMenuID = "illenium_appearance_generate_outfit_code_menu"
RegisterChangeOutfitMenu(changeOutfitMenuID, mainMenuID, outfits)
RegisterUpdateOutfitMenu(updateOutfitMenuID, mainMenuID, outfits)
RegisterDeleteOutfitMenu(deleteOutfitMenuID, mainMenuID, outfits, "illenium-appearance:client:deleteOutfit")
RegisterGenerateOutfitCodeMenu(generateOutfitCodeMenuID, mainMenuID, outfits)
local outfitMenuItems = {
{
title = _L("outfits.change.title"),
description = _L("outfits.change.pDescription"),
menu = changeOutfitMenuID
},
{
title = _L("outfits.update.title"),
description = _L("outfits.update.description"),
menu = updateOutfitMenuID
},
{
title = _L("outfits.save.menuTitle"),
description = _L("outfits.save.description"),
event = "illenium-appearance:client:saveOutfit"
},
{
title = _L("outfits.generate.title"),
description = _L("outfits.generate.description"),
menu = generateOutfitCodeMenuID
},
{
title = _L("outfits.delete.title"),
description = _L("outfits.delete.mDescription"),
menu = deleteOutfitMenuID
},
{
title = _L("outfits.import.menuTitle"),
description = _L("outfits.import.description"),
event = "illenium-appearance:client:importOutfitCode"
}
}
if menuType == "default" then
local header = string.format(_L("clothing.title"), Config.ClothingCost)
if isPedMenu then
header = _L("clothing.titleNoPrice")
end
mainMenu.title = _L("clothing.options.title")
menuItems[#menuItems + 1] = {
title = header,
description = _L("clothing.options.description"),
event = "illenium-appearance:client:openClothingShop",
args = isPedMenu
}
for i = 0, #outfitMenuItems, 1 do
menuItems[#menuItems + 1] = outfitMenuItems[i]
end
elseif menuType == "outfit" then
mainMenu.title = _L("clothing.outfits.title")
for i = 0, #outfitMenuItems, 1 do
menuItems[#menuItems + 1] = outfitMenuItems[i]
end
elseif menuType == "job-outfit" then
mainMenu.title = _L("clothing.outfits.title")
menuItems[#menuItems + 1] = {
title = _L("clothing.outfits.civilian.title"),
description = _L("clothing.outfits.civilian.description"),
event = "illenium-appearance:client:reloadSkin",
args = true
}
local workOutfitsMenuID = "illenium_appearance_work_outfits_menu"
RegisterWorkOutfitsListMenu(workOutfitsMenuID, mainMenuID, menuData)
menuItems[#menuItems + 1] = {
title = _L("jobOutfits.title"),
description = _L("jobOutfits.description"),
menu = workOutfitsMenuID
}
end
mainMenu.options = menuItems
lib.registerContext(mainMenu)
lib.showContext(mainMenuID)
end
RegisterNetEvent("illenium-appearance:client:openClothingShopMenu", function(isPedMenu)
if type(isPedMenu) == "table" then
isPedMenu = false
end
OpenMenu(isPedMenu, "default")
end)
RegisterNetEvent("illenium-appearance:client:OpenBarberShop", OpenBarberShop)
RegisterNetEvent("illenium-appearance:client:OpenTattooShop", OpenTattooShop)
RegisterNetEvent("illenium-appearance:client:OpenSurgeonShop", OpenSurgeonShop)
RegisterNetEvent("illenium-appearance:client:changeOutfit", function(data)
local pedModel = client.getPedModel(cache.ped)
local appearanceDB
if pedModel ~= data.model then
local p = promise.new()
lib.callback("illenium-appearance:server:getAppearance", false, function(appearance)
BackupPlayerStats()
if appearance then
client.setPlayerAppearance(appearance)
RestorePlayerStats()
else
lib.notify({
title = _L("outfits.change.failure.title"),
description = _L("outfits.change.failure.description"),
type = "error",
position = Config.NotifyOptions.position
})
end
p:resolve(appearance)
end, data.model)
appearanceDB = Citizen.Await(p)
else
appearanceDB = client.getPedAppearance(cache.ped)
end
if appearanceDB then
client.setPedComponents(cache.ped, data.components)
client.setPedProps(cache.ped, data.props)
client.setPedHair(cache.ped, appearanceDB.hair, appearanceDB.tattoos)
if data.disableSave then
TriggerServerEvent("illenium-appearance:server:syncUniform", {
type = data.type,
name = data.name
}) -- Is a uniform
else
local appearance = client.getPedAppearance(cache.ped)
TriggerServerEvent("illenium-appearance:server:saveAppearance", appearance)
end
Framework.CachePed()
end
end)
RegisterNetEvent("illenium-appearance:client:DeleteManagementOutfit", function(id)
TriggerServerEvent("illenium-appearance:server:deleteManagementOutfit", id)
lib.notify({
title = _L("outfits.delete.management.success.title"),
description = _L("outfits.delete.management.success.description"),
type = "success",
position = Config.NotifyOptions.position
})
end)
RegisterNetEvent("illenium-appearance:client:deleteOutfit", function(id)
TriggerServerEvent("illenium-appearance:server:deleteOutfit", id)
lib.notify({
title = _L("outfits.delete.success.title"),
description = _L("outfits.delete.success.description"),
type = "success",
position = Config.NotifyOptions.position
})
end)
RegisterNetEvent("illenium-appearance:client:openJobOutfitsMenu", function(outfitsToShow)
OpenMenu(nil, "job-outfit", outfitsToShow)
end)
local function InCooldown()
return (GetGameTimer() - reloadSkinTimer) < Config.ReloadSkinCooldown
end
RegisterNetEvent("illenium-appearance:client:reloadSkin", function(bypassChecks)
if not bypassChecks and InCooldown() or Framework.CheckPlayerMeta() or cache.vehicle or IsPedFalling(cache.ped) then
lib.notify({
title = _L("commands.reloadskin.failure.title"),
description = _L("commands.reloadskin.failure.description"),
type = "error",
position = Config.NotifyOptions.position
})
return
end
reloadSkinTimer = GetGameTimer()
BackupPlayerStats()
lib.callback("illenium-appearance:server:getAppearance", false, function(appearance)
if not appearance then
return
end
client.setPlayerAppearance(appearance)
if Config.PersistUniforms then
LoadPlayerUniform(bypassChecks)
end
RestorePlayerStats()
end)
end)
RegisterNetEvent("illenium-appearance:client:ClearStuckProps", function()
if InCooldown() or Framework.CheckPlayerMeta() then
lib.notify({
title = _L("commands.clearstuckprops.failure.title"),
description = _L("commands.clearstuckprops.failure.description"),
type = "error",
position = Config.NotifyOptions.position
})
return
end
reloadSkinTimer = GetGameTimer()
for _, v in pairs(GetGamePool("CObject")) do
if IsEntityAttachedToEntity(cache.ped, v) then
SetEntityAsMissionEntity(v, true, true)
DeleteObject(v)
DeleteEntity(v)
end
end
end)

View File

@ -0,0 +1,83 @@
function CheckDuty()
return not Config.OnDutyOnlyClothingRooms or (Config.OnDutyOnlyClothingRooms and client.job.onduty)
end
function IsPlayerAllowedForOutfitRoom(outfitRoom)
local isAllowed = false
local count = #outfitRoom.citizenIDs
for i = 1, count, 1 do
if Framework.IsPlayerAllowed(outfitRoom.citizenIDs[i]) then
isAllowed = true
break
end
end
return isAllowed or not outfitRoom.citizenIDs or count == 0
end
function GetPlayerJobOutfits(job)
local outfits = {}
local gender = Framework.GetGender()
local gradeLevel = job and Framework.GetJobGrade() or Framework.GetGangGrade()
local jobName = job and client.job.name or client.gang.name
if Config.BossManagedOutfits then
local mType = job and "Job" or "Gang"
local result = lib.callback.await("illenium-appearance:server:getManagementOutfits", false, mType, gender)
for i = 1, #result, 1 do
outfits[#outfits + 1] = {
type = mType,
model = result[i].model,
components = result[i].components,
props = result[i].props,
disableSave = true,
name = result[i].name
}
end
elseif Config.Outfits[jobName] and Config.Outfits[jobName][gender] then
for i = 1, #Config.Outfits[jobName][gender], 1 do
for _, v in pairs(Config.Outfits[jobName][gender][i].grades) do
if v == gradeLevel then
outfits[#outfits + 1] = Config.Outfits[jobName][gender][i]
outfits[#outfits].gender = gender
outfits[#outfits].jobName = jobName
end
end
end
end
return outfits
end
function OpenOutfitRoom(outfitRoom)
local isAllowed = IsPlayerAllowedForOutfitRoom(outfitRoom)
if isAllowed then
OpenMenu(nil, "outfit")
end
end
function OpenBarberShop()
local config = GetDefaultConfig()
config.headOverlays = true
OpenShop(config, false, "barber")
end
function OpenTattooShop()
local config = GetDefaultConfig()
config.tattoos = true
OpenShop(config, false, "tattoo")
end
function OpenSurgeonShop()
local config = GetDefaultConfig()
config.headBlend = true
config.faceFeatures = true
OpenShop(config, false, "surgeon")
end
AddEventHandler("onResourceStop", function(resource)
if resource == GetCurrentResourceName() then
if Config.BossManagedOutfits then
Management.RemoveItems()
end
end
end)

View File

@ -0,0 +1,41 @@
local function getComponentConfig()
return {
masks = not Config.DisableComponents.Masks,
upperBody = not Config.DisableComponents.UpperBody,
lowerBody = not Config.DisableComponents.LowerBody,
bags = not Config.DisableComponents.Bags,
shoes = not Config.DisableComponents.Shoes,
scarfAndChains = not Config.DisableComponents.ScarfAndChains,
bodyArmor = not Config.DisableComponents.BodyArmor,
shirts = not Config.DisableComponents.Shirts,
decals = not Config.DisableComponents.Decals,
jackets = not Config.DisableComponents.Jackets
}
end
local function getPropConfig()
return {
hats = not Config.DisableProps.Hats,
glasses = not Config.DisableProps.Glasses,
ear = not Config.DisableProps.Ear,
watches = not Config.DisableProps.Watches,
bracelets = not Config.DisableProps.Bracelets
}
end
function GetDefaultConfig()
return {
ped = false,
headBlend = false,
faceFeatures = false,
headOverlays = false,
components = false,
componentConfig = getComponentConfig(),
props = false,
propConfig = getPropConfig(),
tattoos = false,
enableExit = true,
hasTracker = Config.PreventTrackerRemoval and Framework.HasTracker(),
automaticFade = Config.AutomaticFade
}
end

View File

@ -0,0 +1,89 @@
if not Framework.ESX() then return end
local client = client
local firstSpawn = false
AddEventHandler("esx_skin:resetFirstSpawn", function()
firstSpawn = true
end)
AddEventHandler("esx_skin:playerRegistered", function()
if(firstSpawn) then
InitializeCharacter(Framework.GetGender(true))
end
end)
RegisterNetEvent("skinchanger:loadSkin2", function(ped, skin)
if not skin.model then skin.model = "mp_m_freemode_01" end
client.setPedAppearance(ped, skin)
Framework.CachePed()
end)
RegisterNetEvent("skinchanger:getSkin", function(cb)
while not Framework.PlayerData do
Wait(1000)
end
lib.callback("illenium-appearance:server:getAppearance", false, function(appearance)
cb(appearance)
Framework.CachePed()
end)
end)
local function LoadSkin(skin, cb)
if skin.model then
client.setPlayerAppearance(skin)
else -- add validation invisible when failed registration (maybe server restarted when apply skin)
SetInitialClothes(Config.InitialPlayerClothes[Framework.GetGender(true)])
end
if Framework.PlayerData and Framework.PlayerData.loadout then
TriggerEvent("esx:restoreLoadout")
end
Framework.CachePed()
if cb ~= nil then
cb()
end
end
RegisterNetEvent("skinchanger:loadSkin", function(skin, cb)
LoadSkin(skin, cb)
end)
local function loadClothes(_, clothes)
local components = Framework.ConvertComponents(clothes, client.getPedComponents(cache.ped))
local props = Framework.ConvertProps(clothes, client.getPedProps(cache.ped))
client.setPedComponents(cache.ped, components)
client.setPedProps(cache.ped, props)
end
RegisterNetEvent("skinchanger:loadClothes", function(_, clothes)
loadClothes(_, clothes)
end)
RegisterNetEvent("esx_skin:openSaveableMenu", function(onSubmit, onCancel)
InitializeCharacter(Framework.GetGender(true), onSubmit, onCancel)
end)
local function exportHandler(exportName, func)
AddEventHandler(('__cfx_export_skinchanger_%s'):format(exportName), function(setCB)
setCB(func)
end)
end
exportHandler("GetSkin", function()
while not Framework.PlayerData do
Wait(1000)
end
local appearance = lib.callback.await("illenium-appearance:server:getAppearance", false)
return appearance
end)
exportHandler("LoadSkin", function(skin)
return LoadSkin(skin)
end)
exportHandler("LoadClothes", function(playerSkin, clothesSkin)
return loadClothes(playerSkin, clothesSkin)
end)

View File

@ -0,0 +1,85 @@
if not Framework.ESX() then return end
local ESX = exports["ui_core"]:getSharedObject()
Framework.PlayerData = nil
RegisterNetEvent("esx:playerLoaded", function(xPlayer)
Framework.PlayerData = xPlayer
client.job = Framework.PlayerData.job
client.gang = Framework.PlayerData.gang
client.citizenid = Framework.PlayerData.identifier
InitAppearance()
end)
RegisterNetEvent("esx:onPlayerLogout", function()
Framework.PlayerData = nil
end)
RegisterNetEvent("esx:setJob", function(job)
Framework.PlayerData.job = job
client.job = Framework.PlayerData.job
client.gang = Framework.PlayerData.job
end)
local function getRankInputValues(rankList)
local rankValues = {}
for _, v in pairs(rankList) do
rankValues[#rankValues + 1] = {
label = v.label,
value = v.grade
}
end
return rankValues
end
function Framework.GetPlayerGender()
Framework.PlayerData = ESX.GetPlayerData()
if Framework.PlayerData.sex == "f" then
return "Female"
end
return "Male"
end
function Framework.UpdatePlayerData()
local data = ESX.GetPlayerData()
if data.job then
Framework.PlayerData = data
client.job = Framework.PlayerData.job
client.gang = Framework.PlayerData.job
end
client.citizenid = Framework.PlayerData.identifier
end
function Framework.HasTracker()
return false
end
function Framework.CheckPlayerMeta()
Framework.PlayerData = ESX.GetPlayerData()
return Framework.PlayerData.dead or IsPedCuffed(Framework.PlayerData.ped)
end
function Framework.IsPlayerAllowed(citizenid)
return citizenid == Framework.PlayerData.identifier
end
function Framework.GetRankInputValues(type)
local jobGrades = lib.callback.await("illenium-appearance:server:esx:getGradesForJob", false, client[type].name)
return getRankInputValues(jobGrades)
end
function Framework.GetJobGrade()
return client.job.grade
end
function Framework.GetGangGrade()
return client.gang.grade
end
function Framework.CachePed()
ESX.SetPlayerData("ped", cache.ped)
end
function Framework.RestorePlayerArmour()
return nil
end

View File

@ -0,0 +1,11 @@
function Framework.GetGender(isNew)
if isNew or not Config.GenderBasedOnPed then
return Framework.GetPlayerGender()
end
local model = client.getPedModel(cache.ped)
if model == "mp_f_freemode_01" then
return "Female"
end
return "Male"
end

View File

@ -0,0 +1,42 @@
if not Framework.Ox() then return end
local Ox = require '@ox_core.lib.init'
local player = Ox.GetPlayer()
RegisterNetEvent("ox:setActiveCharacter", function(character)
if character.isNew then
return InitializeCharacter(Framework.GetGender(true))
end
InitAppearance()
end)
---@todo groups
-- RegisterNetEvent("ox:setGroup", function(group, grade)
-- end)
function Framework.GetPlayerGender()
return player.get('gender') == 'female' and 'Female' or 'Male'
end
function Framework.UpdatePlayerData() end
function Framework.HasTracker() return false end
function Framework.CheckPlayerMeta()
return LocalPlayer.state.isDead or IsPedCuffed(cache.ped)
end
function Framework.IsPlayerAllowed(charId)
return charId == player.charId
end
function Framework.GetRankInputValues() end
function Framework.GetJobGrade() end
function Framework.GetGangGrade() end
function Framework.CachePed() end
function Framework.RestorePlayerArmour() end

View File

@ -0,0 +1,30 @@
if not Framework.QBCore() then return end
local client = client
-- Backwards Compatible Events
RegisterNetEvent("qb-clothing:client:openMenu", function()
local config = GetDefaultConfig()
config.ped = true
config.headBlend = true
config.faceFeatures = true
config.headOverlays = true
config.components = true
config.props = true
config.tattoos = true
OpenShop(config, true, "all")
end)
RegisterNetEvent("qb-clothing:client:openOutfitMenu", function()
OpenMenu(nil, "outfit")
end)
RegisterNetEvent("qb-clothing:client:loadOutfit", LoadJobOutfit)
RegisterNetEvent("qb-multicharacter:client:chooseChar", function()
client.setPedTattoos(cache.ped, {})
ClearPedDecorations(cache.ped)
TriggerServerEvent("illenium-appearance:server:resetOutfitCache")
end)

View File

@ -0,0 +1,107 @@
if not Framework.QBCore() then return end
local client = client
local QBCore = exports["qb-core"]:GetCoreObject()
local PlayerData = QBCore.Functions.GetPlayerData()
local function getRankInputValues(rankList)
local rankValues = {}
for k, v in pairs(rankList) do
rankValues[#rankValues + 1] = {
label = v.name,
value = k
}
end
return rankValues
end
local function setClientParams()
client.job = PlayerData.job
client.gang = PlayerData.gang
client.citizenid = PlayerData.citizenid
end
function Framework.GetPlayerGender()
if PlayerData.charinfo.gender == 1 then
return "Female"
end
return "Male"
end
function Framework.UpdatePlayerData()
PlayerData = QBCore.Functions.GetPlayerData()
setClientParams()
end
function Framework.HasTracker()
return QBCore.Functions.GetPlayerData().metadata["tracker"]
end
function Framework.CheckPlayerMeta()
return PlayerData.metadata["isdead"] or PlayerData.metadata["inlaststand"] or PlayerData.metadata["ishandcuffed"]
end
function Framework.IsPlayerAllowed(citizenid)
return citizenid == PlayerData.citizenid
end
function Framework.GetRankInputValues(type)
local grades = QBCore.Shared.Jobs[client.job.name].grades
if type == "gang" then
grades = QBCore.Shared.Gangs[client.gang.name].grades
end
return getRankInputValues(grades)
end
function Framework.GetJobGrade()
return client.job.grade.level
end
function Framework.GetGangGrade()
return client.gang.grade.level
end
RegisterNetEvent("QBCore:Client:OnJobUpdate", function(JobInfo)
PlayerData.job = JobInfo
client.job = JobInfo
ResetBlips()
end)
RegisterNetEvent("QBCore:Client:OnGangUpdate", function(GangInfo)
PlayerData.gang = GangInfo
client.gang = GangInfo
ResetBlips()
end)
RegisterNetEvent("QBCore:Client:SetDuty", function(duty)
if PlayerData and PlayerData.job then
PlayerData.job.onduty = duty
client.job = PlayerData.job
end
end)
RegisterNetEvent("QBCore:Client:OnPlayerLoaded", function()
InitAppearance()
end)
RegisterNetEvent("qb-clothes:client:CreateFirstCharacter", function()
QBCore.Functions.GetPlayerData(function(pd)
PlayerData = pd
setClientParams()
InitializeCharacter(Framework.GetGender(true))
end)
end)
function Framework.CachePed()
return nil
end
function Framework.RestorePlayerArmour()
Framework.UpdatePlayerData()
if PlayerData and PlayerData.metadata then
Wait(1000)
SetPedArmour(cache.ped, PlayerData.metadata["armor"])
end
end

View File

@ -0,0 +1,190 @@
if not Framework.QBCore() then return end
local client = client
local skinData = {
["face2"] = {
item = 0,
texture = 0,
defaultItem = 0,
defaultTexture = 0,
},
["facemix"] = {
skinMix = 0,
shapeMix = 0,
defaultSkinMix = 0.0,
defaultShapeMix = 0.0,
},
}
RegisterNetEvent("illenium-appearance:client:migration:load-qb-clothing-skin", function(playerSkin)
local model = playerSkin.model
model = model ~= nil and tonumber(model) or false
Citizen.CreateThread(function()
lib.requestModel(model, 1000)
SetPlayerModel(cache.playerId, model)
Wait(150)
SetPedComponentVariation(cache.ped, 0, 0, 0, 2)
TriggerEvent("illenium-appearance:client:migration:load-qb-clothing-clothes", playerSkin, cache.ped)
SetModelAsNoLongerNeeded(model)
end)
end)
RegisterNetEvent("illenium-appearance:client:migration:load-qb-clothing-clothes", function(playerSkin, ped)
local data = json.decode(playerSkin.skin)
if ped == nil then ped = cache.ped end
for i = 0, 11 do
SetPedComponentVariation(ped, i, 0, 0, 0)
end
for i = 0, 7 do
ClearPedProp(ped, i)
end
-- Face
if not data["facemix"] or not data["face2"] then
data["facemix"] = skinData["facemix"]
data["facemix"].shapeMix = data["facemix"].defaultShapeMix
data["facemix"].skinMix = data["facemix"].defaultSkinMix
data["face2"] = skinData["face2"]
end
SetPedHeadBlendData(ped, data["face"].item, data["face2"].item, nil, data["face"].texture, data["face2"].texture, nil, data["facemix"].shapeMix, data["facemix"].skinMix, nil, true)
-- Pants
SetPedComponentVariation(ped, 4, data["pants"].item, 0, 0)
SetPedComponentVariation(ped, 4, data["pants"].item, data["pants"].texture, 0)
-- Hair
SetPedComponentVariation(ped, 2, data["hair"].item, 0, 0)
SetPedHairColor(ped, data["hair"].texture, data["hair"].texture)
-- Eyebrows
SetPedHeadOverlay(ped, 2, data["eyebrows"].item, 1.0)
SetPedHeadOverlayColor(ped, 2, 1, data["eyebrows"].texture, 0)
-- Beard
SetPedHeadOverlay(ped, 1, data["beard"].item, 1.0)
SetPedHeadOverlayColor(ped, 1, 1, data["beard"].texture, 0)
-- Blush
SetPedHeadOverlay(ped, 5, data["blush"].item, 1.0)
SetPedHeadOverlayColor(ped, 5, 1, data["blush"].texture, 0)
-- Lipstick
SetPedHeadOverlay(ped, 8, data["lipstick"].item, 1.0)
SetPedHeadOverlayColor(ped, 8, 1, data["lipstick"].texture, 0)
-- Makeup
SetPedHeadOverlay(ped, 4, data["makeup"].item, 1.0)
SetPedHeadOverlayColor(ped, 4, 1, data["makeup"].texture, 0)
-- Ageing
SetPedHeadOverlay(ped, 3, data["ageing"].item, 1.0)
SetPedHeadOverlayColor(ped, 3, 1, data["ageing"].texture, 0)
-- Arms
SetPedComponentVariation(ped, 3, data["arms"].item, 0, 2)
SetPedComponentVariation(ped, 3, data["arms"].item, data["arms"].texture, 0)
-- T-Shirt
SetPedComponentVariation(ped, 8, data["t-shirt"].item, 0, 2)
SetPedComponentVariation(ped, 8, data["t-shirt"].item, data["t-shirt"].texture, 0)
-- Vest
SetPedComponentVariation(ped, 9, data["vest"].item, 0, 2)
SetPedComponentVariation(ped, 9, data["vest"].item, data["vest"].texture, 0)
-- Torso 2
SetPedComponentVariation(ped, 11, data["torso2"].item, 0, 2)
SetPedComponentVariation(ped, 11, data["torso2"].item, data["torso2"].texture, 0)
-- Shoes
SetPedComponentVariation(ped, 6, data["shoes"].item, 0, 2)
SetPedComponentVariation(ped, 6, data["shoes"].item, data["shoes"].texture, 0)
-- Mask
SetPedComponentVariation(ped, 1, data["mask"].item, 0, 2)
SetPedComponentVariation(ped, 1, data["mask"].item, data["mask"].texture, 0)
-- Badge
SetPedComponentVariation(ped, 10, data["decals"].item, 0, 2)
SetPedComponentVariation(ped, 10, data["decals"].item, data["decals"].texture, 0)
-- Accessory
SetPedComponentVariation(ped, 7, data["accessory"].item, 0, 2)
SetPedComponentVariation(ped, 7, data["accessory"].item, data["accessory"].texture, 0)
-- Bag
SetPedComponentVariation(ped, 5, data["bag"].item, 0, 2)
SetPedComponentVariation(ped, 5, data["bag"].item, data["bag"].texture, 0)
-- Hat
if data["hat"].item ~= -1 and data["hat"].item ~= 0 then
SetPedPropIndex(ped, 0, data["hat"].item, data["hat"].texture, true)
else
ClearPedProp(ped, 0)
end
-- Glass
if data["glass"].item ~= -1 and data["glass"].item ~= 0 then
SetPedPropIndex(ped, 1, data["glass"].item, data["glass"].texture, true)
else
ClearPedProp(ped, 1)
end
-- Ear
if data["ear"].item ~= -1 and data["ear"].item ~= 0 then
SetPedPropIndex(ped, 2, data["ear"].item, data["ear"].texture, true)
else
ClearPedProp(ped, 2)
end
-- Watch
if data["watch"].item ~= -1 and data["watch"].item ~= 0 then
SetPedPropIndex(ped, 6, data["watch"].item, data["watch"].texture, true)
else
ClearPedProp(ped, 6)
end
-- Bracelet
if data["bracelet"].item ~= -1 and data["bracelet"].item ~= 0 then
SetPedPropIndex(ped, 7, data["bracelet"].item, data["bracelet"].texture, true)
else
ClearPedProp(ped, 7)
end
if data["eye_color"].item ~= -1 and data["eye_color"].item ~= 0 then
SetPedEyeColor(ped, data["eye_color"].item)
end
if data["moles"].item ~= -1 and data["moles"].item ~= 0 then
SetPedHeadOverlay(ped, 9, data["moles"].item, (data["moles"].texture / 10))
end
SetPedFaceFeature(ped, 0, (data["nose_0"].item / 10))
SetPedFaceFeature(ped, 1, (data["nose_1"].item / 10))
SetPedFaceFeature(ped, 2, (data["nose_2"].item / 10))
SetPedFaceFeature(ped, 3, (data["nose_3"].item / 10))
SetPedFaceFeature(ped, 4, (data["nose_4"].item / 10))
SetPedFaceFeature(ped, 5, (data["nose_5"].item / 10))
SetPedFaceFeature(ped, 6, (data["eyebrown_high"].item / 10))
SetPedFaceFeature(ped, 7, (data["eyebrown_forward"].item / 10))
SetPedFaceFeature(ped, 8, (data["cheek_1"].item / 10))
SetPedFaceFeature(ped, 9, (data["cheek_2"].item / 10))
SetPedFaceFeature(ped, 10,(data["cheek_3"].item / 10))
SetPedFaceFeature(ped, 11, (data["eye_opening"].item / 10))
SetPedFaceFeature(ped, 12, (data["lips_thickness"].item / 10))
SetPedFaceFeature(ped, 13, (data["jaw_bone_width"].item / 10))
SetPedFaceFeature(ped, 14, (data["jaw_bone_back_lenght"].item / 10))
SetPedFaceFeature(ped, 15, (data["chimp_bone_lowering"].item / 10))
SetPedFaceFeature(ped, 16, (data["chimp_bone_lenght"].item / 10))
SetPedFaceFeature(ped, 17, (data["chimp_bone_width"].item / 10))
SetPedFaceFeature(ped, 18, (data["chimp_hole"].item / 10))
SetPedFaceFeature(ped, 19, (data["neck_thikness"].item / 10))
local appearance = client.getPedAppearance(ped)
TriggerServerEvent("illenium-appearance:server:migrate-qb-clothing-skin", playerSkin.citizenid, appearance)
end)

View File

@ -0,0 +1,27 @@
if not Config.BossManagedOutfits then return end
if Framework.ESX() then return end
function Management.RemoveItems()
if GetResourceState(Management.ResourceName) ~= "started" then return end
if Management.ItemIDs.Boss then
exports[Management.ResourceName]:RemoveBossMenuItem(Management.ItemIDs.Boss)
end
if Management.ItemIDs.Gang then
exports[Management.ResourceName]:RemoveGangMenuItem(Management.ItemIDs.Gang)
end
end
function Management.AddBackMenuItem(managementMenu, args)
local bossMenuEvent = "qb-bossmenu:client:OpenMenu"
if args.type == "Gang" then
bossMenuEvent = "qb-gangmenu:client:OpenMenu"
end
managementMenu.options[#managementMenu.options+1] = {
title = _L("menu.returnTitle"),
icon = "fa-solid fa-angle-left",
event = bossMenuEvent
}
end

View File

@ -0,0 +1,15 @@
if not Config.BossManagedOutfits then return end
if not Framework.ESX() then return end
function Management.RemoveItems()
-- Do nothing
end
function Management.AddItems()
-- Do nothing
end
function Management.AddBackMenuItem()
-- Do nothing
end

View File

@ -0,0 +1,26 @@
if not Config.BossManagedOutfits then return end
Management = {}
Management.ItemIDs = {
Gang = nil,
Boss = nil
}
function Management.IsQB()
local resName = "qb-management"
if GetResourceState(resName) ~= "missing" then
Management.ResourceName = resName
return true
end
return false
end
function Management.IsQBX()
local resName = "qbx_management"
if GetResourceState(resName) ~= "missing" then
Management.ResourceName = resName
return true
end
return false
end

View File

@ -0,0 +1,21 @@
if not Config.BossManagedOutfits then return end
if not Management.IsQB() then return end
function Management.AddItems()
local menuItem = {
header = _L("outfitManagement.title"),
icon = "fa-solid fa-shirt",
params = {
event = "illenium-appearance:client:OutfitManagementMenu",
args = {}
}
}
menuItem.txt = _L("outfitManagement.jobText")
menuItem.params.args.type = "Job"
Management.ItemIDs.Boss = exports[Management.ResourceName]:AddBossMenuItem(menuItem)
menuItem.txt = _L("outfitManagement.gangText")
menuItem.params.args.type = "Gang"
Management.ItemIDs.Gang = exports[Management.ResourceName]:AddGangMenuItem(menuItem)
end

View File

@ -0,0 +1,19 @@
if not Config.BossManagedOutfits then return end
if not Management.IsQBX() then return end
function Management.AddItems()
local menuItem = {
title = _L("outfitManagement.title"),
icon = "fa-solid fa-shirt",
event = "illenium-appearance:client:OutfitManagementMenu",
args = {}
}
menuItem.description = _L("outfitManagement.jobText")
menuItem.args.type = "Job"
Management.ItemIDs.Boss = exports[Management.ResourceName]:AddBossMenuItem(menuItem)
menuItem.description = _L("outfitManagement.gangText")
menuItem.args.type = "Gang"
Management.ItemIDs.Gang = exports[Management.ResourceName]:AddGangMenuItem(menuItem)
end

View File

@ -0,0 +1,142 @@
local function typeof(var)
local _type = type(var);
if (_type ~= "table" and _type ~= "userdata") then
return _type;
end
local _meta = getmetatable(var);
if (_meta ~= nil and _meta._NAME ~= nil) then
return _meta._NAME;
else
return _type;
end
end
function LoadJobOutfit(oData)
local ped = cache.ped
local data = oData.outfitData
if typeof(data) ~= "table" then
data = json.decode(data)
end
-- Pants
if data["pants"] ~= nil then
SetPedComponentVariation(ped, 4, data["pants"].item, data["pants"].texture, 0)
end
-- Arms
if data["arms"] ~= nil then
SetPedComponentVariation(ped, 3, data["arms"].item, data["arms"].texture, 0)
end
-- T-Shirt
if data["t-shirt"] ~= nil then
SetPedComponentVariation(ped, 8, data["t-shirt"].item, data["t-shirt"].texture, 0)
end
-- Vest
if data["vest"] ~= nil then
SetPedComponentVariation(ped, 9, data["vest"].item, data["vest"].texture, 0)
end
-- Torso 2
if data["torso2"] ~= nil then
SetPedComponentVariation(ped, 11, data["torso2"].item, data["torso2"].texture, 0)
end
-- Shoes
if data["shoes"] ~= nil then
SetPedComponentVariation(ped, 6, data["shoes"].item, data["shoes"].texture, 0)
end
-- Badge
if data["decals"] ~= nil then
SetPedComponentVariation(ped, 10, data["decals"].item, data["decals"].texture, 0)
end
-- Accessory
local tracker = Config.TrackerClothingOptions
if data["accessory"] ~= nil then
if Framework.HasTracker() then
SetPedComponentVariation(ped, 7, tracker.drawable, tracker.texture, 0)
else
SetPedComponentVariation(ped, 7, data["accessory"].item, data["accessory"].texture, 0)
end
else
if Framework.HasTracker() then
SetPedComponentVariation(ped, 7, tracker.drawable, tracker.texture, 0)
else
local drawableId = GetPedDrawableVariation(ped, 7)
if drawableId ~= -1 then
local textureId = GetPedTextureVariation(ped, 7)
if drawableId == tracker.drawable and textureId == tracker.texture then
SetPedComponentVariation(ped, 7, -1, 0, 2)
end
end
end
end
-- Mask
if data["mask"] ~= nil then
SetPedComponentVariation(ped, 1, data["mask"].item, data["mask"].texture, 0)
end
-- Bag
if data["bag"] ~= nil then
SetPedComponentVariation(ped, 5, data["bag"].item, data["bag"].texture, 0)
end
-- Hat
if data["hat"] ~= nil then
if data["hat"].item ~= -1 and data["hat"].item ~= 0 then
SetPedPropIndex(ped, 0, data["hat"].item, data["hat"].texture, true)
else
ClearPedProp(ped, 0)
end
end
-- Glass
if data["glass"] ~= nil then
if data["glass"].item ~= -1 and data["glass"].item ~= 0 then
SetPedPropIndex(ped, 1, data["glass"].item, data["glass"].texture, true)
else
ClearPedProp(ped, 1)
end
end
-- Ear
if data["ear"] ~= nil then
if data["ear"].item ~= -1 and data["ear"].item ~= 0 then
SetPedPropIndex(ped, 2, data["ear"].item, data["ear"].texture, true)
else
ClearPedProp(ped, 2)
end
end
local length = 0
for _ in pairs(data) do
length = length + 1
end
if Config.PersistUniforms and length > 1 then
TriggerServerEvent("illenium-appearance:server:syncUniform", {
jobName = oData.jobName,
gender = oData.gender,
label = oData.name
})
end
end
RegisterNetEvent("illenium-appearance:client:loadJobOutfit", LoadJobOutfit)
RegisterNetEvent("illenium-appearance:client:openOutfitMenu", function()
OpenMenu(nil, "outfit")
end)
RegisterNetEvent("illenium-apearance:client:outfitsCommand", function(isJob)
local outfits = GetPlayerJobOutfits(isJob)
TriggerEvent("illenium-appearance:client:openJobOutfitsMenu", outfits)
end)

View File

@ -0,0 +1,5 @@
lib.onCache('ped', function(value)
if Config.AlwaysKeepProps then
SetPedCanLosePropsOnDamage(value, false, 0)
end
end)

View File

@ -0,0 +1,17 @@
if not Radial.IsOX() then return end
function Radial.Add(title, event)
lib.addRadialItem({
id = Radial.MenuID,
icon = "shirt",
label = title,
event = event,
onSelect = function()
TriggerEvent(event)
end
})
end
function Radial.Remove()
lib.removeRadialItem(Radial.MenuID)
end

View File

@ -0,0 +1,16 @@
if not Radial.IsQBX() and not Radial.IsQB() then return end
function Radial.Add(title, event)
exports[Radial.ResourceName]:AddOption({
id = Radial.MenuID,
title = title,
icon = "shirt",
type = "client",
event = event,
shouldClose = true
}, Radial.MenuID)
end
function Radial.Remove()
exports[Radial.ResourceName]:RemoveOption(Radial.MenuID)
end

View File

@ -0,0 +1,71 @@
Radial = {}
Radial.MenuID = "open_clothing_menu"
local radialOptionAdded = false
function Radial.IsOX()
local resName = "ox_lib"
if GetResourceState(resName) ~= "missing" and Config.UseOxRadial then
Radial.ResourceName = resName
return true
end
return false
end
function Radial.IsQB()
local resName = "qb-radialmenu"
if GetResourceState(resName) ~= "missing" then
Radial.ResourceName = resName
return true
end
return false
end
function Radial.IsQBX()
local resName = "qbx_radialmenu"
if GetResourceState(resName) ~= "missing" then
Radial.ResourceName = resName
return true
end
return false
end
function Radial.AddOption(currentZone)
if not Config.UseRadialMenu then return end
if not currentZone then
Radial.Remove()
return
end
local event, title
local zoneEvents = {
clothingRoom = {"illenium-appearance:client:OpenClothingRoom", _L("menu.title")},
playerOutfitRoom = {"illenium-appearance:client:OpenPlayerOutfitRoom", _L("menu.outfitsTitle")},
clothing = {"illenium-appearance:client:openClothingShopMenu", _L("menu.clothingShopTitle")},
barber = {"illenium-appearance:client:OpenBarberShop", _L("menu.barberShopTitle")},
tattoo = {"illenium-appearance:client:OpenTattooShop", _L("menu.tattooShopTitle")},
surgeon = {"illenium-appearance:client:OpenSurgeonShop", _L("menu.surgeonShopTitle")},
}
if zoneEvents[currentZone.name] then
event, title = table.unpack(zoneEvents[currentZone.name])
end
Radial.Add(title, event)
radialOptionAdded = true
end
function Radial.RemoveOption()
if radialOptionAdded then
Radial.Remove()
radialOptionAdded = false
end
end
AddEventHandler("onResourceStop", function(resource)
if resource == GetCurrentResourceName() then
if Config.UseOxRadial and GetResourceState("ox_lib") == "started" or GetResourceState("qb-radialmenu") == "started" then
Radial.RemoveOption()
end
end
end)

View File

@ -0,0 +1,28 @@
local stats = nil
local function ResetRechargeMultipliers()
SetPlayerHealthRechargeMultiplier(cache.playerId, 0.0)
SetPlayerHealthRechargeLimit(cache.playerId, 0.0)
end
function BackupPlayerStats()
stats = {
health = GetEntityHealth(cache.ped),
armour = GetPedArmour(cache.ped)
}
end
function RestorePlayerStats()
if stats then
SetEntityMaxHealth(cache.ped, 200)
Wait(1000) -- Safety Delay
SetEntityHealth(cache.ped, stats.health)
SetPedArmour(cache.ped, stats.armour)
ResetRechargeMultipliers()
stats = nil
return
end
-- If no stats are backed up, restore from the framework
Framework.RestorePlayerArmour()
end

View File

@ -0,0 +1,55 @@
if not Config.UseTarget then return end
if not Target.IsOX() then return end
local ZoneIDMap = {}
local function convert(options)
local distance = options.distance
options = options.options
for _, v in pairs(options) do
v.onSelect = v.action
v.distance = v.distance or distance
v.name = v.name or v.label
v.groups = v.job or v.gang
v.type = nil
v.action = nil
v.job = nil
v.gang = nil
v.qtarget = true
end
return options
end
function Target.RemoveZone(zone)
exports["ox_target"]:removeZone(ZoneIDMap[zone])
end
function Target.AddTargetEntity(entity, parameters)
exports["ox_target"]:addLocalEntity(entity, convert(parameters))
end
function Target.AddBoxZone(name, coords, size, parameters)
local rotation = parameters.rotation
ZoneIDMap[name] = exports["ox_target"]:addBoxZone({
coords = coords,
size = size,
rotation = rotation,
debug = Config.Debug,
options = convert(parameters)
})
end
function Target.AddPolyZone(name, points, parameters)
ZoneIDMap[name] = exports["ox_target"]:addPolyZone({
points = points,
debug = Config.Debug,
options = convert(parameters)
})
end
function Target.IsTargetStarted()
return GetResourceState("ox_target") == "started"
end

View File

@ -0,0 +1,34 @@
if not Config.UseTarget then return end
if not Target.IsQB() then return end
function Target.RemoveZone(zone)
exports["qb-target"]:RemoveZone(zone)
end
function Target.AddTargetEntity(entity, parameters)
exports["qb-target"]:AddTargetEntity(entity, parameters)
end
function Target.AddBoxZone(name, coords, size, parameters)
exports["qb-target"]:AddBoxZone(name, coords, size.x, size.y, {
name = name,
debugPoly = Config.Debug,
minZ = coords.z - 2,
maxZ = coords.z + 2,
heading = coords.w
}, parameters)
end
function Target.AddPolyZone(name, points, parameters)
exports["qb-target"]:AddPolyZone(name, points, {
name = name,
debugPoly = Config.Debug,
minZ = points[1].z - 2,
maxZ = points[1].z + 2
}, parameters)
end
function Target.IsTargetStarted()
return GetResourceState("qb-target") == "started"
end

View File

@ -0,0 +1,192 @@
if not Config.UseTarget then return end
local TargetPeds = {
Store = {},
ClothingRoom = {},
PlayerOutfitRoom = {}
}
Target = {}
function Target.IsOX()
return GetResourceState("ox_target") ~= "missing"
end
function Target.IsQB()
return GetResourceState("qb-target") ~= "missing"
end
local function RemoveTargetPeds(peds)
for i = 1, #peds, 1 do
DeletePed(peds[i])
end
end
local function RemoveTargets()
if Config.EnablePedsForShops then
RemoveTargetPeds(TargetPeds.Store)
else
for k, v in pairs(Config.Stores) do
Target.RemoveZone(v.type .. k)
end
end
if Config.EnablePedsForClothingRooms then
RemoveTargetPeds(TargetPeds.ClothingRoom)
else
for k, v in pairs(Config.ClothingRooms) do
Target.RemoveZone("clothing_" .. (v.job or v.gang) .. k)
end
end
if Config.EnablePedsForPlayerOutfitRooms then
RemoveTargetPeds(TargetPeds.PlayerOutfitRoom)
else
for k in pairs(Config.PlayerOutfitRooms) do
Target.RemoveZone("playeroutfitroom_" .. k)
end
end
end
AddEventHandler("onResourceStop", function(resource)
if resource == GetCurrentResourceName() then
if Target.IsTargetStarted() then
RemoveTargets()
end
end
end)
local function CreatePedAtCoords(pedModel, coords, scenario)
pedModel = type(pedModel) == "string" and joaat(pedModel) or pedModel
lib.requestModel(pedModel)
local ped = CreatePed(0, pedModel, coords.x, coords.y, coords.z - 0.98, coords.w, false, false)
TaskStartScenarioInPlace(ped, scenario, true)
FreezeEntityPosition(ped, true)
SetEntityVisible(ped, true)
SetEntityInvincible(ped, true)
PlaceObjectOnGroundProperly(ped)
SetBlockingOfNonTemporaryEvents(ped, true)
return ped
end
local function SetupStoreTarget(targetConfig, action, k, v)
local parameters = {
options = {{
type = "client",
action = action,
icon = targetConfig.icon,
label = targetConfig.label
}},
distance = targetConfig.distance,
rotation = v.rotation
}
if Config.EnablePedsForShops then
TargetPeds.Store[k] = CreatePedAtCoords(v.targetModel or targetConfig.model, v.coords, v.targetScenario or targetConfig.scenario)
Target.AddTargetEntity(TargetPeds.Store[k], parameters)
elseif v.usePoly then
Target.AddPolyZone(v.type .. k, v.points, parameters)
else
Target.AddBoxZone(v.type .. k, v.coords, v.size, parameters)
end
end
local function SetupStoreTargets()
for k, v in pairs(Config.Stores) do
local targetConfig = Config.TargetConfig[v.type]
local action
if v.type == "barber" then
action = OpenBarberShop
elseif v.type == "clothing" then
action = function()
TriggerEvent("illenium-appearance:client:openClothingShopMenu")
end
elseif v.type == "tattoo" then
action = OpenTattooShop
elseif v.type == "surgeon" then
action = OpenSurgeonShop
end
if not (Config.RCoreTattoosCompatibility and v.type == "tattoo") then
SetupStoreTarget(targetConfig, action, k, v)
end
end
end
local function SetupClothingRoomTargets()
for k, v in pairs(Config.ClothingRooms) do
local targetConfig = Config.TargetConfig["clothingroom"]
local action = function()
local outfits = GetPlayerJobOutfits(v.job)
TriggerEvent("illenium-appearance:client:openJobOutfitsMenu", outfits)
end
local parameters = {
options = {{
type = "client",
action = action,
icon = targetConfig.icon,
label = targetConfig.label,
canInteract = v.job and CheckDuty or nil,
job = v.job,
gang = v.gang
}},
distance = targetConfig.distance,
rotation = v.rotation
}
local key = "clothing_" .. (v.job or v.gang) .. k
if Config.EnablePedsForClothingRooms then
TargetPeds.ClothingRoom[k] = CreatePedAtCoords(v.targetModel or targetConfig.model, v.coords, v.targetScenario or targetConfig.scenario)
Target.AddTargetEntity(TargetPeds.ClothingRoom[k], parameters)
elseif v.usePoly then
Target.AddPolyZone(key, v.points, parameters)
else
Target.AddBoxZone(key, v.coords, v.size, parameters)
end
end
end
local function SetupPlayerOutfitRoomTargets()
for k, v in pairs(Config.PlayerOutfitRooms) do
local targetConfig = Config.TargetConfig["playeroutfitroom"]
local parameters = {
options = {{
type = "client",
action = function()
OpenOutfitRoom(v)
end,
icon = targetConfig.icon,
label = targetConfig.label,
canInteract = function()
return IsPlayerAllowedForOutfitRoom(v)
end
}},
distance = targetConfig.distance,
rotation = v.rotation
}
if Config.EnablePedsForPlayerOutfitRooms then
TargetPeds.PlayerOutfitRoom[k] = CreatePedAtCoords(v.targetModel or targetConfig.model, v.coords, v.targetScenario or targetConfig.scenario)
Target.AddTargetEntity(TargetPeds.PlayerOutfitRoom[k], parameters)
elseif v.usePoly then
Target.AddPolyZone("playeroutfitroom_" .. k, v.points, parameters)
else
Target.AddBoxZone("playeroutfitroom_" .. k, v.coords, v.size, parameters)
end
end
end
local function SetupTargets()
SetupStoreTargets()
SetupClothingRoomTargets()
SetupPlayerOutfitRoomTargets()
end
CreateThread(function()
if Config.UseTarget then
SetupTargets()
end
end)

View File

@ -0,0 +1,197 @@
if Config.UseTarget then return end
local currentZone = nil
local Zones = {
Store = {},
ClothingRoom = {},
PlayerOutfitRoom = {}
}
local function RemoveZones()
for i = 1, #Zones.Store do
if Zones.Store[i]["remove"] then
Zones.Store[i]:remove()
end
end
for i = 1, #Zones.ClothingRoom do
Zones.ClothingRoom[i]:remove()
end
for i = 1, #Zones.PlayerOutfitRoom do
Zones.PlayerOutfitRoom[i]:remove()
end
end
local function lookupZoneIndexFromID(zones, id)
for i = 1, #zones do
if zones[i].id == id then
return i
end
end
end
local function onStoreEnter(data)
local index = lookupZoneIndexFromID(Zones.Store, data.id)
local store = Config.Stores[index]
local jobName = (store.job and client.job.name) or (store.gang and client.gang.name)
if jobName == (store.job or store.gang) then
currentZone = {
name = store.type,
index = index
}
local prefix = Config.UseRadialMenu and "" or "[E] "
if currentZone.name == "clothing" then
lib.showTextUI(prefix .. string.format(_L("textUI.clothing"), Config.ClothingCost), Config.TextUIOptions)
elseif currentZone.name == "barber" then
lib.showTextUI(prefix .. string.format(_L("textUI.barber"), Config.BarberCost), Config.TextUIOptions)
elseif currentZone.name == "tattoo" then
lib.showTextUI(prefix .. string.format(_L("textUI.tattoo"), Config.TattooCost), Config.TextUIOptions)
elseif currentZone.name == "surgeon" then
lib.showTextUI(prefix .. string.format(_L("textUI.surgeon"), Config.SurgeonCost), Config.TextUIOptions)
end
Radial.AddOption(currentZone)
end
end
local function onClothingRoomEnter(data)
local index = lookupZoneIndexFromID(Zones.ClothingRoom, data.id)
local clothingRoom = Config.ClothingRooms[index]
local jobName = clothingRoom.job and client.job.name or client.gang.name
if jobName == (clothingRoom.job or clothingRoom.gang) then
if CheckDuty() or clothingRoom.gang then
currentZone = {
name = "clothingRoom",
index = index
}
local prefix = Config.UseRadialMenu and "" or "[E] "
lib.showTextUI(prefix .. _L("textUI.clothingRoom"), Config.TextUIOptions)
Radial.AddOption(currentZone)
end
end
end
local function onPlayerOutfitRoomEnter(data)
local index = lookupZoneIndexFromID(Zones.PlayerOutfitRoom, data.id)
local playerOutfitRoom = Config.PlayerOutfitRooms[index]
local isAllowed = IsPlayerAllowedForOutfitRoom(playerOutfitRoom)
if isAllowed then
currentZone = {
name = "playerOutfitRoom",
index = index
}
local prefix = Config.UseRadialMenu and "" or "[E] "
lib.showTextUI(prefix .. _L("textUI.playerOutfitRoom"), Config.TextUIOptions)
Radial.AddOption(currentZone)
end
end
local function onZoneExit()
currentZone = nil
Radial.RemoveOption()
lib.hideTextUI()
end
local function SetupZone(store, onEnter, onExit)
if Config.RCoreTattoosCompatibility and store.type == "tattoo" then
return {}
end
if Config.UseRadialMenu or store.usePoly then
return lib.zones.poly({
points = store.points,
debug = Config.Debug,
onEnter = onEnter,
onExit = onExit
})
end
return lib.zones.box({
coords = store.coords,
size = store.size,
rotation = store.rotation,
debug = Config.Debug,
onEnter = onEnter,
onExit = onExit
})
end
local function SetupStoreZones()
for _, v in pairs(Config.Stores) do
Zones.Store[#Zones.Store + 1] = SetupZone(v, onStoreEnter, onZoneExit)
end
end
local function SetupClothingRoomZones()
for _, v in pairs(Config.ClothingRooms) do
Zones.ClothingRoom[#Zones.ClothingRoom + 1] = SetupZone(v, onClothingRoomEnter, onZoneExit)
end
end
local function SetupPlayerOutfitRoomZones()
for _, v in pairs(Config.PlayerOutfitRooms) do
Zones.PlayerOutfitRoom[#Zones.PlayerOutfitRoom + 1] = SetupZone(v, onPlayerOutfitRoomEnter, onZoneExit)
end
end
local function SetupZones()
SetupStoreZones()
SetupClothingRoomZones()
SetupPlayerOutfitRoomZones()
end
local function ZonesLoop()
Wait(1000)
while true do
local sleep = 1000
if currentZone then
sleep = 5
if IsControlJustReleased(0, 38) then
if currentZone.name == "clothingRoom" then
local clothingRoom = Config.ClothingRooms[currentZone.index]
local outfits = GetPlayerJobOutfits(clothingRoom.job)
TriggerEvent("illenium-appearance:client:openJobOutfitsMenu", outfits)
elseif currentZone.name == "playerOutfitRoom" then
local outfitRoom = Config.PlayerOutfitRooms[currentZone.index]
OpenOutfitRoom(outfitRoom)
elseif currentZone.name == "clothing" then
TriggerEvent("illenium-appearance:client:openClothingShopMenu")
elseif currentZone.name == "barber" then
OpenBarberShop()
elseif currentZone.name == "tattoo" then
OpenTattooShop()
elseif currentZone.name == "surgeon" then
OpenSurgeonShop()
end
end
end
Wait(sleep)
end
end
CreateThread(function()
SetupZones()
if not Config.UseRadialMenu then
ZonesLoop()
end
end)
AddEventHandler("onResourceStop", function(resource)
if resource == GetCurrentResourceName() then
RemoveZones()
end
end)
RegisterNetEvent("illenium-appearance:client:OpenClothingRoom", function()
local clothingRoom = Config.ClothingRooms[currentZone.index]
local outfits = GetPlayerJobOutfits(clothingRoom.job)
TriggerEvent("illenium-appearance:client:openJobOutfitsMenu", outfits)
end)
RegisterNetEvent("illenium-appearance:client:OpenPlayerOutfitRoom", function()
local outfitRoom = Config.PlayerOutfitRooms[currentZone.index]
OpenOutfitRoom(outfitRoom)
end)

View File

@ -0,0 +1,98 @@
fx_version "cerulean"
game "gta5"
author "snakewiz & iLLeniumStudios"
description "A flexible player customization script for FiveM servers."
repository "https://github.com/iLLeniumStudios/illenium-appearance"
version "v5.7.0"
lua54 "yes"
client_scripts {
"game/constants.lua",
"game/util.lua",
"game/customization.lua",
"game/nui.lua",
"client/outfits.lua",
"client/common.lua",
"client/zones.lua",
"client/framework/framework.lua",
"client/framework/qb/compatibility.lua",
"client/framework/qb/main.lua",
"client/framework/qb/migrate.lua",
"client/framework/esx/compatibility.lua",
"client/framework/esx/main.lua",
"client/framework/ox/main.lua",
"client/target/target.lua",
"client/target/qb.lua",
"client/target/ox.lua",
"client/management/management.lua",
"client/management/common.lua",
"client/management/qb.lua",
"client/management/qbx.lua",
"client/management/esx.lua",
"client/radial/radial.lua",
"client/radial/qb.lua",
"client/radial/ox.lua",
"client/stats.lua",
"client/defaults.lua",
"client/blips.lua",
"client/props.lua",
"client/client.lua",
}
server_scripts {
"@oxmysql/lib/MySQL.lua",
"server/database/database.lua",
"server/database/jobgrades.lua",
"server/database/managementoutfits.lua",
"server/database/playeroutfitcodes.lua",
"server/database/playeroutfits.lua",
"server/database/players.lua",
"server/database/playerskins.lua",
"server/database/users.lua",
"server/framework/qb/main.lua",
"server/framework/qb/migrate.lua",
"server/framework/esx/main.lua",
"server/framework/esx/migrate.lua",
"server/framework/esx/callbacks.lua",
"server/framework/esx/management.lua",
"server/framework/ox/main.lua",
"server/util.lua",
"server/server.lua",
"server/permissions.lua"
}
shared_scripts {
"shared/config.lua",
"shared/blacklist.lua",
"shared/peds.lua",
"shared/tattoos.lua",
"shared/theme.lua",
"shared/framework/framework.lua",
"shared/framework/esx/util.lua",
"locales/locales.lua",
"locales/ar.lua",
"locales/bg.lua",
"locales/cs.lua",
"locales/de.lua",
"locales/en.lua",
"locales/es-ES.lua",
"locales/fr.lua",
"locales/hu.lua",
"locales/it.lua",
"locales/nl.lua",
"locales/pt-BR.lua",
"locales/ro-RO.lua",
"locales/id.lua",
"@ox_lib/init.lua"
}
files {
"web/dist/index.html",
"web/dist/assets/*.js"
}
ui_page "web/dist/index.html"
provides { "esx_skin", "ui_skin", "skinchanger" }

View File

@ -0,0 +1,366 @@
constants = {}
constants.PED_COMPONENTS_IDS = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
constants.PED_PROPS_IDS = {0, 1, 2, 6, 7}
constants.FACE_FEATURES = {
"noseWidth",
"nosePeakHigh",
"nosePeakSize",
"noseBoneHigh",
"nosePeakLowering",
"noseBoneTwist",
"eyeBrownHigh",
"eyeBrownForward",
"cheeksBoneHigh",
"cheeksBoneWidth",
"cheeksWidth",
"eyesOpening",
"lipsThickness",
"jawBoneWidth",
"jawBoneBackSize",
"chinBoneLowering",
"chinBoneLenght",
"chinBoneSize",
"chinHole",
"neckThickness",
}
constants.HEAD_OVERLAYS = {
"blemishes",
"beard",
"eyebrows",
"ageing",
"makeUp",
"blush",
"complexion",
"sunDamage",
"lipstick",
"moleAndFreckles",
"chestHair",
"bodyBlemishes",
}
-- Thanks to rootcause for the eye colors names and hair decorations hashes.
constants.EYE_COLORS = {
"Green",
"Emerald",
"Light Blue",
"Ocean Blue",
"Light Brown",
"Dark Brown",
"Hazel",
"Dark Gray",
"Light Gray",
"Pink",
"Yellow",
"Purple",
"Blackout",
"Shades of Gray",
"Tequila Sunrise",
"Atomic",
"Warp",
"ECola",
"Space Ranger",
"Ying Yang",
"Bullseye",
"Lizard",
"Dragon",
"Extra Terrestrial",
"Goat",
"Smiley",
"Possessed",
"Demon",
"Infected",
"Alien",
"Undead",
"Zombie",
}
constants.HAIR_DECORATIONS = {
male = {
[0] = { `mpbeach_overlays`, `FM_Hair_Fuzz` },
[1] = { `multiplayer_overlays`, `NG_M_Hair_001` },
[2] = { `multiplayer_overlays`, `NG_M_Hair_002` },
[3] = { `multiplayer_overlays`, `NG_M_Hair_003` },
[4] = { `multiplayer_overlays`, `NG_M_Hair_004` },
[5] = { `multiplayer_overlays`, `NG_M_Hair_005` },
[6] = { `multiplayer_overlays`, `NG_M_Hair_006` },
[7] = { `multiplayer_overlays`, `NG_M_Hair_007` },
[8] = { `multiplayer_overlays`, `NG_M_Hair_008` },
[9] = { `multiplayer_overlays`, `NG_M_Hair_009` },
[10] = { `multiplayer_overlays`, `NG_M_Hair_013` },
[11] = { `multiplayer_overlays`, `NG_M_Hair_002` },
[12] = { `multiplayer_overlays`, `NG_M_Hair_011` },
[13] = { `multiplayer_overlays`, `NG_M_Hair_012` },
[14] = { `multiplayer_overlays`, `NG_M_Hair_014` },
[15] = { `multiplayer_overlays`, `NG_M_Hair_015` },
[16] = { `multiplayer_overlays`, `NGBea_M_Hair_000` },
[17] = { `multiplayer_overlays`, `NGBea_M_Hair_001` },
[18] = { `multiplayer_overlays`, `NGBus_M_Hair_000` },
[19] = { `multiplayer_overlays`, `NGBus_M_Hair_001` },
[20] = { `multiplayer_overlays`, `NGHip_M_Hair_000` },
[21] = { `multiplayer_overlays`, `NGHip_M_Hair_001` },
[22] = { `multiplayer_overlays`, `NGInd_M_Hair_000` },
[24] = { `mplowrider_overlays`, `LR_M_Hair_000` },
[25] = { `mplowrider_overlays`, `LR_M_Hair_001` },
[26] = { `mplowrider_overlays`, `LR_M_Hair_002` },
[27] = { `mplowrider_overlays`, `LR_M_Hair_003` },
[28] = { `mplowrider2_overlays`, `LR_M_Hair_004` },
[29] = { `mplowrider2_overlays`, `LR_M_Hair_005` },
[30] = { `mplowrider2_overlays`, `LR_M_Hair_006` },
[31] = { `mpbiker_overlays`, `MP_Biker_Hair_000_M` },
[32] = { `mpbiker_overlays`, `MP_Biker_Hair_001_M` },
[33] = { `mpbiker_overlays`, `MP_Biker_Hair_002_M` },
[34] = { `mpbiker_overlays`, `MP_Biker_Hair_003_M` },
[35] = { `mpbiker_overlays`, `MP_Biker_Hair_004_M` },
[36] = { `mpbiker_overlays`, `MP_Biker_Hair_005_M` },
[37] = { `multiplayer_overlays`, `NG_M_Hair_001` },
[38] = { `multiplayer_overlays`, `NG_M_Hair_002` },
[39] = { `multiplayer_overlays`, `NG_M_Hair_003` },
[40] = { `multiplayer_overlays`, `NG_M_Hair_004` },
[41] = { `multiplayer_overlays`, `NG_M_Hair_005` },
[42] = { `multiplayer_overlays`, `NG_M_Hair_006` },
[43] = { `multiplayer_overlays`, `NG_M_Hair_007` },
[44] = { `multiplayer_overlays`, `NG_M_Hair_008` },
[45] = { `multiplayer_overlays`, `NG_M_Hair_009` },
[46] = { `multiplayer_overlays`, `NG_M_Hair_013` },
[47] = { `multiplayer_overlays`, `NG_M_Hair_002` },
[48] = { `multiplayer_overlays`, `NG_M_Hair_011` },
[49] = { `multiplayer_overlays`, `NG_M_Hair_012` },
[50] = { `multiplayer_overlays`, `NG_M_Hair_014` },
[51] = { `multiplayer_overlays`, `NG_M_Hair_015` },
[52] = { `multiplayer_overlays`, `NGBea_M_Hair_000` },
[53] = { `multiplayer_overlays`, `NGBea_M_Hair_001` },
[54] = { `multiplayer_overlays`, `NGBus_M_Hair_000` },
[55] = { `multiplayer_overlays`, `NGBus_M_Hair_001` },
[56] = { `multiplayer_overlays`, `NGHip_M_Hair_000` },
[57] = { `multiplayer_overlays`, `NGHip_M_Hair_001` },
[58] = { `multiplayer_overlays`, `NGInd_M_Hair_000` },
[59] = { `mplowrider_overlays`, `LR_M_Hair_000` },
[60] = { `mplowrider_overlays`, `LR_M_Hair_001` },
[61] = { `mplowrider_overlays`, `LR_M_Hair_002` },
[62] = { `mplowrider_overlays`, `LR_M_Hair_003` },
[63] = { `mplowrider2_overlays`, `LR_M_Hair_004` },
[64] = { `mplowrider2_overlays`, `LR_M_Hair_005` },
[65] = { `mplowrider2_overlays`, `LR_M_Hair_006` },
[66] = { `mpbiker_overlays`, `MP_Biker_Hair_000_M` },
[67] = { `mpbiker_overlays`, `MP_Biker_Hair_001_M` },
[68] = { `mpbiker_overlays`, `MP_Biker_Hair_002_M` },
[69] = { `mpbiker_overlays`, `MP_Biker_Hair_003_M` },
[70] = { `mpbiker_overlays`, `MP_Biker_Hair_004_M` },
[71] = { `mpbiker_overlays`, `MP_Biker_Hair_005_M` },
[72] = { `mpgunrunning_overlays`, `MP_Gunrunning_Hair_M_000_M` },
[73] = { `mpgunrunning_overlays`, `MP_Gunrunning_Hair_M_001_M` },
[74] = { `mpVinewood_overlays`, `MP_Vinewood_Hair_M_000_M` },
[75] = { `mptuner_overlays`, `MP_Tuner_Hair_001_M` },
[76] = { `mpsecurity_overlays`, `MP_Security_Hair_001_M` },
},
female = {
[0] = { `mpbeach_overlays`, `FM_Hair_Fuzz` },
[1] = { `multiplayer_overlays`, `NG_F_Hair_001` },
[2] = { `multiplayer_overlays`, `NG_F_Hair_002` },
[3] = { `multiplayer_overlays`, `NG_F_Hair_003` },
[4] = { `multiplayer_overlays`, `NG_F_Hair_004` },
[5] = { `multiplayer_overlays`, `NG_F_Hair_005` },
[6] = { `multiplayer_overlays`, `NG_F_Hair_006` },
[7] = { `multiplayer_overlays`, `NG_F_Hair_007` },
[8] = { `multiplayer_overlays`, `NG_F_Hair_008` },
[9] = { `multiplayer_overlays`, `NG_F_Hair_009` },
[10] = { `multiplayer_overlays`, `NG_F_Hair_010` },
[11] = { `multiplayer_overlays`, `NG_F_Hair_011` },
[12] = { `multiplayer_overlays`, `NG_F_Hair_012` },
[13] = { `multiplayer_overlays`, `NG_F_Hair_013` },
[14] = { `multiplayer_overlays`, `NG_M_Hair_014` },
[15] = { `multiplayer_overlays`, `NG_M_Hair_015` },
[16] = { `multiplayer_overlays`, `NGBea_F_Hair_000` },
[17] = { `multiplayer_overlays`, `NGBea_F_Hair_001` },
[18] = { `multiplayer_overlays`, `NG_F_Hair_007` },
[19] = { `multiplayer_overlays`, `NGBus_F_Hair_000` },
[20] = { `multiplayer_overlays`, `NGBus_F_Hair_001` },
[21] = { `multiplayer_overlays`, `NGBea_F_Hair_001` },
[22] = { `multiplayer_overlays`, `NGHip_F_Hair_000` },
[23] = { `multiplayer_overlays`, `NGInd_F_Hair_000` },
[25] = { `mplowrider_overlays`, `LR_F_Hair_000` },
[26] = { `mplowrider_overlays`, `LR_F_Hair_001` },
[27] = { `mplowrider_overlays`, `LR_F_Hair_002` },
[28] = { `mplowrider2_overlays`, `LR_F_Hair_003` },
[29] = { `mplowrider2_overlays`, `LR_F_Hair_003` },
[30] = { `mplowrider2_overlays`, `LR_F_Hair_004` },
[31] = { `mplowrider2_overlays`, `LR_F_Hair_006` },
[32] = { `mpbiker_overlays`, `MP_Biker_Hair_000_F` },
[33] = { `mpbiker_overlays`, `MP_Biker_Hair_001_F` },
[34] = { `mpbiker_overlays`, `MP_Biker_Hair_002_F` },
[35] = { `mpbiker_overlays`, `MP_Biker_Hair_003_F` },
[36] = { `multiplayer_overlays`, `NG_F_Hair_003` },
[37] = { `mpbiker_overlays`, `MP_Biker_Hair_006_F` },
[38] = { `mpbiker_overlays`, `MP_Biker_Hair_004_F` },
[39] = { `multiplayer_overlays`, `NG_F_Hair_001` },
[40] = { `multiplayer_overlays`, `NG_F_Hair_002` },
[41] = { `multiplayer_overlays`, `NG_F_Hair_003` },
[42] = { `multiplayer_overlays`, `NG_F_Hair_004` },
[43] = { `multiplayer_overlays`, `NG_F_Hair_005` },
[44] = { `multiplayer_overlays`, `NG_F_Hair_006` },
[45] = { `multiplayer_overlays`, `NG_F_Hair_007` },
[46] = { `multiplayer_overlays`, `NG_F_Hair_008` },
[47] = { `multiplayer_overlays`, `NG_F_Hair_009` },
[48] = { `multiplayer_overlays`, `NG_F_Hair_010` },
[49] = { `multiplayer_overlays`, `NG_F_Hair_011` },
[50] = { `multiplayer_overlays`, `NG_F_Hair_012` },
[51] = { `multiplayer_overlays`, `NG_F_Hair_013` },
[52] = { `multiplayer_overlays`, `NG_M_Hair_014` },
[53] = { `multiplayer_overlays`, `NG_M_Hair_015` },
[54] = { `multiplayer_overlays`, `NGBea_F_Hair_000` },
[55] = { `multiplayer_overlays`, `NGBea_F_Hair_001` },
[56] = { `multiplayer_overlays`, `NG_F_Hair_007` },
[57] = { `multiplayer_overlays`, `NGBus_F_Hair_000` },
[58] = { `multiplayer_overlays`, `NGBus_F_Hair_001` },
[59] = { `multiplayer_overlays`, `NGBea_F_Hair_001` },
[60] = { `multiplayer_overlays`, `NGHip_F_Hair_000` },
[61] = { `multiplayer_overlays`, `NGInd_F_Hair_000` },
[62] = { `mplowrider_overlays`, `LR_F_Hair_000` },
[63] = { `mplowrider_overlays`, `LR_F_Hair_001` },
[64] = { `mplowrider_overlays`, `LR_F_Hair_002` },
[65] = { `mplowrider2_overlays`, `LR_F_Hair_003` },
[66] = { `mplowrider2_overlays`, `LR_F_Hair_003` },
[67] = { `mplowrider2_overlays`, `LR_F_Hair_004` },
[68] = { `mplowrider2_overlays`, `LR_F_Hair_006` },
[69] = { `mpbiker_overlays`, `MP_Biker_Hair_000_F` },
[70] = { `mpbiker_overlays`, `MP_Biker_Hair_001_F` },
[71] = { `mpbiker_overlays`, `MP_Biker_Hair_002_F` },
[72] = { `mpbiker_overlays`, `MP_Biker_Hair_003_F` },
[73] = { `multiplayer_overlays`, `NG_F_Hair_003` },
[74] = { `mpbiker_overlays`, `MP_Biker_Hair_006_F` },
[75] = { `mpbiker_overlays`, `MP_Biker_Hair_004_F` },
[76] = { `mpgunrunning_overlays`, `MP_Gunrunning_Hair_F_000_F` },
[77] = { `mpgunrunning_overlays`, `MP_Gunrunning_Hair_F_001_F` },
[78] = { `mpVinewood_overlays`, `MP_Vinewood_Hair_F_000_F` },
[79] = { `mptuner_overlays`, `MP_Tuner_Hair_000_F` },
[80] = { `mpsecurity_overlays`, `MP_Security_Hair_000_F` },
},
}
constants.DATA_CLOTHES = {
head = {
animations = {
on = {
dict = "mp_masks@standard_car@ds@",
anim = "put_on_mask",
move = 51,
duration = 600
},
off = {
dict = "missheist_agency2ahelmet",
anim = "take_off_helmet_stand",
move = 51,
duration = 1200
}
},
components = {
male = {
{1, 0}
},
female = {
{1, 0}
}
},
props = {
male = {
{0, -1}
},
female = {}
}
},
body = {
animations = {
on = {
dict = "clothingtie",
anim = "try_tie_negative_a",
move = 51,
duration = 1200
},
off = {
dict = "clothingtie",
anim = "try_tie_negative_a",
move = 51,
duration = 1200
}
},
components = {
male = {
{11, 252},
{3, 15},
{8, 15},
{10, 0},
{5, 0}
},
female = {
{11, 15},
{8, 14},
{3, 15},
{10, 0},
{5, 0}
}
},
props = {
male = {},
female = {}
}
},
bottom = {
animations = {
on = {
dict = "re@construction",
anim = "out_of_breath",
move = 51,
duration = 1300
},
off = {
dict = "re@construction",
anim = "out_of_breath",
move = 51,
duration = 1300
}
},
components = {
male = {
{4, 61},
{6, 34}
},
female = {
{4, 15},
{6, 35}
}
},
props = {
male = {},
female = {}
}
}
}
constants.CAMERAS = {
default = {
vec3(0, 2.2, 0.2),
vec3(0, 0, -0.05),
},
head = {
vec3(0, 0.9, 0.65),
vec3(0, 0, 0.6),
},
body = {
vec3(0, 1.2, 0.2),
vec3(0, 0, 0.2),
},
bottom = {
vec3(0, 0.98, -0.7),
vec3(0, 0, -0.9),
},
}
constants.OFFSETS = {
default = vec2(1.5, -1),
head = vec2(0.7, -0.45),
body = vec2(1.2, -0.45),
bottom = vec2(0.7, -0.45),
}

View File

@ -0,0 +1,613 @@
local reverseCamera
local function getRgbColors()
local colors = {
hair = {},
makeUp = {}
}
for i = 0, GetNumHairColors() - 1 do
colors.hair[i+1] = {GetPedHairRgbColor(i)}
end
for i = 0, GetNumMakeupColors() - 1 do
colors.makeUp[i+1] = {GetPedMakeupRgbColor(i)}
end
return colors
end
local playerAppearance
local function getAppearance()
if not playerAppearance then
playerAppearance = client.getPedAppearance(cache.ped)
end
return playerAppearance
end
client.getAppearance = getAppearance
local function addToBlacklist(item, drawable, drawableId, blacklistSettings)
if drawable == drawableId and item.textures then
for i = 1, #item.textures do
blacklistSettings.textures[#blacklistSettings.textures + 1] = item.textures[i]
end
end
if not item.textures or #item.textures == 0 then
blacklistSettings.drawables[#blacklistSettings.drawables + 1] = drawable
end
end
local function listContains(items, item)
for i = 1, #items do
if items[i] == item then
return true
end
end
return false
end
local function listContainsAny(items, containedItems)
for i = 1, #items do
if listContains(containedItems, items[i]) then
return true
end
end
return false
end
local function allowedForPlayer(item, allowedAces)
return (item.jobs and listContains(item.jobs, client.job.name)) or (item.gangs and listContains(item.gangs, client.gang.name)) or (item.aces and listContainsAny(item.aces, allowedAces) or (item.citizenids and listContains(item.citizenids, client.citizenid)))
end
local function filterPedModelsForPlayer(pedConfigs)
local playerPeds = {}
local allowedAces = lib.callback.await("illenium-appearance:server:GetPlayerAces", false)
for i = 1, #pedConfigs do
local config = pedConfigs[i]
if (not config.jobs and not config.gangs and not config.aces and not config.citizenids) or allowedForPlayer(config, allowedAces) then
for j = 1, #config.peds do
playerPeds[#playerPeds + 1] = config.peds[j]
end
end
end
return playerPeds
end
local function filterTattoosByGender(tattoos)
local filtered = {}
local gender = client.getPedDecorationType()
for k, v in pairs(tattoos) do
filtered[k] = {}
for i = 1, #v do
local tattoo = v[i]
if tattoo["hash" .. gender:gsub("^%l", string.upper)] ~= "" then
filtered[k][#filtered[k] + 1] = tattoo
end
end
end
return filtered
end
local function filterBlacklistSettings(items, drawableId)
local blacklistSettings = {
drawables = {},
textures = {}
}
local allowedAces = lib.callback.await("illenium-appearance:server:GetPlayerAces", false)
for i = 1, #items do
local item = items[i]
if not allowedForPlayer(item, allowedAces) and item.drawables then
for j = 0, #item.drawables do
addToBlacklist(item, item.drawables[j], drawableId, blacklistSettings)
end
end
end
return blacklistSettings
end
local function componentBlacklistMap(gender, componentId)
local genderSettings = Config.Blacklist[gender].components
if componentId == 1 then
return genderSettings.masks
elseif componentId == 3 then
return genderSettings.upperBody
elseif componentId == 4 then
return genderSettings.lowerBody
elseif componentId == 5 then
return genderSettings.bags
elseif componentId == 6 then
return genderSettings.shoes
elseif componentId == 7 then
return genderSettings.scarfAndChains
elseif componentId == 8 then
return genderSettings.shirts
elseif componentId == 9 then
return genderSettings.bodyArmor
elseif componentId == 10 then
return genderSettings.decals
elseif componentId == 11 then
return genderSettings.jackets
end
return {}
end
local function propBlacklistMap(gender, propId)
local genderSettings = Config.Blacklist[gender].props
if propId == 0 then
return genderSettings.hats
elseif propId == 1 then
return genderSettings.glasses
elseif propId == 2 then
return genderSettings.ear
elseif propId == 6 then
return genderSettings.watches
elseif propId == 7 then
return genderSettings.bracelets
end
return {}
end
local function getComponentSettings(ped, componentId)
local drawableId = GetPedDrawableVariation(ped, componentId)
local gender = client.getPedDecorationType()
local blacklistSettings = {
drawables = {},
textures = {}
}
if client.isPedFreemodeModel(ped) then
blacklistSettings = filterBlacklistSettings(componentBlacklistMap(gender, componentId), drawableId)
end
return {
component_id = componentId,
drawable = {
min = 0,
max = GetNumberOfPedDrawableVariations(ped, componentId) - 1
},
texture = {
min = 0,
max = GetNumberOfPedTextureVariations(ped, componentId, drawableId) - 1
},
blacklist = blacklistSettings
}
end
client.getComponentSettings = getComponentSettings
local function getPropSettings(ped, propId)
local drawableId = GetPedPropIndex(ped, propId)
local gender = client.getPedDecorationType()
local blacklistSettings = {
drawables = {},
textures = {}
}
if client.isPedFreemodeModel(ped) then
blacklistSettings = filterBlacklistSettings(propBlacklistMap(gender, propId), drawableId)
end
local settings = {
prop_id = propId,
drawable = {
min = -1,
max = GetNumberOfPedPropDrawableVariations(ped, propId) - 1
},
texture = {
min = -1,
max = GetNumberOfPedPropTextureVariations(ped, propId, drawableId) - 1
},
blacklist = blacklistSettings
}
return settings
end
client.getPropSettings = getPropSettings
local function getHairSettings(ped)
local colors = getRgbColors()
local gender = client.getPedDecorationType()
local blacklistSettings = {
drawables = {},
textures = {}
}
if client.isPedFreemodeModel(ped) then
blacklistSettings = filterBlacklistSettings(Config.Blacklist[gender].hair, GetPedDrawableVariation(ped, 2))
end
local settings = {
style = {
min = 0,
max = GetNumberOfPedDrawableVariations(ped, 2) - 1
},
color = {
items = colors.hair
},
highlight = {
items = colors.hair
},
texture = {
min = 0,
max = GetNumberOfPedTextureVariations(ped, 2, GetPedDrawableVariation(ped, 2)) - 1
},
blacklist = blacklistSettings
}
return settings
end
client.getHairSettings = getHairSettings
local function getAppearanceSettings()
local ped = {
model = {
items = filterPedModelsForPlayer(Config.Peds.pedConfig)
}
}
local tattoos = {
items = filterTattoosByGender(Config.Tattoos),
opacity = {
min = 0.1,
max = 1,
factor = 0.1,
}
}
local components = {}
for i = 1, #constants.PED_COMPONENTS_IDS do
components[i] = getComponentSettings(cache.ped, constants.PED_COMPONENTS_IDS[i])
end
local props = {}
for i = 1, #constants.PED_PROPS_IDS do
props[i] = getPropSettings(cache.ped, constants.PED_PROPS_IDS[i])
end
local headBlend = {
shapeFirst = {
min = 0,
max = 45
},
shapeSecond = {
min = 0,
max = 45
},
shapeThird = {
min = 0,
max = 45
},
skinFirst = {
min = 0,
max = 45
},
skinSecond = {
min = 0,
max = 45
},
skinThird = {
min = 0,
max = 45
},
shapeMix = {
min = 0,
max = 1,
factor = 0.1,
},
skinMix = {
min = 0,
max = 1,
factor = 0.1,
},
thirdMix = {
min = 0,
max = 1,
factor = 0.1,
}
}
local size = #constants.FACE_FEATURES
local faceFeatures = table.create(0, size)
for i = 1, size do
local feature = constants.FACE_FEATURES[i]
faceFeatures[feature] = { min = -1, max = 1, factor = 0.1}
end
local colors = getRgbColors()
local colorMap = {
beard = colors.hair,
eyebrows = colors.hair,
chestHair = colors.hair,
makeUp = colors.makeUp,
blush = colors.makeUp,
lipstick = colors.makeUp,
}
size = #constants.HEAD_OVERLAYS
local headOverlays = table.create(0, size)
for i = 1, size do
local overlay = constants.HEAD_OVERLAYS[i]
local settings = {
style = {
min = 0,
max = GetPedHeadOverlayNum(i - 1) - 1
},
opacity = {
min = 0,
max = 1,
factor = 0.1,
}
}
if colorMap[overlay] then
settings.color = {
items = colorMap[overlay]
}
end
headOverlays[overlay] = settings
end
local eyeColor = {
min = 0,
max = 30
}
return {
ped = ped,
components = components,
props = props,
headBlend = headBlend,
faceFeatures = faceFeatures,
headOverlays = headOverlays,
hair = getHairSettings(cache.ped),
eyeColor = eyeColor,
tattoos = tattoos
}
end
client.getAppearanceSettings = getAppearanceSettings
local config
function client.getConfig() return config end
local isCameraInterpolating
local currentCamera
local cameraHandle
local function setCamera(key)
if not isCameraInterpolating then
if key ~= "current" then
currentCamera = key
end
local coords, point = table.unpack(constants.CAMERAS[currentCamera])
local reverseFactor = reverseCamera and -1 or 1
if cameraHandle then
local camCoords = GetOffsetFromEntityInWorldCoords(cache.ped, coords.x * reverseFactor, coords.y * reverseFactor, coords.z * reverseFactor)
local camPoint = GetOffsetFromEntityInWorldCoords(cache.ped, point.x, point.y, point.z)
local tmpCamera = CreateCameraWithParams("DEFAULT_SCRIPTED_CAMERA", camCoords.x, camCoords.y, camCoords.z, 0.0, 0.0, 0.0, 49.0, false, 0)
PointCamAtCoord(tmpCamera, camPoint.x, camPoint.y, camPoint.z)
SetCamActiveWithInterp(tmpCamera, cameraHandle, 1000, 1, 1)
isCameraInterpolating = true
CreateThread(function()
repeat Wait(500)
until not IsCamInterpolating(cameraHandle) and IsCamActive(tmpCamera)
DestroyCam(cameraHandle, false)
cameraHandle = tmpCamera
isCameraInterpolating = false
end)
else
local camCoords = GetOffsetFromEntityInWorldCoords(cache.ped, coords.x, coords.y, coords.z)
local camPoint = GetOffsetFromEntityInWorldCoords(cache.ped, point.x, point.y, point.z)
cameraHandle = CreateCameraWithParams("DEFAULT_SCRIPTED_CAMERA", camCoords.x, camCoords.y, camCoords.z, 0.0, 0.0, 0.0, 49.0, false, 0)
PointCamAtCoord(cameraHandle, camPoint.x, camPoint.y, camPoint.z)
SetCamActive(cameraHandle, true)
end
end
end
client.setCamera = setCamera
function client.rotateCamera(direction)
if not isCameraInterpolating then
local coords, point = table.unpack(constants.CAMERAS[currentCamera])
local offset = constants.OFFSETS[currentCamera]
local sideFactor = direction == "left" and 1 or -1
local reverseFactor = reverseCamera and -1 or 1
local camCoords = GetOffsetFromEntityInWorldCoords(
cache.ped,
(coords.x + offset.x) * sideFactor * reverseFactor,
(coords.y + offset.y) * reverseFactor,
coords.z
)
local camPoint = GetOffsetFromEntityInWorldCoords(cache.ped, point.x, point.y, point.z)
local tmpCamera = CreateCameraWithParams("DEFAULT_SCRIPTED_CAMERA", camCoords.x, camCoords.y, camCoords.z, 0.0, 0.0, 0.0, 49.0, false, 0)
PointCamAtCoord(tmpCamera, camPoint.x, camPoint.y, camPoint.z)
SetCamActiveWithInterp(tmpCamera, cameraHandle, 1000, 1, 1)
isCameraInterpolating = true
CreateThread(function()
repeat Wait(500)
until not IsCamInterpolating(cameraHandle) and IsCamActive(tmpCamera)
DestroyCam(cameraHandle, false)
cameraHandle = tmpCamera
isCameraInterpolating = false
end)
end
end
local playerCoords
local function pedTurn(ped, angle)
reverseCamera = not reverseCamera
local sequenceTaskId = OpenSequenceTask()
if sequenceTaskId then
TaskGoStraightToCoord(0, playerCoords.x, playerCoords.y, playerCoords.z, 8.0, -1, GetEntityHeading(ped) - angle, 0.1)
TaskStandStill(0, -1)
CloseSequenceTask(sequenceTaskId)
ClearPedTasks(ped)
TaskPerformSequence(ped, sequenceTaskId)
ClearSequenceTask(sequenceTaskId)
end
end
client.pedTurn = pedTurn
local function wearClothes(data, typeClothes)
local dataClothes = constants.DATA_CLOTHES[typeClothes]
local animationsOn = dataClothes.animations.on
local components = dataClothes.components[client.getPedDecorationType()]
local appliedComponents = data.components
local props = dataClothes.props[client.getPedDecorationType()]
local appliedProps = data.props
RequestAnimDict(animationsOn.dict)
while not HasAnimDictLoaded(animationsOn.dict) do
Wait(0)
end
for i = 1, #components do
local componentId = components[i][1]
for j = 1, #appliedComponents do
local applied = appliedComponents[j]
if applied.component_id == componentId then
SetPedComponentVariation(cache.ped, componentId, applied.drawable, applied.texture, 2)
end
end
end
for i = 1, #props do
local propId = props[i][1]
for j = 1, #appliedProps do
local applied = appliedProps[j]
if applied.prop_id == propId then
SetPedPropIndex(cache.ped, propId, applied.drawable, applied.texture, true)
end
end
end
TaskPlayAnim(cache.ped, animationsOn.dict, animationsOn.anim, 3.0, 3.0, animationsOn.duration, animationsOn.move, 0, false, false, false)
end
client.wearClothes = wearClothes
local function removeClothes(typeClothes)
local dataClothes = constants.DATA_CLOTHES[typeClothes]
local animationsOff = dataClothes.animations.off
local components = dataClothes.components[client.getPedDecorationType()]
local props = dataClothes.props[client.getPedDecorationType()]
RequestAnimDict(animationsOff.dict)
while not HasAnimDictLoaded(animationsOff.dict) do
Wait(0)
end
for i = 1, #components do
local component = components[i]
SetPedComponentVariation(cache.ped, component[1], component[2], 0, 2)
end
for i = 1, #props do
ClearPedProp(cache.ped, props[i][1])
end
TaskPlayAnim(cache.ped, animationsOff.dict, animationsOff.anim, 3.0, 3.0, animationsOff.duration, animationsOff.move, 0, false, false, false)
end
client.removeClothes = removeClothes
local playerHeading
function client.getHeading() return playerHeading end
local callback
function client.startPlayerCustomization(cb, conf)
repeat Wait(0) until IsScreenFadedIn() and not IsPlayerTeleportActive() and not IsPlayerSwitchInProgress()
playerAppearance = client.getPedAppearance(cache.ped)
playerCoords = GetEntityCoords(cache.ped, true)
playerHeading = GetEntityHeading(cache.ped)
BackupPlayerStats()
callback = cb
config = conf
reverseCamera = false
isCameraInterpolating = false
setCamera("default")
SetNuiFocus(true, true)
SetNuiFocusKeepInput(false)
RenderScriptCams(true, false, 0, true, true)
SetEntityInvincible(cache.ped, Config.InvincibleDuringCustomization)
TaskStandStill(cache.ped, -1)
if Config.HideRadar then DisplayRadar(false) end
SendNuiMessage(json.encode({
type = "appearance_display",
payload = {
asynchronous = Config.AsynchronousLoading
}
}))
end
function client.exitPlayerCustomization(appearance)
RenderScriptCams(false, false, 0, true, true)
DestroyCam(cameraHandle, false)
SetNuiFocus(false, false)
if Config.HideRadar then DisplayRadar(true) end
ClearPedTasksImmediately(cache.ped)
SetEntityInvincible(cache.ped, false)
SendNuiMessage(json.encode({
type = "appearance_hide",
payload = {}
}))
if not appearance then
client.setPlayerAppearance(getAppearance())
else
client.setPedTattoos(cache.ped, appearance.tattoos)
end
RestorePlayerStats()
if callback then
callback(appearance)
end
callback = nil
config = nil
playerAppearance = nil
playerCoords = nil
cameraHandle = nil
currentCamera = nil
reverseCamera = nil
isCameraInterpolating = nil
end
AddEventHandler("onResourceStop", function(resource)
if resource == GetCurrentResourceName() then
SetNuiFocus(false, false)
SetNuiFocusKeepInput(false)
end
end)
exports("startPlayerCustomization", client.startPlayerCustomization)

View File

@ -0,0 +1,136 @@
local client = client
RegisterNUICallback("appearance_get_locales", function(_, cb)
cb(Locales[GetConvar("illenium-appearance:locale", "en")].UI)
end)
RegisterNUICallback("appearance_get_settings", function(_, cb)
cb({ appearanceSettings = client.getAppearanceSettings() })
end)
RegisterNUICallback("appearance_get_data", function(_, cb)
Wait(250)
local appearanceData = client.getAppearance()
if appearanceData.tattoos then
client.setPedTattoos(cache.ped, appearanceData.tattoos)
end
cb({ config = client.getConfig(), appearanceData = appearanceData })
end)
RegisterNUICallback("appearance_set_camera", function(camera, cb)
cb(1)
client.setCamera(camera)
end)
RegisterNUICallback("appearance_turn_around", function(_, cb)
cb(1)
client.pedTurn(cache.ped, 180.0)
end)
RegisterNUICallback("appearance_rotate_camera", function(direction, cb)
cb(1)
client.rotateCamera(direction)
end)
RegisterNUICallback("appearance_change_model", function(model, cb)
local playerPed = client.setPlayerModel(model)
SetEntityHeading(cache.ped, client.getHeading())
SetEntityInvincible(playerPed, true)
TaskStandStill(playerPed, -1)
cb({
appearanceSettings = client.getAppearanceSettings(),
appearanceData = client.getPedAppearance(playerPed)
})
end)
RegisterNUICallback("appearance_change_component", function(component, cb)
client.setPedComponent(cache.ped, component)
cb(client.getComponentSettings(cache.ped, component.component_id))
end)
RegisterNUICallback("appearance_change_prop", function(prop, cb)
client.setPedProp(cache.ped, prop)
cb(client.getPropSettings(cache.ped, prop.prop_id))
end)
RegisterNUICallback("appearance_change_head_blend", function(headBlend, cb)
cb(1)
client.setPedHeadBlend(cache.ped, headBlend)
end)
RegisterNUICallback("appearance_change_face_feature", function(faceFeatures, cb)
cb(1)
client.setPedFaceFeatures(cache.ped, faceFeatures)
end)
RegisterNUICallback("appearance_change_head_overlay", function(headOverlays, cb)
cb(1)
client.setPedHeadOverlays(cache.ped, headOverlays)
end)
RegisterNUICallback("appearance_change_hair", function(hair, cb)
client.setPedHair(cache.ped, hair)
cb(client.getHairSettings(cache.ped))
end)
RegisterNUICallback("appearance_change_eye_color", function(eyeColor, cb)
cb(1)
client.setPedEyeColor(cache.ped, eyeColor)
end)
RegisterNUICallback("appearance_apply_tattoo", function(data, cb)
local paid = not data.tattoo or not Config.ChargePerTattoo or lib.callback.await("illenium-appearance:server:payForTattoo", false, data.tattoo)
if paid then
client.addPedTattoo(cache.ped, data.updatedTattoos or data)
end
cb(paid)
end)
RegisterNUICallback("appearance_preview_tattoo", function(previewTattoo, cb)
cb(1)
client.setPreviewTattoo(cache.ped, previewTattoo.data, previewTattoo.tattoo)
end)
RegisterNUICallback("appearance_delete_tattoo", function(data, cb)
cb(1)
client.removePedTattoo(cache.ped, data)
end)
RegisterNUICallback("appearance_wear_clothes", function(dataWearClothes, cb)
cb(1)
client.wearClothes(dataWearClothes.data, dataWearClothes.key)
end)
RegisterNUICallback("appearance_remove_clothes", function(clothes, cb)
cb(1)
client.removeClothes(clothes)
end)
RegisterNUICallback("appearance_save", function(appearance, cb)
cb(1)
client.wearClothes(appearance, "head")
client.wearClothes(appearance, "body")
client.wearClothes(appearance, "bottom")
client.exitPlayerCustomization(appearance)
end)
RegisterNUICallback("appearance_exit", function(_, cb)
cb(1)
client.exitPlayerCustomization()
end)
RegisterNUICallback("rotate_left", function(_, cb)
cb(1)
client.pedTurn(cache.ped, 10.0)
end)
RegisterNUICallback("rotate_right", function(_, cb)
cb(1)
client.pedTurn(cache.ped, -10.0)
end)
RegisterNUICallback("get_theme_configuration", function(_, cb)
cb(Config.Theme)
end)

View File

@ -0,0 +1,439 @@
local hashesComputed = false
local PED_TATTOOS = {}
local pedModelsByHash = {}
local function tofloat(num)
return num + 0.0
end
local function isPedFreemodeModel(ped)
local model = GetEntityModel(ped)
return model == `mp_m_freemode_01` or model == `mp_f_freemode_01`
end
local function computePedModelsByHash()
for i = 1, #Config.Peds.pedConfig do
local peds = Config.Peds.pedConfig[i].peds
for j = 1, #peds do
pedModelsByHash[joaat(peds[j])] = peds[j]
end
end
end
---@param ped number entity id
---@return string
--- Get the model name from an entity's model hash
local function getPedModel(ped)
if not hashesComputed then
computePedModelsByHash()
hashesComputed = true
end
return pedModelsByHash[GetEntityModel(ped)]
end
---@param ped number entity id
---@return table<number, table<string, number>>
local function getPedComponents(ped)
local size = #constants.PED_COMPONENTS_IDS
local components = table.create(size, 0)
for i = 1, size do
local componentId = constants.PED_COMPONENTS_IDS[i]
components[i] = {
component_id = componentId,
drawable = GetPedDrawableVariation(ped, componentId),
texture = GetPedTextureVariation(ped, componentId),
}
end
return components
end
---@param ped number entity id
---@return table<number, table<string, number>>
local function getPedProps(ped)
local size = #constants.PED_PROPS_IDS
local props = table.create(size, 0)
for i = 1, size do
local propId = constants.PED_PROPS_IDS[i]
props[i] = {
prop_id = propId,
drawable = GetPedPropIndex(ped, propId),
texture = GetPedPropTextureIndex(ped, propId),
}
end
return props
end
local function round(number, decimalPlaces)
return tonumber(string.format("%." .. (decimalPlaces or 0) .. "f", number))
end
---@param ped number entity id
---@return table <number, number>
---```
---{ shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix }
---```
local function getPedHeadBlend(ped)
-- GET_PED_HEAD_BLEND_DATA
local shapeFirst, shapeSecond, shapeThird, skinFirst, skinSecond, skinThird, shapeMix, skinMix, thirdMix = Citizen.InvokeNative(0x2746BD9D88C5C5D0, ped, Citizen.PointerValueIntInitialized(0), Citizen.PointerValueIntInitialized(0), Citizen.PointerValueIntInitialized(0), Citizen.PointerValueIntInitialized(0), Citizen.PointerValueIntInitialized(0), Citizen.PointerValueIntInitialized(0), Citizen.PointerValueFloatInitialized(0), Citizen.PointerValueFloatInitialized(0), Citizen.PointerValueFloatInitialized(0))
shapeMix = tonumber(string.sub(shapeMix, 0, 4))
if shapeMix > 1 then shapeMix = 1 end
skinMix = tonumber(string.sub(skinMix, 0, 4))
if skinMix > 1 then skinMix = 1 end
if not thirdMix then
thirdMix = 0
end
thirdMix = tonumber(string.sub(thirdMix, 0, 4))
if thirdMix > 1 then thirdMix = 1 end
return {
shapeFirst = shapeFirst,
shapeSecond = shapeSecond,
shapeThird = shapeThird,
skinFirst = skinFirst,
skinSecond = skinSecond,
skinThird = skinThird,
shapeMix = shapeMix,
skinMix = skinMix,
thirdMix = thirdMix
}
end
---@param ped number entity id
---@return table<number, table<string, number>>
local function getPedFaceFeatures(ped)
local size = #constants.FACE_FEATURES
local faceFeatures = table.create(0, size)
for i = 1, size do
local feature = constants.FACE_FEATURES[i]
faceFeatures[feature] = round(GetPedFaceFeature(ped, i-1), 1)
end
return faceFeatures
end
---@param ped number entity id
---@return table<number, table<string, number>>
local function getPedHeadOverlays(ped)
local size = #constants.HEAD_OVERLAYS
local headOverlays = table.create(0, size)
for i = 1, size do
local overlay = constants.HEAD_OVERLAYS[i]
local _, value, _, firstColor, secondColor, opacity = GetPedHeadOverlayData(ped, i-1)
if value ~= 255 then
opacity = round(opacity, 1)
else
value = 0
opacity = 0
end
headOverlays[overlay] = {style = value, opacity = opacity, color = firstColor, secondColor = secondColor}
end
return headOverlays
end
---@param ped number entity id
---@return table<string, number>
local function getPedHair(ped)
return {
style = GetPedDrawableVariation(ped, 2),
color = GetPedHairColor(ped),
highlight = GetPedHairHighlightColor(ped),
texture = GetPedTextureVariation(ped, 2)
}
end
local function getPedDecorationType()
local pedModel = GetEntityModel(cache.ped)
local decorationType
if pedModel == `mp_m_freemode_01` then
decorationType = "male"
elseif pedModel == `mp_f_freemode_01` then
decorationType = "female"
else
decorationType = IsPedMale(cache.ped) and "male" or "female"
end
return decorationType
end
local function getPedAppearance(ped)
local eyeColor = GetPedEyeColor(ped)
return {
model = getPedModel(ped) or "mp_m_freemode_01",
headBlend = getPedHeadBlend(ped),
faceFeatures = getPedFaceFeatures(ped),
headOverlays = getPedHeadOverlays(ped),
components = getPedComponents(ped),
props = getPedProps(ped),
hair = getPedHair(ped),
tattoos = client.getPedTattoos(),
eyeColor = eyeColor < #constants.EYE_COLORS and eyeColor or 0
}
end
local function setPlayerModel(model)
if type(model) == "string" then model = joaat(model) end
if IsModelInCdimage(model) then
RequestModel(model)
while not HasModelLoaded(model) do Wait(0) end
SetPlayerModel(cache.playerId, model)
Wait(150)
SetModelAsNoLongerNeeded(model)
if isPedFreemodeModel(cache.ped) then
SetPedDefaultComponentVariation(cache.ped)
-- Check if the model is male or female, then change the face mix based on this.
if model == `mp_m_freemode_01` then
SetPedHeadBlendData(cache.ped, 0, 0, 0, 0, 0, 0, 0, 0, 0, false)
elseif model == `mp_f_freemode_01` then
SetPedHeadBlendData(cache.ped, 45, 21, 0, 20, 15, 0, 0.3, 0.1, 0, false)
end
end
PED_TATTOOS = {}
return cache.ped
end
return cache.playerId
end
local function setPedHeadBlend(ped, headBlend)
if headBlend and isPedFreemodeModel(ped) then
SetPedHeadBlendData(ped, headBlend.shapeFirst, headBlend.shapeSecond, headBlend.shapeThird, headBlend.skinFirst, headBlend.skinSecond, headBlend.skinThird, tofloat(headBlend.shapeMix or 0), tofloat(headBlend.skinMix or 0), tofloat(headBlend.thirdMix or 0), false)
end
end
local function setPedFaceFeatures(ped, faceFeatures)
if faceFeatures then
for k, v in pairs(constants.FACE_FEATURES) do
SetPedFaceFeature(ped, k-1, tofloat(faceFeatures[v]))
end
end
end
local function setPedHeadOverlays(ped, headOverlays)
if headOverlays then
for k, v in pairs(constants.HEAD_OVERLAYS) do
local headOverlay = headOverlays[v]
SetPedHeadOverlay(ped, k-1, headOverlay.style, tofloat(headOverlay.opacity))
if headOverlay.color then
local colorType = 1
if v == "blush" or v == "lipstick" or v == "makeUp" then
colorType = 2
end
SetPedHeadOverlayColor(ped, k-1, colorType, headOverlay.color, headOverlay.secondColor)
end
end
end
end
local function applyAutomaticFade(ped, style)
local gender = getPedDecorationType()
local hairDecoration = constants.HAIR_DECORATIONS[gender][style]
if(hairDecoration) then
AddPedDecorationFromHashes(ped, hairDecoration[1], hairDecoration[2])
end
end
local function setTattoos(ped, tattoos, style)
local isMale = client.getPedDecorationType() == "male"
ClearPedDecorations(ped)
if Config.AutomaticFade then
tattoos["ZONE_HAIR"] = {}
PED_TATTOOS["ZONE_HAIR"] = {}
applyAutomaticFade(ped, style or GetPedDrawableVariation(ped, 2))
end
for k in pairs(tattoos) do
for i = 1, #tattoos[k] do
local tattoo = tattoos[k][i]
local tattooGender = isMale and tattoo.hashMale or tattoo.hashFemale
for _ = 1, (tattoo.opacity or 0.1) * 10 do
AddPedDecorationFromHashes(ped, joaat(tattoo.collection), joaat(tattooGender))
end
end
end
if Config.RCoreTattoosCompatibility then
TriggerEvent("rcore_tattoos:applyOwnedTattoos")
end
end
local function setPedHair(ped, hair, tattoos)
if hair then
SetPedComponentVariation(ped, 2, hair.style, hair.texture, 0)
SetPedHairColor(ped, hair.color, hair.highlight)
if isPedFreemodeModel(ped) then
setTattoos(ped, tattoos or PED_TATTOOS, hair.style)
end
end
end
local function setPedEyeColor(ped, eyeColor)
if eyeColor then
SetPedEyeColor(ped, eyeColor)
end
end
local function setPedComponent(ped, component)
if component then
if isPedFreemodeModel(ped) and (component.component_id == 0 or component.component_id == 2) then
return
end
SetPedComponentVariation(ped, component.component_id, component.drawable, component.texture, 0)
end
end
local function setPedComponents(ped, components)
if components then
for _, v in pairs(components) do
setPedComponent(ped, v)
end
end
end
local function setPedProp(ped, prop)
if prop then
if prop.drawable == -1 then
ClearPedProp(ped, prop.prop_id)
else
SetPedPropIndex(ped, prop.prop_id, prop.drawable, prop.texture, false)
end
end
end
local function setPedProps(ped, props)
if props then
for _, v in pairs(props) do
setPedProp(ped, v)
end
end
end
local function setPedTattoos(ped, tattoos)
PED_TATTOOS = tattoos
setTattoos(ped, tattoos)
end
local function getPedTattoos()
return PED_TATTOOS
end
local function addPedTattoo(ped, tattoos)
setTattoos(ped, tattoos)
end
local function removePedTattoo(ped, tattoos)
setTattoos(ped, tattoos)
end
local function setPreviewTattoo(ped, tattoos, tattoo)
local isMale = client.getPedDecorationType() == "male"
local tattooGender = isMale and tattoo.hashMale or tattoo.hashFemale
ClearPedDecorations(ped)
for _ = 1, (tattoo.opacity or 0.1) * 10 do
AddPedDecorationFromHashes(ped, joaat(tattoo.collection), tattooGender)
end
for k in pairs(tattoos) do
for i = 1, #tattoos[k] do
local aTattoo = tattoos[k][i]
if aTattoo.name ~= tattoo.name then
local aTattooGender = isMale and aTattoo.hashMale or aTattoo.hashFemale
for _ = 1, (aTattoo.opacity or 0.1) * 10 do
AddPedDecorationFromHashes(ped, joaat(aTattoo.collection), joaat(aTattooGender))
end
end
end
end
if Config.AutomaticFade then
applyAutomaticFade(ped, GetPedDrawableVariation(ped, 2))
end
end
local function setPedAppearance(ped, appearance)
if appearance then
setPedComponents(ped, appearance.components)
setPedProps(ped, appearance.props)
if appearance.headBlend and isPedFreemodeModel(ped) then setPedHeadBlend(ped, appearance.headBlend) end
if appearance.faceFeatures then setPedFaceFeatures(ped, appearance.faceFeatures) end
if appearance.headOverlays then setPedHeadOverlays(ped, appearance.headOverlays) end
if appearance.hair then setPedHair(ped, appearance.hair, appearance.tattoos) end
if appearance.eyeColor then setPedEyeColor(ped, appearance.eyeColor) end
if appearance.tattoos then setPedTattoos(ped, appearance.tattoos) end
end
end
local function setPlayerAppearance(appearance)
if appearance then
setPlayerModel(appearance.model)
setPedAppearance(cache.ped, appearance)
end
end
exports("getPedModel", getPedModel)
exports("getPedComponents", getPedComponents)
exports("getPedProps", getPedProps)
exports("getPedHeadBlend", getPedHeadBlend)
exports("getPedFaceFeatures", getPedFaceFeatures)
exports("getPedHeadOverlays", getPedHeadOverlays)
exports("getPedHair", getPedHair)
exports("getPedAppearance", getPedAppearance)
exports("setPlayerModel", setPlayerModel)
exports("setPedHeadBlend", setPedHeadBlend)
exports("setPedFaceFeatures", setPedFaceFeatures)
exports("setPedHeadOverlays", setPedHeadOverlays)
exports("setPedHair", setPedHair)
exports("setPedEyeColor", setPedEyeColor)
exports("setPedComponent", setPedComponent)
exports("setPedComponents", setPedComponents)
exports("setPedProp", setPedProp)
exports("setPedProps", setPedProps)
exports("setPlayerAppearance", setPlayerAppearance)
exports("setPedAppearance", setPedAppearance)
exports("setPedTattoos", setPedTattoos)
client = {
getPedAppearance = getPedAppearance,
setPlayerModel = setPlayerModel,
setPedHeadBlend = setPedHeadBlend,
setPedFaceFeatures = setPedFaceFeatures,
setPedHair = setPedHair,
setPedHeadOverlays = setPedHeadOverlays,
setPedEyeColor = setPedEyeColor,
setPedComponent = setPedComponent,
setPedProp = setPedProp,
setPlayerAppearance = setPlayerAppearance,
setPedAppearance = setPedAppearance,
getPedDecorationType = getPedDecorationType,
isPedFreemodeModel = isPedFreemodeModel,
setPreviewTattoo = setPreviewTattoo,
setPedTattoos = setPedTattoos,
getPedTattoos = getPedTattoos,
addPedTattoo = addPedTattoo,
removePedTattoo = removePedTattoo,
getPedModel = getPedModel,
setPedComponents = setPedComponents,
setPedProps = setPedProps,
getPedComponents = getPedComponents,
getPedProps = getPedProps
}

View File

@ -0,0 +1,367 @@
Locales["ar"] = {
UI = {
modal = {
save = {
title = "حفظ",
description = ""
},
exit = {
title = "خروج",
description = "لن يتم حفظ شيء"
},
accept = "نعم",
decline = "لا"
},
ped = {
title = "الشكل",
model = "النوع"
},
headBlend = {
title = "شكلك",
shape = {
title = "الوجه",
firstOption = "الاب",
secondOption = "الام",
mix = "خلط"
},
skin = {
title = "سكين",
firstOption = "الاب",
secondOption = "الام",
mix = "خلط"
},
race = {
title = "رايس",
shape = "الشكل",
skin = "سكين",
mix = "خلط"
}
},
faceFeatures = {
title = "ملامح الوجه",
nose = {
title = "الأنف",
width = "عرض",
height = "طول",
size = "حجم",
boneHeight = "ارتفاع العظام",
boneTwist = "تطور العظام",
peakHeight = "ذروة الارتفاع"
},
eyebrows = {
title = "الحواجب",
height = "ارتفاع",
depth = "عمق"
},
cheeks = {
title = "الفحوصات",
boneHeight = "ارتفاع العظام",
boneWidth = "عرض العظام",
width = "عرض"
},
eyesAndMouth = {
title = "العيون والفم",
eyesOpening = "فتح العيون",
lipsThickness = "سمك الشفاه"
},
jaw = {
title = "فك",
width = "عرض",
size = "بحجم"
},
chin = {
title = "ذقن",
lowering = "عرض",
length = "طول",
size = "حجم",
hole = "الحفرة"
},
neck = {
title = "رقبه",
thickness = "سماكة"
}
},
headOverlays = {
title = "المظهر",
hair = {
title = "شعر",
style = "النوع",
color = "اللون",
highlight = "التسليط",
texture = "نَسِيج",
fade = "نزول"
},
opacity = "الغضب",
style = "النوع",
color = "اللون",
secondColor = "اللون الثانوي",
blemishes = "العيوب",
beard = "اللحية",
eyebrows = "الحواجب",
ageing = "شيخوخة",
makeUp = "ميك أب",
blush = "احمر خدود",
complexion = "بشرة",
sunDamage = "اشعه الشمس",
lipstick = "أحمر الشفاه",
moleAndFreckles = "النمش",
chestHair = "شعر الصدر",
bodyBlemishes = "عيوب الجسم",
eyeColor = "لون العيون"
},
components = {
title = "ملابس",
drawable = "الظهور",
texture = "الشكل",
mask = "قناع",
upperBody = "اليدين",
lowerBody = "أرجل",
bags = "الحقائب والمظلة",
shoes = "أحذية",
scarfAndChains = "وشاح والسلاسل",
shirt = "قميص",
bodyArmor = "الدروع الواقية",
decals = "شارات",
jackets = "السترات",
head = "رأس"
},
props = {
title = "الاضافات",
drawable = "الظهور",
texture = "الشكل",
hats = "القبعات والخوذات",
glasses = "نظارات",
ear = "أذن",
watches = "ساعات",
bracelets = "الأساور"
},
tattoos = {
title = "الوشم",
items = {
ZONE_TORSO = "الشكل",
ZONE_HEAD = "رأس",
ZONE_LEFT_ARM = "اليد الايسر",
ZONE_RIGHT_ARM = "اليد الايسر",
ZONE_LEFT_LEG = "الساق اليسرى",
ZONE_RIGHT_LEG = "الساق اليمنى"
},
apply = "تأكيد",
delete = "حدف",
deleteAll = "حدف كل الوشم",
opacity = "الغضب"
}
},
outfitManagement = {
title = "إدارة المظاهر",
jobText = "إدارة المظاهر للوظيفة",
gangText = "إدارة المظاهر للعصابة"
},
cancelled = {
title = "إلغاء التخصيص",
description = "لم يتم حفظ التخصيص"
},
outfits = {
import = {
title = "أدخل رمز المظهر",
menuTitle = "استيراد المظهر",
description = "استيراد مظهر من رمز المشاركة",
name = {
label = "تسمية المظهر",
placeholder = "مظهر جميل",
default = "المظهر المستورد"
},
code = {
label = "رمز المظهر"
},
success = {
title = "تم استيراد المظهر",
description = "يمكنك الآن تغيير المظهر باستخدام قائمة المظاهر"
},
failure = {
title = "فشل الاستيراد",
description = "رمز المظهر غير صحيح"
}
},
generate = {
title = "إنشاء رمز المظهر",
description = "إنشاء رمز مظهر للمشاركة",
failure = {
title = "حدث خطأ ما",
description = "فشل إنشاء الرمز للمظهر"
},
success = {
title = "تم إنشاء رمز المظهر",
description = "هذا رمز مظهرك"
}
},
save = {
menuTitle = "حفظ المظهر الحالي",
menuDescription = "حفظ مظهرك الحالي كمظهر %s",
description = "حفظ مظهرك الحالي",
title = "تسمية مظهرك",
managementTitle = "تفاصيل إدارة المظهر",
name = {
label = "اسم المظهر",
placeholder = "مظهر رائع جداً"
},
gender = {
label = "الجنس",
male = "ذكر",
female = "أنثى"
},
rank = {
label = "الرتبة الأدنى"
},
failure = {
title = "فشل الحفظ",
description = "يوجد مظهر بنفس الاسم بالفعل"
},
success = {
title = "نجاح",
description = "تم حفظ المظهر %s"
}
},
update = {
title = "تحديث المظهر",
description = "حفظ ملابسك الحالية إلى مظهر موجود",
failure = {
title = "فشل التحديث",
description = "هذا المظهر غير موجود"
},
success = {
title = "نجاح",
description = "تم تحديث المظهر %s"
}
},
change = {
title = "تغيير المظهر",
description = "اختر من أي من مظاهرك المحفوظة حالياً %s",
pDescription = "اختر من أي من مظاهرك المحفوظة حالياً",
failure = {
title = "حدث خطأ ما",
description = "المظهر الذي تحاول تغييره ليس لديه مظهر أساسي",
}
},
delete = {
title = "حذف المظهر",
description = "حذف مظهر %s محفوظ",
mDescription = "حذف أي من مظاهرك المحفوظة",
item = {
title = 'حذف "%s"',
description = "نموذج: %s%s"
},
success = {
title = "نجاح",
description = "تم حذف المظهر"
}
},
manage = {
title = "👔 | إدارة مظاهر %s"
}
},
jobOutfits = {
title = "مظاهر العمل",
description = "اختر من أي من مظاهر العمل الخاصة بك"
},
menu = {
returnTitle = "عودة",
title = "غرفة الملابس",
outfitsTitle = "مظاهر اللاعب",
clothingShopTitle = "متجر الملابس",
barberShopTitle = "حلاق",
tattooShopTitle = "محل العلامات الجسمية",
surgeonShopTitle = "جراحة البلاستيك"
},
clothing = {
title = "شراء الملابس - $%d",
titleNoPrice = "تغيير الملابس",
options = {
title = "👔 | خيارات متجر الملابس",
description = "اختر من مجموعة واسعة من البنود للارتداء"
},
outfits = {
title = "👔 | خيارات المظاهر",
civilian = {
title = "مظهر مدني",
description = "ارتد ثيابك"
}
}
},
commands = {
reloadskin = {
title = "يجعل شخصيتك تحميل مجدداً",
failure = {
title = "خطأ",
description = "لا يمكنك استخدام reloadskin الآن"
}
},
clearstuckprops = {
title = "يزيل جميع العناصر المرفقة بالكيان",
failure = {
title = "خطأ",
description = "لا يمكنك استخدام clearstuckprops الآن"
}
},
pedmenu = {
title = "فتح / إعطاء قائمة الملابس",
failure = {
title = "خطأ",
description = "لا يوجد اللاعب على الإنترنت"
}
},
joboutfits = {
title = "يفتح قائمة أزياء العمل"
},
gangoutfits = {
title = "يفتح قائمة أزياء العصابات"
},
bossmanagedoutfits = {
title = "يفتح قائمة ملابس المدير"
}
},
textUI = {
clothing = "متجر الملابس - السعر: $%d",
barber = "حلاق - السعر: $%d",
tattoo = "محل العلامات الجسمية - السعر: $%d",
surgeon = "جراحة البلاستيك - السعر: $%d",
clothingRoom = "غرفة الملابس",
playerOutfitRoom = "المظاهر"
},
migrate = {
success = {
title = "نجاح",
description = "انتهت الهجرة. %s جلد تم تهجيرها",
descriptionSingle = "تم تهجير الجلد"
},
skip = {
title = "معلومات",
description = "تخطي الجلد"
},
typeError = {
title = "خطأ",
description = "نوع غير صحيح"
}
},
purchase = {
tattoo = {
success = {
title = "نجاح",
description = "اشتريت علامة جسم بقيمة %s$ ل %s"
},
failure = {
title = "فشل في تطبيق العلامة الجسمية",
description = "ليس لديك ما يكفي من المال!"
}
},
store = {
success = {
title = "نجاح",
description = "أعطيت $%s ل %s!"
},
failure = {
title = "استغلال!",
description = "لم يكن لديك ما يكفي من المال! حاولت أن تستغل النظام!"
}
}
}
}

View File

@ -0,0 +1,367 @@
Locales["bg"] = {
UI = {
modal = {
save = {
title = "Запазване на кустомизация",
description = "Ще бъдете запомнен грозен"
},
exit = {
title = "Изход от кустомизация",
description = "Няма да бъдат запазени промените"
},
accept = "Да",
decline = "Не"
},
ped = {
title = "Пед",
model = "Модел"
},
headBlend = {
title = "Генове",
shape = {
title = "Лице",
firstOption = "Баща",
secondOption = "Майка",
mix = "Микс"
},
skin = {
title = "Кожа",
firstOption = "Баща",
secondOption = "Майка",
mix = "Микс"
},
race = {
title = "Раса",
shape = "Вид",
skin = "Кожа",
mix = "Микс"
}
},
faceFeatures = {
title = "Характеристики на лицето",
nose = {
title = "Нос",
width = "Ширина",
height = "Височина",
size = "Размер",
boneHeight = "Кост височина",
boneTwist = "Кост усукване",
peakHeight = "Връх височина"
},
eyebrows = {
title = "Вежди",
height = "Височина",
depth = "Дълбочина"
},
cheeks = {
title = "Бузи",
boneHeight = "Кост височина",
boneWidth = "Кост ширина",
width = "Ширина"
},
eyesAndMouth = {
title = "Очи и уста",
eyesOpening = "Очи отваряне",
lipsThickness = "Устни дебелина"
},
jaw = {
title = "Челюст",
width = "Ширина",
size = "Размер"
},
chin = {
title = "Брадичка",
lowering = "Понижаване",
length = "Дължина",
size = "Размер",
hole = "Дупка размер"
},
neck = {
title = "Врат",
thickness = "Дебелина"
}
},
headOverlays = {
title = "Външен вид",
hair = {
title = "Коса",
style = "Стил",
color = "Цвят",
highlight = "Силно осветена точка",
texture = "Текстура",
fade = "Избледняване"
},
opacity = "Непрозрачност",
style = "Стил",
color = "Цвят",
secondColor = "Втори цвят",
blemishes = "Петна",
beard = "Брада",
eyebrows = "Вежди",
ageing = "Състаряване",
makeUp = "Грим",
blush = "Изчервяване",
complexion = "Тен",
sunDamage = "Увреждане от слънцето",
lipstick = "Червило",
moleAndFreckles = "Бенки и лунички",
chestHair = "Косми по гърдите",
bodyBlemishes = "Петна по тялото",
eyeColor = "Цвят на очите"
},
components = {
title = "Дрехи",
drawable = "Вид",
texture = "Текстура",
mask = "Маска",
upperBody = "Ръце",
lowerBody = "Крака",
bags = "Чанти и парашут",
shoes = "Обувки",
scarfAndChains = "Шал и вериги",
shirt = "Тениска",
bodyArmor = "Бронежилетка",
decals = "Ваденки",
jackets = "Якета",
head = "Глава"
},
props = {
title = "Обекти",
drawable = "Вид",
texture = "Текстура",
hats = "Шапки и каски",
glasses = "Очила",
ear = "Обеци",
watches = "Часовници",
bracelets = "Гривни"
},
tattoos = {
title = "Татуировки",
items = {
ZONE_TORSO = "Тяло",
ZONE_HEAD = "Глава",
ZONE_LEFT_ARM = "Лява ръка",
ZONE_RIGHT_ARM = "Дясна ръка",
ZONE_LEFT_LEG = "Ляв крак",
ZONE_RIGHT_LEG = "Десен крак"
},
apply = "Прилагане",
delete = "Премахване",
deleteAll = "Премахване на всички татуировки",
opacity = "Непрозрачност"
}
},
outfitManagement = {
title = "Управление на дрехите",
jobText = "Управление на дрехите за работа",
gangText = "Управление на дрехите за банда"
},
cancelled = {
title = "Отменена персонализация",
description = "Персонализацията не е запазена"
},
outfits = {
import = {
title = "Въведете код за дрехата",
menuTitle = "Импортиране на дрехата",
description = "Импортиране на дреха от код за споделяне",
name = {
label = "Име на дрехата",
placeholder = "Хубава дреха",
default = "Импортирана дреха"
},
code = {
label = "Код за дрехата"
},
success = {
title = "Дрехата е импортирана",
description = "Можете сега да се смените към дрехата, използвайки менюто за дрехите"
},
failure = {
title = "Грешка при импортирането",
description = "Невалиден код за дрехата"
}
},
generate = {
title = "Генериране на код за дрехата",
description = "Генериране на код за дреха за споделяне",
failure = {
title = "Нещо се обърка",
description = "Генерирането на код не бе успешно за дрехата"
},
success = {
title = "Кодът за дрехата е генериран",
description = "Ето вашия код за дрехата"
}
},
save = {
menuTitle = "Запазете текущата дреха",
menuDescription = "Запазете текущата ви дреха като %s дреха",
description = "Запазете текущата ви дреха",
title = "Именувайте вашата дреха",
managementTitle = "Управление на детайлите за дрехата",
name = {
label = "Име на дрехата",
placeholder = "Много хубава дреха"
},
gender = {
label = "Пол",
male = "Мъж",
female = "Жена"
},
rank = {
label = "Минимален ранг"
},
failure = {
title = "Запазването е неуспешно",
description = "Дреха с това име вече съществува"
},
success = {
title = "Успешно",
description = "Дреха %s е запазена"
}
},
update = {
title = "Обновяване на дреха",
description = "Запазете текущото ви дрехоподобрение в съществуваща дреха",
failure = {
title = "Обновяването е неуспешно",
description = "Тази дреха не съществува"
},
success = {
title = "Успешно",
description = "Дреха %s е обновена"
}
},
change = {
title = "Смени дрехата",
description = "Изберете от вашите запазени %s дрехи",
pDescription = "Изберете от вашите запазени дрехи",
failure = {
title = "Нещо се обърка",
description = "Дрехата, която се опитвате да смените, няма базов вид",
}
},
delete = {
title = "Изтрий дрехата",
description = "Изтрийте запазен %s дреха",
mDescription = "Изтрийте всяка от вашите запазени дрехи",
item = {
title = 'Изтрий "%s"',
description = "Модел: %s%s"
},
success = {
title = "Успех",
description = "Дрехата е изтрита"
}
},
manage = {
title = "👔 | Управлявай %s дрехи"
}
},
jobOutfits = {
title = "Работни Облекла",
description = "Изберете от всяко едно от вашите работни облекла"
},
menu = {
returnTitle = "Върни се",
title = "Облеклена Стая",
outfitsTitle = "Играчеви Облекла",
clothingShopTitle = "Магазин за Облекла",
barberShopTitle = "Магазин за Фризьорство",
tattooShopTitle = "Магазин за Татуси",
surgeonShopTitle = "Магазин за Хирургия"
},
clothing = {
title = "Купуване на Облекла - $%d",
titleNoPrice = "Смяна на Облекло",
options = {
title = "👔 | Опции на Магазина за Облекла",
description = "Изберете от голямо разнообразие на предмети за обличане"
},
outfits = {
title = "👔 | Опции на Костюмите",
civilian = {
title = "Граждански Костюм",
description = "Облечете се с вашите дрехи"
}
}
},
commands = {
reloadskin = {
title = "Презареждане на вашият персонаж",
failure = {
title = "Грешка",
description = "В момента не може да използвате reloadskin"
}
},
clearstuckprops = {
title = "Премахване на всички обекти, прикрепени към единицата",
failure = {
title = "Грешка",
description = "В момента не може да използвате clearstuckprops"
}
},
pedmenu = {
title = "Отваряне / Даване на Меню за Облекла",
failure = {
title = "Грешка",
description = "Играчът не е на линия"
}
},
joboutfits = {
title = "Отваря менюто за екипировка за работа"
},
gangoutfits = {
title = "Отваря менюто Gang Outfits"
},
bossmanagedoutfits = {
title = "Отваря менюто за управление на дрехи на шефа"
}
},
textUI = {
clothing = "Магазин за Облекла - Цена: $%d",
barber = "Фризьор - Цена: $%d",
tattoo = "Магазин за Татуси - Цена: $%d",
surgeon = "Хирург - Цена: $%d",
clothingRoom = "Облеклена Стая",
playerOutfitRoom = "Костюми на Играча"
},
migrate = {
success = {
title = "Успех",
description = "Миграцията завърши. Мигрирани са %s скина/скинове",
descriptionSingle = "Мигриран Скин"
},
skip = {
title = "Информация",
description = "Пропуснат скин"
},
typeError = {
title = "Грешка",
description = "Невалиден тип"
}
},
purchase = {
tattoo = {
success = {
title = "Успех",
description = "Купен е татус %s за %s$"
},
failure = {
title = "Неуспешно нанасяне на татус",
description = "Нямате достатъчно пари!"
}
},
store = {
success = {
title = "Успех",
description = "Дадохте $%s на %s!"
},
failure = {
title = "Експлоатация!",
description = "Нямате достатъчно пари! Опит за експлоатиране на системата!"
}
}
}
}

View File

@ -0,0 +1,367 @@
Locales["cs"] = {
UI = {
modal = {
save = {
title = "Uložit přizpůsobení",
description = "Zůstanete ošklivý/á"
},
exit = {
title = "Ukončit přizpůsobení",
description = "Změny nebudou uloženy"
},
accept = "Ano",
decline = "Ne"
},
ped = {
title = "Postava",
model = "Model"
},
headBlend = {
title = "Dědičnost",
shape = {
title = "Obličej",
firstOption = "Otec",
secondOption = "Matka",
mix = "Smíchání"
},
skin = {
title = "Kůže",
firstOption = "Otec",
secondOption = "Matka",
mix = "Smíchání"
},
race = {
title = "Rasa",
shape = "Obličej",
skin = "Kůže",
mix = "Smíchání"
}
},
faceFeatures = {
title = "Rysy obličeje",
nose = {
title = "Nos",
width = "Šířka",
height = "Výška",
size = "Velikost",
boneHeight = "Výška kosti",
boneTwist = "Otočení kosti",
peakHeight = "Výška hřbetu"
},
eyebrows = {
title = "Obočí",
height = "Výška",
depth = "Hloubka"
},
cheeks = {
title = "Tváře",
boneHeight = "Výška kosti",
boneWidth = "Šířka kosti",
width = "Šířka"
},
eyesAndMouth = {
title = "Oči a ústa",
eyesOpening = "Otevření očí",
lipsThickness = "Tloušťka rtů"
},
jaw = {
title = "Brada",
width = "Šířka",
size = "Velikost"
},
chin = {
title = "Brada",
lowering = "Snižování",
length = "Délka",
size = "Velikost",
hole = "Velikost díry"
},
neck = {
title = "Krk",
thickness = "Tloušťka"
}
},
headOverlays = {
title = "Vzhled",
hair = {
title = "Vlasy",
style = "Styl",
color = "Barva",
highlight = "Zvýraznění",
texture = "Textura",
fade = "Blednutí"
},
opacity = "Průhlednost",
style = "Styl",
color = "Barva",
secondColor = "Druhá barva",
blemishes = "Vady",
beard = "Vousy",
eyebrows = "Obočí",
ageing = "Stárnutí",
makeUp = "Líčení",
blush = "Rouge",
complexion = "Kožní vada",
sunDamage = "Poškození sluncem",
lipstick = "Rtěnka",
moleAndFreckles = "Mateřské znaménko a pihy",
chestHair = "Hrstka na hrudi",
bodyBlemishes = "Vady těla",
eyeColor = "Barva očí"
},
components = {
title = "Oblečení",
drawable = "Vykreslování",
texture = "Textura",
mask = "Maska",
upperBody = "Horní část těla",
lowerBody = "Spodní část těla",
bags = "Tašky a padáky",
shoes = "Boty",
scarfAndChains = "Šála a řetízky",
shirt = "Košile",
bodyArmor = "Tělesná zbroj",
decals = "Nálepky",
jackets = "Bundy",
head = "Hlava"
},
props = {
title = "Rekvizity",
drawable = "Vykreslování",
texture = "Textura",
hats = "Klobouky a přilby",
glasses = "Brýle",
ear = "Ucho",
watches = "Hodinky",
bracelets = "Náramky"
},
tattoos = {
title = "Tetování",
items = {
ZONE_TORSO = "Tělo",
ZONE_HEAD = "Hlava",
ZONE_LEFT_ARM = "Levá paže",
ZONE_RIGHT_ARM = "Pravá paže",
ZONE_LEFT_LEG = "Levá noha",
ZONE_RIGHT_LEG = "Pravá noha"
},
apply = "Aplikovat",
delete = "Odstranit",
deleteAll = "Odstranit všechna tetování",
opacity = "Průhlednost"
}
},
outfitManagement = {
title = "Správa oděvů",
jobText = "Spravujte oděvy pro práci",
gangText = "Spravujte oděvy pro gang"
},
cancelled = {
title = "Zrušené přizpůsobení",
description = "Přizpůsobení neuloženo"
},
outfits = {
import = {
title = "Zadat kód oděvu",
menuTitle = "Importovat oděv",
description = "Importovat oděv pomocí sdíleného kódu",
name = {
label = "Pojmenujte oděv",
placeholder = "Pěkný oděv",
default = "Importovaný oděv"
},
code = {
label = "Kód oděvu"
},
success = {
title = "Oděv importován",
description = "Nyní můžete změnit oděv pomocí menu oděvů"
},
failure = {
title = "Chyba importu",
description = "Neplatný kód oděvu"
}
},
generate = {
title = "Generovat kód oděvu",
description = "Generovat kód oděvu pro sdílení",
failure = {
title = "Něco se pokazilo",
description = "Generace kódu oděvu selhala"
},
success = {
title = "Kód oděvu vygenerován",
description = "Zde je váš kód oděvu"
}
},
save = {
menuTitle = "Uložit aktuální oděv",
menuDescription = "Uložit aktuální oděv jako %s oděv",
description = "Uložit aktuální oděv",
title = "Pojmenujte svůj oděv",
managementTitle = "Podrobnosti o uloženém oděvu",
name = {
label = "Název oděvu",
placeholder = "Velmi pěkný oděv"
},
gender = {
label = "Pohlaví",
male = "Muž",
female = "Žena"
},
rank = {
label = "Minimální hodnost"
},
failure = {
title = "Uložení selhalo",
description = "Oděv s tímto názvem již existuje"
},
success = {
title = "Úspěch",
description = "Oděv %s byl uložen"
}
},
update = {
title = "Aktualizovat oděv",
description = "Uložit aktuální oblečení do existujícího oděvu",
failure = {
title = "Aktualizace selhala",
description = "Tento oděv neexistuje"
},
success = {
title = "Úspěch",
description = "Oděv %s byl aktualizován"
}
},
change = {
title = "Změnit oděv",
description = "Vyberte si ze svých aktuálně uložených %s oděvů",
pDescription = "Vyberte si ze svých aktuálně uložených oděvů",
failure = {
title = "Něco se pokazilo",
description = "Oděv, který se pokoušíte změnit, nemá základní vzhled",
}
},
delete = {
title = "Smazat oděv",
description = "Smazat uložený %s oděv",
mDescription = "Smazat libovolný uložený oděv",
item = {
title = 'Smazat "%s"',
description = "Model: %s%s"
},
success = {
title = "Úspěch",
description = "Oděv byl smazán"
}
},
manage = {
title = "👔 | Spravovat %s oděvů"
}
},
jobOutfits = {
title = "Pracovní oděvy",
description = "Vyberte si z vašich pracovních oděvů"
},
menu = {
returnTitle = "Zpět",
title = "Místnost s oblečením",
outfitsTitle = "Oděvy hráče",
clothingShopTitle = "Obchod s oblečením",
barberShopTitle = "Holičství",
tattooShopTitle = "Tattoo Studio",
surgeonShopTitle = "Plastická chirurgie"
},
clothing = {
title = "Nákup oblečení - $%d",
titleNoPrice = "Změna oblečení",
options = {
title = "👔 | Možnosti obchodu s oblečením",
description = "Vyberte si z široké škály položek k nošení"
},
outfits = {
title = "👔 | Možnosti oděvů",
civilian = {
title = "Civilní oděv",
description = "Oblečte se"
}
}
},
commands = {
reloadskin = {
title = "Obnovení vaší postavy",
failure = {
title = "Chyba",
description = "Nemůžete použít příkaz 'reloadskin' v tuto chvíli"
}
},
clearstuckprops = {
title = "Odstranění všech připevněných rekvizit k entitě",
failure = {
title = "Chyba",
description = "Nemůžete použít příkaz 'clearstuckprops' v tuto chvíli"
}
},
pedmenu = {
title = "Otevřít / Dát menu oblečení",
failure = {
title = "Chyba",
description = "Hráč není online"
}
},
joboutfits = {
title = "Otevřít menu pracovních oděvů"
},
gangoutfits = {
title = "Otevřít menu oděvů gangu"
},
bossmanagedoutfits = {
title = "Otevřít menu oděvů spravovaných bossem"
}
},
textUI = {
clothing = "Obchod s oblečením - Cena: $%d",
barber = "Holičství - Cena: $%d",
tattoo = "Tattoo Studio - Cena: $%d",
surgeon = "Plastická chirurgie - Cena: $%d",
clothingRoom = "Místnost s oblečením",
playerOutfitRoom = "Oděvy hráče"
},
migrate = {
success = {
title = "Úspěch",
description = "Migrace dokončena. Migrace %s skinů dokončena",
descriptionSingle = "Migrace skinu dokončena"
},
skip = {
title = "Informace",
description = "Přeskočeno migrace skinu"
},
typeError = {
title = "Chyba",
description = "Neplatný typ"
}
},
purchase = {
tattoo = {
success = {
title = "Úspěch",
description = "Zakoupeno tetování %s za %s$"
},
failure = {
title = "Chyba aplikace tetování",
description = "Nemáte dostatek peněz!"
}
},
store = {
success = {
title = "Úspěch",
description = "Dali jste $%s komu: %s!"
},
failure = {
title = "Exploit!",
description = "Neměli jste dost peněz! Pokusili jste se zneužít systém!"
}
}
}
}

View File

@ -0,0 +1,367 @@
Locales["de"] = {
UI = {
modal = {
save = {
title = "Anpassungen speichern",
description = "Du wirst hässlich bleiben"
},
exit = {
title = "Beenden der Anpassung",
description = "Es werden keine Änderungen gespeichert"
},
accept = "Ja",
decline = "Nein"
},
ped = {
title = "Ped",
model = "Model"
},
headBlend = {
title = "Vererbung",
shape = {
title = "Gesicht",
firstOption = "Vater",
secondOption = "Mutter",
mix = "Ähnlichkeit"
},
skin = {
title = "Hautfarbe",
firstOption = "Vater",
secondOption = "Mutter",
mix = "Ähnlichkeit"
},
race = {
title = "Rasse",
shape = "Form",
skin = "Hautfarbe",
mix = "Ähnlichkeit"
}
},
faceFeatures = {
title = "Gesichtsmerkmale",
nose = {
title = "Nase",
width = "Breite",
height = "Höhe",
size = "Größe",
boneHeight = "Knochenhöhe",
boneTwist = "Knochendrehung",
peakHeight = "Höhe der Spitze"
},
eyebrows = {
title = "Augenbrauen",
height = "Höhe",
depth = "Tiefe"
},
cheeks = {
title = "Wangen",
boneHeight = "Knochenhöhe",
boneWidth = "Breite des Knochens",
width = "Breite"
},
eyesAndMouth = {
title = "Augen und Mund",
eyesOpening = "Augengröße",
lipsThickness = "Dicke der Lippen"
},
jaw = {
title = "Kiefer",
width = "Breite",
size = "Größe"
},
chin = {
title = "Kinn",
lowering = "Kinnhöhe",
length = "Kinntiefe",
size = "Größe",
hole = "Kinneinzug"
},
neck = {
title = "Hals",
thickness = "Halsumfang"
}
},
headOverlays = {
title = "Aussehen",
hair = {
title = "Haare",
style = "Stil",
color = "Farbe",
highlight = "Highlight",
texture = "Textur",
fade = "Fade"
},
opacity = "Deckkraft",
style = "Stil",
color = "Farbe",
secondColor = "Sekundärfarbe",
blemishes = "Unreinheiten",
beard = "Bart",
eyebrows = "Augenbrauen",
ageing = "Alterung",
makeUp = "Schminke",
blush = "Erröten",
complexion = "Teint",
sunDamage = "Sonnenschäden",
lipstick = "Lippenstift",
moleAndFreckles = "Muttermal und Sommersprossen",
chestHair = "Brustbehaarung",
bodyBlemishes = "Körperliche Unreinheiten",
eyeColor = "Augenfarbe"
},
components = {
title = "Kleidung",
drawable = "Nummer",
texture = "Textur",
mask = "Masken",
upperBody = "Arme",
lowerBody = "Hosen",
bags = "Taschen",
shoes = "Schuhe",
scarfAndChains = "Ketten",
shirt = "Shirts",
bodyArmor = "Westen",
decals = "Aufkleber",
jackets = "Jacken",
head = "Kopf"
},
props = {
title = "Accessoires",
drawable = "Nummer",
texture = "Textur",
hats = "Hüte und Helme",
glasses = "Brillen",
ear = "Ohrringe",
watches = "Uhren",
bracelets = "Armbänder"
},
tattoos = {
title = "Tätowierungen",
items = {
ZONE_TORSO = "Oberkörper",
ZONE_HEAD = "Kopf",
ZONE_LEFT_ARM = "Linker Arm",
ZONE_RIGHT_ARM = "Rechter Arm",
ZONE_LEFT_LEG = "Linkes Bein",
ZONE_RIGHT_LEG = "Rechtes Bein"
},
apply = "Anwenden",
delete = "Entfernen",
deleteAll = "Alle Tattoos entfernen",
opacity = "Deckkraft"
}
},
outfitManagement = {
title = "Kostümverwaltung",
jobText = "Verwalten Sie Kostüme für den Job",
gangText = "Verwalten Sie Kostüme für die Gang"
},
cancelled = {
title = "Benutzerdefinierte Anpassung abgebrochen",
description = "Anpassung nicht gespeichert"
},
outfits = {
import = {
title = "Geben Sie den Kostüm-Code ein",
menuTitle = "Kostüm importieren",
description = "Importieren Sie ein Kostüm aus einem Sharing-Code",
name = {
label = "Nennen Sie das Kostüm",
placeholder = "Ein schönes Kostüm",
default = "Importiertes Kostüm"
},
code = {
label = "Kostüm-Code"
},
success = {
title = "Kostüm importiert",
description = "Sie können jetzt das Kostüm über das Kostüm-Menü ändern"
},
failure = {
title = "Importfehler",
description = "Ungültiger Kostüm-Code"
}
},
generate = {
title = "Generiere Kostüm-Code",
description = "Generieren Sie einen Kostüm-Code zum Teilen",
failure = {
title = "Etwas ist schief gelaufen",
description = "Die Code-Generierung für das Kostüm ist fehlgeschlagen"
},
success = {
title = "Kostüm-Code generiert",
description = "Hier ist Ihr Kostüm-Code"
}
},
save = {
menuTitle = "Aktuelles Kostüm speichern",
menuDescription = "Speichern Sie Ihr aktuelles Kostüm als %s Kostüm",
description = "Speichern Sie Ihr aktuelles Kostüm",
title = "Benennen Sie Ihr Kostüm",
managementTitle = "Management Kostüm Details",
name = {
label = "Kostümname",
placeholder = "Sehr cooles Kostüm"
},
gender = {
label = "Geschlecht",
male = "Männlich",
female = "Weiblich"
},
rank = {
label = "Mindestrang"
},
failure = {
title = "Speichern fehlgeschlagen",
description = "Ein Kostüm mit diesem Namen existiert bereits"
},
success = {
title = "Erfolg",
description = "Kostüm %s wurde gespeichert"
}
},
update = {
title = "Kostüm aktualisieren",
description = "Speichern Sie Ihre aktuelle Kleidung in einem vorhandenen Kostüm",
failure = {
title = "Aktualisierung fehlgeschlagen",
description = "Dieses Kostüm existiert nicht"
},
success = {
title = "Erfolg",
description = "Kostüm %s wurde aktualisiert"
}
},
change = {
title = "Kostüm ändern",
description = "Wählen Sie eines Ihrer %s gespeicherten Kostüme aus",
pDescription = "Wählen Sie eines Ihrer gespeicherten Kostüme aus",
failure = {
title = "Etwas ist schief gelaufen",
description = "Das Kostüm, zu dem Sie wechseln möchten, hat kein Basiselement",
}
},
delete = {
title = "Kostüm löschen",
description = "Löschen Sie ein gespeichertes %s Kostüm",
mDescription = "Löschen Sie jedes Ihrer gespeicherten Kostüme",
item = {
title = 'Löschen von "%s"',
description = "Modell: %s%s"
},
success = {
title = "Erfolg",
description = "Kostüm gelöscht"
}
},
manage = {
title = "👔 | Verwalten von %s Kostümen"
}
},
jobOutfits = {
title = "Arbeitskleidung",
description = "Wählen Sie eines Ihrer Arbeitsoutfits aus"
},
menu = {
returnTitle = "Zurück",
title = "Kleiderzimmer",
outfitsTitle = "Spieler Kostüme",
clothingShopTitle = "Kleidungsgeschäft",
barberShopTitle = "Friseur",
tattooShopTitle = "Tattoo-Shop",
surgeonShopTitle = "Schönheitschirurg"
},
clothing = {
title = "Kleidung kaufen - $%d",
titleNoPrice = "Kleidung ändern",
options = {
title = "👔 | Kleidungsgeschäft-Optionen",
description = "Wählen Sie aus einer breiten Palette von Kleidungsstücken"
},
outfits = {
title = "👔 | Kostüm Optionen",
civilian = {
title = "Zivilist Kostüm",
description = "Zieh deine Kleider an"
}
}
},
commands = {
reloadskin = {
title = "Charakter wird neu geladen",
failure = {
title = "Fehler",
description = "Du kannst reloadskin im Moment nicht verwenden"
}
},
clearstuckprops = {
title = "Entfernt alle Objekte, die an der Einheit befestigt sind",
failure = {
title = "Fehler",
description = "Du kannst clearstuckprops im Moment nicht verwenden"
}
},
pedmenu = {
title = "Kleidungsmenü öffnen / geben",
failure = {
title = "Fehler",
description = "Spieler ist nicht online"
}
},
joboutfits = {
title = "Öffnet das Job-Outfits-Menü"
},
gangoutfits = {
title = "Öffnet das Gang-Outfits-Menü"
},
bossmanagedoutfits = {
title = "Öffnet das Menü für verwaltete Outfits des Chefs"
}
},
textUI = {
clothing = "Kleidungsgeschäft - Preis: $%d",
barber = "Friseur - Preis: $%d",
tattoo = "Tattoo-Shop - Preis: $%d",
surgeon = "Schönheitschirurg - Preis: $%d",
clothingRoom = "Kleiderzimmer",
playerOutfitRoom = "Kostüme"
},
migrate = {
success = {
title = "Erfolg",
description = "Migration abgeschlossen. %s Skins migriert",
descriptionSingle = "Migrierter Skin"
},
skip = {
title = "Information",
description = "Skin übersprungen"
},
typeError = {
title = "Fehler",
description = "Ungültiger Typ"
}
},
purchase = {
tattoo = {
success = {
title = "Erfolg",
description = "%s Tattoo gekauft für %s$"
},
failure = {
title = "Tattoo konnte nicht aufgetragen werden",
description = "Du hast nicht genug Geld!"
}
},
store = {
success = {
title = "Erfolg",
description = "$%s an %s gegeben!"
},
failure = {
title = "Ausnutzung!",
description = "Du hast nicht genug Geld! Versuchst das System auszunutzen!"
}
}
}
}

View File

@ -0,0 +1,367 @@
Locales["en"] = {
UI = {
modal = {
save = {
title = "Save customization",
description = "You will remain ugly"
},
exit = {
title = "Exit customization",
description = "No changes will be saved"
},
accept = "Yes",
decline = "No"
},
ped = {
title = "Ped",
model = "Model"
},
headBlend = {
title = "Inheritance",
shape = {
title = "Face",
firstOption = "Father",
secondOption = "Mother",
mix = "Mix"
},
skin = {
title = "Skin",
firstOption = "Father",
secondOption = "Mother",
mix = "Mix"
},
race = {
title = "Race",
shape = "Shape",
skin = "Skin",
mix = "Mix"
}
},
faceFeatures = {
title = "Face Features",
nose = {
title = "Nose",
width = "Width",
height = "Height",
size = "Size",
boneHeight = "Bone height",
boneTwist = "Bone twist",
peakHeight = "Peak height"
},
eyebrows = {
title = "Eyebrows",
height = "Height",
depth = "Depth"
},
cheeks = {
title = "Cheeks",
boneHeight = "Bone height",
boneWidth = "Bone width",
width = "Width"
},
eyesAndMouth = {
title = "Eyes and Mouth",
eyesOpening = "Eyes opening",
lipsThickness = "Lip thickness"
},
jaw = {
title = "Jaw",
width = "Width",
size = "Size"
},
chin = {
title = "Chin",
lowering = "Lowering",
length = "Length",
size = "Size",
hole = "Hole size"
},
neck = {
title = "Neck",
thickness = "Thickness"
}
},
headOverlays = {
title = "Appearance",
hair = {
title = "Hair",
style = "Style",
color = "Color",
highlight = "Highlight",
texture = "Texture",
fade = "Fade"
},
opacity = "Opacity",
style = "Style",
color = "Color",
secondColor = "Secondary Color",
blemishes = "Blemishes",
beard = "Beard",
eyebrows = "Eyebrows",
ageing = "Ageing",
makeUp = "Make up",
blush = "Blush",
complexion = "Complexion",
sunDamage = "Sun damage",
lipstick = "Lipstick",
moleAndFreckles = "Mole and Freckles",
chestHair = "Chest hair",
bodyBlemishes = "Body blemishes",
eyeColor = "Eye color"
},
components = {
title = "Clothes",
drawable = "Drawable",
texture = "Texture",
mask = "Mask",
upperBody = "Hands",
lowerBody = "Legs",
bags = "Bags and parachute",
shoes = "Shoes",
scarfAndChains = "Scarf and chains",
shirt = "Shirt",
bodyArmor = "Body armor",
decals = "Decals",
jackets = "Jackets",
head = "Head"
},
props = {
title = "Props",
drawable = "Drawable",
texture = "Texture",
hats = "Hats and helmets",
glasses = "Glasses",
ear = "Ear",
watches = "Watches",
bracelets = "Bracelets"
},
tattoos = {
title = "Tattoos",
items = {
ZONE_TORSO = "Torso",
ZONE_HEAD = "Head",
ZONE_LEFT_ARM = "Left arm",
ZONE_RIGHT_ARM = "Right arm",
ZONE_LEFT_LEG = "Left leg",
ZONE_RIGHT_LEG = "Right leg"
},
apply = "Apply",
delete = "Remove",
deleteAll = "Remove all Tattoos",
opacity = "Opacity"
}
},
outfitManagement = {
title = "Outfit Management",
jobText = "Manage outfits for Job",
gangText = "Manage outfits for Gang"
},
cancelled = {
title = "Cancelled Customization",
description = "Customization not saved"
},
outfits = {
import = {
title = "Enter outfit code",
menuTitle = "Import Outfit",
description = "Import an outfit from a sharing code",
name = {
label = "Name the Outfit",
placeholder = "A nice outfit",
default = "Imported Outfit"
},
code = {
label = "Outfit Code"
},
success = {
title = "Outfit Imported",
description = "You can now change to the outfit using the outfit menu"
},
failure = {
title = "Import Failure",
description = "Invalid outfit code"
}
},
generate = {
title = "Generate Outfit Code",
description = "Generate an outfit code for sharing",
failure = {
title = "Something went wrong",
description = "Code generation failed for the outfit"
},
success = {
title = "Outfit Code Generated",
description = "Here is your outfit code"
}
},
save = {
menuTitle = "Save current Outfit",
menuDescription = "Save your current outfit as %s outfit",
description = "Save your current outfit",
title = "Name your outfit",
managementTitle = "Management Outfit Details",
name = {
label = "Outfit Name",
placeholder = "Very cool outfit"
},
gender = {
label = "Gender",
male = "Male",
female = "Female"
},
rank = {
label = "Minimum Rank"
},
failure = {
title = "Save Failed",
description = "Outfit with this name already exists"
},
success = {
title = "Success",
description = "Outfit %s has been saved"
}
},
update = {
title = "Update Outfit",
description = "Save your current clothing to an existing outfit",
failure = {
title = "Update Failed",
description = "That outfit does not exist"
},
success = {
title = "Success",
description = "Outfit %s has been updated"
}
},
change = {
title = "Change Outfit",
description = "Pick from any of your currently saved %s outfits",
pDescription = "Pick from any of your currently saved outfits",
failure = {
title = "Something went wrong",
description = "The outfit that you're trying to change to, does not have a base appearance",
}
},
delete = {
title = "Delete Outfit",
description = "Delete a saved %s outfit",
mDescription = "Delete any of your saved outfits",
item = {
title = 'Delete "%s"',
description = "Model: %s%s"
},
success = {
title = "Success",
description = "Outfit Deleted"
}
},
manage = {
title = "👔 | Manage %s Outfits"
}
},
jobOutfits = {
title = "Work Outfits",
description = "Pick from any of your work outfits"
},
menu = {
returnTitle = "Return",
title = "Clothing Room",
outfitsTitle = "Player Outfits",
clothingShopTitle = "Clothing Shop",
barberShopTitle = "Barber Shop",
tattooShopTitle = "Tattoo Shop",
surgeonShopTitle = "Surgeon Shop"
},
clothing = {
title = "Buy Clothing - $%d",
titleNoPrice = "Change Clothing",
options = {
title = "👔 | Clothing Store Options",
description = "Pick from a wide range of items to wear"
},
outfits = {
title = "👔 | Outfit Options",
civilian = {
title = "Civilian Outfit",
description = "Put on your clothes"
}
}
},
commands = {
reloadskin = {
title = "Reloads your character",
failure = {
title = "Error",
description = "You cannot use reloadskin right now"
}
},
clearstuckprops = {
title = "Removes all the props attached to the entity",
failure = {
title = "Error",
description = "You cannot use clearstuckprops right now"
}
},
pedmenu = {
title = "Open / Give Clothing Menu",
failure = {
title = "Error",
description = "Player not online"
}
},
joboutfits = {
title = "Opens Job Outfits Menu"
},
gangoutfits = {
title = "Opens Gang Outfits Menu"
},
bossmanagedoutfits = {
title = "Opens Boss Managed Outfits Menu"
}
},
textUI = {
clothing = "Clothing Store - Price: $%d",
barber = "Barber - Price: $%d",
tattoo = "Tattoo Shop - Price: $%d",
surgeon = "Plastic Surgeon - Price: $%d",
clothingRoom = "Clothing Room",
playerOutfitRoom = "Outfits"
},
migrate = {
success = {
title = "Success",
description = "Migration finished. %s skins migrated",
descriptionSingle = "Migrated Skin"
},
skip = {
title = "Information",
description = "Skipped skin"
},
typeError = {
title = "Error",
description = "Invalid type"
}
},
purchase = {
tattoo = {
success = {
title = "Success",
description = "Purchased %s tattoo for %s$"
},
failure = {
title = "Tattoo apply failed",
description = "You don't have enough money!"
}
},
store = {
success = {
title = "Success",
description = "Gave $%s to %s!"
},
failure = {
title = "Exploit!",
description = "You didn't have enough money! Tried to exploit the system!"
}
}
}
}

View File

@ -0,0 +1,367 @@
Locales["es-ES"] = {
UI = {
modal = {
save = {
title = "Guardar personalización",
description = "Seguirás siendo feo"
},
exit = {
title = "Salir de la personalización",
description = "No se guardarán los cambios"
},
accept = "Si",
decline = "No"
},
ped = {
title = "Ped",
model = "Modelo"
},
headBlend = {
title = "Herencia",
shape = {
title = "Rostro",
firstOption = "Padre",
secondOption = "Madre",
mix = "Mezcla"
},
skin = {
title = "Piel",
firstOption = "Padre",
secondOption = "Madre",
mix = "Mezcla"
},
race = {
title = "Raza",
shape = "Rostro",
skin = "Piel",
mix = "Mezcla"
}
},
faceFeatures = {
title = "Características de la cara",
nose = {
title = "Nariz",
width = "Ancho",
height = "Altura",
size = "Tamaño",
boneHeight = "Altura del hueso",
boneTwist = "Girar hueso",
peakHeight = "Altura máxima"
},
eyebrows = {
title = "Cejas",
height = "Altura",
depth = "Profundidad"
},
cheeks = {
title = "Mejillas",
boneHeight = "Altura del hueso",
boneWidth = "Ancho del hueso",
width = "Ancho"
},
eyesAndMouth = {
title = "Ojos y Boca",
eyesOpening = "Apertura de ojos",
lipsThickness = "Grosor del labio"
},
jaw = {
title = "Mandíbula",
width = "Ancho",
size = "Tamaño"
},
chin = {
title = "Barbilla",
lowering = "Bajar",
length = "Largo",
size = "Tamaño",
hole = "Tamaño del agujero"
},
neck = {
title = "Cuello",
thickness = "Grosor"
}
},
headOverlays = {
title = "Apariencia",
hair = {
title = "Pelo",
style = "Estilo",
color = "Color",
highlight = "Resalte",
texture = "Textura",
fade = "Degradado"
},
opacity = "Opacidad",
style = "Estilo",
color = "Color",
secondColor = "Color secundario",
blemishes = "Manchas",
beard = "Barba",
eyebrows = "Cejas",
ageing = "Arrugas",
makeUp = "Maquillaje",
blush = "Rubor",
complexion = "Tez",
sunDamage = "Daño del sol",
lipstick = "Lápiz labial",
moleAndFreckles = "Huecos y Pecas",
chestHair = "Pelo en el pecho",
bodyBlemishes = "Manchas corporales",
eyeColor = "Color de ojos"
},
components = {
title = "Ropa",
drawable = "Prenda",
texture = "Textura",
mask = "Máscaras",
upperBody = "Brazos",
lowerBody = "Piernas",
bags = "Bolsas y Paracaídas",
shoes = "Zapatos",
scarfAndChains = "Bufandas y Cadenas",
shirt = "Camisetas",
bodyArmor = "Chalecos",
decals = "Calcomanías",
jackets = "Chaquetas",
head = "Cabeza"
},
props = {
title = "Accesorios",
drawable = "Prenda",
texture = "Textura",
hats = "Gorras y Cascos",
glasses = "Gafas",
ear = "Aretes",
watches = "Relojes",
bracelets = "Brazaletes"
},
tattoos = {
title = "Tatuajes",
items = {
ZONE_TORSO = "Torso",
ZONE_HEAD = "Cabeza",
ZONE_LEFT_ARM = "Brazo izquierdo",
ZONE_RIGHT_ARM = "Brazo derecho",
ZONE_LEFT_LEG = "Pierna izquierda",
ZONE_RIGHT_LEG = "Pierna derecha"
},
apply = "Aplicar",
delete = "Borrar",
deleteAll = "Borrar todo",
opacity = "Opacidad"
}
},
outfitManagement = {
title = "Gestión de atuendos",
jobText = "Administrar atuendos para trabajo",
gangText = "Administrar atuendos de pandilla"
},
cancelled = {
title = "Personalización cancelada",
description = "Personalización no guardada"
},
outfits = {
import = {
title = "Ingresar código de atuendo",
menuTitle = "Importar atuendo",
description = "Importar un atuendo a partir de un código de intercambio",
name = {
label = "Nombrar el atuendo",
placeholder = "Un atuendo agradable",
default = "Atuendo importado"
},
code = {
label = "Código de atuendo"
},
success = {
title = "Atuendo importado",
description = "Ahora puedes cambiar al atuendo utilizando el menú de atuendos"
},
failure = {
title = "Fallo en la importación",
description = "Código de atuendo no válido"
}
},
generate = {
title = "Generar código de atuendo",
description = "Generar un código de atuendo para compartir",
failure = {
title = "Algo salió mal",
description = "La generación de código falló para el atuendo"
},
success = {
title = "Código de atuendo generado",
description = "Aquí está tu código de atuendo"
}
},
save = {
menuTitle = "Guardar Vestimenta Actual",
menuDescription = "Guarda tu vestimenta actual como %s",
description = "Guarda tu vestimenta actual",
title = "Nombre de la Vestimenta",
managementTitle = "Detalles de la Gestión de Vestimentas",
name = {
label = "Nombre de la Vestimenta",
placeholder = "Vestimenta muy elegante"
},
gender = {
label = "Género",
male = "Masculino",
female = "Femenino"
},
rank = {
label = "Rango Mínimo"
},
failure = {
title = "Fallo al Guardar",
description = "Ya existe una vestimenta con este nombre"
},
success = {
title = "Éxito",
description = "La vestimenta %s ha sido guardada"
}
},
update = {
title = "Actualizar atuendo",
description = "Guarda tu ropa actual en un atuendo existente",
failure = {
title = "Error al actualizar",
description = "Ese atuendo no existe"
},
success = {
title = "Éxito",
description = "El atuendo %s ha sido actualizado"
}
},
change = {
title = "Cambiar atuendo",
description = "Elige de entre tus atuendos guardados actuales %s",
pDescription = "Elige de entre tus atuendos guardados actuales",
failure = {
title = "Algo salió mal",
description = "El atuendo que estás tratando de cambiar no tiene una apariencia base",
}
},
delete = {
title = "Eliminar traje",
description = "Eliminar un %s traje guardado",
mDescription = "Eliminar cualquiera de tus trajes guardados",
item = {
title = 'Eliminar "%s"',
description = "Modelo: %s%s"
},
success = {
title = "Éxito",
description = "Traje eliminado"
}
},
manage = {
title = "👔 | Administrar trajes %s"
}
},
jobOutfits = {
title = "Trajes de trabajo",
description = "Elige entre cualquiera de tus trajes de trabajo"
},
menu = {
returnTitle = "Volver",
title = "Vestuario",
outfitsTitle = "Atuendos del Jugador",
clothingShopTitle = "Tienda de Ropa",
barberShopTitle = "Barbería",
tattooShopTitle = "Tienda de Tatuajes",
surgeonShopTitle = "Cirugía Estética"
},
clothing = {
title = "Comprar Ropa - $%d",
titleNoPrice = "Cambiar Ropa",
options = {
title = "👔 | Opciones de la Tienda de Ropa",
description = "Elija entre una amplia gama de artículos para vestir"
},
outfits = {
title = "👔 | Opciones de Atuendos",
civilian = {
title = "Atuendo Civil",
description = "Ponte tu ropa"
}
}
},
commands = {
reloadskin = {
title = "Recarga a tu personaje",
failure = {
title = "Error",
description = "No puedes usar reloadskin en este momento"
}
},
clearstuckprops = {
title = "Elimina todos los objetos atascados en la entidad",
failure = {
title = "Error",
description = "No puedes usar clearstuckprops en este momento"
}
},
pedmenu = {
title = "Abrir / Dar menú de ropa",
failure = {
title = "Error",
description = "Jugador no en línea"
}
},
joboutfits = {
title = "Abre el menú de atuendos de trabajo"
},
gangoutfits = {
title = "Abre el menú de atuendos de pandillas"
},
bossmanagedoutfits = {
title = "Abre el menú de conjuntos gestionados por el jefe"
}
},
textUI = {
clothing = "Tienda de ropa - Precio: $%d",
barber = "Barbero - Precio: $%d",
tattoo = "Tienda de tatuajes - Precio: $%d",
surgeon = "Cirujano plástico - Precio: $%d",
clothingRoom = "Vestidor",
playerOutfitRoom = "Atuendos"
},
migrate = {
success = {
title = "Éxito",
description = "Migración finalizada. Se migraron %s skins",
descriptionSingle = "Skin migrado"
},
skip = {
title = "Información",
description = "Skin saltado"
},
typeError = {
title = "Error",
description = "Tipo inválido"
}
},
purchase = {
tattoo = {
success = {
title = "Éxito",
description = "Tatuaje %s comprado por %s$"
},
failure = {
title = "Fallo en la aplicación del tatuaje",
description = "¡No tienes suficiente dinero!"
}
},
store = {
success = {
title = "Éxito",
description = "¡Se entregaron $%s a %s!"
},
failure = {
title = "¡Explotación!",
description = "¡No tienes suficiente dinero! Intentó explotar el sistema."
}
}
}
}

View File

@ -0,0 +1,367 @@
Locales["fr"] = {
UI = {
modal = {
save = {
title = "Enregistrer",
description = "tu resteras moche"
},
exit = {
title = "Quitter",
description = "Aucun changement ne sera enregistré"
},
accept = "Oui",
decline = "Non"
},
ped = {
title = "Ped",
model = "Modèle"
},
headBlend = {
title = "Héritage",
shape = {
title = "Visage",
firstOption = "Père",
secondOption = "Mère",
mix = "Mix"
},
skin = {
title = "Peau",
firstOption = "Père",
secondOption = "Mère",
mix = "Mix"
},
race = {
title = "Race",
shape = "Visage",
skin = "Peau",
mix = "Mix"
}
},
faceFeatures = {
title = "Caractéristiques du visage",
nose = {
title = "Nez",
width = "Largeur",
height = "Hauteur",
size = "Taille",
boneHeight = "Hauteur",
boneTwist = "Torsion",
peakHeight = "Hauteur maximale"
},
eyebrows = {
title = "Sourcils",
height = "Hauteur",
depth = "Profondeur"
},
cheeks = {
title = "Joues",
boneHeight = "Hauteur",
boneWidth = "Largeur 1",
width = "Largeur 2"
},
eyesAndMouth = {
title = "Yeux et bouche",
eyesOpening = "Ouverture des yeux",
lipsThickness = "Épaisseur des lèvres"
},
jaw = {
title = "Mâchoire",
width = "Largeur",
size = "Taille"
},
chin = {
title = "Menton",
lowering = "Abaissement",
length = "Longueur",
size = "Taille",
hole = "Taille du Creux"
},
neck = {
title = "Cou",
thickness = "Épaisseur"
}
},
headOverlays = {
title = "Apparence",
hair = {
title = "Cheveux",
style = "Style",
color = "Couleur",
highlight = "Highlight",
texture = "Texture",
fade = "Fade"
},
opacity = "Opacité",
style = "Style",
color = "Couleur",
secondColor = "Couleur de base",
blemishes = "Imperfections",
beard = "Barbe",
eyebrows = "Sourcils",
ageing = "Vieillissement",
makeUp = "Maquillage",
blush = "Blush",
complexion = "Complexion",
sunDamage = "Dégâts du soleil",
lipstick = "Lipstick",
moleAndFreckles = "Taches de rousseur",
chestHair = "Poils du torse",
bodyBlemishes = "Imperfections corporelles",
eyeColor = "Couleur des yeux"
},
components = {
title = "Vêtements",
drawable = "Drawable",
texture = "Texture",
mask = "Masque",
upperBody = "Haut du Corps",
lowerBody = "Bas du Corps",
bags = "Sacs et parachute",
shoes = "Chaussures",
scarfAndChains = "Écharpe et chaînes",
shirt = "T-Shirt",
bodyArmor = "Body armor",
decals = "Decals",
jackets = "Vestes",
head = "Tête"
},
props = {
title = "Props",
drawable = "Drawable",
texture = "Texture",
hats = "Chapeaux et casques",
glasses = "Lunettes",
ear = "Accessoires d'oreille",
watches = "Montres",
bracelets = "Bracelets"
},
tattoos = {
title = "Tattoos",
items = {
ZONE_TORSO = "Torso",
ZONE_HEAD = "Tête",
ZONE_LEFT_ARM = "Bras gauche",
ZONE_RIGHT_ARM = "Bras droit",
ZONE_LEFT_LEG = "Jambe gauche",
ZONE_RIGHT_LEG = "Jambe droite"
},
apply = "Appliquer",
delete = "Supprimer",
deleteAll = "Supprimer tous les tatouages",
opacity = "Opacité"
}
},
outfitManagement = {
title = "Gestion de tenues",
jobText = "Gérer les tenues pour le travail",
gangText = "Gérer les tenues pour le gang"
},
cancelled = {
title = "Personnalisation annulée",
description = "Personnalisation non enregistrée"
},
outfits = {
import = {
title = "Entrer le code de la tenue",
menuTitle = "Importer la tenue",
description = "Importer une tenue à partir d'un code de partage",
name = {
label = "Nom de la tenue",
placeholder = "Une belle tenue",
default = "Tenue importée"
},
code = {
label = "Code de la tenue"
},
success = {
title = "Tenue importée",
description = "Vous pouvez maintenant changer de tenue en utilisant le menu des tenues"
},
failure = {
title = "Échec de l'importation",
description = "Code de tenue non valide"
}
},
generate = {
title = "Générer un code de tenue",
description = "Générer un code de tenue pour le partage",
failure = {
title = "Quelque chose s'est mal passé",
description = "La génération du code a échoué pour la tenue"
},
success = {
title = "Code de tenue généré",
description = "Voici votre code de tenue"
}
},
save = {
menuTitle = "Enregistrer la tenue actuelle",
menuDescription = "Enregistrer votre tenue actuelle en tant que tenue %s",
description = "Enregistrer votre tenue actuelle",
title = "Nommez votre tenue",
managementTitle = "Détails de gestion des tenues",
name = {
label = "Nom de la tenue",
placeholder = "Tenue très cool"
},
gender = {
label = "Genre",
male = "Homme",
female = "Femme"
},
rank = {
label = "Rang minimum"
},
failure = {
title = "Échec de l'enregistrement",
description = "Une tenue avec ce nom existe déjà"
},
success = {
title = "Succès",
description = "Tenue %s enregistrée"
}
},
update = {
title = "Mettre à jour la tenue",
description = "Enregistrer vos vêtements actuels dans une tenue existante",
failure = {
title = "Échec de la mise à jour",
description = "Cette tenue n'existe pas"
},
success = {
title = "Succès",
description = "La tenue %s a été mise à jour"
}
},
change = {
title = "Changer de tenue",
description = "Choisissez parmi toutes vos tenues %s enregistrées",
pDescription = "Choisissez parmi toutes vos tenues enregistrées",
failure = {
title = "Quelque chose s'est mal passé",
description = "La tenue que vous essayez de changer n'a pas d'apparence de base",
}
},
delete = {
title = "Supprimer la tenue",
description = "Supprimer une tenue enregistrée %s",
mDescription = "Supprimer n'importe laquelle de vos tenues enregistrées",
item = {
title = 'Supprimer "%s"',
description = "Modèle : %s%s"
},
success = {
title = "Succès",
description = "Tenue supprimée"
}
},
manage = {
title = "👔 | Gérer les tenues %s"
}
},
jobOutfits = {
title = "Tenues de travail",
description = "Choisissez parmi toutes vos tenues de travail"
},
menu = {
returnTitle = "Retour",
title = "Chambre de vêtements",
outfitsTitle = "Tenues du joueur",
clothingShopTitle = "Magasin de vêtements",
barberShopTitle = "Salon de coiffure",
tattooShopTitle = "Salon de tatouage",
surgeonShopTitle = "Chirurgien esthétique"
},
clothing = {
title = "Acheter des vêtements - %d $",
titleNoPrice = "Changer de vêtements",
options = {
title = "👔 | Options de magasin de vêtements",
description = "Choisissez parmi une large gamme d'articles à porter"
},
outfits = {
title = "👔 | Options de tenue",
civilian = {
title = "Tenue civile",
description = "Mettre vos vêtements"
}
}
},
commands = {
reloadskin = {
title = "Recharger votre personnage",
failure = {
title = "Erreur",
description = "Vous ne pouvez pas utiliser reloadskin pour le moment"
}
},
clearstuckprops = {
title = "Supprimer tous les accessoires attachés à l'entité",
failure = {
title = "Erreur",
description = "Vous ne pouvez pas utiliser clearstuckprops pour le moment"
}
},
pedmenu = {
title = "Ouvrir / Donner le menu de vêtements",
failure = {
title = "Erreur",
description = "Joueur non connecté"
}
},
joboutfits = {
title = "Ouvre le menu des tenues de travail"
},
gangoutfits = {
title = "Ouvre le menu des tenues de gang"
},
bossmanagedoutfits = {
title = "Ouvre le menu des tenues gérées par le patron"
}
},
textUI = {
clothing = "Magasin de vêtements - Prix : %s $",
barber = "Barbier - Prix : %s $",
tattoo = "Boutique de tatouages - Prix : %s $",
surgeon = "Chirurgien plasticien - Prix : %s $",
clothingRoom = "Chambre d'habillage",
playerOutfitRoom = "Tenues"
},
migrate = {
success = {
title = "Succès",
description = "%s skins ont été migrées",
descriptionSingle = "Skin migré"
},
skip = {
title = "Information",
description = "Skin ignoré"
},
typeError = {
title = "Erreur",
description = "Type invalide"
}
},
purchase = {
tattoo = {
success = {
title = "Succès",
description = "Tatouage %s acheté pour %s$"
},
failure = {
title = "Échec de l'application du tatouage",
description = "Vous n'avez pas assez d'argent !"
}
},
store = {
success = {
title = "Succès",
description = "Don de %s$ à %s !"
},
failure = {
title = "Exploitation !",
description = "Vous n'avez pas assez d'argent ! Vous avez essayé d'exploiter le système !"
}
}
}
}

View File

@ -0,0 +1,364 @@
Locales["hu"] = {
UI = {
modal = {
save = {
title = "Változtatás Mentése",
description = "Csúnya maradtál"
},
exit = {
title = "Kilépés a testreszabásból",
description = "Nincs változtatás elmentve"
},
accept = "Igen",
decline = "Nem"
},
ped = {
title = "Ped",
model = "Model"
},
headBlend = {
title = "Öröklődés",
shape = {
title = "Arc",
firstOption = "Apa",
secondOption = "Anya",
mix = "Vegyes"
},
skin = {
title = "Bőrszín",
firstOption = "Apa",
secondOption = "Anya",
mix = "Vegyes"
},
race = {
title = "Rassz",
shape = "Alak",
skin = "Bőrszín",
mix = "Vegyes"
}
},
faceFeatures = {
title = "Arci Jellemzők",
nose = {
title = "Orr",
width = "Szélesség",
height = "Magasság",
size = "Méret",
boneHeight = "Magasság",
boneTwist = "Csavarás",
peakHeight = "Maximális Magasság"
},
eyebrows = {
title = "Szemöldök",
height = "Magasság",
depth = "Mélység"
},
cheeks = {
title = "Száj",
boneHeight = "Magasság",
boneWidth = "Szélesség",
width = "Szélesség"
},
eyesAndMouth = {
title = "Szemek és Száj",
eyesOpening = "Szem Kinyitása",
lipsThickness = "Száj Típusok"
},
jaw = {
title = "Állkapocs",
width = "Szélesség",
size = "Méret"
},
chin = {
title = "Áll",
lowering = "Leeresztés",
length = "Hosszúság",
size = "Méret",
hole = "Méret"
},
neck = {
title = "Nyak",
thickness = "Vastagság"
}
},
headOverlays = {
title = "Kinézet",
hair = {
title = "Haj",
style = "Stílus",
color = "Szín",
highlight = "Kiemelt",
texture = "Kinézet",
fade = "Halvány"
},
opacity = "Átlátszóság",
style = "Stílus",
color = "Szín",
secondColor = "Másodlagos Szín",
blemishes = "Foltok",
beard = "Szakáll",
eyebrows = "Szemöldök",
ageing = "Öregedés",
makeUp = "Smink",
blush = "Elpirulás",
complexion = "Arcszín",
sunDamage = "Napfény okozta bőröregedés",
lipstick = "Rúzs",
moleAndFreckles = "Anyajegyek és Szeplők",
chestHair = "Mellszőrzet",
bodyBlemishes = "Bőrhibák",
eyeColor = "Szemszín"
},
components = {
title = "Ruhák",
drawable = "Rajzolható",
texture = "Kinézet",
mask = "Maszk",
upperBody = "Kezek",
lowerBody = "Lábak",
bags = "Táskák és ejtőernyő",
shoes = "Cipők",
scarfAndChains = "Sál és Láncok",
shirt = "Póló",
bodyArmor = "Test páncél",
decals = "Matricák",
jackets = "Kabátok",
head = "Fej"
},
props = {
title = "Kellékek",
drawable = "Rajzolható",
texture = "Kinézet",
hats = "Sapkák",
glasses = "Szemüvegek",
ear = "Fül",
watches = "órák",
bracelets = "Karkötők"
},
tattoos = {
title = "Tetoválások",
items = {
ZONE_TORSO = "Törzs",
ZONE_HEAD = "Fej",
ZONE_LEFT_ARM = "Bal Kar",
ZONE_RIGHT_ARM = "Jobb Kar",
ZONE_LEFT_LEG = "Bal Láb",
ZONE_RIGHT_LEG = "Jobb Láb"
},
apply = "Mentés",
delete = "Törlés",
deleteAll = "Összes tetkó törlése",
opacity = "Átlátszóság"
}
},
outfitManagement = {
title = "Ruházat Kezelése",
jobText = "Munkaruha Kezelése",
gangText = "Bandaruha Kezelése"
},
cancelled = {
title = "Testreszabás Visszavonva",
description = "Testreszabás Nincs Mentve"
},
outfits = {
import = {
title = "Írd be az ruházat kódját",
menuTitle = "Ruházat Berakása",
description = "Ruházat importálása megosztási kóddal",
name = {
label = "Ruházat Elnevezése",
placeholder = "Egy szép öltözet",
default = "Berakot Ruházat"
},
code = {
label = "Ruházat Kódja"
},
success = {
title = "Ruházat Importálva",
description = "Most át tudsz öltözni az ruházat menü használatával"
},
failure = {
title = "Sikertelen Importálás",
description = "Hibás ruházat kód"
}
},
generate = {
title = "Ruházat kód generálása",
description = "Ruházat kód generálása megosztáshoz",
failure = {
title = "Hiba történt",
description = "Nem sikerült kódot létrehozni az ruházathoz"
},
success = {
title = "Ruházat kód legenerálva",
description = "Itt az ruházat kódod"
}
},
save = {
menuTitle = "Ruha mentése",
menuDescription = "Jelenlegi ruha mentése mint %s ruházat",
description = "Jelenlegi ruházat lementve",
title = "Ruházat elnevezése",
managementTitle = "Ruházat részletek kezelése",
name = {
label = "Ruházat Neve",
placeholder = "Nagyon szép ruházat"
},
gender = {
label = "Nem",
male = "Férfi",
female = ""
},
rank = {
label = "Minimális Rang"
},
failure = {
title = "Sikertelen Mentés",
description = "Ezzel a nével már létezik ruházat"
},
success = {
title = "Sikeres",
description = "%s nevű ruházat mentve"
}
},
update = {
title = "Ruházat Frissítése",
description = "Jelenlegi ruhák mentése egy meglévő ruházat helyére",
failure = {
title = "Frissités Sikertelen",
description = "Ez a ruházat nem létezik"
},
success = {
title = "Sikeres",
description = "%s nevű ruházat frissítve"
}
},
change = {
title = "Ruházat Megváltoztatása",
description = "Válasz a jelenlegi %s ruházatod közül",
pDescription = "Válasz a jelenlegi ruházataid közül",
failure = {
title = "Hiba történt",
description = "A ruházatnak, amibe próbálsz átöltözni, nincs alap megjelenítése",
}
},
delete = {
title = "Ruházat Törlése",
description = "Egy mentett %s ruházat törlése",
mDescription = "Egy mentett ruházatod törlése",
item = {
title = '"%s" törlése',
description = "Model: %s%s"
},
success = {
title = "Sikeres",
description = "Ruházat Törölve"
}
},
manage = {
title = "👔 | %s Ruházatok Kezelése"
}
},
jobOutfits = {
title = "Munkaruhák",
description = "Válasz egy munkaruhát"
},
menu = {
returnTitle = "Vissza",
title = "Ruhatár",
outfitsTitle = "Játékos Ruházatok",
clothingShopTitle = "Ruhabolt",
barberShopTitle = "Fodrászat",
tattooShopTitle = "Tetováló Szalon",
surgeonShopTitle = "Sebészet"
},
clothing = {
title = "Ruha Vásárlás - $%d",
titleNoPrice = "Ruha Váltása",
options = {
title = "👔 | Ruhabolt Beállítások",
description = "Válasszon a ruhák széles kínálatából"
},
outfits = {
title = "👔 | Ruházat Beállítások",
civilian = {
title = "Civil Ruházat",
description = "Ruházat felvétele"
}
}
},
commands = {
reloadskin = {
title = "Karakter újratöltése",
failure = {
title = "Hiba",
description = "Ezt most nem használhatod"
}
},
clearstuckprops = {
title = "Eltávolítja az entitáshoz csatolt összes kelléket",
failure = {
title = "Hiba",
description = "Ezt most nem használhatod"
}
},
pedmenu = {
title = "Ruházati Menü Megnyitása",
failure = {
title = "Hiba",
description = "A játékos nem online"
}
},
joboutfits = {
title = "Munkaruházati menü megnyitása"
},
gangoutfits = {
title = "Bandaruházati menü megnyitása"
}
},
textUI = {
clothing = "Ruhabolt - Ár: $%d",
barber = "Fodrászat - Ár: $%d",
tattoo = "Tetováló Szalon - Ár: $d",
surgeon = "Sebészet - Ár: $%d",
clothingRoom = "Ruhatár",
playerOutfitRoom = "Ruházatok"
},
migrate = {
success = {
title = "Sikeres",
description = "Áthelyezés sikeres. %s kinézet(ek) áthelyezve",
descriptionSingle = "Kinézet áthelyezve"
},
skip = {
title = "Információ",
description = "Kinézet kihagyva"
},
typeError = {
title = "Hiba",
description = "Nem létező típus"
}
},
purchase = {
tattoo = {
success = {
title = "Sikeres",
description = "Megvásárolt %s tetoválás ennyiért: $%s"
},
failure = {
title = "Tetoválás alkalmazása sikertelen",
description = "Nincs elég pénzed!"
}
},
store = {
success = {
title = "Sikeres",
description = "Ennyit fizettél: $%s" --"Gave $100 to clothing" doesn't really make sense, I just removed the second %s
},
failure = {
title = "Hiba",
description = "Nincs elég pénzed! Megpróbáltad kihasználni a rendszert!"
}
}
}
}

View File

@ -0,0 +1,367 @@
Locales["id"] = {
UI = {
modal = {
save = {
title = "Simpan Perubahan",
description = "Kamu akan tetap jelek"
},
exit = {
title = "Keluar",
description = "Tidak ada perubahan yang akan di simpan"
},
accept = "Iya",
decline = "Tidak"
},
ped = {
title = "Karakter",
model = "Pilihan"
},
headBlend = {
title = "Bagian Kepala",
shape = {
title = "Muka",
firstOption = "Ayah",
secondOption = "Ibu",
mix = "Campuran"
},
skin = {
title = "Kulit",
firstOption = "Ayah",
secondOption = "Ibu",
mix = "Campuran"
},
race = {
title = "Ras",
shape = "Bentuk",
skin = "Kulit",
mix = "Campuran"
}
},
faceFeatures = {
title = "Fitur Wajah",
nose = {
title = "Hidung",
width = "Lebar",
height = "Tinggi",
size = "Besar",
boneHeight = "Tinggi Tulang",
boneTwist = "Lengkuk Tulang",
peakHeight = "Kemancungan"
},
eyebrows = {
title = "Alis",
height = "Tinggi",
depth = "Kedalaman"
},
cheeks = {
title = "Pipi",
boneHeight = "Tinggi Tulang",
boneWidth = "Lebar Tulang",
width = "Lebar"
},
eyesAndMouth = {
title = "Mata Dan Mulut",
eyesOpening = "Buka Mata",
lipsThickness = "Ketebalan Bibir"
},
jaw = {
title = "Rahang",
width = "Lebar Rahang",
size = "Besar"
},
chin = {
title = "Dagu",
lowering = "Penurunan",
length = "Panjang",
size = "Besar",
hole = "Ukuran Lubang"
},
neck = {
title = "Leher",
thickness = "Ketebalan"
}
},
headOverlays = {
title = "Penampilan",
hair = {
title = "Rambut",
style = "Gaya",
color = "Warna",
highlight = "Highlight",
texture = "Tekstur",
fade = "Memudar"
},
opacity = "Kegelapan",
style = "Gaya",
color = "Warna",
secondColor = "Warna Sekunder",
blemishes = "Noda",
beard = "Jenggot",
eyebrows = "Alis",
ageing = "Penuaan",
makeUp = "Make up",
blush = "Kemerahan Pipi",
complexion = "Corak",
sunDamage = "Kersakan Muka Akibat Sinar Matahari",
lipstick = "Lipstik",
moleAndFreckles = "Tahi Lalat dan Bintik-bintik",
chestHair = "Bulu dada",
bodyBlemishes = "Noda tubuh",
eyeColor = "Warna mata"
},
components = {
title = "Pakaian",
drawable = "Pilihan",
texture = "Tekstur Baju",
mask = "Masker",
upperBody = "Lengan",
lowerBody = "Celana",
bags = "Tas Dan Parasut",
shoes = "Sepatu",
scarfAndChains = "Syal Dan Kalung",
shirt = "Baju",
bodyArmor = "Bodi Armor",
decals = "Stiker",
jackets = "Jaket",
head = "Topi"
},
props = {
title = "Atribut",
drawable = "Pilihan",
texture = "Tekstur",
hats = "Topi Dan Helm",
glasses = "Kacamata",
ear = "Aksesoris Telinga",
watches = "Jam",
bracelets = "Gelang"
},
tattoos = {
title = "Tato",
items = {
ZONE_TORSO = "Badan",
ZONE_HEAD = "Kepala",
ZONE_LEFT_ARM = "Tangan Kiri",
ZONE_RIGHT_ARM = "Tangan Kanan",
ZONE_LEFT_LEG = "Kaki Kiri",
ZONE_RIGHT_LEG = "Kaki Kanan"
},
apply = "Terapkan",
delete = "Hapus",
deleteAll = "Hapus Semua Tato",
opacity = "Kegelapan"
}
},
outfitManagement = {
title = "Pakaian Pekerjaan",
jobText = "Atur pakaian untuk pekerja",
gangText = "Atur pakaian untuk anggota gang"
},
cancelled = {
title = "Kostumisasi di batalkan",
description = "Kustomisasi tidak disimpan"
},
outfits = {
import = {
title = "Mauskkan kode pakaian",
menuTitle = "Impor Pakaian",
description = "Impor pakaian dari kode yang di bagikan",
name = {
label = "Nama Pakaian",
placeholder = "Pakaian yang bagus",
default = "Pakaian Impor"
},
code = {
label = "Kode Pakaian"
},
success = {
title = "Berhasil",
description = "Anda sekarang dapat mengganti pakaian menggunakan menu pakaian"
},
failure = {
title = "Gagal",
description = "Kode pakaian tidak valid"
}
},
generate = {
title = "Lihat Kode Pakaian",
description = "Lihat kode pakaian untuk di bagikan.",
failure = {
title = "Ada yang salah",
description = "Pembuatan kode gagal untuk pakaian tersebut"
},
success = {
title = "Kode Pakaian Dihasilkan",
description = "Ini kode pakaianmu"
}
},
save = {
menuTitle = "Simpan Pakaian saat ini",
menuDescription = "Simpan pakaian Anda saat ini sebagai pakaian %s",
description = "Simpan pakaian Anda saat ini",
title = "Beri nama pakaian Anda",
managementTitle = "Detail Pakaian Pekerjaan",
name = {
label = "Nama Pakaian",
placeholder = "Pakaian yang bagus"
},
gender = {
label = "Jenis Kelamin",
male = "Laki-Laki",
female = "Perempuan"
},
rank = {
label = "Pangkat Minimal"
},
failure = {
title = "Gagal Menyimpan",
description = "Pakaian dengan nama ini sudah ada"
},
success = {
title = "Berhasil Menyimpan",
description = "Pakaian dengan nama %s berhasil di simpan"
}
},
update = {
title = "Perbarui Pakaian",
description = "Simpan pakaian Anda saat ini ke pakaian yang sudah ada",
failure = {
title = "Gagal Memperbarui",
description = "Pakaian itu tidak ada"
},
success = {
title = "Berhasil Memperbarui",
description = "Pakaian dengan nama %s telah di perbarui"
}
},
change = {
title = "Ganti Pakaian",
description = "Pilih dari %s pakaian yang Anda simpan saat ini",
pDescription = "Pilih dari salah satu pakaian yang Anda simpan saat ini",
failure = {
title = "Ada yang salah",
description = "Pakaian yang ingin Anda ganti tidak memiliki tampilan dasar",
}
},
delete = {
title = "Hapus Pakaian",
description = "Hapus pakaian %s yang disimpan",
mDescription = "Hapus semua pakaian yang Anda simpan",
item = {
title = 'Hapus "%s"',
description = "Model: %s%s"
},
success = {
title = "Berhasil",
description = "Pakaian di hapus"
}
},
manage = {
title = "👔 | Atur %s Pakaian"
}
},
jobOutfits = {
title = "Pakaian Pekerjaan",
description = "Pilih dari salah satu pakaian kerja Anda"
},
menu = {
returnTitle = "Kembali",
title = "Ruang Pakaian",
outfitsTitle = "Menu Pakaian",
clothingShopTitle = "Toko Pakaian",
barberShopTitle = "Toko Rambut",
tattooShopTitle = "Toko Tato",
surgeonShopTitle = "Operasi Plastik"
},
clothing = {
title = "Beli Pakaian - $%d",
titleNoPrice = "Ganti Pakaian",
options = {
title = "👔 | Pilihan Toko Pakaian",
description = "Pilih dari beragam item untuk dikenakan"
},
outfits = {
title = "👔 | Pilihan Pakaian",
civilian = {
title = "Pakaian Sipil",
description = "Pakai baju mu"
}
}
},
commands = {
reloadskin = {
title = "Muat ulang karakter Anda",
failure = {
title = "Error",
description = "Anda tidak dapat menggunakan reloadskin saat ini"
}
},
clearstuckprops = {
title = "Menghapus semua props yang melekat pada anda",
failure = {
title = "Error",
description = "Anda tidak dapat menggunakan clearstuckprops saat ini"
}
},
pedmenu = {
title = "Buka / Berikan Menu Pakaian",
failure = {
title = "Error",
description = "Pemain tidak online"
}
},
joboutfits = {
title = "Buka Menu Pakaian Pekerjaan"
},
gangoutfits = {
title = "Buka Menu Pakaian Gang"
},
bossmanagedoutfits = {
title = "Membuka Menu Pakaian yang Dikelola Bos"
}
},
textUI = {
clothing = "Tokok Pakaian - Price: $%d",
barber = "Salon - Price: $%d",
tattoo = "Tato - Price: $%d",
surgeon = "Operasi Plastik - Price: $%d",
clothingRoom = "Ruang Pakaian",
playerOutfitRoom = "Pakaian"
},
migrate = {
success = {
title = "Berhasil",
description = "Migrasi selesai. %s kulit bermigrasi",
descriptionSingle = "Kulit yang Bermigrasi"
},
skip = {
title = "Informasi",
description = "Melewatkan kulit"
},
typeError = {
title = "Error",
description = "Jenis tidak valid"
}
},
purchase = {
tattoo = {
success = {
title = "Berhasil",
description = "Membuat %s tato dengan harga %s$"
},
failure = {
title = "Penerapan Tato Gagal",
description = "Kamu tidak memiliki cukup uang!"
}
},
store = {
success = {
title = "Berhasil",
description = "Telah memberi $%s ke %s!"
},
failure = {
title = "Exploit!",
description = "Anda tidak punya cukup uang! Mencoba mengeksploitasi sistem!"
}
}
}
}

View File

@ -0,0 +1,367 @@
Locales["it"] = {
UI = {
modal = {
save = {
title = "Salva",
description = "Rimarrai sempre brutto"
},
exit = {
title = "Esci",
description = "Nessun cambiamento verrà salvato"
},
accept = "Si",
decline = "No"
},
ped = {
title = "Ped",
model = "Modello"
},
headBlend = {
title = "Eredità",
shape = {
title = "Faccia",
firstOption = "Padre",
secondOption = "Madre",
mix = "Mix"
},
skin = {
title = "Pelle",
firstOption = "Padre",
secondOption = "Madre",
mix = "Mix"
},
race = {
title = "Mix",
shape = "Forma",
skin = "Pelle",
mix = "Mix"
}
},
faceFeatures = {
title = "Caratteristiche del viso",
nose = {
title = "Naso",
width = "Larghezza",
height = "Altezza",
size = "Dimensione",
boneHeight = "Altezza dell'osso",
boneTwist = "Torsione ossea",
peakHeight = "Altezza della punta"
},
eyebrows = {
title = "Sopracciglia",
height = "Altezza",
depth = "Profondità"
},
cheeks = {
title = "Guance",
boneHeight = "Altezza dell'osso",
boneWidth = "Larghezza dell'osso",
width = "Larghezza"
},
eyesAndMouth = {
title = "Occhi e Bocca",
eyesOpening = "Apertura degli occhi",
lipsThickness = "Spessore delle labbra"
},
jaw = {
title = "Mascella",
width = "Larghezza",
size = "Dimensione"
},
chin = {
title = "Mento",
lowering = "Altezza",
length = "Lunghezza",
size = "Dimensione",
hole = "Mento a culo"
},
neck = {
title = "Collo",
thickness = "Spessore"
}
},
headOverlays = {
title = "Aspetto",
hair = {
title = "Capelli",
style = "Stile",
color = "Colore",
highlight = "Highlight",
texture = "Variante",
fade = "Sfumatura"
},
opacity = "Opacità",
style = "Stile",
color = "Colore",
secondColor = "Colore Secondario",
blemishes = "Macchie",
beard = "Barba",
eyebrows = "Sopracciglia",
ageing = "Invecchiamento",
makeUp = "Trucco",
blush = "Arrossamento",
complexion = "Carnagione",
sunDamage = "Danno dal Sole",
lipstick = "Rossetto",
moleAndFreckles = "Lentigini",
chestHair = "Peli del Petto",
bodyBlemishes = "Inestetismi del Corpo",
eyeColor = "Colore degli Occhi"
},
components = {
title = "Vestiti",
drawable = "Modello",
texture = "Variante",
mask = "Maschera",
upperBody = "Braccia",
lowerBody = "Pantaloni",
bags = "Borse",
shoes = "Scarpe",
scarfAndChains = "Sciarpa e Collane",
shirt = "Maglia",
bodyArmor = "Giubbotto",
decals = "Decalcomanie",
jackets = "Giacca",
head = "Capo"
},
props = {
title = "Accessori",
drawable = "Modello",
texture = "Variante",
hats = "Cappelli e Caschi",
glasses = "Occhiali",
ear = "Orecchie",
watches = "Orologi",
bracelets = "Bracciali"
},
tattoos = {
title = "Tatuaggi",
items = {
ZONE_TORSO = "Petto",
ZONE_HEAD = "Testa",
ZONE_LEFT_ARM = "Braccio Sinistro",
ZONE_RIGHT_ARM = "Braccio Destro",
ZONE_LEFT_LEG = "Gamba Sinistra",
ZONE_RIGHT_LEG = "Gamba Destra"
},
apply = "Applica",
delete = "Rimuovi",
deleteAll = "Rimuovi tutti i Tatuaggi",
opacity = "Opacità"
}
},
outfitManagement = {
title = "Gestione Outfit",
jobText = "Gestisci outfit per il Lavoro",
gangText = "Gestisci outfit per la Gang"
},
cancelled = {
title = "Personalizzazione Annullata",
description = "Personalizzazione non salvata"
},
outfits = {
import = {
title = "Inserisci il codice dell'abbigliamento",
menuTitle = "Importa l'abbigliamento",
description = "Importa un abbigliamento da un codice di condivisione",
name = {
label = "Nome dell'abbigliamento",
placeholder = "Un bel vestito",
default = "Vestito importato"
},
code = {
label = "Codice abbigliamento"
},
success = {
title = "Abbigliamento importato",
description = "Ora puoi cambiare l'abbigliamento utilizzando il menu dell'abbigliamento"
},
failure = {
title = "Importazione fallita",
description = "Codice abbigliamento non valido"
}
},
generate = {
title = "Genera il codice dell'abbigliamento",
description = "Genera un codice abbigliamento per la condivisione",
failure = {
title = "Qualcosa è andato storto",
description = "La generazione del codice per l'abbigliamento è fallita"
},
success = {
title = "Codice abbigliamento generato",
description = "Ecco il tuo codice abbigliamento"
}
},
save = {
menuTitle = "Salva l'abbigliamento attuale",
menuDescription = "Salva il tuo abbigliamento attuale come abbigliamento %s",
description = "Salva il tuo abbigliamento attuale",
title = "Dai un nome al tuo abbigliamento",
managementTitle = "Dettagli di gestione dell'abbigliamento",
name = {
label = "Nome abbigliamento",
placeholder = "Vestito molto bello"
},
gender = {
label = "Genere",
male = "Maschio",
female = "Femmina"
},
rank = {
label = "Grado minimo"
},
failure = {
title = "Salvataggio fallito",
description = "L'abbigliamento con questo nome esiste già"
},
success = {
title = "Successo",
description = "L'abbigliamento %s è stato salvato"
}
},
update = {
title = "Aggiorna abbigliamento",
description = "Salva il tuo abbigliamento corrente in un abbigliamento esistente",
failure = {
title = "Aggiornamento fallito",
description = "Quell'abbigliamento non esiste"
},
success = {
title = "Successo",
description = "L'abbigliamento %s è stato aggiornato"
}
},
change = {
title = "Cambia abbigliamento",
description = "Scegli tra i tuoi abbigliamenti %s salvati",
pDescription = "Scegli tra i tuoi abbigliamenti salvati",
failure = {
title = "Qualcosa è andato storto",
description = "L'abbigliamento che stai cercando di cambiare non ha un aspetto di base",
}
},
delete = {
title = "Elimina abbigliamento",
description = "Elimina un abbigliamento salvato %s",
mDescription = "Elimina qualsiasi outfit salvato",
item = {
title = 'Elimina "%s"',
description = "Modello: %s%s"
},
success = {
title = "Successo",
description = "Outfit eliminato"
}
},
manage = {
title = "👔 | Gestisci %s Outfits"
}
},
jobOutfits = {
title = "Abbigliamento da lavoro",
description = "Scegli tra i tuoi abbigliamenti da lavoro"
},
menu = {
returnTitle = "Indietro",
title = "Stanza dell'abbigliamento",
outfitsTitle = "Abbigliamenti del giocatore",
clothingShopTitle = "Negozio di abbigliamento",
barberShopTitle = "Barbiere",
tattooShopTitle = "Negozio di tatuaggi",
surgeonShopTitle = "Chirurgo plastico"
},
clothing = {
title = "Acquista abbigliamento - %d $",
titleNoPrice = "Cambia abbigliamento",
options = {
title = "👔 | Opzioni del negozio di abbigliamento",
description = "Scegli tra una vasta gamma di oggetti da indossare"
},
outfits = {
title = "👔 | Opzioni outfit",
civilian = {
title = "Abbigliamento civile",
description = "Metti i tuoi vestiti"
}
}
},
commands = {
reloadskin = {
title = "Ricarica il tuo personaggio",
failure = {
title = "Errore",
description = "Non puoi usare reloadskin in questo momento"
}
},
clearstuckprops = {
title = "Rimuovi tutti gli oggetti attaccati all'entità",
failure = {
title = "Errore",
description = "Non puoi usare clearstuckprops in questo momento"
}
},
pedmenu = {
title = "Apri / Condividi menu abbigliamento",
failure = {
title = "Errore",
description = "Giocatore non connesso"
}
},
joboutfits = {
title = "Apre il menu degli abiti da lavoro"
},
gangoutfits = {
title = "Apre il menu degli abiti da gang"
},
bossmanagedoutfits = {
title = "Apre il menu delle outfit gestite dal capo"
}
},
textUI = {
clothing = "Negozio di abbigliamento - Prezzo: $%d",
barber = "Barbiere - Prezzo: $%d",
tattoo = "Negozio di tatuaggi - Prezzo: $%d",
surgeon = "Chirurgo plastico - Prezzo: $%d",
clothingRoom = "Sala degli abiti",
playerOutfitRoom = "Outfits"
},
migrate = {
success = {
title = "Successo",
description = "Migrazione completata. %s skins migrate",
descriptionSingle = "Pelle migrata"
},
skip = {
title = "Informazioni",
description = "Skin saltata"
},
typeError = {
title = "Errore",
description = "Tipo non valido"
}
},
purchase = {
tattoo = {
success = {
title = "Successo",
description = "Tatuaggio %s acquistato per %s$"
},
failure = {
title = "Errore applicazione tatuaggio",
description = "Non hai abbastanza soldi!"
}
},
store = {
success = {
title = "Successo",
description = "Hai dato $%s a %s!"
},
failure = {
title = "Sfruttamento!",
description = "Non hai abbastanza soldi! Ha cercato di sfruttare il sistema!"
}
}
}
}

View File

@ -0,0 +1,17 @@
Locales = {}
function _L(key)
local lang = GetConvar("illenium-appearance:locale", "en")
if not Locales[lang] then
lang = "en"
end
local value = Locales[lang]
for k in key:gmatch("[^.]+") do
value = value[k]
if not value then
print("Missing locale for: " .. key)
return ""
end
end
return value
end

View File

@ -0,0 +1,367 @@
Locales["nl"] = {
UI = {
modal = {
save = {
title = "Veranderingen Toepassen",
description = "Je blijft lelijk"
},
exit = {
title = "Menu Verlaten",
description = "Veranderingen worden niet opgeslagen"
},
accept = "Ja",
decline = "Nee"
},
ped = {
title = "Persoon",
model = "Model"
},
headBlend = {
title = "Erfenis",
shape = {
title = "Gezicht",
firstOption = "Vader",
secondOption = "Moeder",
mix = "Mix"
},
skin = {
title = "Huid",
firstOption = "Vader",
secondOption = "Moeder",
mix = "Mix"
},
race = {
title = "Ras",
shape = "Vorm",
skin = "Huid",
mix = "Mix"
}
},
faceFeatures = {
title = "Gezichtskenmerken",
nose = {
title = "Neus",
width = "Breedte",
height = "Hoogte",
size = "Groote",
boneHeight = "Bot hoogte",
boneTwist = "Bot twist",
peakHeight = "Neus hoogte"
},
eyebrows = {
title = "Wenkbrouwen",
height = "Hoogte",
depth = "Diepte"
},
cheeks = {
title = "Wangen",
boneHeight = "Bot hoogte",
boneWidth = "Bone width",
width = "Breedte"
},
eyesAndMouth = {
title = "Ogen en Mond",
eyesOpening = "Oog opening",
lipsThickness = "Lip dikte"
},
jaw = {
title = "Kaak",
width = "Breedte",
size = "Groote"
},
chin = {
title = "Kin",
lowering = "Verlaging",
length = "Lengte",
size = "Groote",
hole = "Gat groote"
},
neck = {
title = "Nek",
thickness = "Dikte"
}
},
headOverlays = {
title = "Uiterlijk",
hair = {
title = "Haar",
style = "Stijl",
color = "Kleur",
highlight = "Highlight",
texture = "Textuur",
fade = "Fade"
},
opacity = "Helderheid",
style = "Stijl",
color = "Kleur",
secondColor = "Secundaire Kleur",
blemishes = "Vlekken",
beard = "Baard",
eyebrows = "Wenkbrouwen",
ageing = "Veroudering",
makeUp = "Make up",
blush = "Blush",
complexion = "Tint",
sunDamage = "Zonnebrand",
lipstick = "Lippenstift",
moleAndFreckles = "Wrat en Sproeten",
chestHair = "Borst haar",
bodyBlemishes = "Lichaamelijke vlekken",
eyeColor = "Oog kleur"
},
components = {
title = "Kleding",
drawable = "Tekenbaar",
texture = "Textuur",
mask = "Masker",
upperBody = "Handen",
lowerBody = "Benen",
bags = "Tassen en parachute",
shoes = "Schoenen",
scarfAndChains = "Sjaal en kettingen",
shirt = "Shirt",
bodyArmor = "Vesten",
decals = "Stickers",
jackets = "Jassen",
head = "Hoofd"
},
props = {
title = "Sieraden",
drawable = "Tekenbaar",
texture = "Textuur",
hats = "Hoeden en helmen",
glasses = "Brillen",
ear = "Oor",
watches = "Horloges",
bracelets = "Armbanden"
},
tattoos = {
title = "Tattoos",
items = {
ZONE_TORSO = "Borstkas",
ZONE_HEAD = "Hoofd",
ZONE_LEFT_ARM = "Linker arm",
ZONE_RIGHT_ARM = "Rechter arm",
ZONE_LEFT_LEG = "Linker been",
ZONE_RIGHT_LEG = "Rechter been"
},
apply = "Toepassen",
delete = "Verwijder",
deleteAll = "Verwijder alle Tattoos",
opacity = "Helderheid"
}
},
outfitManagement = {
title = "Outfit Beheer",
jobText = "Beheer outfits voor Baan",
gangText = "Beheer outfits voor Bende"
},
cancelled = {
title = "Customisatie Geannuleerd",
description = "Customisatie niet opgeslagen"
},
outfits = {
import = {
title = "Voer outfit code in",
menuTitle = "Outfit Importeren",
description = "Importeer een outfit van een deelcode",
name = {
label = "Geef de outfit een naam",
placeholder = "Een mooie outfit",
default = "Geïmporteerde outfit"
},
code = {
label = "Outfit code"
},
success = {
title = "Outfit Geïmporteerd",
description = "Je kunt nu de outfit gebruiken via het outfit menu"
},
failure = {
title = "Import Mislukt",
description = "Ongeldige outfit code"
}
},
generate = {
title = "Genereer outfit-code",
description = "Genereer een outfit-code om te delen",
failure = {
title = "Er is iets fout gegaan",
description = "Generatie van code voor de outfit is mislukt"
},
success = {
title = "Outfit-code gegenereerd",
description = "Hier is je outfit-code"
}
},
save = {
menuTitle = "Huidige outfit opslaan",
menuDescription = "Sla je huidige outfit op als %s outfit",
description = "Sla je huidige outfit op",
title = "Geef je outfit een naam",
managementTitle = "Outfitbeheer details",
name = {
label = "Outfitnaam",
placeholder = "Heel gave outfit"
},
gender = {
label = "Geslacht",
male = "Man",
female = "Vrouw"
},
rank = {
label = "Minimumrang"
},
failure = {
title = "Opslaan mislukt",
description = "Outfit met deze naam bestaat al"
},
success = {
title = "Succes",
description = "Outfit %s is opgeslagen"
}
},
update = {
title = "Outfit bijwerken",
description = "Sla je huidige kleding op naar een bestaande outfit",
failure = {
title = "Bijwerken mislukt",
description = "Die outfit bestaat niet"
},
success = {
title = "Succes",
description = "Outfit %s is bijgewerkt"
}
},
change = {
title = "Outfit wijzigen",
description = "Kies uit een van je momenteel opgeslagen %s outfits",
pDescription = "Kies uit een van je momenteel opgeslagen outfits",
failure = {
title = "Er is iets fout gegaan",
description = "De outfit waar je naar probeert te wijzigen, heeft geen basisuiterlijk",
}
},
delete = {
title = "Outfit verwijderen",
description = "Verwijder een opgeslagen %s outfit",
mDescription = "Verwijder een van je opgeslagen outfits",
item = {
title = 'Verwijder "%s"',
description = "Model: %s%s"
},
success = {
title = "Succes",
description = "Outfit verwijderd"
}
},
manage = {
title = "👔 | Beheer %s outfits"
}
},
jobOutfits = {
title = "Werkoutfits",
description = "Kies uit een van je werkoutfits"
},
menu = {
returnTitle = "Terug",
title = "Kledingkamer",
outfitsTitle = "Speleroutfits",
clothingShopTitle = "Kledingwinkel",
barberShopTitle = "Kapper",
tattooShopTitle = "Tatoeëerder",
surgeonShopTitle = "Plastisch chirurg"
},
clothing = {
title = "Kleding kopen - $%d",
titleNoPrice = "Kleding wijzigen",
options = {
title = "👔 | Opties kledingwinkel",
description = "Kies uit een breed scala aan kledingstukken om te dragen"
},
outfits = {
title = "👔 | Opties outfit",
civilian = {
title = "Gewone outfit",
description = "Trek je eigen kleding aan"
}
}
},
commands = {
reloadskin = {
title = "Laadt je personage opnieuw",
failure = {
title = "Fout",
description = "Je kunt reloadskin nu niet gebruiken"
}
},
clearstuckprops = {
title = "Verwijdert alle props die aan de entiteit zijn bevestigd",
failure = {
title = "Fout",
description = "Je kunt clearstuckprops nu niet gebruiken"
}
},
pedmenu = {
title = "Open / Geef kledingmenu",
failure = {
title = "Fout",
description = "Speler niet online"
}
},
joboutfits = {
title = "Opent het menu Joboutfits"
},
gangoutfits = {
title = "Opent het menu Bende-outfits"
},
bossmanagedoutfits = {
title = "Opent het menu met door de baas beheerde outfits"
}
},
textUI = {
clothing = "Kledingwinkel - Prijs: $%d",
barber = "Kapper - Prijs: $%d",
tattoo = "Tattooshop - Prijs: $%d",
surgeon = "Plastisch Chirurg - Prijs: $%d",
clothingRoom = "Kleedkamer",
playerOutfitRoom = "Outfits"
},
migrate = {
success = {
title = "Succes",
description = "Migratie voltooid. %s skins gemigreerd",
descriptionSingle = "Gemigreerde huid"
},
skip = {
title = "Informatie",
description = "Overgeslagen skin"
},
typeError = {
title = "Fout",
description = "Ongeldig type"
}
},
purchase = {
tattoo = {
success = {
title = "Succes",
description = "Gekocht %s tattoo voor %s$"
},
failure = {
title = "Tatoeage toepassen mislukt",
description = "Je hebt niet genoeg geld!"
}
},
store = {
success = {
title = "Succes",
description = "$%s gegeven aan %s!"
},
failure = {
title = "Exploit!",
description = "Je had niet genoeg geld! Probeerde het systeem te misbruiken!"
}
}
}
}

View File

@ -0,0 +1,367 @@
Locales["pt-BR"] = {
UI = {
modal = {
save = {
title = "Salvar customização",
description = "Você continuará feio."
},
exit = {
title = "Sair da customização",
description = "Nenhuma mudança será salva"
},
accept = "Sim",
decline = "Não"
},
ped = {
title = "Ped",
model = "Modelo"
},
headBlend = {
title = "Herança",
shape = {
title = "Face",
firstOption = "Pai",
secondOption = "Mãe",
mix = "Mistura"
},
skin = {
title = "Pele",
firstOption = "Pai",
secondOption = "Mãe",
mix = "Mistura"
},
race = {
title = "Raça",
shape = "Face",
skin = "Pele",
mix = "Mistura"
}
},
faceFeatures = {
title = "Características faciais",
nose = {
title = "Nariz",
width = "Largura",
height = "Altura",
size = "Tamanho",
boneHeight = "Tamanho do osso",
boneTwist = "Desvio do osso",
peakHeight = "Altura da ponta"
},
eyebrows = {
title = "Sobrancelhas",
height = "Altura",
depth = "Profundidade"
},
cheeks = {
title = "Bochecha",
boneHeight = "Altura do osso",
boneWidth = "Largura do osso",
width = "Largura"
},
eyesAndMouth = {
title = "Olhos e boca",
eyesOpening = "Abertura dos olhos",
lipsThickness = "Espesurra dos lábios"
},
jaw = {
title = "Mandíbula",
width = "Largura",
size = "Tamanho"
},
chin = {
title = "Queixo",
lowering = "Altura",
length = "Comprimento",
size = "Tamanho",
hole = "Tamanho do furo"
},
neck = {
title = "Pescoço",
thickness = "Espessura"
}
},
headOverlays = {
title = "Aparência",
hair = {
title = "Cabelo",
style = "Estilo",
color = "Cor",
highlight = "Reflexo",
texture = "Estilo",
fade = "Degradê"
},
opacity = "Opacidade",
style = "Estilo",
color = "Cor",
secondColor = "Cor Secundária",
blemishes = "Manchas",
beard = "Barba",
eyebrows = "Sobrancelhas",
ageing = "Envelhecimento",
makeUp = "Maquiagem",
blush = "Blush",
complexion = "Aspecto",
sunDamage = "Dano solar",
lipstick = "Batom",
moleAndFreckles = "Verruga e sardas",
chestHair = "Cabelo do peito",
bodyBlemishes = "Manchas corporais",
eyeColor = "Cor dos olhos"
},
components = {
title = "Roupas",
drawable = "Modelo",
texture = "Textura",
mask = "Máscaras",
upperBody = "Mãos",
lowerBody = "Pernas",
bags = "Mochilas e paraquedas",
shoes = "Sapatos",
scarfAndChains = "Lenços e correntes",
shirt = "Camisa",
bodyArmor = "Colete",
decals = "Decalques",
jackets = "Jaquetas",
head = "Cabeça"
},
props = {
title = "Acessórios",
drawable = "Modelo",
texture = "Textura",
hats = "Chapéus e capacetes",
glasses = "Óculos",
ear = "Brincos",
watches = "Relógios",
bracelets = "Braceletes"
},
tattoos = {
title = "Tatuagens",
items = {
ZONE_TORSO = "Tronco",
ZONE_HEAD = "Cabeça",
ZONE_LEFT_ARM = "Braço esquerdo",
ZONE_RIGHT_ARM = "Braço direito",
ZONE_LEFT_LEG = "Perna esquerda",
ZONE_RIGHT_LEG = "Perna direita"
},
apply = "Aplicar",
delete = "Apagar",
deleteAll = "Apagar tudo",
opacity = "Opacidade"
}
},
outfitManagement = {
title = "Gerenciamento de Roupas",
jobText = "Gerenciar roupas para trabalho",
gangText = "Gerenciar roupas para gangue"
},
cancelled = {
title = "Personalização Cancelada",
description = "Personalização não salva"
},
outfits = {
import = {
title = "Inserir código da roupa",
menuTitle = "Importar roupa",
description = "Importar uma roupa usando um código de compartilhamento",
name = {
label = "Nome da Roupa",
placeholder = "Uma roupa legal",
default = "Roupa Importada"
},
code = {
label = "Código da Roupa"
},
success = {
title = "Roupa Importada",
description = "Agora você pode trocar para a roupa usando o menu de roupas"
},
failure = {
title = "Falha na Importação",
description = "Código da roupa inválido"
}
},
generate = {
title = "Gerar Código de Roupa",
description = "Gerar um código para compartilhar sua roupa",
failure = {
title = "Algo deu errado",
description = "Falha na geração de código para a roupa"
},
success = {
title = "Código de Roupa Gerado",
description = "Aqui está o código da sua roupa"
}
},
save = {
menuTitle = "Salvar Outfit Atual",
menuDescription = "Salve seu outfit atual como um outfit %s",
description = "Salve seu outfit atual",
title = "Nomeie seu outfit",
managementTitle = "Detalhes do Outfit de Gerenciamento",
name = {
label = "Nome do Outfit",
placeholder = "Outfit muito legal"
},
gender = {
label = "Gênero",
male = "Masculino",
female = "Feminino"
},
rank = {
label = "Classificação Mínima"
},
failure = {
title = "Falha ao Salvar",
description = "Outfit com este nome já existe"
},
success = {
title = "Sucesso",
description = "Outfit %s foi salvo"
}
},
update = {
title = "Atualizar Outfit",
description = "Salve sua roupa atual em um outfit existente",
failure = {
title = "Falha na Atualização",
description = "Aquele outfit não existe"
},
success = {
title = "Sucesso",
description = "Outfit %s foi atualizado"
}
},
change = {
title = "Mudar Outfit",
description = "Escolha entre seus %s outfits salvos atualmente",
pDescription = "Escolha entre seus outfits salvos atualmente",
failure = {
title = "Algo deu errado",
description = "O outfit que você está tentando mudar não tem uma aparência base",
}
},
delete = {
title = "Deletar roupa",
description = "Deletar uma roupa salva %s",
mDescription = "Deletar qualquer roupa salva",
item = {
title = 'Deletar "%s"',
description = "Modelo: %s%s"
},
success = {
title = "Sucesso",
description = "Roupa deletada"
}
},
manage = {
title = "👔 | Gerenciar roupas %s"
},
},
jobOutfits = {
title = "Roupas de Trabalho",
description = "Escolha entre suas roupas de trabalho"
},
menu = {
returnTitle = "Voltar",
title = "Vestuário",
outfitsTitle = "Roupas do Jogador",
clothingShopTitle = "Loja de Roupas",
barberShopTitle = "Barbearia",
tattooShopTitle = "Estúdio de Tatuagem",
surgeonShopTitle = "Cirurgião Plástico"
},
clothing = {
title = "Comprar Roupas - $%d",
titleNoPrice = "Mudar Roupas",
options = {
title = "👔 | Opções da loja de roupas",
description = "Escolha entre uma ampla variedade de itens para vestir"
},
outfits = {
title = "👔 | Opções de roupas",
civilian = {
title = "Roupa Civil",
description = "Vista suas roupas"
}
}
},
commands = {
reloadskin = {
title = "Recarrega seu personagem",
failure = {
title = "Erro",
description = "Você não pode usar reloadskin agora"
}
},
clearstuckprops = {
title = "Remove todos os acessórios presos à entidade",
failure = {
title = "Erro",
description = "Você não pode usar clearstuckprops agora"
}
},
pedmenu = {
title = "Abrir / Dar Menu de Roupas",
failure = {
title = "Erro",
description = "Jogador não está online"
}
},
joboutfits = {
title = "Abre o Menu de Trajes de Trabalho"
},
gangoutfits = {
title = "Abre o menu de trajes de gangue"
},
bossmanagedoutfits = {
title = "Abre o menu de roupas gerenciadas pelo chefe"
}
},
textUI = {
clothing = "Loja de Roupas - Preço: $%d",
barber = "Barbeiro - Preço: $%d",
tattoo = "Tatuador - Preço: $%d",
surgeon = "Cirurgião Plástico - Preço: $%d",
clothingRoom = "Sala de Roupas",
playerOutfitRoom = "Trajes"
},
migrate = {
success = {
title = "Sucesso",
description = "Migração finalizada. %s skins migradas",
descriptionSingle = "Pele migrada"
},
skip = {
title = "Informação",
description = "Pele ignorada"
},
typeError = {
title = "Erro",
description = "Tipo inválido"
}
},
purchase = {
tattoo = {
success = {
title = "Sucesso",
description = "Comprado tatuagem %s por %s$"
},
failure = {
title = "Falha na aplicação da tatuagem",
description = "Você não tem dinheiro suficiente!"
}
},
store = {
success = {
title = "Sucesso",
description = "Deu $%s para %s!"
},
failure = {
title = "Exploração!",
description = "Você não tinha dinheiro suficiente! Tentou explorar o sistema!"
}
}
}
}

View File

@ -0,0 +1,367 @@
Locales["ro-RO"] = {
UI = {
modal = {
save = {
title = "Salveaza modificarile",
description = "Arati mult mai bine acum :)"
},
exit = {
title = "Iesi din meniul de customizare",
description = "Nicio schimbare nu o sa se salveze"
},
accept = "Da",
decline = "Nu"
},
ped = {
title = "Ped",
model = "Model"
},
headBlend = {
title = "Aparente",
shape = {
title = "Fata",
firstOption = "Tata",
secondOption = "Mama",
mix = "Mix"
},
skin = {
title = "Pielea",
firstOption = "Tata",
secondOption = "Mama",
mix = "Mix"
},
race = {
title = "Rasă",
shape = "Fata",
skin = "Pielea",
mix = "Mix"
}
},
faceFeatures = {
title = "Optiuni fizionomie",
nose = {
title = "Nas",
width = "Latime",
height = "Inaltime",
size = "Marime",
boneHeight = "Inaltimea nasului",
boneTwist = "Rasucire nasului",
peakHeight = "Varful nasului"
},
eyebrows = {
title = "Sprancene",
height = "Inaltime",
depth = "Adancime"
},
cheeks = {
title = "Pometi",
boneHeight = "Inaltime",
boneWidth = "Latime",
width = "Latime pometi"
},
eyesAndMouth = {
title = "Ochi si gura",
eyesOpening = "Deschidere ochi",
lipsThickness = "Grosime buze"
},
jaw = {
title = "Falca",
width = "Latime",
size = "Marime"
},
chin = {
title = "Barbie",
lowering = "Latime",
length = "Lungime",
size = "Marime",
hole = "Marime gropita"
},
neck = {
title = "Gatul",
thickness = "Grosimea gatului"
}
},
headOverlays = {
title = "Optiuni aspect",
hair = {
title = "Par",
style = "Stil",
color = "Culoare",
highlight = "Highlight",
texture = "Textura",
fade = "Fade (tuns pierdut sau ras)"
},
opacity = "Opacitate",
style = "Stil",
color = "Culoare",
secondColor = "A doua culoare",
blemishes = "Pete piele",
beard = "Barba",
eyebrows = "Sprancene",
ageing = "Varsta",
makeUp = "Machiaj",
blush = "Fard",
complexion = "Complexitate",
sunDamage = "Daune solare",
lipstick = "Ruj",
moleAndFreckles = "Alunite si pistrui",
chestHair = "Parul de pe piept",
bodyBlemishes = "Pete corporale",
eyeColor = "Culoare ochi"
},
components = {
title = "Optiuni haine",
drawable = "Purtabile",
texture = "Texturi",
mask = "Masca",
upperBody = "Maini",
lowerBody = "Picioare",
bags = "Genti si parasute",
shoes = "Incaltaminte",
scarfAndChains = "Esarfe (gat) si optionale",
shirt = "Tricou",
bodyArmor = "Veste antiglont",
decals = "Imprimeuri",
jackets = "Jachete",
head = "Cap"
},
props = {
title = "Optiuni recuzita",
drawable = "Purtabile",
texture = "Texturi",
hats = "Sepci, caciuli si casti",
glasses = "Ochelari",
ear = "Pentru urechi",
watches = "Ceasuri",
bracelets = "Bratari"
},
tattoos = {
title = "Optiuni tatuaje",
items = {
ZONE_TORSO = "Pentru corp (fata-spate)",
ZONE_HEAD = "Pentru cap",
ZONE_LEFT_ARM = "Mana stanga",
ZONE_RIGHT_ARM = "Mana dreapta",
ZONE_LEFT_LEG = "Piciorul stang",
ZONE_RIGHT_LEG = "Piciorul drept"
},
apply = "Aplica",
delete = "Sterge",
deleteAll = "Sterge toate tatuajele",
opacity = "Opacitate"
}
},
outfitManagement = {
title = "Gestionarea outfit-urilor",
jobText = "Gestionați outfit-urile pentru job",
gangText = "Gestionați outfit-urile pentru bandă"
},
cancelled = {
title = "Personalizare anulată",
description = "Personalizarea nu a fost salvată"
},
outfits = {
import = {
title = "Introduceți codul outfit-ului",
menuTitle = "Importați outfit-ul",
description = "Importați un outfit folosind un cod de distribuire",
name = {
label = "Denumiți outfit-ul",
placeholder = "Un outfit frumos",
default = "Outfit importat"
},
code = {
label = "Codul outfit-ului"
},
success = {
title = "Outfit-ul a fost importat",
description = "Acum puteți schimba outfit-ul folosind meniul pentru outfit-uri"
},
failure = {
title = "Eșec la importare",
description = "Cod de outfit invalid"
}
},
generate = {
title = "Generează cod pentru outfit",
description = "Generează un cod pentru a distribui outfit-ul",
failure = {
title = "Ceva nu a mers bine",
description = "Generarea codului a eșuat pentru outfit"
},
success = {
title = "Codul outfit-ului a fost generat",
description = "Aici este codul pentru outfit-ul tău"
}
},
save = {
menuTitle = "Salvează outfit-ul curent",
menuDescription = "Salvează outfit-ul tău curent ca outfit %s",
description = "Salvează outfit-ul tău curent",
title = "Denumiți outfit-ul",
managementTitle = "Detalii de management outfit",
name = {
label = "Nume outfit",
placeholder = "Outfit foarte fain"
},
gender = {
label = "Gen",
male = "Bărbat",
female = "Femeie"
},
rank = {
label = "Rang minim"
},
failure = {
title = "Salvarea a eșuat",
description = "Outfit-ul cu acest nume deja există"
},
success = {
title = "Succes",
description = "Outfit-ul %s a fost salvat"
}
},
update = {
title = "Actualizare outfit",
description = "Salvați îmbrăcămintea actuală într-un outfit existent",
failure = {
title = "Actualizare eșuată",
description = "Acel outfit nu există"
},
success = {
title = "Succes",
description = "Outfit-ul %s a fost actualizat"
}
},
change = {
title = "Schimbă outfit",
description = "Alegeți oricare dintre outfit-urile %s salvate",
pDescription = "Alegeți oricare dintre outfit-urile salvate",
failure = {
title = "Ceva nu a mers bine",
description = "Outfit-ul către care încercați să faceți schimb nu are un aspect de bază",
}
},
delete = {
title = "Șterge outfit",
description = "Ștergeți un outfit %s salvat",
mDescription = "Ștergeți oricare dintre outfit-urile salvate",
item = {
title = 'Ștergeți "%s"',
description = "Model: %s%s"
},
success = {
title = "Succes",
description = "Outfit-ul a fost șters"
}
},
manage = {
title = "👔 | Gestionați outfit-urile %s"
}
},
jobOutfits = {
title = "Outfit-uri de serviciu",
description = "Alegeți oricare din outfit-urile de serviciu"
},
menu = {
returnTitle = "Înapoi",
title = "Cameră pentru haine",
outfitsTitle = "Outfit-uri ale jucătorului",
clothingShopTitle = "Magazin de haine",
barberShopTitle = "Frizerie",
tattooShopTitle = "Magazin de tatuaje",
surgeonShopTitle = "Cabinet de chirurgie plastică"
},
clothing = {
title = "Cumpără haine - %d$",
titleNoPrice = "Schimbă hainele",
options = {
title = "👔 | Opțiuni magazin de haine",
description = "Alege dintr-o gamă largă de articole de îmbrăcăminte"
},
outfits = {
title = "👔 | Opțiuni outfit-uri",
civilian = {
title = "Outfit civil",
description = "Pune-ți hainele"
}
}
},
commands = {
reloadskin = {
title = "Reîncarcă personajul",
failure = {
title = "Eroare",
description = "Nu poți folosi reloadskin în acest moment"
}
},
clearstuckprops = {
title = "Înlătură toate obiectele atașate de entitate",
failure = {
title = "Eroare",
description = "Nu poți folosi clearstuckprops în acest moment"
}
},
pedmenu = {
title = "Deschide / Dă meniul pentru haine",
failure = {
title = "Eroare",
description = "Jucătorul nu este conectat"
}
},
joboutfits = {
title = "Deschide meniul ținute pentru locuri de muncă"
},
gangoutfits = {
title = "Deschide meniul Gang Outfits"
},
bossmanagedoutfits = {
title = "Deschide meniul pentru outfit-urile administrate de șef"
}
},
textUI = {
clothing = "Magazin de haine - Preț: %d$",
barber = "Frizerie - Preț: %d$",
tattoo = "Magazin de tatuaje - Preț: %d$",
surgeon = "Cabinet de chirurgie plastică - Preț: %d$",
clothingRoom = "Cameră pentru haine",
playerOutfitRoom = "Outfit-uri"
},
migrate = {
success = {
title = "Succes",
description = "Migrația s-a încheiat. %s skin-uri au fost migrați",
descriptionSingle = "Un singur skin migrat"
},
skip = {
title = "Informație",
description = "Skin omis"
},
typeError = {
title = "Eroare",
description = "Tip invalid"
}
},
purchase = {
tattoo = {
success = {
title = "Succes",
description = "Ai cumpărat tatuajul %s pentru %s$"
},
failure = {
title = "Aplicarea tatuajului a eșuat",
description = "Nu ai destui bani!"
}
},
store = {
success = {
title = "Succes",
description = "I-ai dat %s$ lui %s!"
},
failure = {
title = "Exploit!",
description = "Nu ai destui bani! Ai încercat să exploatezi sistemul!"
}
}
}
}

View File

@ -0,0 +1,367 @@
Locales["zh-CN"] = {
UI = {
modal = {
save = {
title = "保存定制",
description = "您还是那么丑"
},
exit = {
title = "退出定制",
description = "不会保存任何更改"
},
accept = "",
decline = ""
},
ped = {
title = "角色",
model = "模型"
},
headBlend = {
title = "遗传",
shape = {
title = "面部",
firstOption = "父亲",
secondOption = "母亲",
mix = "混合"
},
skin = {
title = "肤色",
firstOption = "父亲",
secondOption = "母亲",
mix = "混合"
},
race = {
title = "种族",
shape = "形状",
skin = "肤色",
mix = "混合"
}
},
faceFeatures = {
title = "面部特征",
nose = {
title = "鼻子",
width = "宽度",
height = "高度",
size = "大小",
boneHeight = "骨骼高度",
boneTwist = "骨骼扭曲",
peakHeight = "峰值高度"
},
eyebrows = {
title = "眉毛",
height = "高度",
depth = "深度"
},
cheeks = {
title = "脸颊",
boneHeight = "骨骼高度",
boneWidth = "骨骼宽度",
width = "宽度"
},
eyesAndMouth = {
title = "眼睛和嘴巴",
eyesOpening = "眼睛张开",
lipsThickness = "嘴唇厚度"
},
jaw = {
title = "下巴",
width = "宽度",
size = "大小"
},
chin = {
title = "下颚",
lowering = "下降",
length = "长度",
size = "大小",
hole = "孔的大小"
},
neck = {
title = "脖子",
thickness = "厚度"
}
},
headOverlays = {
title = "外貌",
hair = {
title = "发型",
style = "风格",
color = "颜色",
highlight = "亮色",
texture = "贴图",
fade = "淡出"
},
opacity = "透明度",
style = "风格",
color = "颜色",
secondColor = "次要颜色",
blemishes = "瑕疵",
beard = "胡须",
eyebrows = "眉毛",
ageing = "衰老",
makeUp = "化妆",
blush = "腮红",
complexion = "肤色",
sunDamage = "晒伤",
lipstick = "口红",
moleAndFreckles = "痣和雀斑",
chestHair = "胸毛",
bodyBlemishes = "身体瑕疵",
eyeColor = "眼睛颜色"
},
components = {
title = "服装",
drawable = "服装编号",
texture = "贴图",
mask = "面具",
upperBody = "上身",
lowerBody = "下身",
bags = "背包和降落伞",
shoes = "鞋子",
scarfAndChains = "围巾和链子",
shirt = "衬衫",
bodyArmor = "防弹衣",
decals = "贴花",
jackets = "夹克",
head = "头部"
},
props = {
title = "挂饰",
drawable = "挂饰编号",
texture = "贴图",
hats = "帽子和头盔",
glasses = "眼镜",
ear = "耳朵",
watches = "手表",
bracelets = "手镯"
},
tattoos = {
title = "纹身",
items = {
ZONE_TORSO = "躯干",
ZONE_HEAD = "头部",
ZONE_LEFT_ARM = "左臂",
ZONE_RIGHT_ARM = "右臂",
ZONE_LEFT_LEG = "左腿",
ZONE_RIGHT_LEG = "右腿"
},
apply = "应用",
delete = "移除",
deleteAll = "移除所有纹身",
opacity = "透明度"
}
},
outfitManagement = {
title = "服装管理",
jobText = "管理职业服装",
gangText = "管理帮派服装"
},
cancelled = {
title = "取消定制",
description = "未保存定制"
},
outfits = {
import = {
title = "输入服装代码",
menuTitle = "导入服装",
description = "从共享代码导入服装",
name = {
label = "命名服装",
placeholder = "一个不错的服装",
default = "导入的服装"
},
code = {
label = "服装代码"
},
success = {
title = "导入服装成功",
description = "现在您可以使用服装菜单切换到该服装"
},
failure = {
title = "导入失败",
description = "无效的服装代码"
}
},
generate = {
title = "生成服装代码",
description = "生成一个共享的服装代码",
failure = {
title = "出现问题",
description = "生成服装代码失败"
},
success = {
title = "生成服装代码成功",
description = "这是您的服装代码"
}
},
save = {
menuTitle = "保存当前服装",
menuDescription = "将当前服装保存为%s服装",
description = "保存当前服装",
title = "命名您的服装",
managementTitle = "管理服装细节",
name = {
label = "服装名称",
placeholder = "非常酷的服装"
},
gender = {
label = "性别",
male = "男性",
female = "女性"
},
rank = {
label = "最低等级"
},
failure = {
title = "保存失败",
description = "同名的服装已存在"
},
success = {
title = "成功",
description = "已保存服装%s"
}
},
update = {
title = "更新服装",
description = "将当前服装保存到现有的服装中",
failure = {
title = "更新失败",
description = "该服装不存在"
},
success = {
title = "成功",
description = "已更新服装%s"
}
},
change = {
title = "切换服装",
description = "从当前保存的%s服装中选择",
pDescription = "从当前保存的服装中选择",
failure = {
title = "出现问题",
description = "您尝试切换到的服装没有基本外观",
}
},
delete = {
title = "删除服装",
description = "删除保存的%s服装",
mDescription = "删除任意保存的服装",
item = {
title = '删除"%s"',
description = "模型:%s%s"
},
success = {
title = "成功",
description = "已删除服装"
}
},
manage = {
title = "👔 | 管理%s服装"
}
},
jobOutfits = {
title = "工作服装",
description = "从您的工作服装中选择"
},
menu = {
returnTitle = "返回",
title = "更衣室",
outfitsTitle = "玩家服装",
clothingShopTitle = "服装商店",
barberShopTitle = "理发店",
tattooShopTitle = "纹身店",
surgeonShopTitle = "整容店"
},
clothing = {
title = "购买服装 - $%d",
titleNoPrice = "更换服装",
options = {
title = "👔 | 服装商店选项",
description = "从各种各样的服装中选择"
},
outfits = {
title = "👔 | 服装选项",
civilian = {
title = "民用服装",
description = "穿上您的衣服"
}
}
},
commands = {
reloadskin = {
title = "重新加载您的角色",
failure = {
title = "错误",
description = "您现在不能重新加载角色"
}
},
clearstuckprops = {
title = "移除附加到实体的所有挂饰",
failure = {
title = "错误",
description = "您现在不能移除挂饰"
}
},
pedmenu = {
title = "打开/给予服装菜单",
failure = {
title = "错误",
description = "玩家不在线"
}
},
joboutfits = {
title = "打开工作服装菜单"
},
gangoutfits = {
title = "打开帮派服装菜单"
},
bossmanagedoutfits = {
title = "打开老板管理的服装菜单"
}
},
textUI = {
clothing = "服装商店 - 价格:%d$",
barber = "理发店 - 价格:%d$",
tattoo = "纹身店 - 价格:%d$",
surgeon = "整容店 - 价格:%d$",
clothingRoom = "更衣室",
playerOutfitRoom = "服装"
},
migrate = {
success = {
title = "成功",
description = "迁移完成。已迁移%s个外观",
descriptionSingle = "已迁移的外观"
},
skip = {
title = "信息",
description = "跳过外观编辑"
},
typeError = {
title = "错误",
description = "无效的类型"
}
},
purchase = {
tattoo = {
success = {
title = "成功",
description = "购买%s纹身价格%s$"
},
failure = {
title = "纹身应用失败",
description = "您没有足够的钱!"
}
},
store = {
success = {
title = "成功",
description = "将%s$给予%s"
},
failure = {
title = "利用漏洞!",
description = "作弊夸技巧,贫贱露真貌,钱少心更扰,空赢世人笑。"
}
}
}
}

View File

@ -0,0 +1,367 @@
Locales["zh-TW"] = {
UI = {
modal = {
save = {
title = "儲存客製化",
description = "您還是一樣醜"
},
exit = {
title = "退出客製化",
description = "不會儲存任何更改"
},
accept = "",
decline = ""
},
ped = {
title = "角色",
model = "模型"
},
headBlend = {
title = "遺傳",
shape = {
title = "臉部",
firstOption = "父親",
secondOption = "母親",
mix = "混合"
},
skin = {
title = "膚色",
firstOption = "父親",
secondOption = "母親",
mix = "混合"
},
race = {
title = "種族",
shape = "形狀",
skin = "膚色",
mix = "混合"
}
},
faceFeatures = {
title = "臉部特徵",
nose = {
title = "鼻子",
width = "寬度",
height = "高度",
size = "大小",
boneHeight = "骨骼高度",
boneTwist = "骨骼扭曲",
peakHeight = "峰值高度"
},
eyebrows = {
title = "眉毛",
height = "高度",
depth = "深度"
},
cheeks = {
title = "臉頰",
boneHeight = "骨骼高度",
boneWidth = "骨骼寬度",
width = "寬度"
},
eyesAndMouth = {
title = "眼睛和嘴巴",
eyesOpening = "眼睛張開",
lipsThickness = "嘴唇厚度"
},
jaw = {
title = "下巴",
width = "寬度",
size = "大小"
},
chin = {
title = "下顎",
lowering = "下降",
length = "長度",
size = "大小",
hole = "孔的大小"
},
neck = {
title = "脖子",
thickness = "厚度"
}
},
headOverlays = {
title = "外貌",
hair = {
title = "髮型",
style = "風格",
color = "顏色",
highlight = "亮色",
texture = "貼圖",
fade = "淡出"
},
opacity = "透明度",
style = "風格",
color = "顏色",
secondColor = "次要顏色",
blemishes = "瑕疵",
beard = "鬍鬚",
eyebrows = "眉毛",
ageing = "衰老",
makeUp = "化妝",
blush = "腮紅",
complexion = "膚色",
sunDamage = "曬傷",
lipstick = "口紅",
moleAndFreckles = "痣和雀斑",
chestHair = "胸毛",
bodyBlemishes = "身體瑕疵",
eyeColor = "眼睛顏色"
},
components = {
title = "服裝",
drawable = "服裝編號",
texture = "貼圖",
mask = "面具",
upperBody = "上身",
lowerBody = "下身",
bags = "背包和降落傘",
shoes = "鞋子",
scarfAndChains = "圍巾和鏈子",
shirt = "襯衫",
bodyArmor = "防彈衣",
decals = "貼花",
jackets = "夾克",
head = "頭部"
},
props = {
title = "掛飾",
drawable = "掛飾編號",
texture = "貼圖",
hats = "帽子和頭盔",
glasses = "眼鏡",
ear = "耳朵",
watches = "手錶",
bracelets = "手鐲"
},
tattoos = {
title = "紋身",
items = {
ZONE_TORSO = "軀幹",
ZONE_HEAD = "頭部",
ZONE_LEFT_ARM = "左臂",
ZONE_RIGHT_ARM = "右臂",
ZONE_LEFT_LEG = "左腿",
ZONE_RIGHT_LEG = "右腿"
},
apply = "應用",
delete = "移除",
deleteAll = "移除所有紋身",
opacity = "透明度"
}
},
outfitManagement = {
title = "服裝管理",
jobText = "管理職業服裝",
gangText = "管理幫派服裝"
},
cancelled = {
title = "取消客製化",
description = "未儲存客製化"
},
outfits = {
import = {
title = "輸入服裝代碼",
menuTitle = "匯入服裝",
description = "從共享代碼匯入服裝",
name = {
label = "命名服裝",
placeholder = "一個不錯的服裝",
default = "匯入的服裝"
},
code = {
label = "服裝代碼"
},
success = {
title = "匯入服裝成功",
description = "現在您可以使用服裝菜單切換到該服裝"
},
failure = {
title = "匯入失敗",
description = "無效的服裝代碼"
}
},
generate = {
title = "生成服裝代碼",
description = "生成一個共享的服裝代碼",
failure = {
title = "出現問題",
description = "生成服裝代碼失敗"
},
success = {
title = "生成服裝代碼成功",
description = "這是您的服裝代碼"
}
},
save = {
menuTitle = "儲存當前服裝",
menuDescription = "將當前服裝儲存為%s服裝",
description = "儲存當前服裝",
title = "命名您的服裝",
managementTitle = "管理服裝細節",
name = {
label = "服裝名稱",
placeholder = "非常酷的服裝"
},
gender = {
label = "性別",
male = "男性",
female = "女性"
},
rank = {
label = "最低等級"
},
failure = {
title = "儲存失敗",
description = "同名的服裝已存在"
},
success = {
title = "成功",
description = "已儲存服裝%s"
}
},
update = {
title = "更新服裝",
description = "將當前服裝儲存到現有的服裝中",
failure = {
title = "更新失敗",
description = "該服裝不存在"
},
success = {
title = "成功",
description = "已更新服裝%s"
}
},
change = {
title = "切換服裝",
description = "從當前儲存的%s服裝中選擇",
pDescription = "從當前儲存的服裝中選擇",
failure = {
title = "出現問題",
description = "您嘗試切換到的服裝沒有基本外觀",
}
},
delete = {
title = "刪除服裝",
description = "刪除儲存的%s服裝",
mDescription = "刪除任意儲存的服裝",
item = {
title = '刪除"%s"',
description = "模型:%s%s"
},
success = {
title = "成功",
description = "已刪除服裝"
}
},
manage = {
title = "👔 | 管理%s服裝"
}
},
jobOutfits = {
title = "工作服裝",
description = "從您的工作服裝中選擇"
},
menu = {
returnTitle = "返回",
title = "更衣室",
outfitsTitle = "玩家服裝",
clothingShopTitle = "服裝商店",
barberShopTitle = "理髮店",
tattooShopTitle = "紋身店",
surgeonShopTitle = "整容店"
},
clothing = {
title = "購買服裝 - $%d",
titleNoPrice = "更換服裝",
options = {
title = "👔 | 服裝商店選項",
description = "從各種各樣的服裝中選擇"
},
outfits = {
title = "👔 | 服裝選項",
civilian = {
title = "民用服裝",
description = "穿上您的衣服"
}
}
},
commands = {
reloadskin = {
title = "重新加載您的角色",
failure = {
title = "錯誤",
description = "您現在不能重新加載角色"
}
},
clearstuckprops = {
title = "移除附加到實體的所有道具",
failure = {
title = "錯誤",
description = "您現在不能移除掛飾"
}
},
pedmenu = {
title = "打開/給予服裝菜單",
failure = {
title = "錯誤",
description = "玩家不在線"
}
},
joboutfits = {
title = "打開工作服裝菜單"
},
gangoutfits = {
title = "打開幫派服裝菜單"
},
bossmanagedoutfits = {
title = "打開老闆管理的服裝菜單"
}
},
textUI = {
clothing = "服裝商店 - 價格:%d$",
barber = "理髮店 - 價格:%d$",
tattoo = "紋身店 - 價格:%d$",
surgeon = "整容店 - 價格:%d$",
clothingRoom = "更衣室",
playerOutfitRoom = "服裝"
},
migrate = {
success = {
title = "成功",
description = "遷移完成。已遷移%s個外觀",
descriptionSingle = "已遷移的外觀"
},
skip = {
title = "信息",
description = "跳過外觀編輯"
},
typeError = {
title = "錯誤",
description = "無效的類型"
}
},
purchase = {
tattoo = {
success = {
title = "成功",
description = "購買%s紋身價格%s$"
},
failure = {
title = "紋身應用失敗",
description = "您沒有足夠的錢!"
}
},
store = {
success = {
title = "成功",
description = "將%s$給予%s"
},
failure = {
title = "利用漏洞!",
description = "作弊夸技巧,貧賤露真貌,錢少心更擾,空贏世人笑。"
}
}
}
}

View File

@ -0,0 +1 @@
Database = {}

View File

@ -0,0 +1,5 @@
Database.JobGrades = {}
function Database.JobGrades.GetByJobName(name)
return MySQL.query.await("SELECT grade,name,label FROM job_grades WHERE job_name = ?", {name})
end

View File

@ -0,0 +1,30 @@
Database.ManagementOutfits = {}
function Database.ManagementOutfits.GetAllByJob(type, jobName, gender)
local query = "SELECT * FROM management_outfits WHERE type = ? AND job_name = ?"
local queryArgs = {type, jobName}
if gender then
query = query .. " AND gender = ?"
queryArgs[#queryArgs + 1] = gender
end
return MySQL.query.await(query, queryArgs)
end
function Database.ManagementOutfits.Add(outfitData)
return MySQL.insert.await("INSERT INTO management_outfits (job_name, type, minrank, name, gender, model, props, components) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", {
outfitData.JobName,
outfitData.Type,
outfitData.MinRank,
outfitData.Name,
outfitData.Gender,
outfitData.Model,
json.encode(outfitData.Props),
json.encode(outfitData.Components)
})
end
function Database.ManagementOutfits.DeleteByID(id)
MySQL.query.await("DELETE FROM management_outfits WHERE id = ?", {id})
end

View File

@ -0,0 +1,17 @@
Database.PlayerOutfitCodes = {}
function Database.PlayerOutfitCodes.GetByCode(code)
return MySQL.single.await("SELECT * FROM player_outfit_codes WHERE code = ?", {code})
end
function Database.PlayerOutfitCodes.GetByOutfitID(outfitID)
return MySQL.single.await("SELECT * FROM player_outfit_codes WHERE outfitID = ?", {outfitID})
end
function Database.PlayerOutfitCodes.Add(outfitID, code)
return MySQL.insert.await("INSERT INTO player_outfit_codes (outfitid, code) VALUES (?, ?)", {outfitID, code})
end
function Database.PlayerOutfitCodes.DeleteByOutfitID(id)
MySQL.query.await("DELETE FROM player_outfit_codes WHERE outfitid = ?", {id})
end

View File

@ -0,0 +1,36 @@
Database.PlayerOutfits = {}
function Database.PlayerOutfits.GetAllByCitizenID(citizenid)
return MySQL.query.await("SELECT * FROM player_outfits WHERE citizenid = ?", {citizenid})
end
function Database.PlayerOutfits.GetByID(id)
return MySQL.single.await("SELECT * FROM player_outfits WHERE id = ?", {id})
end
function Database.PlayerOutfits.GetByOutfit(name, citizenid) -- for validate duplicate name before insert
return MySQL.single.await("SELECT * FROM player_outfits WHERE outfitname = ? AND citizenid = ?", {name, citizenid})
end
function Database.PlayerOutfits.Add(citizenID, outfitName, model, components, props)
return MySQL.insert.await("INSERT INTO player_outfits (citizenid, outfitname, model, components, props) VALUES (?, ?, ?, ?, ?)", {
citizenID,
outfitName,
model,
components,
props
})
end
function Database.PlayerOutfits.Update(outfitID, model, components, props)
return MySQL.update.await("UPDATE player_outfits SET model = ?, components = ?, props = ? WHERE id = ?", {
model,
components,
props,
outfitID
})
end
function Database.PlayerOutfits.DeleteByID(id)
MySQL.query.await("DELETE FROM player_outfits WHERE id = ?", {id})
end

View File

@ -0,0 +1,5 @@
Database.Players = {}
function Database.Players.GetAll()
return MySQL.query.await("SELECT * FROM players")
end

View File

@ -0,0 +1,34 @@
Database.PlayerSkins = {}
function Database.PlayerSkins.UpdateActiveField(citizenID, active)
MySQL.update.await("UPDATE playerskins SET active = ? WHERE citizenid = ?", {active, citizenID}) -- Make all the skins inactive / active
end
function Database.PlayerSkins.DeleteByModel(citizenID, model)
MySQL.query.await("DELETE FROM playerskins WHERE citizenid = ? AND model = ?", {citizenID, model})
end
function Database.PlayerSkins.Add(citizenID, model, appearance, active)
MySQL.insert.await("INSERT INTO playerskins (citizenid, model, skin, active) VALUES (?, ?, ?, ?)", {citizenID, model, appearance, active})
end
function Database.PlayerSkins.GetByCitizenID(citizenID, model)
local query = "SELECT skin FROM playerskins WHERE citizenid = ?"
local queryArgs = {citizenID}
if model ~= nil then
query = query .. " AND model = ?"
queryArgs[#queryArgs + 1] = model
else
query = query .. " AND active = ?"
queryArgs[#queryArgs + 1] = 1
end
return MySQL.scalar.await(query, queryArgs)
end
function Database.PlayerSkins.DeleteByCitizenID(citizenID)
MySQL.query.await("DELETE FROM playerskins WHERE citizenid = ?", { citizenID })
end
function Database.PlayerSkins.GetAll()
return MySQL.query.await("SELECT * FROM playerskins")
end

View File

@ -0,0 +1,13 @@
Database.Users = {}
function Database.Users.UpdateSkinForUser(citizenID, skin)
return MySQL.update.await("UPDATE users SET skin = ? WHERE identifier = ?", {skin, citizenID})
end
function Database.Users.GetSkinByCitizenID(citizenID)
return MySQL.single.await("SELECT skin FROM users WHERE identifier = ?", {citizenID})
end
function Database.Users.GetAll()
return MySQL.query.await("SELECT * FROM users")
end

View File

@ -0,0 +1,18 @@
if not Framework.ESX() then return end
local ESX = exports["ui_core"]:getSharedObject()
ESX.RegisterServerCallback("esx_skin:getPlayerSkin", function(source, cb)
local Player = ESX.GetPlayerFromId(source)
local appearance = Framework.GetAppearance(Player.identifier)
cb(appearance, {
skin_male = Player.job.skin_male,
skin_female = Player.job.skin_female
})
end)
lib.callback.register("illenium-appearance:server:esx:getGradesForJob", function(_, jobName)
return Database.JobGrades.GetByJobName(jobName)
end)

View File

@ -0,0 +1,63 @@
if not Framework.ESX() then return end
local ESX = exports["ui_core"]:getSharedObject()
function Framework.GetPlayerID(src)
local Player = ESX.GetPlayerFromId(src)
if Player then
return Player.identifier
end
end
function Framework.HasMoney(src, type, money)
if type == "cash" then
type = "money"
end
local Player = ESX.GetPlayerFromId(src)
return Player.getAccount(type).money >= money
end
function Framework.RemoveMoney(src, type, money)
if type == "cash" then
type = "money"
end
local Player = ESX.GetPlayerFromId(src)
if Player.getAccount(type).money >= money then
Player.removeAccountMoney(type, money)
return true
end
return false
end
function normalizeGrade(job)
job.grade = {
level = job.grade
}
return job
end
function Framework.GetJob(src)
local Player = ESX.GetPlayerFromId(src)
return normalizeGrade(Player.getJob())
end
function Framework.GetGang(src)
local Player = ESX.GetPlayerFromId(src)
return normalizeGrade(Player.getJob())
end
function Framework.SaveAppearance(appearance, citizenID)
Database.Users.UpdateSkinForUser(citizenID, json.encode(appearance))
end
function Framework.GetAppearance(citizenID)
local user = Database.Users.GetSkinByCitizenID(citizenID)
if user then
local skin = json.decode(user.skin)
if skin then
skin.sex = skin.model == "mp_m_freemode_01" and 0 or 1
return skin
end
end
return nil
end

View File

@ -0,0 +1,28 @@
if not Framework.ESX() then return end
if Config.BossManagedOutfits then
function isBoss(grades, grade)
local highestGrade = grades[1].grade
for i = 2, #grades do
if grades[i].grade > highestGrade then
highestGrade = grades[i].grade
end
end
return highestGrade == grade
end
lib.addCommand("bossmanagedoutfits", { help = _L("commands.bossmanagedoutfits.title"), }, function(source)
local job = Framework.GetJob(source)
local grades = Database.JobGrades.GetByJobName(job.name)
if not grades then
return
end
if not isBoss(grades, job.grade.level) then
return
end
TriggerClientEvent("illenium-appearance:client:OutfitManagementMenu", source, {
type = "Job"
})
end)
end

View File

@ -0,0 +1,156 @@
if not Framework.ESX() then return end
local function tofloat(num)
return num + 0.0
end
local function convertSkinToNewFormat(oldSkin, gender)
local skin = {
components = Framework.ConvertComponents(oldSkin),
eyeColor = oldSkin.eye_color,
faceFeatures = {
chinBoneLenght = tofloat((oldSkin.chin_2 or 0) / 10),
noseBoneTwist = tofloat((oldSkin.nose_6 or 0) / 10),
nosePeakHigh = tofloat((oldSkin.nose_2 or 0) / 10),
jawBoneWidth = tofloat((oldSkin.jaw_1 or 0) / 10),
cheeksWidth = tofloat((oldSkin.cheeks_3 or 0) / 10),
eyeBrownHigh = tofloat((oldSkin.eyebrows_5 or 0) / 10),
chinHole = tofloat((oldSkin.chin_4 or 0) / 10),
jawBoneBackSize = tofloat((oldSkin.jaw_2 or 0) / 10),
eyesOpening = tofloat((oldSkin.eye_squint or 0) / 10),
lipsThickness = tofloat((oldSkin.lip_thickness or 0) / 10),
nosePeakSize = tofloat((oldSkin.nose_3 or 0) / 10),
eyeBrownForward = tofloat((oldSkin.eyebrows_6 or 0) / 10),
neckThickness = tofloat((oldSkin.neck_thickness or 0) / 10),
chinBoneSize = tofloat((oldSkin.chin_3 or 0) / 10),
chinBoneLowering = tofloat((oldSkin.chin_1 or 0) / 10),
cheeksBoneWidth = tofloat((oldSkin.cheeks_2 or 0) / 10),
nosePeakLowering = tofloat((oldSkin.nose_5 or 0) / 10),
noseBoneHigh = tofloat((oldSkin.nose_4 or 0) / 10),
cheeksBoneHigh = tofloat((oldSkin.cheeks_1 or 0) / 10),
noseWidth = tofloat((oldSkin.nose_1 or 0) / 10)
},
hair = {
highlight = oldSkin.hair_color_2 or 0,
texture = oldSkin.hair_2 or 0,
style = oldSkin.hair_1 or 0,
color = oldSkin.hair_color_1 or 0
},
headBlend = {
thirdMix = 0,
skinSecond = oldSkin.dad or 0,
skinMix = tofloat((oldSkin.skin_md_weight or 0) / 100),
skinThird = 0,
shapeFirst = oldSkin.mom or 0,
shapeThird = 0,
shapeMix = tofloat((oldSkin.face_md_weight or 0) / 100),
shapeSecond = oldSkin.dad or 0,
skinFirst = oldSkin.mom or 0
},
headOverlays = {
complexion = {
opacity = tofloat((oldSkin.complexion_2 or 0) / 10),
color = 0,
style = oldSkin.complexion_1 or 0,
secondColor = 0
},
lipstick = {
opacity = tofloat((oldSkin.lipstick_2 or 0) / 10),
color = oldSkin.lipstick_3 or 0,
style = oldSkin.lipstick_1 or 0,
secondColor = oldSkin.lipstick_4 or 0
},
eyebrows = {
opacity = tofloat((oldSkin.eyebrows_2 or 0) / 10),
color = oldSkin.eyebrows_3 or 0,
style = oldSkin.eyebrows_1 or 0,
secondColor = oldSkin.eyebrows_4 or 0
},
beard = {
opacity = tofloat((oldSkin.beard_2 or 0) / 10),
color = oldSkin.beard_3 or 0,
style = oldSkin.beard_1 or 0,
secondColor = oldSkin.beard_4 or 0
},
blush = {
opacity = tofloat((oldSkin.blush_2 or 0) / 10),
color = oldSkin.blush_3 or 0,
style = oldSkin.blush_1 or 0,
secondColor = oldSkin.blush_4 or 0
},
ageing = {
opacity = tofloat((oldSkin.age_2 or 0) / 10),
color = 0,
style = oldSkin.age_1 or 0,
secondColor = 0
},
blemishes = {
opacity = tofloat((oldSkin.blemishes_2 or 0) / 10),
color = 0,
style = oldSkin.blemishes_1 or 0,
secondColor = 0
},
chestHair = {
opacity = tofloat((oldSkin.chest_2 or 0) / 10),
color = oldSkin.chest_3 or 0,
style = oldSkin.chest_1 or 0,
secondColor = 0
},
bodyBlemishes = {
opacity = tofloat((oldSkin.bodyb_2 or 0) / 10),
color = oldSkin.bodyb_3 or 0,
style = oldSkin.bodyb_1 or 0,
secondColor = oldSkin.bodyb_4 or 0
},
moleAndFreckles = {
opacity = tofloat((oldSkin.moles_2 or 0) / 10),
color = 0,
style = oldSkin.moles_1 or 0,
secondColor = 0
},
sunDamage = {
opacity = tofloat((oldSkin.sun_2 or 0) / 10),
color = 0,
style = oldSkin.sun_1 or 0,
secondColor = 0
},
makeUp = {
opacity = tofloat((oldSkin.makeup_2 or 0) / 10),
color = oldSkin.makeup_3 or 0,
style = oldSkin.makeup_1 or 0,
secondColor = oldSkin.makeup_4 or 0
}
},
model = gender == "m" and "mp_m_freemode_01" or "mp_f_freemode_01",
props = Framework.ConvertProps(oldSkin),
tattoos = {}
}
return skin
end
lib.addCommand("migrateskins", { help = "Migrate skins", restricted = "group.admin" }, function(source)
local users = Database.Users.GetAll()
local convertedSkins = 0
if users then
for i = 1, #users do
local user = users[i]
if user.skin then
local oldSkin = json.decode(user.skin)
if oldSkin.hair_1 then -- Convert only if its an old skin
local skin = json.encode(convertSkinToNewFormat(oldSkin, user.sex))
local affectedRows = Database.Users.UpdateSkinForUser(user.identifier, skin)
if affectedRows then
convertedSkins += 1
end
end
end
end
end
lib.notify(source, {
title = _L("migrate.success.title"),
description = string.format(_L("migrate.success.description"), tostring(convertedSkins)),
type = "success",
position = Config.NotifyOptions.position
})
end)

View File

@ -0,0 +1,36 @@
if not Framework.Ox() then return end
local Ox = require '@ox_core.lib.init'
function Framework.GetPlayerID(playerId)
return Ox.GetPlayer(playerId).charId
end
function Framework.HasMoney(playerId, item, amount)
return exports.ox_inventory:GetItemCount(playerId, item) >= amount
end
function Framework.RemoveMoney(playerId, type, amount)
return exports.ox_inventory:RemoveItem(playerId, type, amount)
end
function Framework.GetJob()
return ---@todo
end
function Framework.GetGang()
return ---@todo
end
function Framework.SaveAppearance(appearance, charId)
Database.PlayerSkins.UpdateActiveField(charId, 0)
Database.PlayerSkins.DeleteByModel(charId, appearance.model)
Database.PlayerSkins.Add(charId, appearance.model, json.encode(appearance), 1)
end
function Framework.GetAppearance(charId, model)
local result = Database.PlayerSkins.GetByCitizenID(charId, model)
if result then
return json.decode(result)
end
end

View File

@ -0,0 +1,43 @@
if not Framework.QBCore() then return end
local QBCore = exports["qb-core"]:GetCoreObject()
function Framework.GetPlayerID(src)
local Player = QBCore.Functions.GetPlayer(src)
if Player then
return Player.PlayerData.citizenid
end
end
function Framework.HasMoney(src, type, money)
local Player = QBCore.Functions.GetPlayer(src)
return Player.PlayerData.money[type] >= money
end
function Framework.RemoveMoney(src, type, money)
local Player = QBCore.Functions.GetPlayer(src)
return Player.Functions.RemoveMoney(type, money)
end
function Framework.GetJob(src)
local Player = QBCore.Functions.GetPlayer(src)
return Player.PlayerData.job
end
function Framework.GetGang(src)
local Player = QBCore.Functions.GetPlayer(src)
return Player.PlayerData.gang
end
function Framework.SaveAppearance(appearance, citizenID)
Database.PlayerSkins.UpdateActiveField(citizenID, 0)
Database.PlayerSkins.DeleteByModel(citizenID, appearance.model)
Database.PlayerSkins.Add(citizenID, appearance.model, json.encode(appearance), 1)
end
function Framework.GetAppearance(citizenID, model)
local result = Database.PlayerSkins.GetByCitizenID(citizenID, model)
if result then
return json.decode(result)
end
end

View File

@ -0,0 +1,97 @@
if not Framework.QBCore() then return end
local continue = false
local function MigrateFivemAppearance(source)
local allPlayers = Database.Players.GetAll()
local playerSkins = {}
for i=1, #allPlayers, 1 do
if allPlayers[i].skin then
playerSkins[#playerSkins+1] = {
citizenID = allPlayers[i].citizenid,
skin = allPlayers[i].skin
}
end
end
for i=1, #playerSkins, 1 do
Database.PlayerSkins.Add(playerSkins[i].citizenID, json.decode(playerSkins[i].skin).model, playerSkins[i].skin, 1)
end
lib.notify(source, {
title = _L("migrate.success.title"),
description = string.format(_L("migrate.success.description"), tostring(#playerSkins)),
type = "success",
position = Config.NotifyOptions.position
})
end
local function MigrateQBClothing(source)
local allPlayerSkins = Database.PlayerSkins.GetAll()
local migrated = 0
for i=1, #allPlayerSkins, 1 do
if not tonumber(allPlayerSkins[i].model) then
lib.notify(source, {
title = _L("migrate.skip.title"),
description = _L("migrate.skip.description"),
type = "inform",
position = Config.NotifyOptions.position
})
else
TriggerClientEvent("illenium-appearance:client:migration:load-qb-clothing-skin", source, allPlayerSkins[i])
while not continue do
Wait(10)
end
continue = false
migrated = migrated + 1
end
end
TriggerClientEvent("illenium-appearance:client:reloadSkin", source)
lib.notify(source, {
title = _L("migrate.success.title"),
description = string.format(_L("migrate.success.description"), tostring(migrated)),
type = "success",
position = Config.NotifyOptions.position
})
end
RegisterNetEvent("illenium-appearance:server:migrate-qb-clothing-skin", function(citizenid, appearance)
local src = source
Database.PlayerSkins.DeleteByCitizenID(citizenid)
Database.PlayerSkins.Add(citizenid, appearance.model, json.encode(appearance), 1)
continue = true
lib.notify(src, {
id = "illenium_appearance_skin_migrated",
title = _L("migrate.success.title"),
description = _L("migrate.success.descriptionSingle"),
type = "success",
position = Config.NotifyOptions.position
})
end)
lib.addCommand("migrateskins", {
help = "Migrate skins",
params = {
{
name = "resourceName",
type = "string",
},
},
restricted = "group.god"
}, function(source, args)
local resourceName = args.resourceName
if resourceName == "fivem-appearance" then
MigrateFivemAppearance(source)
elseif resourceName == "qb-clothing" then
CreateThread(function()
MigrateQBClothing(source)
end)
else
lib.notify(source, {
title = _L("migrate.typeError.title"),
description = _L("migrate.typeError.description"),
type = "error",
position = Config.NotifyOptions.position
})
end
end)

View File

@ -0,0 +1,11 @@
lib.callback.register("illenium-appearance:server:GetPlayerAces", function()
local src = source
local allowedAces = {}
for i = 1, #Config.Aces do
local ace = Config.Aces[i]
if IsPlayerAceAllowed(src, ace) then
allowedAces[#allowedAces+1] = ace
end
end
return allowedAces
end)

View File

@ -0,0 +1,354 @@
local outfitCache = {}
local uniformCache = {}
local function getMoneyForShop(shopType)
local money = 0
if shopType == "clothing" then
money = Config.ClothingCost
elseif shopType == "barber" then
money = Config.BarberCost
elseif shopType == "tattoo" then
money = Config.TattooCost
elseif shopType == "surgeon" then
money = Config.SurgeonCost
end
return money
end
local function getOutfitsForPlayer(citizenid)
outfitCache[citizenid] = {}
local result = Database.PlayerOutfits.GetAllByCitizenID(citizenid)
for i = 1, #result, 1 do
outfitCache[citizenid][#outfitCache[citizenid] + 1] = {
id = result[i].id,
name = result[i].outfitname,
model = result[i].model,
components = json.decode(result[i].components),
props = json.decode(result[i].props)
}
end
end
local function GenerateUniqueCode()
local code, exists
repeat
code = GenerateNanoID(Config.OutfitCodeLength)
exists = Database.PlayerOutfitCodes.GetByCode(code)
until not exists
return code
end
-- Callback(s)
lib.callback.register("illenium-appearance:server:generateOutfitCode", function(_, outfitID)
local existingOutfitCode = Database.PlayerOutfitCodes.GetByOutfitID(outfitID)
if not existingOutfitCode then
local code = GenerateUniqueCode()
local id = Database.PlayerOutfitCodes.Add(outfitID, code)
if not id then
print("Something went wrong while generating outfit code")
return
end
return code
end
return existingOutfitCode.code
end)
lib.callback.register("illenium-appearance:server:importOutfitCode", function(source, outfitName, outfitCode)
local citizenID = Framework.GetPlayerID(source)
local existingOutfitCode = Database.PlayerOutfitCodes.GetByCode(outfitCode)
if not existingOutfitCode then
return nil
end
local playerOutfit = Database.PlayerOutfits.GetByID(existingOutfitCode.outfitid)
if not playerOutfit then
return
end
if playerOutfit.citizenid == citizenID then return end -- Validation when someone tried to duplicate own outfit
if Database.PlayerOutfits.GetByOutfit(outfitName, citizenID) then return end -- Validation duplicate outfit name, if validate on local id, someone can "spam error" server-sided
local id = Database.PlayerOutfits.Add(citizenID, outfitName, playerOutfit.model, playerOutfit.components, playerOutfit.props)
if not id then
print("Something went wrong while importing the outfit")
return
end
outfitCache[citizenID][#outfitCache[citizenID] + 1] = {
id = id,
name = outfitName,
model = playerOutfit.model,
components = json.decode(playerOutfit.components),
props = json.decode(playerOutfit.props)
}
return true
end)
lib.callback.register("illenium-appearance:server:getAppearance", function(source, model)
local citizenID = Framework.GetPlayerID(source)
return Framework.GetAppearance(citizenID, model)
end)
lib.callback.register("illenium-appearance:server:hasMoney", function(source, shopType)
local money = getMoneyForShop(shopType)
if Framework.HasMoney(source, "cash", money) then
return true, money
else
return false, money
end
end)
lib.callback.register("illenium-appearance:server:payForTattoo", function(source, tattoo)
local src = source
local cost = tattoo.cost or Config.TattooCost
if Framework.RemoveMoney(src, "cash", cost) then
lib.notify(src, {
title = _L("purchase.tattoo.success.title"),
description = string.format(_L("purchase.tattoo.success.description"), tattoo.label, cost),
type = "success",
position = Config.NotifyOptions.position
})
return true
else
lib.notify(src, {
title = _L("purchase.tattoo.failure.title"),
description = _L("purchase.tattoo.failure.description"),
type = "error",
position = Config.NotifyOptions.position
})
return false
end
end)
lib.callback.register("illenium-appearance:server:getOutfits", function(source)
local citizenID = Framework.GetPlayerID(source)
if outfitCache[citizenID] == nil then
getOutfitsForPlayer(citizenID)
end
return outfitCache[citizenID]
end)
lib.callback.register("illenium-appearance:server:getManagementOutfits", function(source, mType, gender)
local job = Framework.GetJob(source)
if mType == "Gang" then
job = Framework.GetGang(source)
end
local grade = tonumber(job.grade.level)
local managementOutfits = {}
local result = Database.ManagementOutfits.GetAllByJob(mType, job.name, gender)
for i = 1, #result, 1 do
if grade >= result[i].minrank then
managementOutfits[#managementOutfits + 1] = {
id = result[i].id,
name = result[i].name,
model = result[i].model,
gender = result[i].gender,
components = json.decode(result[i].components),
props = json.decode(result[i].props)
}
end
end
return managementOutfits
end)
lib.callback.register("illenium-appearance:server:getUniform", function(source)
return uniformCache[Framework.GetPlayerID(source)]
end)
RegisterServerEvent("illenium-appearance:server:saveAppearance", function(appearance)
local src = source
local citizenID = Framework.GetPlayerID(src)
if appearance ~= nil then
Framework.SaveAppearance(appearance, citizenID)
end
end)
RegisterServerEvent("illenium-appearance:server:chargeCustomer", function(shopType)
local src = source
local money = getMoneyForShop(shopType)
if Framework.RemoveMoney(src, "cash", money) then
lib.notify(src, {
title = _L("purchase.store.success.title"),
description = string.format(_L("purchase.store.success.description"), money, shopType),
type = "success",
position = Config.NotifyOptions.position
})
else
lib.notify(src, {
title = _L("purchase.store.failure.title"),
description = _L("purchase.store.failure.description"),
type = "error",
position = Config.NotifyOptions.position
})
end
end)
RegisterNetEvent("illenium-appearance:server:saveOutfit", function(name, model, components, props)
local src = source
local citizenID = Framework.GetPlayerID(src)
if outfitCache[citizenID] == nil then
getOutfitsForPlayer(citizenID)
end
if model and components and props then
local id = Database.PlayerOutfits.Add(citizenID, name, model, json.encode(components), json.encode(props))
if not id then
return
end
outfitCache[citizenID][#outfitCache[citizenID] + 1] = {
id = id,
name = name,
model = model,
components = components,
props = props
}
lib.notify(src, {
title = _L("outfits.save.success.title"),
description = string.format(_L("outfits.save.success.description"), name),
type = "success",
position = Config.NotifyOptions.position
})
end
end)
RegisterNetEvent("illenium-appearance:server:updateOutfit", function(id, model, components, props)
local src = source
local citizenID = Framework.GetPlayerID(src)
if outfitCache[citizenID] == nil then
getOutfitsForPlayer(citizenID)
end
if model and components and props then
if not Database.PlayerOutfits.Update(id, model, json.encode(components), json.encode(props)) then return end
local outfitName = ""
for i = 1, #outfitCache[citizenID], 1 do
local outfit = outfitCache[citizenID][i]
if outfit.id == id then
outfit.model = model
outfit.components = components
outfit.props = props
outfitName = outfit.name
break
end
end
lib.notify(src, {
title = _L("outfits.update.success.title"),
description = string.format(_L("outfits.update.success.description"), outfitName),
type = "success",
position = Config.NotifyOptions.position
})
end
end)
RegisterNetEvent("illenium-appearance:server:saveManagementOutfit", function(outfitData)
local src = source
local id = Database.ManagementOutfits.Add(outfitData)
if not id then
return
end
lib.notify(src, {
title = _L("outfits.save.success.title"),
description = string.format(_L("outfits.save.success.description"), outfitData.Name),
type = "success",
position = Config.NotifyOptions.position
})
end)
RegisterNetEvent("illenium-appearance:server:deleteManagementOutfit", function(id)
Database.ManagementOutfits.DeleteByID(id)
end)
RegisterNetEvent("illenium-appearance:server:syncUniform", function(uniform)
local src = source
uniformCache[Framework.GetPlayerID(src)] = uniform
end)
RegisterNetEvent("illenium-appearance:server:deleteOutfit", function(id)
local src = source
local citizenID = Framework.GetPlayerID(src)
Database.PlayerOutfitCodes.DeleteByOutfitID(id)
Database.PlayerOutfits.DeleteByID(id)
for k, v in ipairs(outfitCache[citizenID]) do
if v.id == id then
table.remove(outfitCache[citizenID], k)
break
end
end
end)
RegisterNetEvent("illenium-appearance:server:resetOutfitCache", function()
local src = source
local citizenID = Framework.GetPlayerID(src)
if citizenID then
outfitCache[citizenID] = nil
end
end)
RegisterNetEvent("illenium-appearance:server:ChangeRoutingBucket", function()
local src = source
SetPlayerRoutingBucket(src, src)
end)
RegisterNetEvent("illenium-appearance:server:ResetRoutingBucket", function()
local src = source
SetPlayerRoutingBucket(src, 0)
end)
if Config.EnablePedMenu then
lib.addCommand("pedmenu", {
help = _L("commands.pedmenu.title"),
params = {
{
name = "playerID",
type = "number",
help = "Target player's server id",
optional = true
},
},
restricted = Config.PedMenuGroup
}, function(source, args)
local target = source
if args.playerID then
local citizenID = Framework.GetPlayerID(args.playerID)
if citizenID then
target = args.playerID
else
lib.notify(source, {
title = _L("commands.pedmenu.failure.title"),
description = _L("commands.pedmenu.failure.description"),
type = "error",
position = Config.NotifyOptions.position
})
return
end
end
TriggerClientEvent("illenium-appearance:client:openClothingShopMenu", target, true)
end)
end
if Config.EnableJobOutfitsCommand then
lib.addCommand("joboutfits", { help = _L("commands.joboutfits.title"), }, function(source)
TriggerClientEvent("illenium-apearance:client:outfitsCommand", source, true)
end)
lib.addCommand("gangoutfits", { help = _L("commands.gangoutfits.title"), }, function(source)
TriggerClientEvent("illenium-apearance:client:outfitsCommand", source)
end)
end
lib.addCommand("reloadskin", { help = _L("commands.reloadskin.title") }, function(source)
TriggerClientEvent("illenium-appearance:client:reloadSkin", source)
end)
lib.addCommand("clearstuckprops", { help = _L("commands.clearstuckprops.title") }, function(source)
TriggerClientEvent("illenium-appearance:client:ClearStuckProps", source)
end)
lib.versionCheck("iLLeniumStudios/illenium-appearance")

View File

@ -0,0 +1,12 @@
math.randomseed(os.time())
local urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"
function GenerateNanoID(size)
local id = ""
for _ = 1, size do
local randomIndex = math.random(64)
id = id .. urlAlphabet:sub(randomIndex,randomIndex)
end
return id
end

View File

@ -0,0 +1,46 @@
Config.Blacklist = {
male = {
hair = {},
components = {
masks = {},
upperBody = {},
lowerBody = {},
bags = {},
shoes = {},
scarfAndChains = {},
shirts = {},
bodyArmor = {},
decals = {},
jackets = {}
},
props = {
hats = {},
glasses = {},
ear = {},
watches = {},
bracelets = {}
}
},
female = {
hair = {},
components = {
masks = {},
upperBody = {},
lowerBody = {},
bags = {},
shoes = {},
scarfAndChains = {},
shirts = {},
bodyArmor = {},
decals = {},
jackets = {}
},
props = {
hats = {},
glasses = {},
ear = {},
watches = {},
bracelets = {}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,96 @@
if not Framework.ESX() then return end
function Framework.ConvertComponents(oldSkin, components)
return {
{
component_id = 0,
drawable = (components and components[1].drawable) or 0,
texture = (components and components[1].texture) or 0
},
{
component_id = 1,
drawable = oldSkin.mask_1 or (components and components[2].drawable) or 0,
texture = oldSkin.mask_2 or (components and components[2].texture) or 0
},
{
component_id = 2,
drawable = (components and components[3].drawable) or 0,
texture = (components and components[3].texture) or 0
},
{
component_id = 3,
drawable = oldSkin.arms or (components and components[4].drawable) or 0,
texture = oldSkin.arms_2 or (components and components[4].texture) or 0,
},
{
component_id = 4,
drawable = oldSkin.pants_1 or (components and components[5].drawable) or 0,
texture = oldSkin.pants_2 or (components and components[5].texture) or 0
},
{
component_id = 5,
drawable = oldSkin.bags_1 or (components and components[6].drawable) or 0,
texture = oldSkin.bags_2 or (components and components[6].texture) or 0
},
{
component_id = 6,
drawable = oldSkin.shoes_1 or (components and components[7].drawable) or 0,
texture = oldSkin.shoes_2 or (components and components[7].texture) or 0
},
{
component_id = 7,
drawable = oldSkin.chain_1 or (components and components[8].drawable) or 0,
texture = oldSkin.chain_2 or (components and components[8].texture) or 0
},
{
component_id = 8,
drawable = oldSkin.tshirt_1 or (components and components[9].drawable) or 0,
texture = oldSkin.tshirt_2 or (components and components[9].texture) or 0
},
{
component_id = 9,
drawable = oldSkin.bproof_1 or (components and components[10].drawable) or 0,
texture = oldSkin.bproof_2 or (components and components[10].texture) or 0
},
{
component_id = 10,
drawable = oldSkin.decals_1 or (components and components[11].drawable) or 0,
texture = oldSkin.decals_2 or (components and components[11].texture) or 0
},
{
component_id = 11,
drawable = oldSkin.torso_1 or (components and components[12].drawable) or 0,
texture = oldSkin.torso_2 or (components and components[12].texture) or 0
}
}
end
function Framework.ConvertProps(oldSkin, props)
return {
{
texture = oldSkin.helmet_2 or (props and props[1].texture) or -1,
drawable = oldSkin.helmet_1 or (props and props[1].drawable) or -1,
prop_id = 0
},
{
texture = oldSkin.glasses_2 or (props and props[2].texture) or -1,
drawable = oldSkin.glasses_1 or (props and props[2].drawable) or -1,
prop_id = 1
},
{
texture = oldSkin.ears_2 or (props and props[3].texture) or -1,
drawable = oldSkin.ears_1 or (props and props[3].drawable) or -1,
prop_id = 2
},
{
texture = oldSkin.watches_2 or (props and props[4].texture) or -1,
drawable = oldSkin.watches_1 or (props and props[4].drawable) or -1,
prop_id = 6
},
{
texture = oldSkin.bracelets_2 or (props and props[5].texture) or -1,
drawable = oldSkin.bracelets_1 or (props and props[5].drawable) or -1,
prop_id = 7
}
}
end

View File

@ -0,0 +1,13 @@
Framework = {}
function Framework.ESX()
return GetResourceState("es_extended") ~= "missing"
end
function Framework.QBCore()
return GetResourceState("qb-core") ~= "missing"
end
function Framework.Ox()
return GetResourceState("ox_core") ~= "missing"
end

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,61 @@
Config.Theme = {
currentTheme = "qb-core",
themes = {
{
id = "default",
borderRadius = "4px",
fontColor = "255, 255, 255",
fontColorHover = "255, 255, 255",
fontColorSelected = "0, 0, 0",
fontFamily = "Inter",
primaryBackground = "0, 0, 0",
primaryBackgroundSelected = "255, 255, 255",
secondaryBackground = "0, 0, 0",
scaleOnHover = false,
sectionFontWeight = "normal",
smoothBackgroundTransition = false
},
{
id = "qb-core",
borderRadius = "3vh",
fontColor = "255, 255, 255",
fontColorHover = "255, 255, 255",
fontColorSelected = "255, 255, 255",
fontFamily = "Poppins",
primaryBackground = "220, 20, 60",
primaryBackgroundSelected = "220, 20, 60",
secondaryBackground = "23, 23, 23",
scaleOnHover = true,
sectionFontWeight = "bold",
smoothBackgroundTransition = true
},
{
id = "project-sloth",
borderRadius = "6vh",
fontColor = "255, 255, 255",
fontColorHover = "255, 255, 255",
fontColorSelected = "255, 255, 255",
fontFamily = "Inter",
primaryBackground = "2, 241, 181",
primaryBackgroundSelected = "2, 241, 181",
secondaryBackground = "27, 24, 69",
scaleOnHover = true,
sectionFontWeight = "bold",
smoothBackgroundTransition = false
},
{
id = "not-heavily-inspired",
borderRadius = "10vh",
fontColor = "255, 255, 255",
fontColorHover = "255, 255, 255",
fontColorSelected = "255, 255, 255",
fontFamily = "Inter",
primaryBackground = "149, 239, 119",
primaryBackgroundSelected = "242, 163, 101",
secondaryBackground = "25, 46, 70",
scaleOnHover = true,
sectionFontWeight = "bold",
smoothBackgroundTransition = false
}
}
}

View File

@ -0,0 +1,12 @@
CREATE TABLE IF NOT EXISTS `management_outfits` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`job_name` varchar(50) NOT NULL,
`type` varchar(50) NOT NULL,
`minrank` int(11) NOT NULL DEFAULT 0,
`name` varchar(50) NOT NULL DEFAULT 'Cool Outfit',
`gender` varchar(50) NOT NULL DEFAULT 'male',
`model` varchar(50) DEFAULT NULL,
`props` varchar(1000) DEFAULT NULL,
`components` varchar(1500) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4;

View File

@ -0,0 +1,22 @@
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE TABLE IF NOT EXISTS `player_outfit_codes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`outfitid` int(11) NOT NULL,
`code` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `FK_player_outfit_codes_player_outfits` (`outfitid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */;

View File

@ -0,0 +1,24 @@
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE TABLE IF NOT EXISTS `player_outfits` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`citizenid` varchar(50) DEFAULT NULL,
`outfitname` varchar(50) NOT NULL DEFAULT '0',
`model` varchar(50) DEFAULT NULL,
`props` varchar(1000) DEFAULT NULL,
`components` varchar(1500) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `citizenid_outfitname_model` (`citizenid`,`outfitname`,`model`),
KEY `citizenid` (`citizenid`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */;

View File

@ -0,0 +1,10 @@
CREATE TABLE IF NOT EXISTS `playerskins` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`citizenid` varchar(255) NOT NULL,
`model` varchar(255) NOT NULL,
`skin` text NOT NULL,
`active` tinyint(4) NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
KEY `citizenid` (`citizenid`),
KEY `active` (`active`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/src/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>UI</title>
<script type="module" crossorigin src="./assets/index.b8e72b46.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>

View File

@ -18,7 +18,7 @@ Config.Accounts = {
},
}
Config.StartingAccountMoney = { bank = 50000 }
Config.StartingAccountMoney = { bank = 15000 }
Config.StartingInventoryItems = false -- table/false
@ -41,7 +41,7 @@ Config.EnableSocietyPayouts = false -- pay from the society account that the pla
Config.MaxWeight = 24 -- the max inventory weight without a backpack
Config.PaycheckInterval = 7 * 60000 -- how often to receive paychecks in milliseconds
Config.EnableDebug = false -- Use Debug options?
Config.EnableDefaultInventory = true -- Display the default Inventory ( F2 )
Config.EnableDefaultInventory = false -- Display the default Inventory ( F2 )
Config.EnableWantedLevel = false -- Use Normal GTA wanted Level?
Config.EnablePVP = true -- Allow Player to player combat

View File

@ -77,3 +77,5 @@ dependencies {
'oxmysql',
'spawnmanager',
}
provides { "es_extended" }

Some files were not shown because too many files have changed in this diff Show More