diff --git a/LICENSE b/LICENSE index 6977f644..595810b9 100644 --- a/LICENSE +++ b/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. esx-legacy - Copyright (C) 2015-2023 Jérémie N'gadi + Copyright (C) 2015-2024 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - esx-legacy Copyright (C) 2015-2023 Jérémie N'gadi + esx-legacy Copyright (C) 2015-2024 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/[core]/cron/LICENSE b/[core]/cron/LICENSE index e3b0b61c..9ef14b9d 100644 --- a/[core]/cron/LICENSE +++ b/[core]/cron/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. cron - Copyright (C) 2015-2023 Jérémie N'gadi + Copyright (C) 2015-2024 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - cron Copyright (C) 2015-2023 Jérémie N'gadi + cron Copyright (C) 2015-2024 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/[core]/cron/fxmanifest.lua b/[core]/cron/fxmanifest.lua index 1d9878f8..ca0036fd 100644 --- a/[core]/cron/fxmanifest.lua +++ b/[core]/cron/fxmanifest.lua @@ -2,7 +2,7 @@ fx_version 'adamant' game 'gta5' author 'ESX-Framework' -description 'cron' +description 'Allows resources to Run tasks at specific intervals.' lua54 'yes' version '1.10.5' diff --git a/[core]/es_extended/LICENSE b/[core]/es_extended/LICENSE index a10f2d96..5f5e070b 100644 --- a/[core]/es_extended/LICENSE +++ b/[core]/es_extended/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. es_extended - Copyright (C) 2015-2023 Jérémie N'gadi + Copyright (C) 2015-2024 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - es_extended Copyright (C) 2015-2023 Jérémie N'gadi + es_extended Copyright (C) 2015-2024 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/[core]/es_extended/client/functions.lua b/[core]/es_extended/client/functions.lua index bb545f4e..f5576bf2 100644 --- a/[core]/es_extended/client/functions.lua +++ b/[core]/es_extended/client/functions.lua @@ -507,10 +507,10 @@ function ESX.Game.GetClosestEntity(entities, isPlayerEntities, coords, modelFilt if modelFilter then filteredEntities = {} - - for _, entity in pairs(entities) do - if modelFilter[GetEntityModel(entity)] then - filteredEntities[#filteredEntities + 1] = entity + + for currentEntityIndex = 1, #entities do + if modelFilter[GetEntityModel(entities[currentEntityIndex])] then + filteredEntities[#filteredEntities + 1] = entities[currentEntityIndex] end end end @@ -576,21 +576,15 @@ function ESX.Game.GetVehicleProperties(vehicle) end local doorsBroken, windowsBroken, tyreBurst = {}, {}, {} - local numWheels = tostring(GetVehicleNumberOfWheels(vehicle)) - local TyresIndex = { -- Wheel index list according to the number of vehicle wheels. - ["2"] = { 0, 4 }, -- Bike and cycle. - ["3"] = { 0, 1, 4, 5 }, -- Vehicle with 3 wheels (get for wheels because some 3 wheels vehicles have 2 wheels on front and one rear or the reverse). - ["4"] = { 0, 1, 4, 5 }, -- Vehicle with 4 wheels. - ["6"] = { 0, 1, 2, 3, 4, 5 }, -- Vehicle with 6 wheels. - } - if TyresIndex[numWheels] then - for _, idx in pairs(TyresIndex[numWheels]) do - tyreBurst[tostring(idx)] = IsVehicleTyreBurst(vehicle, idx, false) - end + local wheel_count = GetVehicleNumberOfWheels(vehicle); + + for wheel_index = 0, wheel_count - 1 do + tyreBurst[tostring(wheel_index)] = IsVehicleTyreBurst(vehicle, wheel_index, false) end + for windowId = 0, 7 do -- 13 RollUpWindow(vehicle, windowId) --fix when you put the car away with the window down windowsBroken[tostring(windowId)] = not IsVehicleWindowIntact(vehicle, windowId) @@ -1128,8 +1122,8 @@ function ESX.ShowInventory() { unselectable = true, icon = "fas fa-users", title = "Nearby Players" }, } - for _, playerNearby in ipairs(playersNearby) do - players[GetPlayerServerId(playerNearby)] = true + for currentNearbyPlayerIndex = 1, #playersNearby do + players[GetPlayerServerId(playersNearby[currentNearbyPlayerIndex])] = true end ESX.TriggerServerCallback("esx:getPlayerNames", function(returnedPlayers) diff --git a/[core]/es_extended/client/main.lua b/[core]/es_extended/client/main.lua index 7da04a24..27180dd7 100644 --- a/[core]/es_extended/client/main.lua +++ b/[core]/es_extended/client/main.lua @@ -24,7 +24,7 @@ function ESX.SpawnPlayer(skin, coords, cb) p:resolve() end) Citizen.Await(p) - + local playerPed = PlayerPedId() FreezeEntityPosition(playerPed, true) SetEntityCoordsNoOffset(playerPed, coords.x, coords.y, coords.z, false, false, false, true) @@ -56,7 +56,7 @@ AddEventHandler("esx:playerLoaded", function(xPlayer, _, skin) while not DoesEntityExist(ESX.PlayerData.ped) do Wait(20) end - + ESX.PlayerLoaded = true local metadata = ESX.PlayerData.metadata @@ -271,29 +271,13 @@ AddEventHandler("esx:restoreLoadout", function() end end) --- Credit: https://github.com/LukeWasTakenn, https://github.com/LukeWasTakenn/luke_garages/blob/master/client/client.lua#L331-L352 AddStateBagChangeHandler("VehicleProperties", nil, function(bagName, _, value) if not value then return end local netId = bagName:gsub("entity:", "") - local timer = GetGameTimer() - while not NetworkDoesEntityExistWithNetworkId(tonumber(netId)) do - Wait(0) - if GetGameTimer() - timer > 10000 then - return - end - end - local vehicle = NetToVeh(tonumber(netId)) - local timer2 = GetGameTimer() - while NetworkGetEntityOwner(vehicle) ~= PlayerId() do - Wait(0) - if GetGameTimer() - timer2 > 10000 then - return - end - end ESX.Game.SetVehicleProperties(vehicle, value) end) @@ -378,6 +362,11 @@ AddEventHandler("esx:setJob", function(Job) ESX.SetPlayerData("job", Job) end) +RegisterNetEvent("esx:setGroup") +AddEventHandler("esx:setGroup", function(group) + ESX.SetPlayerData("group", group) +end) + if not Config.OxInventory then RegisterNetEvent("esx:createPickup") AddEventHandler("esx:createPickup", function(pickupId, label, coords, itemType, name, components, tintIndex) diff --git a/[core]/es_extended/client/modules/actions.lua b/[core]/es_extended/client/modules/actions.lua index 0fec4584..401297d8 100644 --- a/[core]/es_extended/client/modules/actions.lua +++ b/[core]/es_extended/client/modules/actions.lua @@ -24,6 +24,11 @@ local function GetData(vehicle) return displayName, netId end +local function ToggleVehicleStatus(inVehicle, seat) + ESX.SetPlayerData("vehicle", inVehicle) + ESX.SetPlayerData("seat", seat) +end + CreateThread(function() while not ESX.PlayerLoaded do Wait(200) end while true do @@ -64,11 +69,13 @@ CreateThread(function() isEnteringVehicle = true TriggerEvent("esx:enteringVehicle", vehicle, plate, seat, netId) TriggerServerEvent("esx:enteringVehicle", plate, seat, netId) + ToggleVehicleStatus(vehicle, seat) elseif not DoesEntityExist(GetVehiclePedIsTryingToEnter(playerPed)) and not IsPedInAnyVehicle(playerPed, true) and isEnteringVehicle then -- vehicle entering aborted TriggerEvent("esx:enteringVehicleAborted") TriggerServerEvent("esx:enteringVehicleAborted") isEnteringVehicle = false + ToggleVehicleStatus(false, false) elseif IsPedInAnyVehicle(playerPed, false) then -- suddenly appeared in a vehicle, possible teleport isEnteringVehicle = false @@ -79,6 +86,7 @@ CreateThread(function() current.displayName, current.netId = GetData(current.vehicle) TriggerEvent("esx:enteredVehicle", current.vehicle, current.plate, current.seat, current.displayName, current.netId) TriggerServerEvent("esx:enteredVehicle", current.plate, current.seat, current.displayName, current.netId) + ToggleVehicleStatus(current.vehicle, current.seat) end elseif isInVehicle then if not IsPedInAnyVehicle(playerPed, false) or IsPlayerDead(PlayerId()) then @@ -87,6 +95,7 @@ CreateThread(function() TriggerServerEvent("esx:exitedVehicle", current.plate, current.seat, current.displayName, current.netId) isInVehicle = false current = {} + ToggleVehicleStatus(false,false) end end Wait(200) diff --git a/[core]/es_extended/common/functions.lua b/[core]/es_extended/common/functions.lua index f6414bdc..0e9adb08 100644 --- a/[core]/es_extended/common/functions.lua +++ b/[core]/es_extended/common/functions.lua @@ -106,3 +106,36 @@ end function ESX.Round(value, numDecimalPlaces) return ESX.Math.Round(value, numDecimalPlaces) end + +function ESX.ValidateType(value, ...) + local types = { ... } + if #types == 0 then return true end + + local mapType = {} + for i = 1, #types, 1 do + local validateType = types[i] + assert(type(validateType) == "string", "bad argument types, only expected string") -- should never use anyhing else than string + mapType[validateType] = true + end + + local valueType = type(value) + + local matches = mapType[valueType] ~= nil + + if not matches then + local requireTypes = table.concat(types, " or ") + local errorMessage = ("bad value (%s expected, got %s)"):format(requireTypes, valueType) + + return false, errorMessage + end + + return true +end + +function ESX.AssertType(...) + local matches, errorMessage = ESX.ValidateType(...) + + assert(matches, errorMessage) + + return matches +end diff --git a/[core]/es_extended/common/modules/math.lua b/[core]/es_extended/common/modules/math.lua index 9910d17e..868773b6 100644 --- a/[core]/es_extended/common/modules/math.lua +++ b/[core]/es_extended/common/modules/math.lua @@ -23,3 +23,9 @@ function ESX.Math.Trim(value) return nil end end + +function ESX.Math.Random(minRange, maxRange) + math.randomseed(GetGameTimer()) + return math.random(minRange or 1, maxRange or 10) +end + diff --git a/[core]/es_extended/client/common.lua b/[core]/es_extended/common/object.lua similarity index 97% rename from [core]/es_extended/client/common.lua rename to [core]/es_extended/common/object.lua index 2191d17a..bd8f8009 100644 --- a/[core]/es_extended/client/common.lua +++ b/[core]/es_extended/common/object.lua @@ -1,8 +1,8 @@ -exports("getSharedObject", function() - return ESX -end) - -AddEventHandler("esx:getSharedObject", function() - local Invoke = GetInvokingResource() - print(("[^1ERROR^7] Resource ^5%s^7 Used the ^5getSharedObject^7 Event, this event ^1no longer exists!^7 Visit https://documentation.esx-framework.org/tutorials/tutorials-esx/sharedevent for how to fix!"):format(Invoke)) -end) +exports("getSharedObject", function() + return ESX +end) + +AddEventHandler("esx:getSharedObject", function() + local Invoke = GetInvokingResource() + print(("[^1ERROR^7] Resource ^5%s^7 Used the ^5getSharedObject^7 Event, this event ^1no longer exists!^7 Visit https://documentation.esx-framework.org/tutorials/tutorials-esx/sharedevent for how to fix!"):format(Invoke)) +end) \ No newline at end of file diff --git a/[core]/es_extended/config.lua b/[core]/es_extended/config.lua index 6f899f1d..3d82a1f0 100644 --- a/[core]/es_extended/config.lua +++ b/[core]/es_extended/config.lua @@ -38,21 +38,21 @@ Config.AdminGroups = { Config.EnablePaycheck = true -- enable paycheck Config.LogPaycheck = false -- Logs paychecks to a nominated Discord channel via webhook (default is false) Config.EnableSocietyPayouts = false -- pay from the society account that the player is employed at? Requirement: esx_society -Config.MaxWeight = 24 -- the max inventory weight without backpack -Config.PaycheckInterval = 7 * 60000 -- how often to recieve pay checks in milliseconds +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.EnableWantedLevel = false -- Use Normal GTA wanted Level? Config.EnablePVP = true -- Allow Player to player combat Config.Multichar = GetResourceState("esx_multicharacter") ~= "missing" -Config.Identity = true -- Select a characters identity data before they have loaded in (this happens by default with multichar) +Config.Identity = true -- Select a character identity data before they have loaded in (this happens by default with multichar) Config.DistanceGive = 4.0 -- Max distance when giving items, weapons etc. Config.AdminLogging = false -- Logs the usage of certain commands by those with group.admin ace permissions (default is false) Config.DisableHealthRegeneration = false -- Player will no longer regenerate health -Config.DisableVehicleRewards = false -- Disables Player Recieving weapons from vehicles +Config.DisableVehicleRewards = false -- Disables Player Receiving weapons from vehicles Config.DisableNPCDrops = false -- stops NPCs from dropping weapons on death Config.DisableDispatchServices = false -- Disable Dispatch services Config.DisableScenarios = false -- Disable Scenarios @@ -85,12 +85,12 @@ Config.RemoveHudComponents = { [22] = false, --HUD_WEAPONS } -Config.SpawnVehMaxUpgrades = true -- admin vehicles spawn with max vehcle settings +Config.SpawnVehMaxUpgrades = true -- admin vehicles spawn with max vehicle settings Config.CustomAIPlates = "........" -- Custom plates for AI vehicles -- Pattern string format --1 will lead to a random number from 0-9. --A will lead to a random letter from A-Z. --- . will lead to a random letter or number, with 50% probability of being either. +-- . will lead to a random letter or number, with a 50% probability of being either. --^1 will lead to a literal 1 being emitted. --^A will lead to a literal A being emitted. --Any other character will lead to said character being emitted. diff --git a/[core]/es_extended/fxmanifest.lua b/[core]/es_extended/fxmanifest.lua index fe10450d..d9a3bf09 100644 --- a/[core]/es_extended/fxmanifest.lua +++ b/[core]/es_extended/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'cerulean' game 'gta5' -description 'ES Extended' +description 'The Core resource that provides the functionalities for all other resources.' lua54 'yes' version '1.10.5' @@ -11,6 +11,9 @@ shared_scripts { 'config.lua', 'config.weapons.lua', + + 'common/modules/*.lua', + 'common/*.lua', } server_scripts { @@ -27,10 +30,9 @@ server_scripts { 'server/main.lua', 'server/commands.lua', - 'common/modules/*.lua', - 'common/functions.lua', 'server/modules/actions.lua', - 'server/modules/npwd.lua' + 'server/modules/npwd.lua', + 'server/modules/createJob.lua' } client_scripts { @@ -41,9 +43,6 @@ client_scripts { 'client/main.lua', - 'common/modules/*.lua', - 'common/functions.lua', - 'common/functions.lua', 'client/modules/actions.lua', 'client/modules/death.lua', diff --git a/[core]/es_extended/server/classes/overrides/oxinventory.lua b/[core]/es_extended/server/classes/overrides/oxinventory.lua index b6e9b53a..5c883707 100644 --- a/[core]/es_extended/server/classes/overrides/oxinventory.lua +++ b/[core]/es_extended/server/classes/overrides/oxinventory.lua @@ -140,7 +140,7 @@ Core.PlayerFunctionOverrides.OxInventory = { return function(newWeight) self.maxWeight = newWeight self.triggerEvent("esx:setMaxWeight", self.maxWeight) - return Inventory.Set(self.source, "maxWeight", newWeight) + return Inventory.SetMaxWeight(self.source, newWeight) end end, diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index ad3fd030..8d389d7f 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -1,5 +1,6 @@ local _GetPlayerPed = GetPlayerPed local _GetEntityCoords = GetEntityCoords +local _GetEntityHeading = GetEntityHeading local _ExecuteCommand = ExecuteCommand local _SetEntityCoords = SetEntityCoords local _SetEntityHeading = SetEntityHeading @@ -80,8 +81,9 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, function self.getCoords(vector) local ped = _GetPlayerPed(self.source) local coordinates = _GetEntityCoords(ped) + local heading = _GetEntityHeading(ped) - return vector and coordinates or { x = coordinates.x, y = coordinates.y, z = coordinates.z } + return vector and vector4(coordinates.xyz, heading) or { x = coordinates.x, y = coordinates.y, z = coordinates.z, heading = heading } end ---@param reason string @@ -127,9 +129,16 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, ---@param newGroup string ---@return void function self.setGroup(newGroup) + local lastGroup = self.group + _ExecuteCommand(("remove_principal identifier.%s group.%s"):format(self.license, self.group)) + self.group = newGroup + + _TriggerEvent("esx:setGroup", self.source, self.group, lastGroup) + self.triggerEvent("esx:setGroup", self.group, lastGroup) Player(self.source).state:set("group", self.group, true) + _ExecuteCommand(("add_principal identifier.%s group.%s"):format(self.license, self.group)) end @@ -475,7 +484,7 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, skin_female = gradeObject.skin_female and json.decode(gradeObject.skin_female) or {}, } - TriggerEvent("esx:setJob", self.source, self.job, lastJob) + _TriggerEvent("esx:setJob", self.source, self.job, lastJob) self.triggerEvent("esx:setJob", self.job, lastJob) Player(self.source).state:set("job", self.job, true) end diff --git a/[core]/es_extended/server/common.lua b/[core]/es_extended/server/common.lua index 68bc94c9..f69f5838 100644 --- a/[core]/es_extended/server/common.lua +++ b/[core]/es_extended/server/common.lua @@ -18,15 +18,6 @@ RegisterNetEvent("esx:onPlayerSpawn", function() ESX.Players[source].spawned = true end) -AddEventHandler("esx:getSharedObject", function() - local Invoke = GetInvokingResource() - print(("[^1ERROR^7] Resource ^5%s^7 Used the ^5getSharedObject^7 Event, this event ^1no longer exists!^7 Visit https://documentation.esx-framework.org/tutorials/tutorials-esx/sharedevent for how to fix!"):format(Invoke)) -end) - -exports("getSharedObject", function() - return ESX -end) - if Config.OxInventory then Config.PlayerFunctionOverride = "OxInventory" SetConvarReplicated("inventory:framework", "esx") diff --git a/[core]/es_extended/server/functions.lua b/[core]/es_extended/server/functions.lua index 38834ddc..dcf313d3 100644 --- a/[core]/es_extended/server/functions.lua +++ b/[core]/es_extended/server/functions.lua @@ -4,6 +4,24 @@ function ESX.Trace(msg) end end +--- Triggers an event for one or more clients. +---@param eventName string The name of the event to trigger. +---@param playerIds table|number If a number, represents a single player ID. If a table, represents an array of player IDs. +---@param ... any Additional arguments to pass to the event handler. +function ESX.TriggerClientEvent(eventName, playerIds, ...) + if type(playerIds) == "number" then + TriggerClientEvent(eventName, playerIds, ...) + return + end + + local payload = msgpack.pack_args(...) + local payloadLength = #payload + + for i = 1, #playerIds do + TriggerClientEventInternal(eventName, playerIds[i], payload, payloadLength) + end +end + function ESX.RegisterCommand(name, group, cb, allowConsole, suggestion) if type(name) == "table" then for _, v in ipairs(name) do @@ -106,13 +124,13 @@ function ESX.RegisterCommand(name, group, cb, allowConsole, suggestion) elseif v.type == "any" then newArgs[v.name] = args[k] elseif v.type == "merge" then - local lenght = 0 + local length = 0 for i = 1, k - 1 do - lenght = lenght + string.len(args[i]) + 1 + length = length + string.len(args[i]) + 1 end local merge = table.concat(args, " ") - newArgs[v.name] = string.sub(merge, lenght) + newArgs[v.name] = string.sub(merge, length) elseif v.type == "coordinate" then local coord = tonumber(args[k]:match("(-?%d+%.?%d*)")) if not coord then @@ -406,37 +424,6 @@ function ESX.DiscordLogFields(name, title, color, fields) ) end ---- Create Job at Runtime ---- @param name string ---- @param label string ---- @param grades table -function ESX.CreateJob(name, label, grades) - if not name then - return print("[^3WARNING^7] missing argument `name(string)` while creating a job") - end - - if not label then - return print("[^3WARNING^7] missing argument `label(string)` while creating a job") - end - - if not grades or not next(grades) then - return print("[^3WARNING^7] missing argument `grades(table)` while creating a job!") - end - - local parameters = {} - local job = { name = name, label = label, grades = {} } - - for _, v in pairs(grades) do - job.grades[tostring(v.grade)] = { job_name = name, grade = v.grade, name = v.name, label = v.label, salary = v.salary, skin_male = v.skin_male or "{}", skin_female = v.skin_female or "{}" } - parameters[#parameters + 1] = { name, v.grade, v.name, v.label, v.salary, v.skin_male or "{}", v.skin_female or "{}" } - end - - MySQL.insert("INSERT IGNORE INTO jobs (name, label) VALUES (?, ?)", { name, label }) - MySQL.prepare("INSERT INTO job_grades (job_name, grade, name, label, salary, skin_male, skin_female) VALUES (?, ?, ?, ?, ?, ?, ?)", parameters) - - ESX.Jobs[name] = job -end - function ESX.RefreshJobs() local Jobs = {} local jobs = MySQL.query.await("SELECT * FROM jobs") @@ -549,15 +536,7 @@ if not Config.OxInventory then end function ESX.DoesJobExist(job, grade) - grade = tostring(grade) - - if job and grade then - if ESX.Jobs[job] and ESX.Jobs[job].grades[grade] then - return true - end - end - - return false + return (ESX.Jobs[job] and ESX.Jobs[job].grades[tostring(grade)] ~= nil) or false end function Core.IsPlayerAdmin(playerId) diff --git a/[core]/es_extended/server/main.lua b/[core]/es_extended/server/main.lua index fbfd7897..4862e7ff 100644 --- a/[core]/es_extended/server/main.lua +++ b/[core]/es_extended/server/main.lua @@ -239,7 +239,7 @@ function loadESXPlayer(identifier, playerId, isNew) end -- Position - userData.coords = json.decode(result.position) or Config.DefaultSpawns[math.random(#Config.DefaultSpawns)] + userData.coords = json.decode(result.position) or Config.DefaultSpawns[ESX.Math.Random(1,#Config.DefaultSpawns)] -- Skin userData.skin = (result.skin and result.skin ~= "") and json.decode(result.skin) or { sex = userData.sex == "f" and 1 or 0 } diff --git a/[core]/es_extended/server/modules/createJob.lua b/[core]/es_extended/server/modules/createJob.lua new file mode 100644 index 00000000..e156fa11 --- /dev/null +++ b/[core]/es_extended/server/modules/createJob.lua @@ -0,0 +1,102 @@ + +local NOTIFY_TYPES = { + INFO = "^5[%s]^7-^6[INFO]^7 %s", + SUCCESS = "^5[%s]^7-^2[SUCCESS]^7 %s", + ERROR = "^5[%s]^7-^1[ERROR]^7 %s" +} + +local function doesJobAndGradesExist(name, grades) + if not ESX.Jobs[name] then + return false + end + + for _, grade in ipairs(grades) do + if not ESX.DoesJobExist(name, grade.grade) then + return false + end + end + + return true +end + +local function generateTransactionQueries(name,grades) + local queries = {} + for _, grade in ipairs(grades) do + queries[#queries+1] = { + query = 'INSERT INTO job_grades (job_name, grade, name, label, salary, skin_male, skin_female) VALUES (?, ?, ?, ?, ?, ?, ?)', + values = {name, grade.grade, grade.name, grade.label, grade.salary, '{}', '{}'} + } + end + + return queries +end + +local function generateNewJobTable(name, label, grades) + local job = { name = name, label = label, grades = {} } + for _, v in pairs(grades) do + job.grades[tostring(v.grade)] = { job_name = name, grade = v.grade, name = v.name, label = v.label, salary = v.salary, skin_male = {}, skin_female = {} } + end + + return job +end + +local function notify(notifyType,resourceName,message,...) + local formattedMessage = string.format(message, ...) + + if not NOTIFY_TYPES[notifyType] then + return print(NOTIFY_TYPES.INFO:format(resourceName,formattedMessage)) + end + + return print(NOTIFY_TYPES[notifyType]:format(resourceName,formattedMessage)) +end + +--- Create Job at Runtime +--- @param name string +--- @param label string +--- @param grades table +function ESX.CreateJob(name, label, grades) + local currentResourceName = GetInvokingResource() + local success = false + + if not name or name == '' then + notify("ERROR",currentResourceName, 'Missing argument `name`') + return + end + if not label or label == '' then + notify("ERROR",currentResourceName, 'Missing argument `label`') + return + end + if not grades or not next(grades) then + notify("ERROR",currentResourceName, 'Missing argument `grades`') + return + end + + local currentJobExist = doesJobAndGradesExist(name, grades) + + if currentJobExist then + notify("ERROR",currentResourceName, 'Job or grades already exists: `%s`', name) + return + end + + MySQL.insert('INSERT IGNORE INTO jobs (name, label) VALUES (?, ?)', {name, label}, function(jobId) + if jobId == nil or jobId == 0 then + notify("ERROR",currentResourceName, 'Failed to insert job: `%s`', name) + return + end + + local queries = generateTransactionQueries(name, grades) + + MySQL.transaction(queries, function(results) + success = results + if not results then + notify("ERROR",currentResourceName, 'Failed to insert one or more grades for job: `%s`', name) + return + end + + ESX.Jobs[name] = generateNewJobTable(name,label,grades) + notify("SUCCESS",currentResourceName, 'Job created successfully: `%s`', name) + end) + end) + + return success +end diff --git a/[core]/esx_context/LICENSE b/[core]/esx_context/LICENSE index 4b046bd2..dae70ee4 100644 --- a/[core]/esx_context/LICENSE +++ b/[core]/esx_context/LICENSE @@ -631,8 +631,8 @@ to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - esx_boat - Copyright (C) 2015-2023 Jérémie N'gadi + esx_context + Copyright (C) 2022-2024 ESX Framework This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - esx_boat Copyright (C) 2015-2023 Jérémie N'gadi + esx_context Copyright (C) 2022-2024 ESX Framework This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/[core]/esx_context/README.md b/[core]/esx_context/README.md index 97da2c83..c4e378a9 100644 --- a/[core]/esx_context/README.md +++ b/[core]/esx_context/README.md @@ -6,7 +6,7 @@ A elegant, easy to use Context Menu system to make User Interactions clean and h esx_context -Copyright (C) ESX-Framework +Copyright (C) 2022-2024 ESX Framework This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. diff --git a/[core]/esx_context/fxmanifest.lua b/[core]/esx_context/fxmanifest.lua index a0334dba..28ebebe6 100644 --- a/[core]/esx_context/fxmanifest.lua +++ b/[core]/esx_context/fxmanifest.lua @@ -2,7 +2,7 @@ fx_version 'bodacious' game 'gta5' author 'ESX-Framework & Brayden' -description 'Offical ESX Legacy Context Menu' +description 'A simplistic context menu for ESX.' lua54 'yes' version '1.10.5' diff --git a/[core]/esx_identity/LICENSE b/[core]/esx_identity/LICENSE index 4dc529f0..e57012ae 100644 --- a/[core]/esx_identity/LICENSE +++ b/[core]/esx_identity/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. esx_identity - Copyright (C) 2015-2023 Jérémie N'gadi + Copyright (C) 2015-2024 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - esx_identity Copyright (C) 2015-2023 Jérémie N'gadi + esx_identity Copyright (C) 2015-2024 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/[core]/esx_identity/fxmanifest.lua b/[core]/esx_identity/fxmanifest.lua index bdfd042f..b6120014 100644 --- a/[core]/esx_identity/fxmanifest.lua +++ b/[core]/esx_identity/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'adamant' game 'gta5' -description 'ESX Identity' +description 'Allows the player to Pick their characters: Name, Gender, Height and Date-of-birth.' lua54 'yes' version '1.10.5' diff --git a/[core]/esx_identity/locales/de.lua b/[core]/esx_identity/locales/de.lua new file mode 100644 index 00000000..4c6de824 --- /dev/null +++ b/[core]/esx_identity/locales/de.lua @@ -0,0 +1,38 @@ +Locales["de"] = { + ["show_active_character"] = "Aktiven Charakter anzeigen", + ["active_character"] = "Aktiver Charakter: %s", + ["error_active_character"] = "Beim Abrufen deiner Daten ist ein Fehler aufgetreten", + ["delete_character"] = "Lösche deinen aktuellen Charakter.", + ["deleted_character"] = "Charakter gelöscht", + ["error_delete_character"] = "Es gab ein Problem beim löschen deines Charakters.", + ["thank_you_for_registering"] = "Registrierung erfolgreich.", + ["debug_xPlayer_get_first_name"] = "Gibt deinen Vornamen zurück", + ["debug_xPlayer_get_last_name"] = "Gibt deinen Nachnamen zurück", + ["debug_xPlayer_get_full_name"] = "Gibt deinen vollständigen Namen zurück", + ["debug_xPlayer_get_sex"] = "Gibt dein Geschlecht zurück", + ["debug_xPlayer_get_dob"] = "Gibt dein Geburtsdatum zurück", + ["debug_xPlayer_get_height"] = "Gibt deine Körpergröße zurück", + ["error_debug_xPlayer_get_first_name"] = "Es gab ein Problem beim Abrufen deines Vornamens.", + ["error_debug_xPlayer_get_last_name"] = "Es gab ein Problem beim Abrufen deines Nachnamens.", + ["error_debug_xPlayer_get_full_name"] = "Es gab ein Problem beim Abrufen deines vollständigen Namens.", + ["error_debug_xPlayer_get_sex"] = "Es gab ein Problem beim Abrufen deines Geschlechts.", + ["error_debug_xPlayer_get_dob"] = "Es gab ein Problem beim Abrufen deines Geburtsdatums.", + ["error_debug_xPlayer_get_height"] = "Es gab ein Problem beim Abrufen deiner Körpergröße.", + ["return_debug_xPlayer_get_first_name"] = "Vorname: %s", + ["return_debug_xPlayer_get_last_name"] = "Nachname: %s", + ["return_debug_xPlayer_get_full_name"] = "Name: %s", + ["return_debug_xPlayer_get_sex"] = "Geschlecht: %s", + ["return_debug_xPlayer_get_dob"] = "Geburtsdatum: %s", + ["return_debug_xPlayer_get_height"] = "Größe: %s cm", + ["data_incorrect"] = "Ungültige Daten, bitte versuche es erneut", + ["invalid_format"] = "Ungültiges Datenformat, bitte versuche es erneut.", + ["no_identifier"] = "Es gab ein Problem beim Laden deines Charakters!\nFehlercode: identifier-missing\n\nDies wird dadurch verursacht, dass deine R* ID fehlt. Bitte versuche es erneut oder melde dieses Problem dem Support.", + ["missing_identity"] = "Es gab ein Problem beim Laden deines Charakters!\nFehlercode: identifier-missing\n\nDies wird dadurch verursacht, dass deine R* ID fehlt. Bitte versuche es erneut oder melde dieses Problem dem Support.", + ["deleted_identity"] = "Charakter gelöscht. Bitte verbinde dich erneut, um einen neuen Charakter zu erstellen.", + ["already_registered"] = "Du hast dich bereits registriert.", + ["invalid_firstname_format"] = "Ungültiges Format (Vorname): Bitte versuche es erneut.", + ["invalid_lastname_format"] = "Ungültiges Format (Nachname): Bitte versuche es erneut.", + ["invalid_dob_format"] = "Ungültiges Format (Geburtstag): Bitte versuche es erneut.", + ["invalid_sex_format"] = "Ungültiges Format (Geschlecht): Bitte versuche es erneut.", + ["invalid_height_format"] = "Ungültiges Format (Körpergröße): Bitte versuche es erneut.", +} \ No newline at end of file diff --git a/[core]/esx_loadingscreen/LICENSE b/[core]/esx_loadingscreen/LICENSE index 85ce0959..79832f23 100644 --- a/[core]/esx_loadingscreen/LICENSE +++ b/[core]/esx_loadingscreen/LICENSE @@ -631,8 +631,8 @@ to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - esx_menu_default - Copyright (C) 2015-2023 Jérémie N'gadi + esx_loadingscreen + Copyright (C) 2020-2024 ESX Framework This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - esx_menu_default Copyright (C) 2015-2023 Jérémie N'gadi + esx_loadingscreen Copyright (C) 2020-2024 ESX Framework This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/[core]/esx_loadingscreen/README.md b/[core]/esx_loadingscreen/README.md index 57b3f585..1f51ae3e 100644 --- a/[core]/esx_loadingscreen/README.md +++ b/[core]/esx_loadingscreen/README.md @@ -6,7 +6,7 @@ A simple but beautiful Loading Screen for your server! esx_loadingscreen - Loading in style! -Copyright (C) 2023 ESX-Framework +Copyright (C) 2020-2024 ESX Framework This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. diff --git a/[core]/esx_loadingscreen/fxmanifest.lua b/[core]/esx_loadingscreen/fxmanifest.lua index c0f5a921..1f29ac91 100644 --- a/[core]/esx_loadingscreen/fxmanifest.lua +++ b/[core]/esx_loadingscreen/fxmanifest.lua @@ -1,9 +1,11 @@ game 'common' -version '1.10.5' fx_version 'cerulean' author 'ESX-Framework' +description 'Allows resources to Run tasks at specific intervals.' +version '1.10.5' lua54 'yes' + loadscreen 'index.html' shared_script 'config.lua' diff --git a/[core]/esx_menu_default/LICENSE b/[core]/esx_menu_default/LICENSE index 85ce0959..8eef124b 100644 --- a/[core]/esx_menu_default/LICENSE +++ b/[core]/esx_menu_default/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. esx_menu_default - Copyright (C) 2015-2023 Jérémie N'gadi + Copyright (C) 2015-2024 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - esx_menu_default Copyright (C) 2015-2023 Jérémie N'gadi + esx_menu_default Copyright (C) 2015-2024 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/[core]/esx_menu_default/README.md b/[core]/esx_menu_default/README.md index b06d5124..a9c1bb45 100644 --- a/[core]/esx_menu_default/README.md +++ b/[core]/esx_menu_default/README.md @@ -1,13 +1,13 @@

[ESX] Menu Defualt

Discord - Website - Documentation -A defualt List type menu for ESX. +A default List type menu for ESX. ![Preview_1](https://cdn.discordapp.com/attachments/944789399852417096/997882867336101948/Screenshot_52.png) ![Preview_2](https://cdn.discordapp.com/attachments/944789399852417096/997882867688411176/Screenshot_53.png) ## Legal -esx_menu_defualt - Default Menu! +esx_menu_default - Default Menu! Copyright (C) 2015-2023 Jérémie N'gadi diff --git a/[core]/esx_menu_default/fxmanifest.lua b/[core]/esx_menu_default/fxmanifest.lua index 3782aff6..1d26b2ae 100644 --- a/[core]/esx_menu_default/fxmanifest.lua +++ b/[core]/esx_menu_default/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'adamant' game 'gta5' -description 'ESX Menu Default' +description 'A basic menu system for ESX Legacy.' lua54 'yes' version '1.10.5' diff --git a/[core]/esx_menu_default/html/js/app.js b/[core]/esx_menu_default/html/js/app.js index 36b960d1..da6a906a 100644 --- a/[core]/esx_menu_default/html/js/app.js +++ b/[core]/esx_menu_default/html/js/app.js @@ -62,7 +62,7 @@ }); ESX_MENU.render(); - $("#menu_" + namespace + "_" + name) + $(document.getElementById("menu_" + namespace + "_" + name)) .find(".menu-item.selected")[0] .scrollIntoView(); }; @@ -121,7 +121,7 @@ } if (typeof focused != "undefined") { - $("#menu_" + focused.namespace + "_" + focused.name).show(); + $(document.getElementById("menu_" + focused.namespace + "_" + focused.name)).show(); } $(menuContainer).show(); @@ -231,7 +231,7 @@ ESX_MENU.change(focused.namespace, focused.name, elem); ESX_MENU.render(); - $("#menu_" + focused.namespace + "_" + focused.name) + $(document.getElementById("menu_" + focused.namespace + "_" + focused.name)) .find(".menu-item.selected")[0] .scrollIntoView(); } @@ -266,7 +266,7 @@ ESX_MENU.change(focused.namespace, focused.name, elem); ESX_MENU.render(); - $("#menu_" + focused.namespace + "_" + focused.name) + $(document.getElementById("menu_" + focused.namespace + "_" + focused.name)) .find(".menu-item.selected")[0] .scrollIntoView(); } @@ -302,7 +302,7 @@ break; } - $("#menu_" + focused.namespace + "_" + focused.name) + $(document.getElementById("menu_" + focused.namespace + "_" + focused.name)) .find(".menu-item.selected")[0] .scrollIntoView(); } @@ -341,7 +341,7 @@ break; } - $("#menu_" + focused.namespace + "_" + focused.name) + $(document.getElementById("menu_" + focused.namespace + "_" + focused.name)) .find(".menu-item.selected")[0] .scrollIntoView(); } diff --git a/[core]/esx_menu_dialog/LICENSE b/[core]/esx_menu_dialog/LICENSE index 2a78c4ae..7b3fd1a9 100644 --- a/[core]/esx_menu_dialog/LICENSE +++ b/[core]/esx_menu_dialog/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. esx_menu_dialog - Copyright (C) 2015-2023 Jérémie N'gadi + Copyright (C) 2015-2024 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - esx_menu_dialog Copyright (C) 2015-2023 Jérémie N'gadi + esx_menu_dialog Copyright (C) 2015-2024 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/[core]/esx_menu_dialog/README.md b/[core]/esx_menu_dialog/README.md index e1d9c85a..3a50de88 100644 --- a/[core]/esx_menu_dialog/README.md +++ b/[core]/esx_menu_dialog/README.md @@ -1,23 +1,6 @@ # esx_menu_dialog Simple script used for inputs. -## Download & Installation - -### Using [fvm](https://github.com/qlaffont/fvm-installer) -``` -fvm install --save --folder=esx esx-org/esx_menu_dialog -``` - -### Using Git -``` -cd resources -git clone https://github.com/ESX-Org/esx_menu_dialog [esx]/esx_menu_dialog -``` - -### Manually -- Download https://github.com/ESX-Org/esx_menu_dialog/archive/master.zip -- Put it in the `[esx]` directory - ## Installation - Add this to your `server.cfg`: @@ -29,7 +12,7 @@ start esx_menu_dialog ### License esx_menu_dialog - input dialog for ESX -Copyright (C) 2015-2023 Jérémie N'gadi +Copyright (C) 2015-2024 ESX-Framework This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. diff --git a/[core]/esx_menu_dialog/fxmanifest.lua b/[core]/esx_menu_dialog/fxmanifest.lua index 1513b3b1..33cdc713 100644 --- a/[core]/esx_menu_dialog/fxmanifest.lua +++ b/[core]/esx_menu_dialog/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'adamant' game 'gta5' -description 'ESX Menu Dialog' +description 'A basic input dialog for ESX Legacy.' lua54 'yes' version '1.10.5' diff --git a/[core]/esx_menu_list/LICENSE b/[core]/esx_menu_list/LICENSE index 4b6f6d2e..b56c9231 100644 --- a/[core]/esx_menu_list/LICENSE +++ b/[core]/esx_menu_list/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. esx_menu_list - Copyright (C) 2015-2023 Jérémie N'gadi + Copyright (C) 2015-2024 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - esx_menu_list Copyright (C) 2015-2023 Jérémie N'gadi + esx_menu_list Copyright (C) 2015-2024 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/[core]/esx_menu_list/README.md b/[core]/esx_menu_list/README.md index 173045d2..cdfc2fcb 100644 --- a/[core]/esx_menu_list/README.md +++ b/[core]/esx_menu_list/README.md @@ -1,35 +1,11 @@ # esx_menu_list Advanced menu inputs for ESX -## Download & Installation - -### Using [fvm](https://github.com/qlaffont/fvm-installer) -``` -fvm install --save --folder=esx esx-org/esx_menu_list -``` - -### Using Git -``` -cd resources -git clone https://github.com/ESX-Org/esx_menu_list [esx]/esx_menu_list -``` - -### Manually -- Download https://github.com/ESX-Org/esx_menu_list/archive/master.zip -- Put it in the `[esx]` directory - -## Installation -- Add this to your `server.cfg`: - -``` -start esx_menu_list -``` - # Legal ### License esx_menu_list - advanced menu inputs for ESX -Copyright (C) 2015-2023 Jérémie N'gadi +Copyright (C) 2015-2024 ESX-Framework This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. diff --git a/[core]/esx_menu_list/fxmanifest.lua b/[core]/esx_menu_list/fxmanifest.lua index cab86347..fbc887e6 100644 --- a/[core]/esx_menu_list/fxmanifest.lua +++ b/[core]/esx_menu_list/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'adamant' game 'gta5' -description 'ESX Menu List' +description 'A basic table-based menu system for ESX Legacy.' lua54 'yes' version '1.10.5' diff --git a/[core]/esx_multicharacter/LICENSE.md b/[core]/esx_multicharacter/LICENSE.md index f288702d..e23434ea 100644 --- a/[core]/esx_multicharacter/LICENSE.md +++ b/[core]/esx_multicharacter/LICENSE.md @@ -631,8 +631,8 @@ to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - - Copyright (C) + esx_multicharacter + Copyright (C) 2022-2024 ESX Framework, Linden, KASH This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - Copyright (C) + esx_multicharacter Copyright (C) 2022-2024 ESX Framework, Linden, KASH This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/[core]/esx_multicharacter/client/main.lua b/[core]/esx_multicharacter/client/main.lua index 4f6655cd..7771876d 100644 --- a/[core]/esx_multicharacter/client/main.lua +++ b/[core]/esx_multicharacter/client/main.lua @@ -1,7 +1,7 @@ local mp_m_freemode_01 = `mp_m_freemode_01` local mp_f_freemode_01 = `mp_f_freemode_01` -local SpawnCoords = Config.Spawn[math.random(#Config.Spawn)] +local SpawnCoords = Config.Spawn[ESX.Math.Random(1,#Config.Spawn)] if ESX.GetConfig().Multichar then CreateThread(function() diff --git a/[core]/esx_multicharacter/config.lua b/[core]/esx_multicharacter/config.lua index 8e5267bf..9f6e0577 100644 --- a/[core]/esx_multicharacter/config.lua +++ b/[core]/esx_multicharacter/config.lua @@ -16,7 +16,7 @@ else -- Sets the location for the character selection scene -- To set the spawn location for new characters, modify the default value in the users SQL table Config.Spawn = { - { x = -284.2856, y = 562.4627, z = 172.9182, heading = 19.9895 }, + { x = -284.2856, y = 562.4627, z = 172.9182, w = 19.9895 }, } -------------------- diff --git a/[core]/esx_multicharacter/fxmanifest.lua b/[core]/esx_multicharacter/fxmanifest.lua index b433c871..398ad3de 100644 --- a/[core]/esx_multicharacter/fxmanifest.lua +++ b/[core]/esx_multicharacter/fxmanifest.lua @@ -2,7 +2,7 @@ fx_version 'cerulean' game 'gta5' author 'ESX-Framework - Linden - KASH' -description 'Official Multicharacter System For ESX Legacy' +description 'Allows players to have multiple characters on the same account.' version '1.10.5' lua54 'yes' diff --git a/[core]/esx_multicharacter/locales/de.lua b/[core]/esx_multicharacter/locales/de.lua new file mode 100644 index 00000000..f33c433e --- /dev/null +++ b/[core]/esx_multicharacter/locales/de.lua @@ -0,0 +1,32 @@ +Locales["de"] = { + ["male"] = "Männlich", + ["female"] = "Weiblich", + ["select_char"] = "Charakter auswählen", + ["select_char_description"] = "Wähle einen Charakter aus, mit den du spielen willst.", + ["create_char"] = "Neuer Charakter", + ["char_play"] = "Spielen", + ["char_play_description"] = "Weiter in die Stadt.", + ["char_disabled"] = "Deaktiviert", + ["char_disabled_description"] = "Dieser Charakter ist deaktiviert.", + ["char_delete"] = "Löschen", + ["char_delete_description"] = "Dieser Charakter wird dauerhaft entfernt.", + ["char_delete_confirmation"] = "Bestätigung zur Entfernung deines Charakters.", + ["char_delete_confirmation_description"] = "Bist du sicher, dass du den ausgewählten Charakter entfernen willst?", + ["char_delete_yes_description"] = "Ja, ich bin sicher, dass ich den ausgewählten Charakter lösche", + ["char_delete_no_description"] = "Nein, zurück zu den Charakteroptionen", + ["character"] = " Charakter: %s", + ["return"] = "Zurück", + ["return_description"] = "Zur Charakterauswahl zurückkehren.", + ["command_setslots"] = "Anzahl der Charakter-Slots eines Spielers festlegen", + ["command_remslots"] = "Die Anzahl der Charakter-Slots eines Spielers entfernen", + ["command_enablechar"] = "Aktiviere einen bestimmten Charakter eines Spielers", + ["command_disablechar"] = "Deaktiviere einen bestimmten Charakter eines Spielers", + ["command_charslot"] = "Slotnummer des Charakters", + ["command_identifier"] = "Spieler R* ID", + ["command_slots"] = "Anzahl von Charakter-Slots", + ["slotsadd"] = "Du hast %s Charakter-Slots auf %s gesetzt", + ["slotsrem"] = "Du hast &s Charakter-Slots auf %s entfernt", + ["charenabled"] = "Du hast den Charakter #%s von %s aktiviert", + ["chardisabled"] = "Du hast den Charakter #%s von %s deaktiviert", + ["charnotfound"] = "Charakter #%s von %s existiert nicht", +} \ No newline at end of file diff --git a/[core]/esx_multicharacter/locales/gr.lua b/[core]/esx_multicharacter/locales/gr.lua new file mode 100644 index 00000000..49b832ca --- /dev/null +++ b/[core]/esx_multicharacter/locales/gr.lua @@ -0,0 +1,32 @@ +Locales["gr"] = { + ["male"] = "Άνδρας", + ["female"] = "Γυναίκα", + ["select_char"] = "Επιλογή Χαρακτήρα", + ["select_char_description"] = "Επιλέξτε ένα χαρακτήρα για να παίξετε.", + ["create_char"] = "Νέος Χαρακτήρας", + ["char_play"] = "Παίξτε", + ["char_play_description"] = "Συνέχεια στην πόλη.", + ["char_disabled"] = "Απενεργοποιημένος", + ["char_disabled_description"] = "Αυτός ο χαρακτήρας δεν είναι χρησιμοποιήσιμος.", + ["char_delete"] = "Διαγραφή", + ["char_delete_description"] = "Διαγράψτε οριστικά αυτόν τον χαρακτήρα.", + ["char_delete_confirmation"] = "Επιβεβαίωση Διαγραφής", + ["char_delete_confirmation_description"] = "Είστε σίγουρος ότι θέλετε να διαγράψετε τον επιλεγμένο χαρακτήρα;", + ["char_delete_yes_description"] = "Ναι, είμαι σίγουρος ότι θέλω να διαγράψω τον επιλεγμένο χαρακτήρα", + ["char_delete_no_description"] = "Όχι, επιστροφή στις επιλογές χαρακτήρα", + ["character"] = "Χαρακτήρας: %s", + ["return"] = "Επιστροφή", + ["return_description"] = "Επιστροφή στην επιλογή χαρακτήρα.", + ["command_setslots"] = "Ορίστε τον αριθμό των slot πολλαπλών χαρακτήρων ενός παίκτη", + ["command_remslots"] = "Αφαιρέστε τον αριθμό των slot πολλαπλών χαρακτήρων ενός παίκτη", + ["command_enablechar"] = "Ενεργοποιήστε έναν συγκεκριμένο χαρακτήρα ενός παίκτη", + ["command_disablechar"] = "Απενεργοποιήστε έναν συγκεκριμένο χαρακτήρα ενός παίκτη", + ["command_charslot"] = "Αριθμός υποδιαίρεσης του χαρακτήρα", + ["command_identifier"] = "Ταυτότητα παίκτη", + ["command_slots"] = "Αριθμός slot", + ["slotsadd"] = "Ορίσατε %s slot σε %s", + ["slotsrem"] = "Αφαιρέσατε slot από τον %s", + ["charenabled"] = "Ενεργοποιήσατε τον χαρακτήρα #%s του %s", + ["chardisabled"] = "Απενεργοποιήσατε τον χαρακτήρα #%s του %s", + ["charnotfound"] = "Ο χαρακτήρας #%s του %s δεν υπάρχει", +} diff --git a/[core]/esx_multicharacter/readme.md b/[core]/esx_multicharacter/readme.md index 75e9cdf6..58b30ff4 100644 --- a/[core]/esx_multicharacter/readme.md +++ b/[core]/esx_multicharacter/readme.md @@ -21,7 +21,7 @@ A Simplistic system, that allows Players to have multiple Characters, which can Official Multi-Character system for ESX Legacy -Copyright © 2022-2023 Linden, ESX-Framework and KASH +Copyright © 2022-2024 Linden, ESX-Framework and KASH This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/[core]/esx_multicharacter/server/main.lua b/[core]/esx_multicharacter/server/main.lua index 8a5f9b2b..eec85eb6 100644 --- a/[core]/esx_multicharacter/server/main.lua +++ b/[core]/esx_multicharacter/server/main.lua @@ -136,7 +136,7 @@ end) local function DeleteCharacter(source, charid) local identifier = ("%s%s:%s"):format(PREFIX, charid, GetIdentifier(source)) - local query = "DELETE FROM %s WHERE %s = ?" + local query = "DELETE FROM `%s` WHERE %s = ?" local queries = {} local count = 0 diff --git a/[core]/esx_notify/LICENSE b/[core]/esx_notify/LICENSE index 85ce0959..a7568793 100644 --- a/[core]/esx_notify/LICENSE +++ b/[core]/esx_notify/LICENSE @@ -631,8 +631,8 @@ to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - esx_menu_default - Copyright (C) 2015-2023 Jérémie N'gadi + esx_notify + Copyright (C) 2022-2024 ESX Framework This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - esx_menu_default Copyright (C) 2015-2023 Jérémie N'gadi + esx_notify Copyright (C) 2022-2024 ESX Framework This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/[core]/esx_notify/Notify.lua b/[core]/esx_notify/Notify.lua index 44f19fb6..d47066f8 100644 --- a/[core]/esx_notify/Notify.lua +++ b/[core]/esx_notify/Notify.lua @@ -25,8 +25,8 @@ local function Notify(notificatonType, length, message) end SendNuiMessage(json.encode({ - type = notificatonType or "info", - length = length or 3000, + type = notificatonType, + length = length, message = message or "ESX-Notify", })) end diff --git a/[core]/esx_notify/fxmanifest.lua b/[core]/esx_notify/fxmanifest.lua index bdb6f40c..d18d867e 100644 --- a/[core]/esx_notify/fxmanifest.lua +++ b/[core]/esx_notify/fxmanifest.lua @@ -4,7 +4,7 @@ lua54 'yes' game 'gta5' version '1.10.5' author 'ESX-Framework' -description 'Official NUI Notification system for ESX' +description 'A beautiful and simple NUI notification system for ESX' shared_script '@es_extended/imports.lua' diff --git a/[core]/esx_notify/readme.md b/[core]/esx_notify/readme.md index 9f00c0de..666b3498 100644 --- a/[core]/esx_notify/readme.md +++ b/[core]/esx_notify/readme.md @@ -55,7 +55,7 @@ ESX.ShowNotification("I i ~r~love~s~ donuts", "success", 3000) esx_notify- Notify! -Copyright (C) 2023 ESX-Framework +Copyright (C) 2022-2024 ESX-Framework This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. diff --git a/[core]/esx_progressbar/fxmanifest.lua b/[core]/esx_progressbar/fxmanifest.lua index 502a543d..c034adcf 100644 --- a/[core]/esx_progressbar/fxmanifest.lua +++ b/[core]/esx_progressbar/fxmanifest.lua @@ -2,9 +2,9 @@ fx_version 'adamant' game 'gta5' author 'ESX-Framework' -lua54 'yes' +description 'A beautiful and simple NUI progress bar for ESX' version '1.10.5' -description 'ESX Progressbar' +lua54 'yes' client_scripts { 'Progress.lua' } shared_script '@es_extended/imports.lua' diff --git a/[core]/esx_skin/LICENSE b/[core]/esx_skin/LICENSE index f8a9de97..78332fdb 100644 --- a/[core]/esx_skin/LICENSE +++ b/[core]/esx_skin/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. esx_skin - Copyright (C) 2015-2023 Jérémie N'gadi + Copyright (C) 2015-2024 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - esx_skin Copyright (C) 2015-2023 Jérémie N'gadi + esx_skin Copyright (C) 2015-2024 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/[core]/esx_skin/fxmanifest.lua b/[core]/esx_skin/fxmanifest.lua index 436be397..44683a05 100644 --- a/[core]/esx_skin/fxmanifest.lua +++ b/[core]/esx_skin/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'adamant' game 'gta5' -description 'ESX Skin' +description 'Allows players to customise their character\'s appearance' version '1.10.5' lua54 'yes' diff --git a/[core]/esx_skin/locales/de.lua b/[core]/esx_skin/locales/de.lua new file mode 100644 index 00000000..b40caa1d --- /dev/null +++ b/[core]/esx_skin/locales/de.lua @@ -0,0 +1,6 @@ +Locales["de"] = { + ["skin_menu"] = "Skin Menü", + ["use_rotate_view"] = "Drücke ~INPUT_FRONTEND_LS~ oder ~INPUT_CHARACTER_WHEEL~ um deine Ansicht zu ändern.", + ["skin"] = "Aussehen ändern", + ["saveskin"] = "Aussehen abspeichern", + } \ No newline at end of file diff --git a/[core]/esx_textui/LICENSE b/[core]/esx_textui/LICENSE index 85ce0959..cf001768 100644 --- a/[core]/esx_textui/LICENSE +++ b/[core]/esx_textui/LICENSE @@ -631,8 +631,8 @@ to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - esx_menu_default - Copyright (C) 2015-2023 Jérémie N'gadi + esx_textui + Copyright (C) 2015-2024 ESX Framework This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - esx_menu_default Copyright (C) 2015-2023 Jérémie N'gadi + esx_textui Copyright (C) 2022-2024 ESX Framework This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/[core]/esx_textui/fxmanifest.lua b/[core]/esx_textui/fxmanifest.lua index 389761db..e77a61a4 100644 --- a/[core]/esx_textui/fxmanifest.lua +++ b/[core]/esx_textui/fxmanifest.lua @@ -2,8 +2,8 @@ fx_version 'adamant' game 'gta5' author 'ESX-Framework' +description 'A beautiful and simple Persistent Notification system for ESX.' version '1.10.5' -description 'ESX TextUI' lua54 'yes' client_scripts { 'TextUI.lua' } diff --git a/[core]/esx_textui/readme.md b/[core]/esx_textui/readme.md index 2c1f30e9..32796da3 100644 --- a/[core]/esx_textui/readme.md +++ b/[core]/esx_textui/readme.md @@ -41,9 +41,9 @@ ESX.TextUI("i ~r~love~s~ donuts", "error") ## Legal -esx_textui - Persistant Notifications! +esx_textui - Persistent Notifications -Copyright (C) 2023 ESX-Framework +Copyright (C) 2022-2024 ESX Framework This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. diff --git a/[core]/skinchanger/LICENSE b/[core]/skinchanger/LICENSE index 79cea11b..89a184fc 100644 --- a/[core]/skinchanger/LICENSE +++ b/[core]/skinchanger/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. skinchanger - Copyright (C) 2015-2023 Jérémie N'gadi + Copyright (C) 2015-2024 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - skinchanger Copyright (C) 2015-2023 Jérémie N'gadi + skinchanger Copyright (C) 2015-2024 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/[core]/skinchanger/fxmanifest.lua b/[core]/skinchanger/fxmanifest.lua index 641deaf5..c8ada324 100644 --- a/[core]/skinchanger/fxmanifest.lua +++ b/[core]/skinchanger/fxmanifest.lua @@ -1,9 +1,9 @@ fx_version 'adamant' game 'gta5' -lua54 'yes' -description 'Official ESX-Legacy resource for handling the Player`s Skin' +description 'Saves/loads character appearances for ESX Legacy.' version '1.10.5' +lua54 'yes' client_scripts { '@es_extended/locale.lua', diff --git a/[core]/skinchanger/locales/de.lua b/[core]/skinchanger/locales/de.lua new file mode 100644 index 00000000..a4741a61 --- /dev/null +++ b/[core]/skinchanger/locales/de.lua @@ -0,0 +1,100 @@ +Locales["de"] = { + ["sex"] = "Geschlecht", + ["mom"] = "Mutters Gesicht", + ["dad"] = "Vaters Gesicht", + ["resemblance"] = "Ähnlichkeit", + ["skin_tone"] = "Hautton", + ["nose_1"] = "Nasenbreite", + ["nose_2"] = "Höhe der Nasenspitze", + ["nose_3"] = "Länge der Nasenspitze", + ["nose_4"] = "Nasenbeinhöhe", + ["nose_5"] = "Nasenspitzenabsenkung", + ["nose_6"] = "Nasenbeinverdrehung", + ["cheeks_1"] = "Wangenknochenhöhe", + ["cheeks_2"] = "Wangenknochenbreite", + ["cheeks_3"] = "Wangenbreite", + ["lip_fullness"] = "Lippendicke", + ["jaw_bone_width"] = "Kieferknochenbreite", + ["jaw_bone_length"] = "Kieferknochenlänge", + ["chin_height"] = "Kinnhöhe", + ["chin_length"] = "Kinnlänge", + ["chin_width"] = "Kinnbreite", + ["chin_hole"] = "Kinnlochgröße", + ["neck_thickness"] = "Halsdicke", + ["wrinkles"] = "Falten", + ["wrinkle_thickness"] = "Faltenstärke", + ["beard_type"] = "Barttyp", + ["beard_size"] = "Bartgröße", + ["beard_color_1"] = "Bartfarbe 1", + ["beard_color_2"] = "Bartfarbe 2", + ["hair_1"] = "Haare 1", + ["hair_2"] = "Haare 2", + ["hair_color_1"] = "Haarfarbe 1", + ["hair_color_2"] = "Haarfarbe 2", + ["eye_color"] = "Augenfarbe", + ["eye_squint"] = "Augenblinzeln", + ["eyebrow_type"] = "Augenbrauentyp", + ["eyebrow_size"] = "Augenbrauengröße", + ["eyebrow_color_1"] = "Augenbrauenfarbe 1", + ["eyebrow_color_2"] = "Augenbrauenfarbe 2", + ["eyebrow_depth"] = "Augenbrauentiefe", + ["eyebrow_height"] = "Augenbrauenhöhe", + ["makeup_type"] = "Makeup-Typ", + ["makeup_thickness"] = "Makeupstärke", + ["makeup_color_1"] = "Schminkfarbe 1", + ["makeup_color_2"] = "Schminkfarbe 2", + ["lipstick_type"] = "Lippenstifttyp", + ["lipstick_thickness"] = "Lippenstiftdicke", + ["lipstick_color_1"] = "Lippenstiftfarbe 1", + ["lipstick_color_2"] = "Lippenstiftfarbe 2", + ["ear_accessories"] = "Ohrenzubehör", + ["ear_accessories_color"] = "Ohrenzubehör Farbe", + ["tshirt_1"] = "T-Shirt 1", + ["tshirt_2"] = "T-Shirt 2", + ["torso_1"] = "Oberkörper 1", + ["torso_2"] = "Oberkörper 2", + ["decals_1"] = "Abziehbilder 1", + ["decals_2"] = "Abziehbilder 2", + ["arms"] = "Arme 1", + ["arms_2"] = "Arme 2", + ["pants_1"] = "Hose 1", + ["pants_2"] = "Hose 2", + ["schuhe_1"] = "Schuhe 1", + ["Schuhe_2"] = "Schuhe 2", + ["mask_1"] = "Maske 1", + ["mask_2"] = "Maske 2", + ["bproof_1"] = "Kugelsichere Weste 1", + ["bproof_2"] = "Kugelsichere Weste 2", + ["chain_1"] = "Kette 1", + ["chain_2"] = "Kette 2", + ["helmet_1"] = "Helm 1", + ["helmet_2"] = "Helm 2", + ["watches_1"] = "Uhren 1", + ["watches_2"] = "Uhren 2", + ["bracelets_1"] = "Armbänder 1", + ["bracelets_2"] = "Armbänder 2", + ["glasses_1"] = "Brille 1", + ["glasses_2"] = "Brille 2", + ["bag"] = "Tasche", + ["bag_color"] = "Taschenfarbe", + ["blemishes"] = "Schönheitsfehler", + ["blemishes_size"] = "Fleckenstärke", + ["ageing"] = "Alterung", + ["ageing_1"] = "Alterungsstärke", + ["blush"] = "Erröten", + ["blush_1"] = "Errötungsstärke", + ["blush_color"] = "Errötungsfarbe", + ["complexion"] = "Teint", + ["complexion_1"] = "Teintstärke", + ["sun"] = "Sonne", + ["sun_1"] = "Sonnenstärke", + ["sommersprossen"] = "Sommersprossen", + ["sommersprossen_1"] = "Sommersprossenstärke", + ["chest_hair"] = "Brusthaar", + ["chest_hair_1"] = "Brusthaarstärke", + ["chest_color"] = "Brusthaarfarbe", + ["bodyb"] = "Körpermakel", + ["bodyb_size"] = "Körpermakelstärke", + ["bodyb_extra"] = "Körperfleckeneffekt", + ["bodyb_extra_thickness"] = "Körperfleckeneffektstärke", +}