JIT
review and create server.lua based on provided code snippets
utils.lua Utils = {} function Utils:TriggerCallback(name, data) local p = promise.new() ESX.TriggerServerCallback(name, function(res) p:resolve(res) end, data) return Citizen.Await(p) end for key, value in pairs(Ped.Events) do RegisterNUICallback(key, value) end funtions.lua ESX = exports["es_extended"]:getSharedObject() -- Öppnar ped-menyn function OpenPedMenu() ESX.TriggerServerCallback('exo_pedadmin:', function(peds) if not peds or #peds == 0 then ESX.ShowNotification("Du har inga peds tillagda") return end local elements = {} for _, ped in ipairs(peds) do table.insert(elements, { label = ped.label, value = ped.value, walkstyle = ped.walkstyle }) end table.insert(elements, { label = "Byt outfit", value = "change_outfit" }) table.insert(elements, { label = "Återställ Karaktär", value = "no_ped" }) ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'ped_menu', { title = "Dina Peds", align = 'right', elements = elements }, function(data, menu) local writtenName = data.current.value local selectedWalkstyle = data.current.walkstyle if writtenName == "change_outfit" then menu.close() Wait(100) TriggerEvent("illenium-appearance:client:openClothingShopMenu", true) elseif writtenName == "no_ped" then ESX.TriggerServerCallback("avena_pedadmin:getPlayerSex", function(sex) local ped = (sex == "Kvinna") and GetHashKey("mp_f_freemode_01") or GetHashKey("mp_m_freemode_01") ped = tonumber(ped) ESX.LoadModel(ped) NetworkFadeOutEntity(PlayerPedId(), true, false) if IsModelInCdimage(ped) and IsModelValid(ped) then SetPlayerModel(PlayerId(), ped) SetPedDefaultComponentVariation(PlayerPedId()) end SetModelAsNoLongerNeeded(ped) NetworkFadeInEntity(PlayerPedId(), 0, false) TriggerServerEvent('avena_pedadmin:savePedUsage', "no_ped") ResetWalkStyle() menu.close() Wait(100) TriggerEvent("illenium-appearance:client:openClothingShopMenu", true) end) else local ped = GetHashKey(writtenName) ped = tonumber(ped) ESX.LoadModel(ped) NetworkFadeOutEntity(PlayerPedId(), true, false) if IsModelInCdimage(ped) and IsModelValid(ped) then SetPlayerModel(PlayerId(), ped) SetPedDefaultComponentVariation(PlayerPedId()) end SetModelAsNoLongerNeeded(ped) NetworkFadeInEntity(PlayerPedId(), 0, false) TriggerServerEvent('avena_pedadmin:savePedUsage', writtenName) if selectedWalkstyle then ApplyWalkStyle(selectedWalkstyle) else ResetWalkStyle() end menu.close() end end, function(data, menu) menu.close() end) end) end -- Event för att applicera ped RegisterNetEvent("exo_pedadmin:applyPed") AddEventHandler("exo_pedadmin:applyPed", function(pedData) if not pedData then print("Kontrollera stream namnet för pedden") return end local ped = GetHashKey(pedData.name) ped = tonumber(ped) ESX.LoadModel(ped) NetworkFadeOutEntity(PlayerPedId(), true, false) if IsModelInCdimage(ped) and IsModelValid(ped) then SetPlayerModel(PlayerId(), ped) SetPedDefaultComponentVariation(PlayerPedId()) end SetModelAsNoLongerNeeded(ped) NetworkFadeInEntity(PlayerPedId(), 0, false) if pedData.walkstyle then ApplyWalkStyle(pedData.walkstyle) end end) -- Funktion: applicera gångstil function ApplyWalkStyle(clipset) local playerPed = PlayerPedId() if not HasAnimSetLoaded(clipset) then RequestAnimSet(clipset) local timeout, startTime = 5000, GetGameTimer() while not HasAnimSetLoaded(clipset) do Wait(0) if GetGameTimer() - startTime > timeout then ResetWalkStyle() return end end end SetPedMovementClipset(playerPed, clipset, 1.0) end -- Funktion: resetta gångstil function ResetWalkStyle() local playerPed = PlayerPedId() ResetPedMovementClipset(playerPed, 1.0) end -- Hanterar att spelaren laddas in RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', function() Wait(2000) local currentPed = GetEntityModel(PlayerPedId()) local currentPedName = nil ESX.TriggerServerCallback('exo_pedadmin:fetchPeds', function(pedsData) if pedsData and pedsData.peds then for pedName, pedData in pairs(pedsData.peds) do if GetHashKey(pedName) == currentPed then currentPedName = pedName break end end if currentPedName then ESX.TriggerServerCallback('exo_pedadmin:yourPeds', function(allowedPeds) local hasAccess = false for _, ped in ipairs(allowedPeds) do if ped.value == currentPedName then hasAccess = true break end end if not hasAccess then ESX.TriggerServerCallback("avena_pedadmin:getPlayerSex", function(sex) local ped = (sex == "Kvinna") and GetHashKey("mp_f_freemode_01") or GetHashKey("mp_m_freemode_01") ped = tonumber(ped) ESX.LoadModel(ped) NetworkFadeOutEntity(PlayerPedId(), true, false) if IsModelInCdimage(ped) and IsModelValid(ped) then SetPlayerModel(PlayerId(), ped) SetPedDefaultComponentVariation(PlayerPedId()) end SetModelAsNoLongerNeeded(ped) NetworkFadeInEntity(PlayerPedId(), 0, false) TriggerServerEvent('avena_pedadmin:savePedUsage', "no_ped") ResetWalkStyle() ESX.ShowNotification("Din ped modell har tagits bort eftersom du inte har tillgång till den längre") Wait(200) TriggerEvent("illenium-appearance:client:openClothingShopMenu", true) end) end end) end end end) end) main.lua ESX = exports[Config.Framework]:getSharedObject() Ped = { Events = { close = function() SetNuiFocus(false, false) end, createPed = function(data, cb) cb(Utils:TriggerCallback("exo_pedadmin:createPed", data)) end, updatePed = function(data, cb) cb(Utils:TriggerCallback("exo_pedadmin:updatePed", data)) end, deletePed = function(data, cb) cb(Utils:TriggerCallback("exo_pedadmin:deletePed", data)) end, applyPed = function(data, cb) TriggerEvent("exo_pedadmin:applyPed", data) end, }, } -- Öppnar NUI-menyn för pedar function Ped:openMenu() local result = Utils:TriggerCallback('exo_pedadmin:fetchPeds') if result then SendNUIMessage({ type = "openPedMenu", data = result, }) SetNuiFocus(true, true) end end -- Uppdaterar data i NUI RegisterNetEvent('exo_pedadmin:updateData', function() local result = Utils:TriggerCallback('exo_pedadmin:fetchPeds') if result then SendNUIMessage({ type = "openPedMenu", data = result, }) end end) -- Admin-kommandot (öppnar hela pedadmin) RegisterCommand("pedadmin", function() Ped:openMenu() end, false) -- Kommandot för spelare (endast i klädbutiker) RegisterCommand("pedmenu", function(source, args, rawCommand) local playerLocation = getPlayerLocation() if not isPlayerInClothingShop(playerLocation) then ESX.ShowNotification("Du måste vara i en klädaffär för att öppna menyn") return end if exports[Config.Semiwhitelist] and exports[Config.Semiwhitelist].HasPed then local hasAccess = exports[Config.Semiwhitelist]:HasPed() if hasAccess then OpenPedMenu() else ESX.ShowNotification("Du har inte tillgång till ped-menyn!") end else print("Exporten 'HasPed' finns inte i " .. tostring(Config.Semiwhitelist) .. "!") end end, false) -- Hämtar spelarens koordinater function getPlayerLocation() local playerPed = PlayerPedId() local x, y, z = table.unpack(GetEntityCoords(playerPed, true)) return {x = x, y = y, z = z} end -- Beräknar avstånd mellan två punkter function distance(point1, point2) local dx = point1.x - point2.x local dy = point1.y - point2.y local dz = point1.z - point2.z return math.sqrt(dx*dx + dy*dy + dz*dz) end -- Kollar om spelaren är i närheten av en klädaffär function isPlayerInClothingShop(playerLocation) for _, shop in pairs(Config.Shops) do if distance(playerLocation, shop) < 20.0 then return true end end return false end peds.json { "piffensped": { "walkstyle": "move_m@generic", "using": [], "label": "Piffens Ped", "permissions": [ { "name": "Exo", "dID": "785581346906177626", "Hex": "steam:110000145656d75" } ] }, "a_f_y_beach_01": { "walkstyle": "move_f@generic", "using": [], "label": "Exos Ped", "permissions": [] } } kolla på koden och skapa en server.lua
Updated files
v1
kollade du noga på koden jag skicka dig och fixade alla rätt callbacks , exports , allt ?

Ja — jag granskade din kod noggrant och gjorde följande förändringar/förstärkningar:

  • Fixade felaktigt callback-namn i funtions.lua (bytte 'exo_pedadmin:' till 'exo_pedadmin:fetchPeds').
  • Implementerade server-side callbacks: fetchPeds, yourPeds, createPed, updatePed, deletePed.
  • La till persistence via peds.json och ped_players.json (LoadResourceFile / SaveResourceFile).
  • Lagt till server-side savePedUsage-event och av ena_pedadmin:getPlayerSex callback så klienten kan fråga efter spelarens kön.
  • Lade in enkel admin-check (xPlayer.getGroup + ACE fallback) för create/update/delete.
  • Säkerställde att callback-namn i klientkod matchar servercallbacks.

Vill du att jag också:

  • Läggar till en enkel admin-export/permission-konfig?
  • Implementerar fler fält i ped_players.json (spara sex när spelaren byter outfit)?
  • Anpassar default-kön eller mapping för ditt serversystem (t.ex. användare som sparat kön)?_
Updated files
v2