mirror of
https://github.com/ND-Framework/ND_Core.git
synced 2026-08-17 05:56:01 +01:00
413 lines
12 KiB
Lua
413 lines
12 KiB
Lua
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 = {}
|
|
NDCore.PlayerData = {}
|
|
|
|
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()
|
|
if not player then return {} end
|
|
|
|
player.Accounts = {
|
|
Bank = player.bank,
|
|
Money = player.Cash,
|
|
Black = player.Cash
|
|
}
|
|
|
|
if player.jobInfo then
|
|
player.job = {
|
|
id = player.job,
|
|
name = player.job,
|
|
label = player.jobInfo.label,
|
|
grade = player.jobInfo.rank,
|
|
grade_name = player.jobInfo.rankName,
|
|
grade_label = player.jobInfo.rankName,
|
|
grade_salary = 0,
|
|
skin_male = {},
|
|
skin_female = {}
|
|
}
|
|
end
|
|
|
|
player.coords = GetEntityCoords(cache.ped)
|
|
player.loadout = {}
|
|
player.maxWeight = GetResourceState("ox_inventory") == "started" and exports.ox_inventory:GetPlayerMaxWeight() or 0
|
|
player.money = player.Accounts.Money
|
|
player.sex = player.gender
|
|
player.firstName = player.firstname
|
|
player.lastName = player.lastname
|
|
player.dateofbirth = player.dob
|
|
player.height = 120
|
|
player.dead = LocalPlayer.state.dead or false
|
|
NDCore.PlayerData = player
|
|
|
|
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 = GetResourceState("ox_inventory") == "started" and exports.ox_inventory:Search(item) or 0
|
|
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()
|
|
return GetResourceState("ox_inventory") == "started" and 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) then return 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) then return 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) then return 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) then return 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
|
|
|
|
AddEventHandler("ND:characterLoaded", function()
|
|
NDCore.GetPlayerData()
|
|
end)
|
|
|
|
AddEventHandler("ND:updateCharacter", function()
|
|
NDCore.GetPlayerData()
|
|
end)
|