mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-08-29 09:18:53 +00:00
1d83a1f2f4
Added flash and saveToBreif booleans to ESX.ShowNotification() and ESX.ShowHelpNotification() Added two optional booleans thisFrame, beep to ShowHelpNotification() and last new optional argument duration
544 lines
12 KiB
Lua
544 lines
12 KiB
Lua
function CreateExtendedPlayer(player, accounts, inventory, job, loadout, name, coords)
|
|
local self = {}
|
|
|
|
self.player = player
|
|
self.accounts = accounts
|
|
self.inventory = inventory
|
|
self.job = job
|
|
self.loadout = loadout
|
|
self.name = name
|
|
self.maxWeight = Config.MaxWeight
|
|
self.coords = coords
|
|
|
|
self.source = self.player.get('source')
|
|
self.identifier = self.player.get('identifier')
|
|
|
|
self.triggerEvent = function(eventName, ...)
|
|
TriggerClientEvent(eventName, self.source, ...)
|
|
end
|
|
|
|
self.setMoney = function(money)
|
|
money = ESX.Math.Round(money)
|
|
|
|
if money >= 0 then
|
|
self.player.setMoney(money)
|
|
end
|
|
end
|
|
|
|
self.getMoney = function()
|
|
return self.player.get('money')
|
|
end
|
|
|
|
self.setBankBalance = function(money)
|
|
money = ESX.Math.Round(money)
|
|
|
|
if money >= 0 then
|
|
self.player.setBankBalance(money)
|
|
end
|
|
end
|
|
|
|
self.getBank = function()
|
|
return self.player.get('bank')
|
|
end
|
|
|
|
self.setCoords = function(coords)
|
|
self.updateCoords(coords)
|
|
self.triggerEvent('esx:teleport', coords)
|
|
end
|
|
|
|
self.updateCoords = function(coords)
|
|
self.coords = {x = ESX.Math.Round(coords.x, 1), y = ESX.Math.Round(coords.y, 1), z = ESX.Math.Round(coords.z, 1), heading = ESX.Math.Round(coords.heading, 1)}
|
|
end
|
|
|
|
self.getCoords = function(vector)
|
|
if vector then
|
|
return vector3(self.coords.x, self.coords.y, self.coords.z)
|
|
else
|
|
return self.coords
|
|
end
|
|
end
|
|
|
|
self.kick = function(reason)
|
|
DropPlayer(self.source, reason)
|
|
end
|
|
|
|
self.addMoney = function(money)
|
|
money = ESX.Math.Round(money)
|
|
|
|
if money >= 0 then
|
|
self.player.addMoney(money)
|
|
end
|
|
end
|
|
|
|
self.removeMoney = function(money)
|
|
money = ESX.Math.Round(money)
|
|
|
|
if money > 0 then
|
|
self.player.removeMoney(money)
|
|
end
|
|
end
|
|
|
|
self.addBank = function(money)
|
|
money = ESX.Math.Round(money)
|
|
|
|
if money > 0 then
|
|
self.player.addBank(money)
|
|
end
|
|
end
|
|
|
|
self.removeBank = function(money)
|
|
money = ESX.Math.Round(money)
|
|
|
|
if money > 0 then
|
|
self.player.removeBank(money)
|
|
end
|
|
end
|
|
|
|
self.displayMoney = function(money)
|
|
self.player.displayMoney(money)
|
|
end
|
|
|
|
self.displayBank = function(money)
|
|
self.player.displayBank(money)
|
|
end
|
|
|
|
self.setSessionVar = function(key, value)
|
|
self.player.setSessionVar(key, value)
|
|
end
|
|
|
|
self.getSessionVar = function(k)
|
|
return self.player.getSessionVar(k)
|
|
end
|
|
|
|
self.getPermissions = function()
|
|
return self.player.getPermissions()
|
|
end
|
|
|
|
self.setPermissions = function(p)
|
|
self.player.setPermissions(p)
|
|
end
|
|
|
|
self.getIdentifier = function()
|
|
return self.player.getIdentifier()
|
|
end
|
|
|
|
self.getGroup = function()
|
|
return self.player.getGroup()
|
|
end
|
|
|
|
self.set = function(k, v)
|
|
self.player.set(k, v)
|
|
end
|
|
|
|
self.get = function(k)
|
|
return self.player.get(k)
|
|
end
|
|
|
|
self.getPlayer = function()
|
|
return self.player
|
|
end
|
|
|
|
self.getAccounts = function()
|
|
local accounts = {}
|
|
|
|
for k,v in ipairs(Config.Accounts) do
|
|
if v == 'bank' then
|
|
table.insert(accounts, {
|
|
name = 'bank',
|
|
money = self.get('bank'),
|
|
label = Config.AccountLabels.bank
|
|
})
|
|
else
|
|
for k2,v2 in ipairs(self.accounts) do
|
|
if v2.name == v then
|
|
table.insert(accounts, v2)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return accounts
|
|
end
|
|
|
|
self.getAccount = function(a)
|
|
if a == 'bank' then
|
|
return {
|
|
name = 'bank',
|
|
money = self.get('bank'),
|
|
label = Config.AccountLabels.bank
|
|
}
|
|
end
|
|
|
|
for k,v in ipairs(self.accounts) do
|
|
if v.name == a then
|
|
return v
|
|
end
|
|
end
|
|
end
|
|
|
|
self.getInventory = function()
|
|
return self.inventory
|
|
end
|
|
|
|
self.getJob = function()
|
|
return self.job
|
|
end
|
|
|
|
self.getLoadout = function()
|
|
return self.loadout
|
|
end
|
|
|
|
self.getName = function()
|
|
return self.name
|
|
end
|
|
|
|
self.setName = function(newName)
|
|
self.name = newName
|
|
end
|
|
|
|
self.getMissingAccounts = function(cb)
|
|
MySQL.Async.fetchAll('SELECT name FROM user_accounts WHERE identifier = @identifier', {
|
|
['@identifier'] = self.getIdentifier()
|
|
}, function(result)
|
|
local missingAccounts = {}
|
|
|
|
for k,v in ipairs(Config.Accounts) do
|
|
if v ~= 'bank' then
|
|
local found = false
|
|
|
|
for k2,v2 in ipairs(result) do
|
|
if v == v2.name then
|
|
found = true
|
|
break
|
|
end
|
|
end
|
|
|
|
if not found then
|
|
table.insert(missingAccounts, v)
|
|
end
|
|
end
|
|
end
|
|
|
|
cb(missingAccounts)
|
|
end)
|
|
end
|
|
|
|
self.createAccounts = function(missingAccounts, cb)
|
|
for k,v in ipairs(missingAccounts) do
|
|
MySQL.Async.execute('INSERT INTO user_accounts (identifier, name) VALUES (@identifier, @name)', {
|
|
['@identifier'] = self.getIdentifier(),
|
|
['@name'] = v
|
|
}, function(rowsChanged)
|
|
if cb then
|
|
cb()
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|
|
self.setAccountMoney = function(acc, money)
|
|
if money >= 0 then
|
|
local account = self.getAccount(acc)
|
|
|
|
if account then
|
|
local prevMoney = account.money
|
|
local newMoney = ESX.Math.Round(money)
|
|
|
|
account.money = newMoney
|
|
|
|
if acc == 'bank' then
|
|
self.set('bank', newMoney)
|
|
end
|
|
|
|
self.triggerEvent('esx:setAccountMoney', account)
|
|
end
|
|
end
|
|
end
|
|
|
|
self.addAccountMoney = function(acc, money)
|
|
if money > 0 then
|
|
local account = self.getAccount(acc)
|
|
|
|
if account then
|
|
local newMoney = account.money + ESX.Math.Round(money)
|
|
account.money = newMoney
|
|
|
|
if acc == 'bank' then
|
|
self.set('bank', newMoney)
|
|
end
|
|
|
|
self.triggerEvent('esx:setAccountMoney', account)
|
|
end
|
|
end
|
|
end
|
|
|
|
self.removeAccountMoney = function(acc, money)
|
|
if money > 0 then
|
|
local account = self.getAccount(acc)
|
|
|
|
if account then
|
|
local newMoney = account.money - ESX.Math.Round(money)
|
|
account.money = newMoney
|
|
|
|
if acc == 'bank' then
|
|
self.set('bank', newMoney)
|
|
end
|
|
|
|
self.triggerEvent('esx:setAccountMoney', account)
|
|
end
|
|
end
|
|
end
|
|
|
|
self.getInventoryItem = function(name)
|
|
for k,v in ipairs(self.inventory) do
|
|
if v.name == name then
|
|
return v
|
|
end
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
self.addInventoryItem = function(name, count)
|
|
local item = self.getInventoryItem(name)
|
|
|
|
if item then
|
|
local newCount = item.count + count
|
|
item.count = newCount
|
|
|
|
TriggerEvent('esx:onAddInventoryItem', self.source, item, count)
|
|
self.triggerEvent('esx:addInventoryItem', item, count)
|
|
end
|
|
end
|
|
|
|
self.removeInventoryItem = function(name, count)
|
|
local item = self.getInventoryItem(name)
|
|
|
|
if item then
|
|
local newCount = item.count - count
|
|
|
|
if newCount >= 0 then
|
|
item.count = newCount
|
|
|
|
TriggerEvent('esx:onRemoveInventoryItem', self.source, item, count)
|
|
self.triggerEvent('esx:removeInventoryItem', item, count)
|
|
end
|
|
end
|
|
end
|
|
|
|
self.setInventoryItem = function(name, count)
|
|
local item = self.getInventoryItem(name)
|
|
|
|
if item and count >= 0 then
|
|
local oldCount = item.count
|
|
item.count = count
|
|
|
|
if oldCount > item.count then
|
|
TriggerEvent('esx:onRemoveInventoryItem', self.source, item, oldCount - item.count)
|
|
self.triggerEvent('esx:removeInventoryItem', item, oldCount - item.count)
|
|
else
|
|
TriggerEvent('esx:onAddInventoryItem', self.source, item, item.count - oldCount)
|
|
self.triggerEvent('esx:addInventoryItem', item, item.count - oldCount)
|
|
end
|
|
end
|
|
end
|
|
|
|
self.getWeight = function()
|
|
local inventoryWeight = 0
|
|
|
|
for k,v in ipairs(self.inventory) do
|
|
inventoryWeight = inventoryWeight + (v.count * v.weight)
|
|
end
|
|
|
|
return inventoryWeight
|
|
end
|
|
|
|
self.canCarryItem = function(name, count)
|
|
local currentWeight, itemWeight = self.getWeight(), ESX.Items[name].weight
|
|
local newWeight = currentWeight + (itemWeight * count)
|
|
|
|
return newWeight <= self.maxWeight
|
|
end
|
|
|
|
self.canSwapItem = function(firstItem, firstItemCount, testItem, testItemCount)
|
|
local firstItemObject = self.getInventoryItem(firstItem)
|
|
local testItemObject = self.getInventoryItem(testItem)
|
|
|
|
if firstItemObject.count >= firstItemCount then
|
|
local weightWithoutFirstItem = ESX.Math.Round(self.getWeight() - (firstItemObject.weight * firstItemCount))
|
|
local weightWithTestItem = ESX.Math.Round(weightWithoutFirstItem + (testItemObject.weight * testItemCount))
|
|
|
|
return weightWithTestItem <= self.maxWeight
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
self.setMaxWeight = function(newWeight)
|
|
self.maxWeight = newWeight
|
|
self.triggerEvent('esx:setMaxWeight', self.maxWeight)
|
|
end
|
|
|
|
self.setJob = function(job, grade)
|
|
grade = tostring(grade)
|
|
local lastJob = json.decode(json.encode(self.job))
|
|
|
|
if ESX.DoesJobExist(job, grade) then
|
|
local jobObject, gradeObject = ESX.Jobs[job], ESX.Jobs[job].grades[grade]
|
|
|
|
self.job.id = jobObject.id
|
|
self.job.name = jobObject.name
|
|
self.job.label = jobObject.label
|
|
|
|
self.job.grade = tonumber(grade)
|
|
self.job.grade_name = gradeObject.name
|
|
self.job.grade_label = gradeObject.label
|
|
self.job.grade_salary = gradeObject.salary
|
|
|
|
self.job.skin_male = {}
|
|
self.job.skin_female = {}
|
|
|
|
if gradeObject.skin_male then
|
|
self.job.skin_male = json.decode(gradeObject.skin_male)
|
|
end
|
|
|
|
if gradeObject.skin_female then
|
|
self.job.skin_female = json.decode(gradeObject.skin_female)
|
|
end
|
|
|
|
TriggerEvent('esx:setJob', self.source, self.job, lastJob)
|
|
self.triggerEvent('esx:setJob', self.job)
|
|
else
|
|
print(('[es_extended] [^3WARNING^7] Ignoring invalid .setJob() usage for "%s"'):format(self.identifier))
|
|
end
|
|
end
|
|
|
|
self.addWeapon = function(weaponName, ammo)
|
|
local weaponLabel = ESX.GetWeaponLabel(weaponName)
|
|
|
|
if not self.hasWeapon(weaponName) then
|
|
table.insert(self.loadout, {
|
|
name = weaponName,
|
|
ammo = ammo,
|
|
label = weaponLabel,
|
|
components = {}
|
|
})
|
|
|
|
self.triggerEvent('esx:addWeapon', weaponName, ammo)
|
|
self.triggerEvent('esx:addInventoryItem', {label = weaponLabel}, 1)
|
|
end
|
|
end
|
|
|
|
self.addWeaponComponent = function(weaponName, weaponComponent)
|
|
local loadoutNum, weapon = self.getWeapon(weaponName)
|
|
|
|
if weapon then
|
|
if not self.hasWeaponComponent(weaponName, weaponComponent) then
|
|
table.insert(self.loadout[loadoutNum].components, weaponComponent)
|
|
self.triggerEvent('esx:addWeaponComponent', weaponName, weaponComponent)
|
|
end
|
|
end
|
|
end
|
|
|
|
self.addWeaponAmmo = function(weaponName, ammoCount)
|
|
local loadoutNum, weapon = self.getWeapon(weaponName)
|
|
|
|
if weapon then
|
|
weapon.ammo = weapon.ammo + ammoCount
|
|
self.triggerEvent('esx:setWeaponAmmo', weaponName, weapon.ammo)
|
|
end
|
|
end
|
|
|
|
self.removeWeapon = function(weaponName, ammo)
|
|
local weaponLabel
|
|
|
|
for k,v in ipairs(self.loadout) do
|
|
if v.name == weaponName then
|
|
weaponLabel = v.label
|
|
|
|
for k2,v2 in ipairs(v.components) do
|
|
self.triggerEvent('esx:removeWeaponComponent', weaponName, v2)
|
|
end
|
|
|
|
table.remove(self.loadout, k)
|
|
break
|
|
end
|
|
end
|
|
|
|
if weaponLabel then
|
|
self.triggerEvent('esx:removeWeapon', weaponName, ammo)
|
|
self.triggerEvent('esx:removeInventoryItem', {label = weaponLabel}, 1)
|
|
end
|
|
end
|
|
|
|
self.removeWeaponComponent = function(weaponName, weaponComponent)
|
|
local loadoutNum, weapon = self.getWeapon(weaponName)
|
|
|
|
if weapon then
|
|
for k,v in ipairs(self.loadout[loadoutNum].components) do
|
|
if v.name == weaponComponent then
|
|
table.remove(self.loadout[loadoutNum].components, k)
|
|
break
|
|
end
|
|
end
|
|
|
|
self.triggerEvent('esx:removeWeaponComponent', weaponName, weaponComponent)
|
|
end
|
|
end
|
|
|
|
self.removeWeaponAmmo = function(weaponName, ammoCount)
|
|
local loadoutNum, weapon = self.getWeapon(weaponName)
|
|
|
|
if weapon then
|
|
weapon.ammo = weapon.ammo - ammoCount
|
|
self.triggerEvent('esx:setWeaponAmmo', weaponName, weapon.ammo)
|
|
end
|
|
end
|
|
|
|
self.hasWeaponComponent = function(weaponName, weaponComponent)
|
|
local loadoutNum, weapon = self.getWeapon(weaponName)
|
|
|
|
if weapon then
|
|
for k,v in ipairs(weapon.components) do
|
|
if v == weaponComponent then
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
self.hasWeapon = function(weaponName)
|
|
for k,v in ipairs(self.loadout) do
|
|
if v.name == weaponName then
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
self.getWeapon = function(weaponName)
|
|
for k,v in ipairs(self.loadout) do
|
|
if v.name == weaponName then
|
|
return k, v
|
|
end
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
self.showNotification = function(msg, flash, saveToBrief)
|
|
self.triggerEvent('esx:showNotification', msg, flash, saveToBrief)
|
|
end
|
|
|
|
self.showHelpNotification = function(msg, thisFrame, beep, duration)
|
|
self.triggerEvent('esx:showHelpNotification', msg, thisFrame, beep, duration)
|
|
end
|
|
|
|
return self
|
|
end
|