mirror of
https://github.com/ND-Framework/ND_Core.git
synced 2026-08-17 22:06:02 +01:00
372 lines
11 KiB
Lua
372 lines
11 KiB
Lua
if not lib.table.contains(Config.compatibility, "esx") then return end
|
|
|
|
local itemNames
|
|
local registeredItems = {}
|
|
|
|
local function getAmmoFromWeapon(weapon)
|
|
if not weapon then return end
|
|
for item, data in pairs(exports.ox_inventory:Items()) do
|
|
if data.weapon and data.model and data.model:lower() == weapon:lower() then
|
|
return data.ammoname
|
|
end
|
|
end
|
|
end
|
|
|
|
local function createPlayerFunctions(self)
|
|
self.Accounts = {
|
|
Bank = self.bank,
|
|
Money = self.Cash,
|
|
Black = self.Cash
|
|
}
|
|
|
|
if self.jobInfo then
|
|
self.job = {
|
|
id = self.job,
|
|
name = self.job,
|
|
label = self.jobInfo.label,
|
|
grade = self.jobInfo.rank,
|
|
grade_name = self.jobInfo.rankName,
|
|
grade_label = self.jobInfo.rankName,
|
|
grade_salary = 0,
|
|
skin_male = {},
|
|
skin_female = {}
|
|
}
|
|
end
|
|
|
|
local ped = GetPlayerPed(self.source)
|
|
if DoesEntityExist(ped) then
|
|
self.coords = GetEntityCoords()
|
|
end
|
|
|
|
self.loadout = {}
|
|
self.maxWeight = 30000
|
|
self.money = self.Accounts.Money
|
|
self.sex = self.gender
|
|
self.firstName = self.firstname
|
|
self.lastName = self.lastname
|
|
self.dateofbirth = self.dob
|
|
self.height = 120
|
|
self.dead = self.getMetadata("dead")
|
|
|
|
function self.addAccountMoney(account, amount)
|
|
local amount = tonumber(amount)
|
|
if not amount or amount <= 0 or account ~= "bank" and account ~= "cash" then return end
|
|
self[account] += amount
|
|
if NDCore.players[self.source] then
|
|
self.triggerEvent("ND:updateMoney", self.cash, self.bank)
|
|
TriggerEvent("ND:moneyChange", self.source, account, amount, "add")
|
|
end
|
|
return true
|
|
end
|
|
|
|
function self.addInventoryItem(item, count)
|
|
exports.ox_inventory:AddItem(self.source, item, count)
|
|
end
|
|
|
|
function self.addMoney(amount)
|
|
local amount = tonumber(amount)
|
|
if not amount or amount <= 0 then return end
|
|
self["bank"] += amount
|
|
if NDCore.players[self.source] then
|
|
self.triggerEvent("ND:updateMoney", self.cash, self.bank)
|
|
TriggerEvent("ND:moneyChange", self.source, "bank", amount, "add", reason)
|
|
end
|
|
return true
|
|
end
|
|
|
|
function self.addWeaponAmmo(weaponName, ammoCount)
|
|
local ammoName = getAmmoFromWeapon(weaponName)
|
|
if not ammoName then return end
|
|
self.addInventoryItem(ammoName, ammoCount)
|
|
end
|
|
|
|
function self.addWeapon(weaponName, ammo)
|
|
local name = nil
|
|
if weaponName:find("weapon") then
|
|
name = weaponName
|
|
else
|
|
name = ("weapon_%s"):format(weaponName)
|
|
end
|
|
self.addInventoryItem(name, 1)
|
|
self.addWeaponAmmo(name, ammo)
|
|
|
|
-- local weapon = GetHashKey(name)
|
|
-- local ped = GetPlayerPed(self.source)
|
|
-- GiveWeaponToPed(ped, weapon, ammo, false, false)
|
|
end
|
|
|
|
function self.addWeaponComponent(_, component)
|
|
self.addInventoryItem(component, 1)
|
|
end
|
|
|
|
function self.canCarryItem(item, count)
|
|
return exports.ox_inventory:CanCarryItem(self.source, item, count)
|
|
end
|
|
|
|
function self.canSwapItem(firstItem, firstItemCount, testItem, testItemCount)
|
|
exports.ox_inventory:CanSwapItem(self.source, firstItem, firstItemCount, testItem, testItemCount)
|
|
end
|
|
|
|
function self.clearMeta(index)
|
|
self.setMetadata(index, nil)
|
|
end
|
|
|
|
function self.getMeta(index, subIndex)
|
|
local meta = self.getMetadata(index)
|
|
if type(meta) == "table" then
|
|
return meta[subIndex]
|
|
end
|
|
return meta
|
|
end
|
|
|
|
function self.getCoords(useVector)
|
|
local ped = GetPlayerPed(self.source)
|
|
local coords = GetEntityCoords(ped)
|
|
if useVector then
|
|
return coords
|
|
end
|
|
return {
|
|
x = coords.x,
|
|
y = coords.y,
|
|
z = coords.z
|
|
}
|
|
end
|
|
|
|
function self.getIdentifier()
|
|
return self.identifier
|
|
end
|
|
|
|
function self.getInventory(minimal)
|
|
local playerItems = exports.ox_inventory:GetInventoryItems(self.source)
|
|
if not minimal then
|
|
return playerItems
|
|
end
|
|
-- minimal stuff
|
|
end
|
|
|
|
function self.getInventoryItem(item)
|
|
local playerItems = exports.ox_inventory:GetInventoryItems(self.source)
|
|
for name, data in pairs(playerItems) do
|
|
if name == item then
|
|
return data
|
|
end
|
|
end
|
|
end
|
|
|
|
function self.getMoney()
|
|
return self.bank
|
|
end
|
|
|
|
function self.getName()
|
|
return self.fullname
|
|
end
|
|
|
|
function self.hasItem(item, metadata)
|
|
return exports.ox_inventory:GetItem(self.source, item, metadata)
|
|
end
|
|
|
|
function self.removeInventoryItem(item, count)
|
|
exports.ox_inventory:RemoveItem(self.source, item, count)
|
|
end
|
|
|
|
function self.removeMoney(amount)
|
|
self.deductMoney("bank", amount)
|
|
end
|
|
|
|
function setMoney(amount)
|
|
self.setData("bank", amount)
|
|
end
|
|
|
|
self.kick = self.drop
|
|
self.removeAccountMoney = self.deductMoney
|
|
self.setMeta = self.setMetadata
|
|
self.setAccountMoney = self.setData
|
|
self.setInventoryItem = self.addInventoryItem
|
|
|
|
|
|
-- self.getAccount(account)
|
|
-- self.getAccounts()
|
|
-- self.getGroup()
|
|
-- self.getJob()
|
|
-- self.getLoadout()
|
|
-- self.getMissingAccounts(cb)
|
|
-- self.getWeapon(weaponName)
|
|
-- self.getWeaponTint(weaponName, weaponTintIndex)
|
|
-- self.getWeight()
|
|
-- self.hasWeapon(weaponName)
|
|
-- self.hasWeaponComponent(weaponName, weaponComponent)
|
|
-- self.removeWeapon(weaponName)
|
|
-- self.removeWeaponAmmo(weaponName, ammoCount)
|
|
-- self.removeWeaponComponent(weaponName, weaponComponent)
|
|
-- self.setMaxWeight(newWeight)
|
|
-- self.setName(newName)
|
|
-- self.setWeaponTint(weaponName, weaponTintIndex)
|
|
-- self.showAdvancedNotification(sender, subject, msg, textureDict, iconType, flash, saveToBrief, hudColorIndex)
|
|
-- self.showHelpNotification(msg, thisFrame, beep, duration)
|
|
-- self.showNotification(msg, flash, saveToBrief, hudColorIndex)
|
|
|
|
return self
|
|
end
|
|
|
|
NDCore.OneSync = {}
|
|
NDCore.RegisterServerCallback = lib.callback.register
|
|
NDCore.SetTimeout = SetTimeout
|
|
NDCore.Trace = Citizen.Trace
|
|
|
|
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.ClearTimeout()
|
|
print("[^3WARNING^7] ESX Function 'ClearTimeout' is not compatible with NDCore!")
|
|
end
|
|
|
|
function NDCore.CreatePickup()
|
|
print("[^3WARNING^7] ESX Function 'CreatePickup' is not compatible with NDCore!")
|
|
end
|
|
|
|
function NDCore.DiscordLog()
|
|
print("[^3WARNING^7] ESX Function 'DiscordLog' is not compatible with NDCore!")
|
|
end
|
|
|
|
function NDCore.DiscordLogFields()
|
|
print("[^3WARNING^7] ESX Function 'DiscordLogFields' is not compatible with NDCore!")
|
|
end
|
|
|
|
function NDCore.RegisterUsableItem()
|
|
print("[^3WARNING^7] ESX Function 'RegisterUsableItem' is not compatible with NDCore!")
|
|
end
|
|
|
|
function NDCore.UseItem()
|
|
print("[^3WARNING^7] ESX Function 'UseItem' is not compatible with NDCore!")
|
|
end
|
|
|
|
|
|
function NDCore.GetPlayerFromId(src)
|
|
return createPlayerFunctions(NDCore.getPlayer(src))
|
|
end
|
|
|
|
function NDCore.GetExtendedPlayers(key, value)
|
|
local players = {}
|
|
if not key or not value then
|
|
for _, info in pairs(NDCore.players) do
|
|
players[#players+1] = createPlayerFunctions(info)
|
|
end
|
|
return players
|
|
end
|
|
|
|
local keyTypes = {id = "id", firstname = "firstname", lastname = "lastname", gender = "gender", groups = "groups"}
|
|
local findBy = keyTypes[key] or "metadata"
|
|
if findBy then
|
|
for _, info in pairs(NDCore.players) do
|
|
if findBy == "metadata" and info["metadata"][key] == value or info[findBy] == value then
|
|
players[#players+1] = createPlayerFunctions(info)
|
|
end
|
|
end
|
|
end
|
|
return players
|
|
end
|
|
|
|
NDCore.GetPlayers = NDCore.GetExtendedPlayers
|
|
|
|
function NDCore.RegisterCommand(name, perms, cb, allowConsole, suggestion)
|
|
lib.addCommand(name, {
|
|
help = suggestion.help,
|
|
params = suggestion.arguments,
|
|
restricted = perms and ("group.%s"):format(perms)
|
|
}, function(source, args, raw)
|
|
if allowConsole and source == 0 then
|
|
return print("[^3WARNING^7] ^5Command Cannot be executed from console")
|
|
end
|
|
local player = NDCore.getPlayer(source)
|
|
cb(player, args, function(msg)
|
|
if source == 0 then
|
|
return print(("[^3WARNING^7] %s^7"):format(msg))
|
|
end
|
|
player.showNotification(msg)
|
|
end)
|
|
end)
|
|
end
|
|
|
|
function NDCore.DoesJobExist(job, grade)
|
|
local groupInfo = Config.groups[job]
|
|
if groupInfo and groupInfo.ranks[grade] then
|
|
return true
|
|
end
|
|
end
|
|
|
|
function NDCore.GetItemLabel(item)
|
|
if not itemNames then
|
|
itemNames = {}
|
|
for item, data in pairs(exports.ox_inventory:Items()) do
|
|
itemNames[item] = data.label
|
|
end
|
|
end
|
|
return itemNames[item]
|
|
end
|
|
|
|
function NDCore.GetJobs()
|
|
return Config.groups
|
|
end
|
|
|
|
function NDCore.GetPlayerFromIdentifier(identifier)
|
|
for _, info in pairs(NDCore.players) do
|
|
if info.identifier:find(identifier) then
|
|
return info
|
|
end
|
|
end
|
|
end
|
|
|
|
function NDCore.OneSync.SpawnObject(model, coords, heading, cb)
|
|
local entity = CreateObject(model, coords.x, coords.y, coords.z, true, false, false)
|
|
local value = lib.waitFor(function()
|
|
if DoesEntityExist(entity) then return entity end
|
|
end, "Failed to spawn object", 5000)
|
|
if not value then return end
|
|
SetEntityHeading(value, heading)
|
|
if not cb then return end
|
|
cb(value)
|
|
end
|
|
|
|
function NDCore.OneSync.SpawnPed(model, coords, heading, cb)
|
|
local entity = CreatePed(0, model, coords.x, coords.y, coords.z, heading, true, false)
|
|
local value = lib.waitFor(function()
|
|
if DoesEntityExist(entity) then return entity end
|
|
end, "Failed to spawn ped", 5000)
|
|
if not value or not cb then return end
|
|
cb(NetworkGetNetworkIdFromEntity(value))
|
|
end
|
|
|
|
function NDCore.OneSync.SpawnVehicle(model, coords, heading, properties, cb)
|
|
local vehicle = NDCore.createVehicle({
|
|
model = model,
|
|
coords = coords,
|
|
heading = heading
|
|
})
|
|
if not cb then return end
|
|
cb(vehicle.netId)
|
|
end
|
|
|
|
function NDCore.OneSync.SpawnPedInVehicle(model, vehicle, seat, cb)
|
|
local entity = CreatePedInsideVehicle(vehicle, 0, model, seat, true, false)
|
|
local value = lib.waitFor(function()
|
|
if DoesEntityExist(entity) then return entity end
|
|
end, "Failed to spawn ped", 5000)
|
|
if not value or not cb then return end
|
|
cb(value)
|
|
end
|
|
|
|
AddEventHandler("ND:characterUnloaded", function(src, character)
|
|
TriggerEvent("esx:playerDropped", src, "")
|
|
end)
|
|
|
|
AddEventHandler("ND:characterLoaded", function(character)
|
|
TriggerEvent("esx:playerLoaded", character.source, createPlayerFunctions(character))
|
|
end)
|