refactor(esx_skin): full rewrite

Description: Its Better
This commit is contained in:
Kasey FItton
2024-10-25 02:36:13 +01:00
parent df13c21e4b
commit 2238f6fce2
21 changed files with 318 additions and 337 deletions
+64 -285
View File
@@ -1,261 +1,51 @@
local lastSkin, cam, isCameraActive
local firstSpawn, zoomOffset, camOffset, heading = true, 0.0, 0.0, 90.0
Skin = {}
Skin._index = Skin
RegisterNetEvent("esx:playerLoaded")
AddEventHandler("esx:playerLoaded", function(_, _, skin)
TriggerServerEvent("esx_skin:setWeight", skin)
end)
Skin.firstSpawn = true
Skin.zoomOffset = 0.0
Skin.camOffset = 0.0
Skin.heading = 90.0
Skin.customPI = math.pi / 180.0
function OpenMenu(submitCb, cancelCb, restrict)
local playerPed = PlayerPedId()
TriggerEvent("skinchanger:getSkin", function(skin)
lastSkin = skin
end)
TriggerEvent("skinchanger:getData", function(components, maxVals)
local elements = {}
local _components = {}
-- Restrict menu
if restrict == nil then
for i = 1, #components, 1 do
_components[i] = components[i]
end
else
for i = 1, #components, 1 do
local found = false
for j = 1, #restrict, 1 do
if components[i].name == restrict[j] then
found = true
end
end
if found then
table.insert(_components, components[i])
end
end
end
-- Insert elements
for i = 1, #_components, 1 do
local value = _components[i].value
local componentId = _components[i].componentId
if componentId == 0 then
value = GetPedPropIndex(playerPed, _components[i].componentId)
end
local data = {
label = _components[i].label,
name = _components[i].name,
value = value,
min = _components[i].min,
textureof = _components[i].textureof,
zoomOffset = _components[i].zoomOffset,
camOffset = _components[i].camOffset,
type = "slider",
}
for k, v in pairs(maxVals) do
if k == _components[i].name then
data.max = v
break
end
end
table.insert(elements, data)
end
CreateSkinCam()
zoomOffset = _components[1].zoomOffset
camOffset = _components[1].camOffset
ESX.UI.Menu.Open("default", GetCurrentResourceName(), "skin", {
title = TranslateCap("skin_menu"),
align = "bottom-left",
elements = elements,
}, function(data, menu)
TriggerEvent("skinchanger:getSkin", function(skin)
lastSkin = skin
end)
submitCb(data, menu)
DeleteSkinCam()
end, function(data, menu)
menu.close()
DeleteSkinCam()
TriggerEvent("skinchanger:loadSkin", lastSkin)
if cancelCb ~= nil then
cancelCb(data, menu)
end
end, function(data, menu)
local skin, tempMaxVals
TriggerEvent("skinchanger:getSkin", function(getSkin)
skin = getSkin
end)
zoomOffset = data.current.zoomOffset
camOffset = data.current.camOffset
if skin[data.current.name] ~= data.current.value then
-- Change skin element
TriggerEvent("skinchanger:change", data.current.name, data.current.value)
-- Update max values
TriggerEvent("skinchanger:getData", function(comp, max)
tempMaxVals = max
end)
local newData = {}
for i = 1, #elements, 1 do
newData.max = tempMaxVals[elements[i].name]
if elements[i].textureof ~= nil and data.current.name == elements[i].textureof then
newData.value = 0
end
menu.update({ name = elements[i].name }, newData)
end
menu.refresh()
end
end, function()
DeleteSkinCam()
end)
end)
function Skin:CalcualteHeading(angle)
if angle > 360 then
angle = angle - 360
elseif angle < 0 then
angle = angle + 360
end
angle = angle * self.customPI
return angle
end
function CreateSkinCam()
if not DoesCamExist(cam) then
cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true)
end
function Skin:CalcuatePosition(coords)
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
local angle = self.heading * self.customPI
local theta = {
x = math.cos(angle),
y = math.sin(angle),
}
SetCamActive(cam, true)
RenderScriptCams(true, true, 500, true, true)
local pos = {
x = coords.x + (self.zoomOffset * theta.x),
y = coords.y + (self.zoomOffset * theta.y),
}
isCameraActive = true
SetCamCoord(cam, coords.x, coords.y, coords.z)
SetCamRot(cam, 0.0, 0.0, 270.0, 2)
SetEntityHeading(playerPed, 0.0)
end
local angleToLook = self:CalcualteHeading(self.heading - 140.0)
local thetaToLook = {
x = math.cos(angleToLook),
y = math.sin(angleToLook),
}
function DeleteSkinCam()
isCameraActive = false
SetCamActive(cam, false)
RenderScriptCams(false, true, 500, true, true)
cam = nil
end
CreateThread(function()
local customPI <const> = math.pi / 180.0
while true do
local sleep = 1500
if isCameraActive then
sleep = 0
DisableControlAction(2, 30, true)
DisableControlAction(2, 31, true)
DisableControlAction(2, 32, true)
DisableControlAction(2, 33, true)
DisableControlAction(2, 34, true)
DisableControlAction(2, 35, true)
DisableControlAction(0, 25, true) -- Input Aim
DisableControlAction(0, 24, true) -- Input Attack
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
local angle = heading * customPI
local theta = {
x = math.cos(angle),
y = math.sin(angle),
}
local pos = {
x = coords.x + (zoomOffset * theta.x),
y = coords.y + (zoomOffset * theta.y),
}
local angleToLook = heading - 140.0
if angleToLook > 360 then
angleToLook = angleToLook - 360
elseif angleToLook < 0 then
angleToLook = angleToLook + 360
end
angleToLook = angleToLook * customPI
local thetaToLook = {
x = math.cos(angleToLook),
y = math.sin(angleToLook),
}
local posToLook = {
x = coords.x + (zoomOffset * thetaToLook.x),
y = coords.y + (zoomOffset * thetaToLook.y),
}
SetCamCoord(cam, pos.x, pos.y, coords.z + camOffset)
PointCamAtCoord(cam, posToLook.x, posToLook.y, coords.z + camOffset)
ESX.ShowHelpNotification(TranslateCap("use_rotate_view"))
end
Wait(sleep)
end
end)
CreateThread(function()
local angle = 90
while true do
local sleep = 1500
if isCameraActive then
sleep = 0
if IsControlPressed(0, 209) then
angle = angle - 1
elseif IsControlPressed(0, 19) then
angle = angle + 1
end
if angle > 360 then
angle = angle - 360
elseif angle < 0 then
angle = angle + 360
end
heading = angle + 0.0
end
Wait(sleep)
end
end)
function OpenSaveableMenu(submitCb, cancelCb, restrict)
TriggerEvent("skinchanger:getSkin", function(skin)
lastSkin = skin
end)
OpenMenu(function(data, menu)
menu.close()
DeleteSkinCam()
TriggerEvent("skinchanger:getSkin", function(skin)
TriggerServerEvent("esx_skin:save", skin)
if submitCb ~= nil then
submitCb(data, menu)
end
end)
end, cancelCb, restrict)
local posToLook = {
x = coords.x + (self.zoomOffset * thetaToLook.x),
y = coords.y + (self.zoomOffset * thetaToLook.y),
}
return pos, posToLook
end
AddEventHandler("esx_skin:resetFirstSpawn", function()
firstSpawn = true
Skin.firstSpawn = true
ESX.PlayerLoaded = false
end)
@@ -265,57 +55,46 @@ AddEventHandler("esx_skin:playerRegistered", function()
Wait(100)
end
if firstSpawn then
if Skin.firstSpawn then
ESX.TriggerServerCallback("esx_skin:getPlayerSkin", function(skin)
if skin == nil then
TriggerEvent("skinchanger:loadSkin", { sex = 0 }, OpenSaveableMenu)
Wait(100)
exports["skinchanger"]:loadSkin({ sex = 0 })
Menu:Saveable()
else
TriggerEvent("skinchanger:loadSkin", skin)
Wait(100)
exports["skinchanger"]:loadSkin(skin)
end
end)
firstSpawn = false
Skin.firstSpawn = false
end
end)
end)
RegisterNetEvent("esx:playerLoaded")
AddEventHandler("esx:playerLoaded", function()
RegisterNetEvent("esx:playerLoaded", function(_, _, skin)
ESX.PlayerLoaded = true
TriggerServerEvent("esx_skin:setWeight", skin)
end)
RegisterNetEvent("esx_skin:openMenu", function(submitCb, cancelCb)
Menu:Open(submitCb, cancelCb, nil)
end)
RegisterNetEvent("esx_skin:openRestrictedMenu", function(submitCb, cancelCb, restrict)
Menu:Open(submitCb, cancelCb, nil)
end)
RegisterNetEvent("esx_skin:openSaveableMenu", function(submitCb, cancelCb)
Menu:Saveable(submitCb, cancelCb, nil)
end)
RegisterNetEvent("esx_skin:openSaveableRestrictedMenu", function(submitCb, cancelCb, restrict)
Menu:Saveable(submitCb, cancelCb, restrict)
end)
AddEventHandler("esx_skin:getLastSkin", function(cb)
cb(lastSkin)
cb(Skin.Last)
end)
AddEventHandler("esx_skin:setLastSkin", function(skin)
lastSkin = skin
end)
RegisterNetEvent("esx_skin:openMenu")
AddEventHandler("esx_skin:openMenu", function(submitCb, cancelCb)
OpenMenu(submitCb, cancelCb, nil)
end)
RegisterNetEvent("esx_skin:openRestrictedMenu")
AddEventHandler("esx_skin:openRestrictedMenu", function(submitCb, cancelCb, restrict)
OpenMenu(submitCb, cancelCb, restrict)
end)
RegisterNetEvent("esx_skin:openSaveableMenu")
AddEventHandler("esx_skin:openSaveableMenu", function(submitCb, cancelCb)
OpenSaveableMenu(submitCb, cancelCb, nil)
end)
RegisterNetEvent("esx_skin:openSaveableRestrictedMenu")
AddEventHandler("esx_skin:openSaveableRestrictedMenu", function(submitCb, cancelCb, restrict)
OpenSaveableMenu(submitCb, cancelCb, restrict)
end)
RegisterNetEvent("esx_skin:requestSaveSkin")
AddEventHandler("esx_skin:requestSaveSkin", function()
TriggerEvent("skinchanger:getSkin", function(skin)
TriggerServerEvent("esx_skin:responseSaveSkin", skin)
end)
end)
Skin.Last = skin
end)
+83
View File
@@ -0,0 +1,83 @@
Camera = {}
Camera._index = Camera
function Camera:AngleLoop()
CreateThread(function()
local angle = 90
while self.cam do
if IsDisabledControlPressed(0, 44) then
angle = angle - 1
elseif IsDisabledControlPressed(0, 38) then
angle = angle + 1
end
if angle > 360 then
angle = angle - 360
elseif angle < 0 then
angle = angle + 360
end
Skin.heading = angle + 0.0
Wait(0)
end
end)
end
function Camera:DisableContols()
local controls = {30, 31, 32, 33, 34, 35, 25, 24}
for i=1 , #controls do
DisableControlAction(2, controls[i], true)
end
end
function Camera:PositionLoop()
CreateThread(function()
while self.cam do
self:DisableContols()
local ped = ESX.PlayerData.ped or PlayerPedId()
local coords = GetEntityCoords(ped)
local pos, posToLook = Skin:CalcuatePosition(coords)
SetCamCoord(self.cam, pos.x, pos.y, coords.z + Skin.camOffset)
PointCamAtCoord(self.cam, posToLook.x, posToLook.y, coords.z + Skin.camOffset)
Wait(0)
end
end)
end
function Camera:StartLoops()
ESX.TextUI(Translate('use_rotate_view', "Q", "E"))
self:AngleLoop()
self:PositionLoop()
end
function Camera:Create()
if self.cam then
return
end
local playerPed = ESX.PlayerData.ped or PlayerPedId()
local playerCoords = GetEntityCoords(playerPed)
self.cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true)
SetCamCoord(self.cam, playerCoords.x, playerCoords.y, playerCoords.z + 1.0)
SetCamRot(self.cam, 0.0, 0.0, 270.0, 2)
SetEntityHeading(playerPed, 0.0)
SetCamActive(self.cam, true)
RenderScriptCams(true, true, 500, true, true)
self:StartLoops()
end
function Camera:Destroy()
if not self.cam then
return
end
RenderScriptCams(false, true, 500, true, true)
DestroyCam(self.cam, true)
self.cam = nil
end
+144
View File
@@ -0,0 +1,144 @@
Menu = {}
Menu._index = Menu
function Menu:ESXMenu()
ESX.UI.Menu.Open("default", GetCurrentResourceName(), "skin", {
title = TranslateCap("skin_menu"),
align = "bottom-left",
elements = self.elements,
}, function(data, menu)
self:Submit(data, menu)
end, function(data, menu)
self:Cancel(data, menu)
end, function(data, menu)
self:Change(data, menu)
end, function()
self:Close()
end)
end
function Menu:Restrict()
local _components = {}
for i = 1, #self.components, 1 do
local found = false
for j = 1, #self.restricted, 1 do
if self.components[i].name == self.restricted[j] then
found = true
end
end
if found then
_components[#_components + 1] = self.components[i]
end
end
end
function Menu:InsertElements()
local playerPed = ESX.PlayerData.ped or PlayerPedId()
for i = 1, #self.components, 1 do
local value = self.components[i].value
local componentId = self.components[i].componentId
if componentId == 0 then
value = GetPedPropIndex(playerPed, self.components[i].componentId)
end
local data = self.components[i]
data.value = value
data.type = "slider"
data.max = type(data.max) == "function" and data.max() or data.max
if not self.elements then
self.elements = {}
end
self.elements[#self.elements + 1] = data
end
end
function Menu:Submit(data, menu)
Skin.last = exports["skinchanger"]:GetSkin()
self.submitCb(data, menu)
Camera:Destroy()
end
function Menu:Cancel(data, menu)
menu.close()
Camera:Destroy()
TriggerEvent("skinchanger:loadSkin", Skin.last)
if self.cancelCb then
self.cancelCb(data, menu)
end
end
function Menu:Change(data, menu)
local skin = exports["skinchanger"]:GetSkin()
Skin.zoomOffset = data.current.zoomOffset
Skin.camOffset = data.current.camOffset
if skin[data.current.name] ~= data.current.value then
-- Change skin element
TriggerEvent("skinchanger:change", data.current.name, data.current.value)
local newData = {}
for i = 1, #self.elements, 1 do
local component = self.components[i]
newData.max = type(component.max) == "function" and component.max() or component.max
if self.elements[i].textureof ~= nil and data.current.name == self.elements[i].textureof then
newData.value = 0
end
menu.update({ name = self.elements[i].name }, newData)
end
self.elements = newData
menu.refresh()
end
end
---@diagnostic disable-next-line: duplicate-set-field
function Menu:Close()
Camera:Destroy()
end
function Menu:Open(submit, cancel, restrict)
self.submitCb = submit
self.cancelCb = cancel
self.restricted = restrict
Skin.last = exports["skinchanger"]:GetSkin()
self.components, self.maxValues = exports["skinchanger"]:GetData()
if restrict then
self.components = self:Restrict()
end
self:InsertElements()
self.zoomOffset = self.components[1].zoomOffset
self.camOffset = self.components[1].camOffset
Camera:Create()
self:ESXMenu()
end
function Menu:Saveable(submitCb, cancelCb, restrict)
Skin.last = exports["skinchanger"]:GetSkin()
self:Open(function(data, menu)
menu.close()
Camera:Destroy()
local skin = exports["skinchanger"]:GetSkin()
TriggerServerEvent("esx_skin:save", skin)
if submitCb ~= nil then
submitCb(data, menu)
end
end, cancelCb, restrict)
end
+8 -8
View File
@@ -5,21 +5,21 @@ description 'Allows players to customise their character\'s appearance'
version '1.10.10'
lua54 'yes'
shared_script '@es_extended/imports.lua'
shared_scripts {
'@es_extended/locale.lua',
'locales/*.lua',
'@es_extended/imports.lua',
'config.lua',
}
server_scripts {
'@oxmysql/lib/MySQL.lua',
'@es_extended/locale.lua',
'locales/*.lua',
'config.lua',
'server/main.lua'
}
client_scripts {
'@es_extended/locale.lua',
'locales/*.lua',
'config.lua',
'client/main.lua'
'client/main.lua',
'client/modules/*.lua'
}
dependencies {
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["da"] = {
["skin_menu"] = "Udseende Menu",
["use_rotate_view"] = "brug ~INPUT_FRONTEND_LS~ og ~INPUT_CHARACTER_WHEEL~ for at dreje kameraet.",
["use_rotate_view"] = "brug Q og E for at dreje kameraet.",
["skin"] = "skift udseende",
["saveskin"] = "gem udseende til en fil",
}
+2 -2
View File
@@ -1,6 +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.",
["use_rotate_view"] = "Drücke Q oder E um deine Ansicht zu ändern.",
["skin"] = "Aussehen ändern",
["saveskin"] = "Aussehen abspeichern",
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["en"] = {
["skin_menu"] = "Skin Menu",
["use_rotate_view"] = "use ~INPUT_FRONTEND_LS~ and ~INPUT_CHARACTER_WHEEL~ to rotate the view.",
["use_rotate_view"] = "use Q and E to rotate the view.",
["skin"] = "change skin",
["saveskin"] = "save skin to a file",
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["es"] = {
["skin_menu"] = "Menú de apariencia",
["use_rotate_view"] = "Utiliza ~INPUT_FRONTEND_LS~ y ~INPUT_CHARACTER_WHEEL~ para rotar la vista.",
["use_rotate_view"] = "Utiliza Q y E para rotar la vista.",
["skin"] = "Cambiar aspecto",
["saveskin"] = "Guarda tu aspecto actual",
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["fi"] = {
["skin_menu"] = "Ulkonäkö",
["use_rotate_view"] = "Paina ~INPUT_FRONTEND_LS~ tai ~INPUT_CHARACTER_WHEEL~ liikutaaksesi kameraa.",
["use_rotate_view"] = "Paina Q tai E liikutaaksesi kameraa.",
["skin"] = "Muokkaa ulkonäköä",
["saveskin"] = "Tallenna",
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["fr"] = {
["skin_menu"] = "menu de Skin",
["use_rotate_view"] = "utilisez ~INPUT_FRONTEND_LS~ et ~INPUT_CHARACTER_WHEEL~ pour tourner la vue.",
["use_rotate_view"] = "utilisez Q et E pour tourner la vue.",
["skin"] = "changer de skin",
["saveskin"] = "sauvegarder skin dans un fichier",
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["he"] = {
["skin_menu"] = "תפריט עור",
["use_rotate_view"] = "השתמש ~INPUT_FRONTEND_LS~ ו ~INPUT_CHARACTER_WHEEL~ כדי לסובב את התצוגה.",
["use_rotate_view"] = "השתמש Q ו E כדי לסובב את התצוגה.",
["skin"] = "שנה עור",
["saveskin"] = "שמור עור לקובץ",
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["hu"] = {
["skin_menu"] = "Kinézet Menü",
["use_rotate_view"] = "Használd ~INPUT_FRONTEND_LS~ vagy ~INPUT_CHARACTER_WHEEL~ gombokat a forgatáshoz",
["use_rotate_view"] = "Használd Q vagy E gombokat a forgatáshoz",
["skin"] = "kinézet változtatása",
["saveskin"] = "kinézet mentése fájlba",
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["it"] = {
["skin_menu"] = "Menu Skin",
["use_rotate_view"] = "usa ~INPUT_FRONTEND_LS~ e ~INPUT_CHARACTER_WHEEL~ per ruotare la visuale.",
["use_rotate_view"] = "usa Q e E per ruotare la visuale.",
["skin"] = "cambia skin",
["saveskin"] = "salvare la skin",
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["nl"] = {
["skin_menu"] = "Kleding Menu",
["use_rotate_view"] = "gebruik ~INPUT_FRONTEND_LS~ en ~INPUT_CHARACTER_WHEEL~ om de camera te draaien.",
["use_rotate_view"] = "gebruik Q en E om de camera te draaien.",
["skin"] = "verander outfit",
["saveskin"] = "sla outfit op in je kledingkast.",
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["pl"] = {
["skin_menu"] = "menu wyglądu",
["use_rotate_view"] = "użyj ~INPUT_FRONTEND_LS~ i ~INPUT_CHARACTER_WHEEL~ aby obrócić ekran.",
["use_rotate_view"] = "użyj Q i E aby obrócić ekran.",
["skin"] = "zmień wygląd",
["saveskin"] = "zapisz wygląd do pliku",
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["pt"] = {
["skin_menu"] = "Menu de Skin",
["use_rotate_view"] = "Usa ~INPUT_FRONTEND_LS~ e ~INPUT_CHARACTER_WHEEL~ para rodar a câmara.",
["use_rotate_view"] = "Usa Q e E para rodar a câmara.",
["skin"] = "alterar skin",
["saveskin"] = "salvar a skin num ficheiro",
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["sl"] = {
["skin_menu"] = "Oblacilni menu.",
["use_rotate_view"] = "Pritisni ~INPUT_FRONTEND_LS~ in ~INPUT_CHARACTER_WHEEL~ da se obracas s pogledom.",
["use_rotate_view"] = "Pritisni Q in E da se obracas s pogledom.",
["skin"] = "Zamenjaj Skin.",
["saveskin"] = "Shrani skin.",
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["sr"] = {
["skin_menu"] = "Skin Meni",
["use_rotate_view"] = "koristi ~INPUT_FRONTEND_LS~ i ~INPUT_CHARACTER_WHEEL~ da rotiras kameru.",
["use_rotate_view"] = "koristi Q i E da rotiras kameru.",
["skin"] = "promeni skin",
["saveskin"] = "sacuvaj skin u file",
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["sv"] = {
["skin_menu"] = "Skin Meny",
["use_rotate_view"] = "Använd ~INPUT_FRONTEND_LS~ och ~INPUT_CHARACTER_WHEEL~ för att rotera.",
["use_rotate_view"] = "Använd Q och E för att rotera.",
["skin"] = "Ända utseende",
["saveskin"] = "Spara",
}
+1 -1
View File
@@ -1,6 +1,6 @@
Locales["zh-cn"] = {
["skin_menu"] = "皮肤选单",
["use_rotate_view"] = "使用 ~INPUT_FRONTEND_LS~ 和 ~INPUT_CHARACTER_WHEEL~ 旋转镜头视角.",
["use_rotate_view"] = "使用 Q 和 E 旋转镜头视角.",
["skin"] = "更换皮肤数据",
["saveskin"] = "保存皮肤数据",
}
+2 -27
View File
@@ -1,5 +1,4 @@
RegisterServerEvent("esx_skin:save")
AddEventHandler("esx_skin:save", function(skin)
RegisterNetEvent("esx_skin:save", function(skin)
local xPlayer = ESX.GetPlayerFromId(source)
if not ESX.GetConfig().OxInventory then
@@ -19,8 +18,7 @@ AddEventHandler("esx_skin:save", function(skin)
})
end)
RegisterServerEvent("esx_skin:setWeight")
AddEventHandler("esx_skin:setWeight", function(skin)
RegisterServerEvent("esx_skin:setWeight", function(skin)
local xPlayer = ESX.GetPlayerFromId(source)
if not ESX.GetConfig().OxInventory then
@@ -35,25 +33,6 @@ AddEventHandler("esx_skin:setWeight", function(skin)
end
end)
RegisterServerEvent("esx_skin:responseSaveSkin")
AddEventHandler("esx_skin:responseSaveSkin", function(skin)
local xPlayer = ESX.GetPlayerFromId(source)
if xPlayer.getGroup() == "admin" then
print("[^3WARNING^7] /saveskin is a debug command and should not be used in production")
local path = GetResourcePath(GetCurrentResourceName())
local file = io.open(("%s/skins.txt"):format(path), "a")
if not file then
return
end
file:write(json.encode(skin) .. "\n\n")
file:flush()
file:close()
else
print(("[^2INFO^7] ^5%s^7 attempted saving skin to file"):format(xPlayer.getIdentifier()))
end
end)
ESX.RegisterServerCallback("esx_skin:getPlayerSkin", function(source, cb)
local xPlayer = ESX.GetPlayerFromId(source)
@@ -78,7 +57,3 @@ end)
ESX.RegisterCommand("skin", "admin", function(xPlayer)
xPlayer.triggerEvent("esx_skin:openSaveableMenu")
end, false, { help = TranslateCap("skin") })
ESX.RegisterCommand("skinsave", "admin", function(xPlayer)
xPlayer.triggerEvent("esx_skin:requestSaveSkin")
end, false, { help = TranslateCap("saveskin") })