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