mirror of
https://github.com/ND-Framework/ND_Core.git
synced 2026-08-17 05:56:01 +01:00
feat: esx client compatibility
This commit is contained in:
@@ -1,2 +1,386 @@
|
||||
if not lib.table.contains(Config.compatibility, "esx") then return end
|
||||
|
||||
NDCore.Game = {}
|
||||
NDCore.Game.Utils = {}
|
||||
NDCore.Scaleform = {}
|
||||
NDCore.Scaleform.Utils = {}
|
||||
NDCore.Streaming = {}
|
||||
NDCore.UI = {}
|
||||
NDCore.UI.HUD = {}
|
||||
NDCore.UI.Menu = {}
|
||||
|
||||
local uiMetatable = {
|
||||
__index = function(table, key)
|
||||
if type(key) == "string" and key:match("^%a+$") then
|
||||
return function()
|
||||
print(("[^3WARNING^7] ESX Function '%s' is not compatible with NDCore!"):format(key))
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
setmetatable(NDCore.UI, uiMetatable)
|
||||
setmetatable(NDCore.UI.HUD, uiMetatable)
|
||||
setmetatable(NDCore.UI.Menu, uiMetatable)
|
||||
|
||||
local function exportHandler(resource, exportName, cb)
|
||||
AddEventHandler(("__cfx_export_%s_%s"):format(resource, exportName), function(setCB)
|
||||
setCB(cb)
|
||||
end)
|
||||
end
|
||||
|
||||
exportHandler("es_extended", "getSharedObject", function()
|
||||
return NDCore
|
||||
end)
|
||||
|
||||
function NDCore.GetPlayerData()
|
||||
local player = NDCore.getPlayer()
|
||||
|
||||
player.Accounts = {
|
||||
Bank = player.bank,
|
||||
Money = player.Cash,
|
||||
Black = player.Cash
|
||||
}
|
||||
|
||||
-- add more here
|
||||
|
||||
return player
|
||||
end
|
||||
|
||||
function NDCore.IsPlayerLoaded()
|
||||
return NDCore.getPlayer() ~= nil
|
||||
end
|
||||
|
||||
function NDCore.Progressbar(message, lenght, options)
|
||||
local newOptions = {
|
||||
duration = lenght,
|
||||
label = message,
|
||||
canCancel = true
|
||||
}
|
||||
|
||||
if options.animation then
|
||||
newOptions.anim = {}
|
||||
if options.animation.type == "anim" then
|
||||
if options.animation.dict then
|
||||
newOptions.anim.dict = options.animation.dict,
|
||||
end
|
||||
if options.animation.lib then
|
||||
newOptions.anim.clip = options.animation.lib
|
||||
end
|
||||
elseif options.animation.type == "Scenario" then
|
||||
newOptions.anim.scenario = options.animation.Scenario
|
||||
end
|
||||
end
|
||||
|
||||
if options.FreezePlayer then FreezeEntityPosition(cache.ped, true) end
|
||||
local complete = lib.progressBar(newOptions)
|
||||
|
||||
if options.FreezePlayer then FreezeEntityPosition(cache.ped, false) end
|
||||
if newOptions.onFinish and complete then
|
||||
newOptions.onFinish()
|
||||
end
|
||||
if newOptions.onCancel and not complete then
|
||||
newOptions.onCancel()
|
||||
end
|
||||
return complete
|
||||
end
|
||||
|
||||
function NDCore.SearchInventory(item, count)
|
||||
local itemCount = exports.ox_inventory:Search(item)
|
||||
return itemCount >= count and itemCount
|
||||
end
|
||||
|
||||
function NDCore.SetPlayerData()
|
||||
print("[^3WARNING^7] ESX Function 'SetPlayerData' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.ShowAdvancedNotification()
|
||||
print("[^3WARNING^7] ESX Function 'ShowAdvancedNotification' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.ShowFloatingHelpNotification()
|
||||
print("[^3WARNING^7] ESX Function 'ShowFloatingHelpNotification' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.ShowHelpNotification()
|
||||
print("[^3WARNING^7] ESX Function 'ShowHelpNotification' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.ShowInventory()
|
||||
exports.ox_inventory:openInventory("player", cache.serverId)
|
||||
end
|
||||
|
||||
function NDCore.ShowNotification(msg, type, time)
|
||||
NDCore.notify({
|
||||
title = "Notification",
|
||||
description = msg,
|
||||
type = type == "info" and "inform" or type,
|
||||
duration = time
|
||||
})
|
||||
end
|
||||
|
||||
function NDCore.TriggerServerCallback(name, cb, ...)
|
||||
lib.callback(name, nil, cb, ...)
|
||||
end
|
||||
|
||||
function NDCore.Streaming.RequestAnimDict(animDict, cb)
|
||||
lib.requestAnimDict(animDict)
|
||||
if cb then cb(animDict) end
|
||||
return animDict
|
||||
end
|
||||
|
||||
function NDCore.Streaming.RequestAnimSet(animSet, cb)
|
||||
lib.requestAnimSet(animSet)
|
||||
if cb then cb(animSet) end
|
||||
return animSet
|
||||
end
|
||||
|
||||
function NDCore.Streaming.RequestModel(model, cb)
|
||||
lib.requestModel(model)
|
||||
if cb then cb(model) end
|
||||
return model
|
||||
end
|
||||
|
||||
function NDCore.Streaming.RequestNamedPtfxAsset(assetName, cb)
|
||||
lib.requestNamedPtfxAsset(assetName)
|
||||
if cb then cb(assetName) end
|
||||
return assetName
|
||||
end
|
||||
|
||||
function NDCore.Streaming.RequestStreamedTextureDict(textureDict, cb)
|
||||
lib.requestStreamedTextureDict(textureDict)
|
||||
if cb then cb(textureDict) end
|
||||
return textureDict
|
||||
end
|
||||
|
||||
function NDCore.Streaming.RequestWeaponAsset(weaponHash, cb)
|
||||
lib.requestWeaponAsset(weaponHash)
|
||||
if cb then cb(weaponHash) end
|
||||
return weaponHash
|
||||
end
|
||||
|
||||
function NDCore.Scaleform.ShowBreakingNews()
|
||||
print("[^3WARNING^7] ESX Function 'Scaleform.ShowBreakingNews' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.Scaleform.ShowFreemodeMessage()
|
||||
print("[^3WARNING^7] ESX Function 'Scaleform.ShowFreemodeMessage' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.Scaleform.ShowPopupWarning()
|
||||
print("[^3WARNING^7] ESX Function 'Scaleform.ShowPopupWarning' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.Scaleform.ShowTrafficMovie()
|
||||
print("[^3WARNING^7] ESX Function 'Scaleform.ShowTrafficMovie' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.Scaleform.Utils.RequestScaleformMovie()
|
||||
print("[^3WARNING^7] ESX Function 'Scaleform.Utils.RequestScaleformMovie' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.Game.Utils.DrawText3D(coords, text, size, font)
|
||||
local onScreen, x, y = World3dToScreen2d(coords.x, coords.y, coords.z)
|
||||
if not onScreen then return end
|
||||
SetTextScale(size or 0.4, size or 0.4)
|
||||
SetTextFont(font or 4)
|
||||
SetTextProportional(1)
|
||||
SetTextEntry("STRING")
|
||||
SetTextCentre(true)
|
||||
SetTextColour(255, 255, 255, 255)
|
||||
SetTextOutline()
|
||||
AddTextComponentString(text)
|
||||
DrawText(x, y)
|
||||
end
|
||||
|
||||
function NDCore.Game.DeleteObject(object)
|
||||
if not DoesEntityExist(object) then return end
|
||||
DeleteEntity(object)
|
||||
end
|
||||
|
||||
function NDCore.Game.DeleteVehicle(vehicle)
|
||||
if not DoesEntityExist(vehicle) then return end
|
||||
DeleteEntity(vehicle)
|
||||
end
|
||||
|
||||
function NDCore.Game.GetClosestEntity(coords)
|
||||
coords = coords or GetEntityCoords(cache.ped)
|
||||
local loc = vec3(coords.x, coords.y, coords.z)
|
||||
local entities = {lib.getClosestObject(loc), lib.getClosestPed(loc), lib.getClosestVehicle(loc)}
|
||||
local closest = nil
|
||||
local closestDistance = math.huge
|
||||
|
||||
for i = 1, #entities do
|
||||
local ent = entities[i]
|
||||
if DoesEntityExist(ent.object or ent.ped or ent.vehicle) then
|
||||
local distance = #(loc-ent.coords)
|
||||
if distance < closestDistance then
|
||||
closest = ent
|
||||
closestDistance = distance
|
||||
end
|
||||
end
|
||||
end
|
||||
return closest.object or closest.ped or closest.vehicle
|
||||
end
|
||||
|
||||
function NDCore.Game.GetClosestObject(coords)
|
||||
coords = coords or GetEntityCoords(cache.ped)
|
||||
local loc = vec3(coords.x, coords.y, coords.z)
|
||||
return lib.getClosestObject(loc).object
|
||||
end
|
||||
|
||||
function NDCore.Game.GetClosestPed(coords)
|
||||
coords = coords or GetEntityCoords(cache.ped)
|
||||
local loc = vec3(coords.x, coords.y, coords.z)
|
||||
return lib.getClosestPed(loc).ped
|
||||
end
|
||||
|
||||
function NDCore.Game.GetClosestPlayer(coords)
|
||||
coords = coords or GetEntityCoords(cache.ped)
|
||||
local loc = vec3(coords.x, coords.y, coords.z)
|
||||
local ply = lib.getClosestPlayer(loc)
|
||||
return ply.playerId, #(ply.playerCoords-loc)
|
||||
end
|
||||
|
||||
function NDCore.Game.GetClosestVehicle(coords)
|
||||
coords = coords or GetEntityCoords(cache.ped)
|
||||
local loc = vec3(coords.x, coords.y, coords.z)
|
||||
return lib.getClosestVehicle(loc).vehicle
|
||||
end
|
||||
|
||||
function NDCore.Game.GetObjects()
|
||||
return GetGamePool("CObject")
|
||||
end
|
||||
|
||||
function NDCore.Game.GetPedMugshot()
|
||||
print("[^3WARNING^7] ESX Function 'Game.GetPedMugshot' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.Game.GetPeds(onlyOtherPeds)
|
||||
local peds = GetGamePool("CPed")
|
||||
if onlyOtherPeds then
|
||||
for i=1, #peds do
|
||||
if peds[i] == cache.ped then
|
||||
table.remove(peds, i)
|
||||
end
|
||||
end
|
||||
end
|
||||
return peds
|
||||
end
|
||||
|
||||
function NDCore.Game.GetPlayers()
|
||||
print("[^3WARNING^7] ESX Function 'Game.GetPlayers' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.Game.GetPlayersInArea()
|
||||
print("[^3WARNING^7] ESX Function 'Game.GetPlayersInArea' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.Game.GetPlayersInArea()
|
||||
print("[^3WARNING^7] ESX Function 'Game.GetPlayersInArea' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.Game.GetVehicleInDirection()
|
||||
print("[^3WARNING^7] ESX Function 'Game.GetVehicleInDirection' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.Game.GetVehicleProperties(vehicle)
|
||||
return lib.getVehicleProperties(vehicle)
|
||||
end
|
||||
|
||||
function NDCore.Game.GetVehicles()
|
||||
return GetGamePool("CVehicle")
|
||||
end
|
||||
|
||||
function NDCore.Game.GetVehiclesInArea()
|
||||
print("[^3WARNING^7] ESX Function 'Game.GetVehiclesInArea' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.Game.IsSpawnPointClear()
|
||||
print("[^3WARNING^7] ESX Function 'Game.IsSpawnPointClear' is not compatible with NDCore!")
|
||||
end
|
||||
|
||||
function NDCore.Game.IsVehicleEmpty(vehicle)
|
||||
for i=-1, 6 do
|
||||
if not IsVehicleSeatFree(vehicle, i) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function NDCore.Game.SetVehicleProperties(vehicle, props)
|
||||
lib.setVehicleProperties(vehicle, props)
|
||||
end
|
||||
|
||||
function NDCore.Game.SpawnLocalObject(model, coords, cb)
|
||||
if type(model) == "string" then
|
||||
model = GetHashKey(model)
|
||||
end
|
||||
local entity = CreateObject(model, coords.x, coords.y, coords.z, false, false, false)
|
||||
entity = lib.waitFor(function()
|
||||
if DoesEntityExist(entity) end
|
||||
end)
|
||||
if cb then
|
||||
cb(entity)
|
||||
end
|
||||
return entity
|
||||
end
|
||||
|
||||
function NDCore.Game.SpawnLocalVehicle(model, coords, heading, cb)
|
||||
if type(model) == "string" then
|
||||
model = GetHashKey(model)
|
||||
end
|
||||
local entity = CreateVehicle(model, coords.x, coords.y, coords.z, heading, false, false, false)
|
||||
entity = lib.waitFor(function()
|
||||
if DoesEntityExist(entity) end
|
||||
end)
|
||||
if cb then
|
||||
cb(entity)
|
||||
end
|
||||
return entity
|
||||
end
|
||||
|
||||
function NDCore.Game.SpawnObject(model, coords, cb)
|
||||
if type(model) == "string" then
|
||||
model = GetHashKey(model)
|
||||
end
|
||||
local entity = CreateObject(model, coords.x, coords.y, coords.z, true, false, false)
|
||||
entity = lib.waitFor(function()
|
||||
if DoesEntityExist(entity) end
|
||||
end)
|
||||
if cb then
|
||||
cb(entity)
|
||||
end
|
||||
return entity
|
||||
end
|
||||
|
||||
function NDCore.Game.SpawnVehicle(model, coords, heading, cb)
|
||||
if type(model) == "string" then
|
||||
model = GetHashKey(model)
|
||||
end
|
||||
local entity = CreateVehicle(model, coords.x, coords.y, coords.z, heading, true, false, false)
|
||||
entity = lib.waitFor(function()
|
||||
if DoesEntityExist(entity) end
|
||||
end)
|
||||
if cb then
|
||||
cb(entity)
|
||||
end
|
||||
return entity
|
||||
end
|
||||
|
||||
function NDCore.Game.Teleport(entity, coords, cb)
|
||||
if DoesEntityExist(entity) then
|
||||
RequestCollisionAtCoord(coords.x, coords.y, coords.z)
|
||||
while not HasCollisionLoadedAroundEntity(entity) do
|
||||
Wait(0)
|
||||
end
|
||||
|
||||
SetEntityCoords(entity, coords.x, coords.y, coords.z, false, false, false, false)
|
||||
SetEntityHeading(entity, coords.w or coords.heading or 0.0)
|
||||
end
|
||||
|
||||
if cb then
|
||||
cb()
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user