From f48ea5b4f37a033a5df20ee20ebe6b06efa433d8 Mon Sep 17 00:00:00 2001 From: Andyyy7666 <86536434+Andyyy7666@users.noreply.github.com> Date: Sat, 11 Nov 2023 03:02:19 +0100 Subject: [PATCH] feat: esx client compatibility --- compatibility/esx/client.lua | 384 +++++++++++++++++++++++++++++++++++ 1 file changed, 384 insertions(+) diff --git a/compatibility/esx/client.lua b/compatibility/esx/client.lua index a2bb939..62b667e 100644 --- a/compatibility/esx/client.lua +++ b/compatibility/esx/client.lua @@ -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