Files
jim_bridge/shared/playerfunctions.lua

1015 lines
38 KiB
Lua
Raw Normal View History

--[[
Player Utility & Server Event Handlers Module
------------------------------------------------
This module provides utility functions for:
Locking/unlocking the player's inventory.
Instantly turning or gradually turning the player to face a target.
Handling player needs (thirst and hunger) via server events.
Charging/funding players (money removal/addition).
Processing item consumption and applying effects.
Checking player job/gang roles and retrieving player information.
Getting active players near a coordinate.
]]
2025-02-22 13:21:54 +00:00
local hungerThirstFunc = {
{ framework = QBXExport,
setThirst =
function(src, thirst)
local Player = Core.Functions.GetPlayer(src)
local newThirst = Player.PlayerData.metadata.thirst + thirst
newThirst = (newThirst >= 100.0 and 100.0) or (newThirst <= 0 and 0) or newThirst
Player.Functions.SetMetaData('thirst', newThirst)
TriggerClientEvent("hud:client:UpdateNeeds", src, Player.PlayerData.metadata.hunger, newThirst)
end,
setHunger =
function(src, hunger)
local Player = Core.Functions.GetPlayer(src)
local newHunger = Player.PlayerData.metadata.hunger + hunger
newHunger = (newHunger >= 100.0 and 100.0) or (newHunger <= 0 and 0) or newHunger
Player.Functions.SetMetaData('hunger', newHunger)
TriggerClientEvent("hud:client:UpdateNeeds", src, newHunger, Player.PlayerData.metadata.thirst)
end,
setStress =
function(src, stress)
local Player = Core.Functions.GetPlayer(src)
2025-10-04 22:10:39 +01:00
local newStress = Player.PlayerData.metadata.stress - stress
newStress = (newStress >= 100.0 and 100.0)or (newStress <= 0 and 0) or newStress
Player.Functions.SetMetaData('stress', newStress)
TriggerClientEvent('hud:client:UpdateStress', src, newStress)
end,
},
{ framework = QBExport,
setThirst =
function(src, thirst)
local Player = Core.Functions.GetPlayer(src)
local newThirst = Player.PlayerData.metadata.thirst + thirst
newThirst = (newThirst >= 100.0 and 100.0) or (newThirst <= 0 and 0) or newThirst
Player.Functions.SetMetaData('thirst', newThirst)
TriggerClientEvent("hud:client:UpdateNeeds", src, Player.PlayerData.metadata.hunger, newThirst)
end,
setHunger =
function(src, hunger)
local Player = Core.Functions.GetPlayer(src)
local newHunger = Player.PlayerData.metadata.hunger + hunger
newHunger = (newHunger >= 100.0 and 100.0) or (newHunger <= 0 and 0) or newHunger
Player.Functions.SetMetaData('hunger', newHunger)
TriggerClientEvent("hud:client:UpdateNeeds", src, newHunger, Player.PlayerData.metadata.thirst)
end,
setStress =
function(src, stress)
local Player = Core.Functions.GetPlayer(src)
2025-10-04 22:10:39 +01:00
local newStress = Player.PlayerData.metadata.stress - stress
newStress = (newStress >= 100.0 and 100.0)or (newStress <= 0 and 0) or newStress
Player.Functions.SetMetaData('stress', newStress)
TriggerClientEvent('hud:client:UpdateStress', src, newStress)
end,
},
{ framework = RSGExport,
setThirst =
function(src, thirst)
local Player = Core.Functions.GetPlayer(src)
local newThirst = Player.PlayerData.metadata.thirst + thirst
newThirst = (newThirst >= 100.0 and 100.0) or (newThirst <= 0 and 0) or newThirst
Player.Functions.SetMetaData('thirst', newThirst)
TriggerClientEvent("hud:client:UpdateNeeds", src, Player.PlayerData.metadata.hunger, newThirst)
end,
setHunger =
function(src, hunger)
local Player = Core.Functions.GetPlayer(src)
local newHunger = Player.PlayerData.metadata.hunger + hunger
newHunger = (newHunger >= 100.0 and 100.0) or (newHunger <= 0 and 0) or newHunger
Player.Functions.SetMetaData('hunger', newHunger)
TriggerClientEvent("hud:client:UpdateNeeds", src, newHunger, Player.PlayerData.metadata.thirst)
end,
setStress =
function(src, stress)
local Player = Core.Functions.GetPlayer(src)
local newStress = Player.PlayerData.metadata.stress - stress
newStress = (newStress >= 100.0 and 100.0) or (newStress <= 0 and 0) or newStress
Player.Functions.SetMetaData('stress', newStress)
TriggerClientEvent('hud:client:UpdateStress', src, newStress)
end,
},
{ framework = ESXExport,
setThirst =
function(src, thirst)
TriggerClientEvent('esx_status:add', src, 'thirst', tonumber(thirst) * 10000)
end,
setHunger =
function(src, hunger)
TriggerClientEvent('esx_status:add', src, 'hunger', tonumber(hunger) * 10000)
end,
setStress =
function(src, stress)
TriggerClientEvent("esx_status:add", src, "stress", tonumber(stress) * 10000)
end,
},
}
-------------------------------------------------------------
-- Server Event Handlers for Needs
-------------------------------------------------------------
--- Sets the player's thirst level.
2025-02-22 13:21:54 +00:00
---
--- @param src number The player's server ID.
--- @param thirst number The new thirst level.
2025-02-22 13:21:54 +00:00
---
--- @usage
--- ```lua
--- setThirst(playerId, 80)
2025-02-22 13:21:54 +00:00
--- ```
function setThirst(src, thirst)
for i = 1, #hungerThirstFunc do
local framework = hungerThirstFunc[i]
if isStarted(framework.framework) then
debugPrint("^4Debug^7: ^2Adding ^3"..framework.framework.." ^2thirst^7: ^3"..thirst.." ^2to player^7: ^3"..src.."^7")
framework.setThirst(src, thirst)
return
end
end
2025-02-22 13:21:54 +00:00
end
--- Sets the player's hunger level.
2025-02-22 13:21:54 +00:00
---
--- @param src number The player's server ID.
--- @param hunger number The new hunger level.
2025-02-22 13:21:54 +00:00
---
--- @usage
--- ```lua
--- setHunger(playerId, 60)
2025-02-22 13:21:54 +00:00
--- ```
function setHunger(src, hunger)
for i = 1, #hungerThirstFunc do
local framework = hungerThirstFunc[i]
if isStarted(framework.framework) then
debugPrint("^4Debug^7: ^2Adding ^3"..framework.framework.." ^2hunger^7: ^3"..hunger.." ^2to player^7: ^3"..src.."^7")
framework.setHunger(src, hunger)
return
2025-02-22 13:21:54 +00:00
end
end
end
--- Sets the player's stress level.
---
--- @param src number The player's server ID.
--- @param stress number The new stress level.
---
--- @usage
--- ```lua
--- setStress(playerId, 60)
--- ```
function setStress(src, stress)
for i = 1, #hungerThirstFunc do
local framework = hungerThirstFunc[i]
if isStarted(framework.framework) then
debugPrint("^4Debug^7: ^2Adding ^3"..framework.framework.." ^2stress^7: ^3"..stress.." ^2to player^7: ^3"..src.."^7")
framework.setStress(src, stress)
return
end
end
end
--- Server event handler for urinal usage.
--- Decreases player's thirst by a random amount.
2025-02-22 13:21:54 +00:00
RegisterNetEvent(getScript()..":server:Urinal", function()
local src = source
local Player = getPlayer(src)
local thirstamt = math.random(10, 30)
local thirst = Player.thirst - thirstamt
setThirst(src, getPlayer(src).thirst - thirst)
end)
--- Server event handler for setting player needs (thirst or hunger).
2025-02-22 13:21:54 +00:00
---
--- @event
--- @param needType string "thirst" or "hunger".
--- @param amount number New value to set.
RegisterNetEvent(getScript()..":server:setNeed", function(needType, amount)
print("^1Deprecated function ':server:setNeed' called, please update the scripts that use it^7")
-- local src = source
-- if needType == "thirst" then
-- setThirst(src, amount)
-- elseif needType == "hunger" then
-- setHunger(src, amount)
-- end
2025-02-22 13:21:54 +00:00
end)
-------------------------------------------------------------
-- Economy Event Handlers
-------------------------------------------------------------
local billPlayerFunc = {
jim =
function(data)
TriggerEvent("jim-payments:client:Charge", {
job = data.job,
gang = data.gang,
coords = data.coords.xyz,
img = data.img
})
end,
okok =
function(data)
TriggerEvent("okokBilling:ToggleCreateInvoice")
end,
2025-10-09 20:05:15 +01:00
codem =
function(data)
TriggerEvent("codem-billing:client:OpenMenu")
end,
tgg =
function(data)
exports["tgg-billing"]:OpenBillingMenu()
end,
}
--- BillPlayer
function billPlayer(data)
if Config.System.Billing and billPlayerFunc[Config.System.Billing] then
billPlayerFunc[Config.System.Billing](data)
else
debugPrint("^1Error^7: ^1No billing script detected")
end
end
-- Money Handlers
local moneyFunc = {
{ framework = OXInv,
chargePlayer =
function(src, amount, moneyType)
return exports[OXInv]:RemoveItem(src, "money", amount)
end,
fundPlayer =
function(src, amount, moneyType)
return exports[OXInv]:AddItem(src, "money", amount)
end,
},
{ framework = QBXExport,
chargePlayer =
function(src, amount, moneyType)
return Core.Functions.GetPlayer(src).Functions.RemoveMoney(moneyType or "cash", amount)
end,
fundPlayer =
function(src, amount, moneyType)
return Core.Functions.GetPlayer(src).Functions.AddMoney(moneyType or "cash", amount)
end,
},
{ framework = QBExport,
chargePlayer =
function(src, amount, moneyType)
return Core.Functions.GetPlayer(src).Functions.RemoveMoney(moneyType or "cash", amount)
end,
fundPlayer =
function(src, amount, moneyType)
return Core.Functions.GetPlayer(src).Functions.AddMoney(moneyType or "cash", amount)
end,
},
{ framework = RSGExport,
chargePlayer =
function(src, amount, moneyType)
return Core.Functions.GetPlayer(src).Functions.RemoveMoney(moneyType or "cash", amount)
end,
fundPlayer =
function(src, amount, moneyType)
return Core.Functions.GetPlayer(src).Functions.AddMoney(moneyType or "cash", amount)
end,
},
{ framework = ESXExport,
chargePlayer =
function(src, amount, moneyType)
return ESX.GetPlayerFromId(src).removeMoney(amount, "")
end,
fundPlayer =
function(src, amount, moneyType)
return ESX.GetPlayerFromId(src).addMoney(amount, "")
end,
},
}
--- Charges a player by removing money from their account.
2025-02-22 13:21:54 +00:00
---
--- @param cost number The amount to charge.
--- @param type string "cash" or "bank".
--- @param newsrc number|nil Optional player ID; defaults to event source.
2025-02-22 13:21:54 +00:00
---
--- @usage
--- ```lua
--- chargePlayer(100, "cash", playerId)
--- ```
function chargePlayer(cost, moneyType, newsrc)
local is_success = false
2025-02-22 13:21:54 +00:00
local src = newsrc or source
if cost <= 0 then
debugPrint("^1Error^7: ^7SRC: ^3"..src.." ^2Tried to charge a zero or minus value^7", cost)
2025-04-01 14:15:50 +01:00
return
end
for i = 1, #moneyFunc do
local framework = moneyFunc[i]
if framework.framework == OXInv and moneyType == "bank" then goto skip end
if isStarted(framework.framework) then
debugPrint("^6Bridge^7: ^2Charging ^3"..framework.framework.." ^2Player^7: '^6"..cost.."^7'", moneyType)
is_success = framework.chargePlayer(src, cost, moneyType)
break
2025-02-22 13:21:54 +00:00
end
::skip::
2025-02-22 13:21:54 +00:00
end
return is_success
2025-02-22 13:21:54 +00:00
end
2025-04-01 14:15:50 +01:00
RegisterNetEvent(getScript()..":server:ChargePlayer", function(cost, moneyType, newsrc)
if GetInvokingResource() and GetInvokingResource() ~= getScript() and GetInvokingResource() ~= "qb-core" then
print(GetInvokingResource())
print("^1Error^7: ^1Possible exploit^7, ^1vital function was called from an external resource^7")
2025-04-01 14:15:50 +01:00
return
end
chargePlayer(cost, moneyType, newsrc)
end)
2025-02-22 13:21:54 +00:00
--- Funds a player by adding money to their account.
2025-02-22 13:21:54 +00:00
---
--- @param fund number The amount to add.
--- @param type string "cash" or "bank".
--- @param newsrc number|nil Optional player ID; defaults to event source.
2025-02-22 13:21:54 +00:00
---
--- @usage
--- ```lua
--- fundPlayer(150, "cash", playerId)
2025-02-22 13:21:54 +00:00
--- ```
function fundPlayer(fund, moneyType, newsrc)
local is_success = false
2025-02-22 13:21:54 +00:00
local src = newsrc or source
if fund <= 0 then
debugPrint("^1Error^7: ^7SRC: ^3"..src.." ^2Tried to fund a zero or minus value^7", fund)
return
end
for i = 1, #moneyFunc do
local framework = moneyFunc[i]
if framework.framework == OXInv and moneyType == "bank" then goto skip end
if isStarted(framework.framework) then
2025-08-17 02:10:38 +01:00
debugPrint("^6Bridge^7: ^2Funding ^3"..framework.framework.." ^2Player^7: '^6"..fund.."^7'", moneyType)
is_success = framework.fundPlayer(src, fund, moneyType)
break
2025-02-22 13:21:54 +00:00
end
::skip::
2025-02-22 13:21:54 +00:00
end
return is_success
2025-02-22 13:21:54 +00:00
end
-------------------------------------------------------------
-- Item Consumption & Effects
-------------------------------------------------------------
2025-02-22 13:21:54 +00:00
--- Handles successful consumption of an item.
---
--- Plays a consumption animation, removes the item, updates player needs, handles alcohol effects,
--- and checks for random rewards.
2025-02-22 13:21:54 +00:00
---
--- @param itemName string The name of the consumed item.
--- @param type string The category of the item (e.g., "alcohol").
--- @param data table Additional data (e.g., hunger and thirst values).
2025-02-22 13:21:54 +00:00
---
--- @usage
--- ```lua
--- -- Player consumes a health pack
--- ConsumeSuccess("health_pack", "health")
---
--- -- Player consumes an alcohol drink
--- ConsumeSuccess("beer", "alcohol")
--- ```
function ConsumeSuccess(itemName, type, data)
print("^1Deprecated function 'ConsumeSuccess' called, please update your scripts^7")
--local hunger = data and data.hunger or Items[itemName].hunger
--local thirst = data and data.thirst or Items[itemName].thirst
--
--ExecuteCommand("e c")
--removeItem(itemName, 1)
--
--if isStarted(ESXExport) then
-- if hunger then
-- TriggerServerEvent(getScript()..":server:setNeed", "hunger", tonumber(hunger) * 10000)
-- end
-- if thirst then
-- TriggerServerEvent(getScript()..":server:setNeed", "thirst", tonumber(thirst) * 10000)
-- end
--else
-- if hunger then
-- TriggerServerEvent(getScript()..":server:setNeed", "hunger", Core.Functions.GetPlayerData().metadata["hunger"] + tonumber(hunger))
-- end
-- if thirst then
-- TriggerServerEvent(getScript()..":server:setNeed", "thirst", Core.Functions.GetPlayerData().metadata["thirst"] + tonumber(thirst))
-- end
--end
--
--if type == "alcohol" then
-- alcoholCount = (alcoholCount or 0) + 1
-- if alcoholCount > 1 and alcoholCount < 4 then
-- TriggerEvent("evidence:client:SetStatus", "alcohol", 200)
-- elseif alcoholCount >= 4 then
-- TriggerEvent("evidence:client:SetStatus", "heavyalcohol", 200)
-- AlienEffect()
-- end
--end
--
--if Config.Reward then
-- getRandomReward(itemName)
--end
2025-02-22 13:21:54 +00:00
end
-------------------------------------------------------------
-- Player Job & Information Utilities
-------------------------------------------------------------
local hasGroupFunc = {
{ framework = QBXExport,
hasGroup =
function(group, grade, src)
local hasJobFlag, duty = false, true
local playerInfo = GetPlayer(src)
local jobinfo = playerInfo.job or playerInfo.PlayerData.job
2025-09-20 17:56:47 +01:00
if jobinfo and jobinfo.name == group then
hasJobFlag = true
duty = jobinfo.onduty
if grade and not (grade <= jobinfo.grade.level) then
hasJobFlag = false
end
2025-09-20 17:56:47 +01:00
return hasJobFlag, duty
end
local ganginfo = playerInfo.gang or playerInfo.PlayerData.gang
2025-09-20 17:56:47 +01:00
if ganginfo and ganginfo.name == group then
hasJobFlag = true
if grade and not (grade <= ganginfo.grade.level) then
hasJobFlag = false
end
2025-09-20 17:56:47 +01:00
return hasJobFlag, duty
end
return hasJobFlag, duty
end,
},
{ framework = QBExport,
hasGroup =
function(group, grade, src)
local hasJobFlag, duty = false, true
local playerInfo = GetPlayer(src)
local jobinfo = playerInfo.job or playerInfo.PlayerData.job
2025-09-20 17:56:47 +01:00
if jobinfo and jobinfo.name == group then
hasJobFlag = true
duty = jobinfo.onduty
if grade and not (grade <= jobinfo.grade.level) then
hasJobFlag = false
end
end
local ganginfo = playerInfo.gang or playerInfo.PlayerData.gang
2025-09-20 17:56:47 +01:00
if ganginfo and ganginfo.name == group then
hasJobFlag = true
if grade and not (grade <= ganginfo.grade.level) then
hasJobFlag = false
end
end
return hasJobFlag, duty
end,
},
{ framework = OXCoreExport,
hasGroup =
function(group, grade, src)
local hasJobFlag, duty = false, true
if src then
local chunk = assert(load(LoadResourceFile('ox_core', ('imports/%s.lua'):format('server')), ('@@ox_core/%s'):format(file)))
chunk()
local player = Ox.GetPlayer(src)
for k, v in pairs(player.getGroups()) do
if k == group then hasJobFlag = true end
end
end
local info = OxPlayer.getGroups()
for k, v in pairs(info) do
if k == group then hasJobFlag = true break end
end
return hasJobFlag, duty
end,
},
{ framework = ESXExport,
hasGroup =
function(group, grade, src)
local hasJobFlag, duty = false, true
local playerInfo = GetPlayer(src)
local info = playerInfo.job
while not info do
info = GetPlayer(src).job
Wait(100)
end
if info.name == group then
hasJobFlag = true
end
return hasJobFlag, duty
end,
},
{ framework = RSGExport,
hasGroup =
function(group, grade, src)
local hasJobFlag, duty = false, true
local playerInfo = GetPlayer(src)
local jobinfo = playerInfo.job or playerInfo.PlayerData.job
2025-09-20 17:56:47 +01:00
if jobinfo and jobinfo.name == group then
hasJobFlag = true
duty = jobinfo.onduty
if grade and not (grade <= jobinfo.grade.level) then
hasJobFlag = false
end
end
local ganginfo = playerInfo.gang or playerInfo.PlayerData.gang
2025-09-20 17:56:47 +01:00
if ganginfo and ganginfo.name == group then
hasJobFlag = true
if grade and not (grade <= ganginfo.grade.level) then
hasJobFlag = false
end
end
return hasJobFlag, duty
end,
},
}
--- Checks if a player has a specific job or gang (and optionally meets a minimum grade).
2025-02-22 13:21:54 +00:00
---
--- @param job string The job or gang name to check.
--- @param source number|nil Optional player source; if nil, checks current player.
--- @param grade number|nil Optional minimum grade level.
--- @return boolean, boolean boolean Returns true and duty status if the check passes; false otherwise.
2025-02-22 13:21:54 +00:00
---
--- @usage
--- ```lua
--- -- Check if the player has the 'police' job and is on duty
--- local hasPoliceJob, isOnDuty = hasJob("police")
--- if hasPoliceJob and isOnDuty then
--- -- Grant access to police-specific features
--- end
---
--- -- Check if a specific player has the 'gang_leader' job with at least grade 2
--- local hasGangLeaderJob, _ = hasJob("gang_leader", playerId, 2)
--- if hasGangLeaderJob then
--- -- Allow gang leader actions
--- end
--- ```
function hasJob(job, source, grade)
local src = source
local hasJobFlag, duty = false, true
for i = 1, #hasGroupFunc do
local framework = hasGroupFunc[i]
if isStarted(framework.framework) then
hasJobFlag, duty = framework.hasGroup(job, grade, src)
return hasJobFlag, duty
2025-02-22 13:21:54 +00:00
end
end
print("^4ERROR^7: ^2No Core detected for hasJob ^7- ^2Check ^3starter^1.^2lua^7")
2025-02-22 13:21:54 +00:00
end
----------------------------------
2025-02-22 13:21:54 +00:00
---
local getPlayerFunc = {
{ framework = ESXExport,
serverSide =
function(src)
local Player = {}
local info = ESX.GetPlayerFromId(src)
if not info then return {} end
Player = {
name = info.getName(),
cash = info.getMoney(),
bank = info.getAccount("bank").money,
2025-02-22 13:21:54 +00:00
firstname = info.variables.firstName,
lastname = info.variables.lastName,
source = info.source,
job = info.job.name,
--jobBoss = info.job.isboss,
--gang = info.gang.name,
--gangBoss = info.gang.isboss,
onDuty = info.job.onDuty,
--account = info.charinfo.account,
citizenId = info.identifier,
hunger = info.status.hunger,
thirst = info.status.thirst,
}
return Player
end,
clientSide =
function()
local Player = {}
local info = ESX.GetPlayerData()
if not info.firstName then return {} end
local cash, bank = 0, 0
for _, v in pairs(info.accounts) do
if v.name == "money" then cash = v.money end
if v.name == "bank" then bank = v.money end
end
Player = {
firstname = info.firstName,
lastname = info.lastName,
name = info.firstName.." "..info.lastName,
cash = cash,
bank = bank,
source = GetPlayerServerId(PlayerId()),
job = info.job.name,
--jobBoss = info.job.isboss,
--gang = info.gang.name,
--gangBoss = info.gang.isboss,
onDuty = info.job.onDuty,
--account = info.charinfo.account,
citizenId = info.identifier,
isDead = IsEntityDead(PlayerPedId()),
isDown = IsPedDeadOrDying(PlayerPedId(), true),
hunger = info.status.hunger,
thirst = info.status.thirst,
}
return Player
end,
},
{ framework = OXCoreExport,
serverSide =
function(src)
local Player = {}
local file = ('imports/%s.lua'):format('server')
local import = LoadResourceFile('ox_core', file)
local chunk = assert(load(import, ('@@ox_core/%s'):format(file)))
chunk()
local player = Ox.GetPlayer(src)
if not player then return {} end
Player = {
firstname = player.firstName,
lastname = player.lastName,
name = ('%s %s'):format(player.firstName, player.lastName),
cash = exports[OXInv]:Search(src, 'count', "money"),
bank = 0,
source = src,
--job = OxPlayer.getGroups(),
--jobBoss = info.job.isboss,
--gang = OxPlayer.getGroups(),
--gangBoss = info.gang.isboss,
--onDuty = info.job.onduty,
--account = info.charinfo.account,
citizenId = player.stateId,
}
return Player
end,
clientSide =
function()
local Player = {}
if not OxPlayer.userId then return {} end
Player = {
firstname = OxPlayer.get("firstName"),
lastname = OxPlayer.get("lastName"),
name = OxPlayer.get("firstName").." "..OxPlayer.get("lastName"),
cash = exports[OXInv]:Search('count', "money"),
bank = 0,
source = GetPlayerServerId(PlayerId()),
job = OxPlayer.getGroups(),
--jobBoss = info.job.isboss,
gang = OxPlayer.getGroups(),
--gangBoss = info.gang.isboss,
--onDuty = info.job.onduty,
--account = info.charinfo.account,
citizenId = OxPlayer.userId,
isDead = IsEntityDead(PlayerPedId()),
isDown = IsPedDeadOrDying(PlayerPedId(), true)
}
return Player
end,
},
{ framework = QBXExport,
serverSide =
function(src)
local Player = {}
local info = exports[QBXExport]:GetPlayer(src)
if not info then return {} end
Player = {
firstname = info.PlayerData.charinfo.firstname,
lastname = info.PlayerData.charinfo.lastname,
name = info.PlayerData.charinfo.firstname.." "..info.PlayerData.charinfo.lastname,
cash = exports[OXInv]:Search(src, 'count', "money"),
bank = info.Functions.GetMoney("bank"),
source = info.PlayerData.source,
job = info.PlayerData.job.name,
jobBoss = info.PlayerData.job.isboss,
jobInfo = info.PlayerData.job,
gang = info.PlayerData.gang.name,
gangInfo = info.PlayerData.gang,
gangBoss = info.PlayerData.gang.isboss,
onDuty = info.PlayerData.job.onduty,
account = info.PlayerData.charinfo.account,
citizenId = info.PlayerData.citizenid,
isDead = info.PlayerData.metadata["isdead"],
isDown = info.PlayerData.metadata["inlaststand"],
charInfo = info.charinfo,
hunger = info.PlayerData.metadata["hunger"],
thirst = info.PlayerData.metadata["thirst"],
}
return Player
end,
clientSide =
function()
local Player = {}
local info = exports[QBXExport]:GetPlayerData()
if not info.charinfo then return {} end
2025-02-22 13:21:54 +00:00
Player = {
firstname = info.charinfo.firstname,
lastname = info.charinfo.lastname,
name = info.charinfo.firstname.." "..info.charinfo.lastname,
cash = info.money["cash"],
bank = info.money["bank"],
source = info.source,
job = info.job.name,
jobBoss = info.job.isboss,
2025-03-11 22:41:13 +00:00
jobInfo = info.job,
2025-02-22 13:21:54 +00:00
gang = info.gang.name,
gangBoss = info.gang.isboss,
2025-03-11 22:41:13 +00:00
gangInfo = info.gang,
2025-02-22 13:21:54 +00:00
onDuty = info.job.onduty,
account = info.charinfo.account,
citizenId = info.citizenid,
isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"],
2025-04-12 00:19:22 +01:00
charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
2025-02-22 13:21:54 +00:00
}
return Player
end,
},
{ framework = QBExport,
serverSide =
function(src)
local Player = {}
if Core.Functions.GetPlayer(src) then
local info = Core.Functions.GetPlayer(src).PlayerData
if not info then return {} end
Player = {
firstname = info.charinfo.firstname,
lastname = info.charinfo.lastname,
name = info.charinfo.firstname.." "..info.charinfo.lastname,
cash = info.money["cash"],
bank = info.money["bank"],
source = info.source,
job = info.job.name,
jobBoss = info.job.isboss,
jobInfo = info.job,
gang = info.gang.name,
gangBoss = info.gang.isboss,
gangInfo = info.gang,
onDuty = info.job.onduty,
account = info.charinfo.account,
citizenId = info.citizenid,
isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"],
charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
}
end
return Player
end,
clientSide =
function()
local Player = {}
local info = nil
Core.Functions.GetPlayerData(function(PlayerData) info = PlayerData end)
if not info.charinfo then return {} end
2025-04-07 20:52:59 +01:00
Player = {
firstname = info.charinfo.firstname,
lastname = info.charinfo.lastname,
name = info.charinfo.firstname.." "..info.charinfo.lastname,
cash = info.money["cash"],
bank = info.money["bank"],
source = info.source,
job = info.job.name,
jobBoss = info.job.isboss,
jobInfo = info.job,
gang = info.gang.name,
gangBoss = info.gang.isboss,
gangInfo = info.gang,
onDuty = info.job.onduty,
account = info.charinfo.account,
citizenId = info.citizenid,
isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"],
2025-04-12 00:19:22 +01:00
charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
2025-04-07 20:52:59 +01:00
}
return Player
end,
},
{ framework = RSGExport,
serverSide =
function(src)
local Player = {}
if Core.Functions.GetPlayer(src) then
local info = Core.Functions.GetPlayer(src).PlayerData
if not info then return {} end
Player = {
firstname = info.charinfo.firstname,
lastname = info.charinfo.lastname,
name = info.charinfo.firstname.." "..info.charinfo.lastname,
cash = info.money["cash"],
bank = info.money["bank"],
source = info.source,
job = info.job.name,
jobBoss = info.job.isboss,
jobInfo = info.job,
gang = info.gang.name,
gangBoss = info.gang.isboss,
gangInfo = info.gang,
onDuty = info.job.onduty,
account = info.charinfo.account,
citizenId = info.citizenid,
isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"],
charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
}
end
return Player
end,
clientSide =
function()
local Player = {}
local info = nil
Core.Functions.GetPlayerData(function(PlayerData) info = PlayerData end)
if not info.charinfo then return {} end
Player = {
firstname = info.charinfo.firstname,
lastname = info.charinfo.lastname,
name = info.charinfo.firstname.." "..info.charinfo.lastname,
cash = info.money["cash"],
bank = info.money["bank"],
source = info.source,
job = info.job.name,
jobBoss = info.job.isboss,
jobInfo = info.job,
gang = info.gang.name,
gangBoss = info.gang.isboss,
gangInfo = info.gang,
onDuty = info.job.onduty,
account = info.charinfo.account,
citizenId = info.citizenid,
isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"],
charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
}
return Player
end,
},
}
--- Retrieves basic player information (name, cash, bank, job, etc.) based on the active core/inventory system.
---
--- Can be called server-side (passing a player source) or client-side (for current player).
---
--- @param source number|nil Optional player server ID.
--- @return table A table containing player details.
---
--- @usage
--- ```lua
--- -- Get information for a specific player
--- local playerInfo = getPlayer(playerId)
--- print(playerInfo.name, playerInfo.cash, playerInfo.bank)
---
--- -- Get information for the current player (client-side)
--- local myInfo = getPlayer()
--- print(myInfo.name, myInfo.cash, myInfo.bank)
--- ```
function getPlayer(source)
local Player = {}
--debugPrint("^6Bridge^7: ^2Getting ^3Player^2 info^7")
if source then
for i = 1, #getPlayerFunc do
local framework = getPlayerFunc[i]
if isStarted(framework.framework) then
Player = framework.serverSide(source)
break
end
end
else
for i = 1, #getPlayerFunc do
local framework = getPlayerFunc[i]
if isStarted(framework.framework) then
Player = framework.clientSide()
break
end
2025-02-22 13:21:54 +00:00
end
2025-02-22 13:21:54 +00:00
end
return Player
end
--- Retrieves all active players within a given radius from the specified coordinates.
---
--- @param coords vector3 The reference coordinates.
--- @param radius number The radius within which to find players.
--- @return table table An array of player IDs.
---
--- @usage
--- ```lua
--- local nearbyPlayers = GetPlayersFromCoords(vector3(100, 200, 30), 20)
--- ```
2025-02-22 13:21:54 +00:00
function GetPlayersFromCoords(coords, radius)
local players = {}
for _, playerId in ipairs(GetActivePlayers()) do
local ped = GetPlayerPed(playerId)
if ped and DoesEntityExist(ped) then
local playerCoords = GetEntityCoords(ped)
if #(coords - playerCoords) <= radius then
players[#players + 1] = playerId
2025-02-22 13:21:54 +00:00
end
end
end
return players
end
-------------------------------------------------------------
-- Clothing Script Selection
-------------------------------------------------------------
local wardrobeFunc = {
{ name = "qb-clothing",
openWardrobe = function()
TriggerEvent("qb-clothing:client:OpenMenu")
end,
},
{ name = "esx_skin",
openWardrobe = function()
TriggerEvent("esx_skin:openSaveableMenu",
function()
finished = true
end, function()
finished = true
end)
end,
},
{
name = "illenium-appearance",
openWardrobe = function()
TriggerEvent("illenium-appearance:client:openOutfitMenu")
end,
},
{
name = "rcore_clothing",
openWardrobe = function()
TriggerEvent('rcore_clothing:openChangingRoom')
end,
}
}
--- Opens the clothing customization menu
function openClothing()
for i = 1, #wardrobeFunc do
local script = wardrobeFunc[i]
if isStarted(script.name) then
script.openWardrobe()
break
end
end
end