0.0.1
This commit is contained in:
437
resources/[esx_addons]/esx_policejob/server/main.lua
Normal file
437
resources/[esx_addons]/esx_policejob/server/main.lua
Normal file
@@ -0,0 +1,437 @@
|
||||
if Config.EnableESXService then
|
||||
if Config.MaxInService ~= -1 then
|
||||
TriggerEvent('esx_service:activateService', 'police', Config.MaxInService)
|
||||
end
|
||||
end
|
||||
|
||||
TriggerEvent('esx_phone:registerNumber', 'police', TranslateCap('alert_police'), true, true)
|
||||
TriggerEvent('esx_society:registerSociety', 'police', TranslateCap('society_police'), 'society_police', 'society_police', 'society_police', {type = 'public'})
|
||||
|
||||
RegisterNetEvent('esx_policejob:confiscatePlayerItem')
|
||||
AddEventHandler('esx_policejob:confiscatePlayerItem', function(target, itemType, itemName, amount)
|
||||
local source = source
|
||||
local sourceXPlayer = ESX.Player(source)
|
||||
local targetXPlayer = ESX.Player(target)
|
||||
local job = sourceXPlayer.getJob()
|
||||
local sourceXPlayerName = sourceXPlayer.getName()
|
||||
local targetXPlayerName = targetXPlayer.getName()
|
||||
if job.name ~= 'police' then
|
||||
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Exploit The Confuscation System!'):format(sourceXPlayer.src))
|
||||
return
|
||||
end
|
||||
|
||||
if itemType == 'item_standard' then
|
||||
local targetItem = targetXPlayer.getInventoryItem(itemName)
|
||||
local sourceItem = sourceXPlayer.getInventoryItem(itemName)
|
||||
|
||||
-- does the target player have enough in their inventory?
|
||||
if targetItem and targetItem.count >= amount then
|
||||
|
||||
-- can the player carry the said amount of x item?
|
||||
if sourceXPlayer.canCarryItem(itemName, amount) then
|
||||
targetXPlayer.removeInventoryItem(itemName, amount)
|
||||
sourceXPlayer.addInventoryItem (itemName, amount)
|
||||
sourceXPlayer.showNotification(TranslateCap('you_confiscated', amount, sourceItem.label, targetXPlayerName))
|
||||
targetXPlayer.showNotification(TranslateCap('got_confiscated', amount, sourceItem.label, sourceXPlayerName))
|
||||
else
|
||||
sourceXPlayer.showNotification(TranslateCap('quantity_invalid'))
|
||||
end
|
||||
else
|
||||
sourceXPlayer.showNotification(TranslateCap('quantity_invalid'))
|
||||
end
|
||||
|
||||
elseif itemType == 'item_account' then
|
||||
local targetAccount = targetXPlayer.getAccount(itemName)
|
||||
|
||||
-- does the target player have enough money?
|
||||
if targetAccount.money >= amount then
|
||||
targetXPlayer.removeAccountMoney(itemName, amount, "Confiscated")
|
||||
sourceXPlayer.addAccountMoney (itemName, amount, "Confiscated")
|
||||
|
||||
sourceXPlayer.showNotification(TranslateCap('you_confiscated_account', amount, itemName, targetXPlayerName))
|
||||
targetXPlayer.showNotification(TranslateCap('got_confiscated_account', amount, itemName, sourceXPlayerName))
|
||||
else
|
||||
sourceXPlayer.showNotification(TranslateCap('quantity_invalid'))
|
||||
end
|
||||
|
||||
elseif itemType == 'item_weapon' then
|
||||
if amount == nil then amount = 0 end
|
||||
|
||||
-- does the target player have weapon?
|
||||
if targetXPlayer.hasWeapon(itemName) then
|
||||
targetXPlayer.removeWeapon(itemName)
|
||||
sourceXPlayer.addWeapon (itemName, amount)
|
||||
|
||||
sourceXPlayer.showNotification(TranslateCap('you_confiscated_weapon', ESX.GetWeaponLabel(itemName), targetXPlayerName, amount))
|
||||
targetXPlayer.showNotification(TranslateCap('got_confiscated_weapon', ESX.GetWeaponLabel(itemName), amount, sourceXPlayerName))
|
||||
else
|
||||
sourceXPlayer.showNotification(TranslateCap('quantity_invalid'))
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent('esx_policejob:handcuff')
|
||||
AddEventHandler('esx_policejob:handcuff', function(target)
|
||||
local xPlayer = ESX.Player(source)
|
||||
|
||||
if xPlayer.getJob().name == 'police' then
|
||||
TriggerClientEvent('esx_policejob:handcuff', target)
|
||||
else
|
||||
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Exploit Handcuffs!'):format(xPlayer.src))
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent('esx_policejob:drag')
|
||||
AddEventHandler('esx_policejob:drag', function(target)
|
||||
local xPlayer = ESX.Player(source)
|
||||
|
||||
if xPlayer.getJob().name == 'police' then
|
||||
TriggerClientEvent('esx_policejob:drag', target, source)
|
||||
else
|
||||
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Exploit Dragging!'):format(xPlayer.src))
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent('esx_policejob:putInVehicle')
|
||||
AddEventHandler('esx_policejob:putInVehicle', function(target)
|
||||
local xPlayer = ESX.Player(source)
|
||||
|
||||
if xPlayer.getJob().name == 'police' then
|
||||
TriggerClientEvent('esx_policejob:putInVehicle', target)
|
||||
else
|
||||
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Exploit Garage!'):format(xPlayer.src))
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent('esx_policejob:OutVehicle')
|
||||
AddEventHandler('esx_policejob:OutVehicle', function(target)
|
||||
local xPlayer = ESX.Player(source)
|
||||
|
||||
if xPlayer.getJob().name == 'police' then
|
||||
TriggerClientEvent('esx_policejob:OutVehicle', target)
|
||||
else
|
||||
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Exploit Dragging Out Of Vehicle!'):format(xPlayer.src))
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent('esx_policejob:getStockItem')
|
||||
AddEventHandler('esx_policejob:getStockItem', function(itemName, count)
|
||||
local source = source
|
||||
local xPlayer = ESX.Player(source)
|
||||
|
||||
TriggerEvent('esx_addoninventory:getSharedInventory', 'society_police', function(inventory)
|
||||
local inventoryItem = inventory.getItem(itemName)
|
||||
|
||||
-- is there enough in the society?
|
||||
if count > 0 and inventoryItem.count >= count then
|
||||
|
||||
-- can the player carry the said amount of x item?
|
||||
if xPlayer.canCarryItem(itemName, count) then
|
||||
inventory.removeItem(itemName, count)
|
||||
xPlayer.addInventoryItem(itemName, count)
|
||||
xPlayer.showNotification(TranslateCap('have_withdrawn', count, inventoryItem.name))
|
||||
else
|
||||
xPlayer.showNotification(TranslateCap('quantity_invalid'))
|
||||
end
|
||||
else
|
||||
xPlayer.showNotification(TranslateCap('quantity_invalid'))
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
RegisterNetEvent('esx_policejob:putStockItems')
|
||||
AddEventHandler('esx_policejob:putStockItems', function(itemName, count)
|
||||
local xPlayer = ESX.Player(source)
|
||||
local sourceItem = xPlayer.getInventoryItem(itemName)
|
||||
|
||||
TriggerEvent('esx_addoninventory:getSharedInventory', 'society_police', function(inventory)
|
||||
local inventoryItem = inventory.getItem(itemName)
|
||||
|
||||
-- does the player have enough of the item?
|
||||
if sourceItem.count >= count and count > 0 then
|
||||
xPlayer.removeInventoryItem(itemName, count)
|
||||
inventory.addItem(itemName, count)
|
||||
xPlayer.showNotification(TranslateCap('have_deposited', count, inventoryItem.name))
|
||||
else
|
||||
xPlayer.showNotification(TranslateCap('quantity_invalid'))
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
ESX.RegisterServerCallback('esx_policejob:getOtherPlayerData', function(source, cb, target, notify)
|
||||
local xPlayer = ESX.Player(target)
|
||||
local job = xPlayer.getJob()
|
||||
if notify then
|
||||
xPlayer.showNotification(TranslateCap('being_searched'))
|
||||
end
|
||||
|
||||
if xPlayer then
|
||||
local data = {
|
||||
name = xPlayer.getName(),
|
||||
job = job.label,
|
||||
grade = job.grade_label,
|
||||
inventory = xPlayer.getInventory(),
|
||||
accounts = xPlayer.getAccounts(),
|
||||
weapons = xPlayer.getLoadout()
|
||||
}
|
||||
|
||||
if Config.EnableESXIdentity then
|
||||
data.dob = xPlayer.get('dateofbirth')
|
||||
data.height = xPlayer.get('height')
|
||||
|
||||
if xPlayer.get('sex') == 'm' then data.sex = 'male' else data.sex = 'female' end
|
||||
end
|
||||
|
||||
TriggerEvent('esx_status:getStatus', target, 'drunk', function(status)
|
||||
if status then
|
||||
data.drunk = ESX.Math.Round(status.percent)
|
||||
end
|
||||
end)
|
||||
|
||||
if Config.EnableLicenses then
|
||||
TriggerEvent('esx_license:getLicenses', target, function(licenses)
|
||||
data.licenses = licenses
|
||||
cb(data)
|
||||
end)
|
||||
else
|
||||
cb(data)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
local fineList = {}
|
||||
ESX.RegisterServerCallback('esx_policejob:getFineList', function(source, cb, category)
|
||||
if not fineList[category] then
|
||||
MySQL.query('SELECT * FROM fine_types WHERE category = ?', {category},
|
||||
function(fines)
|
||||
fineList[category] = fines
|
||||
|
||||
cb(fines)
|
||||
end)
|
||||
else
|
||||
cb(fineList[category])
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
ESX.RegisterServerCallback('esx_policejob:getVehicleInfos', function(source, cb, plate)
|
||||
local retrivedInfo = {
|
||||
plate = plate
|
||||
}
|
||||
if Config.EnableESXIdentity then
|
||||
MySQL.single('SELECT users.firstname, users.lastname FROM owned_vehicles JOIN users ON owned_vehicles.owner = users.identifier WHERE plate = ?', {plate},
|
||||
function(result)
|
||||
if result then
|
||||
retrivedInfo.owner = ('%s %s'):format(result.firstname, result.lastname)
|
||||
end
|
||||
cb(retrivedInfo)
|
||||
end)
|
||||
else
|
||||
MySQL.scalar('SELECT owner FROM owned_vehicles WHERE plate = ?', {plate},
|
||||
function(owner)
|
||||
if owner then
|
||||
local xPlayer = ESX.Player(owner)
|
||||
if xPlayer then
|
||||
retrivedInfo.owner = xPlayer.getName()
|
||||
end
|
||||
end
|
||||
cb(retrivedInfo)
|
||||
end)
|
||||
end
|
||||
end)
|
||||
|
||||
ESX.RegisterServerCallback('esx_policejob:getArmoryWeapons', function(source, cb)
|
||||
TriggerEvent('esx_datastore:getSharedDataStore', 'society_police', function(store)
|
||||
local weapons = store.get('weapons')
|
||||
|
||||
if weapons == nil then
|
||||
weapons = {}
|
||||
end
|
||||
|
||||
cb(weapons)
|
||||
end)
|
||||
end)
|
||||
|
||||
ESX.RegisterServerCallback('esx_policejob:addArmoryWeapon', function(source, cb, weaponName, removeWeapon)
|
||||
local xPlayer = ESX.Player(source)
|
||||
|
||||
if removeWeapon then
|
||||
xPlayer.removeWeapon(weaponName)
|
||||
end
|
||||
|
||||
TriggerEvent('esx_datastore:getSharedDataStore', 'society_police', function(store)
|
||||
local weapons = store.get('weapons') or {}
|
||||
local foundWeapon = false
|
||||
|
||||
for i=1, #weapons, 1 do
|
||||
if weapons[i].name == weaponName then
|
||||
weapons[i].count = weapons[i].count + 1
|
||||
foundWeapon = true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if not foundWeapon then
|
||||
table.insert(weapons, {
|
||||
name = weaponName,
|
||||
count = 1
|
||||
})
|
||||
end
|
||||
|
||||
store.set('weapons', weapons)
|
||||
cb()
|
||||
end)
|
||||
end)
|
||||
|
||||
ESX.RegisterServerCallback('esx_policejob:removeArmoryWeapon', function(source, cb, weaponName)
|
||||
local xPlayer = ESX.Player(source)
|
||||
xPlayer.addWeapon(weaponName, 500)
|
||||
|
||||
TriggerEvent('esx_datastore:getSharedDataStore', 'society_police', function(store)
|
||||
local weapons = store.get('weapons') or {}
|
||||
|
||||
local foundWeapon = false
|
||||
|
||||
for i=1, #weapons, 1 do
|
||||
if weapons[i].name == weaponName then
|
||||
weapons[i].count = (weapons[i].count > 0 and weapons[i].count - 1 or 0)
|
||||
foundWeapon = true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if not foundWeapon then
|
||||
table.insert(weapons, {
|
||||
name = weaponName,
|
||||
count = 0
|
||||
})
|
||||
end
|
||||
|
||||
store.set('weapons', weapons)
|
||||
cb()
|
||||
end)
|
||||
end)
|
||||
|
||||
ESX.RegisterServerCallback('esx_policejob:buyWeapon', function(source, cb, weaponName, type, componentNum)
|
||||
local xPlayer = ESX.Player(source)
|
||||
local authorizedWeapons, selectedWeapon = Config.AuthorizedWeapons[xPlayer.getJob().grade_name]
|
||||
|
||||
for k,v in ipairs(authorizedWeapons) do
|
||||
if v.weapon == weaponName then
|
||||
selectedWeapon = v
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if not selectedWeapon then
|
||||
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Buy Invalid Weapon - ^5%s^7!'):format(source, weaponName))
|
||||
cb(false)
|
||||
else
|
||||
-- Weapon
|
||||
if type == 1 then
|
||||
if xPlayer.getMoney() >= selectedWeapon.price then
|
||||
xPlayer.removeMoney(selectedWeapon.price, "Weapon Bought")
|
||||
xPlayer.addWeapon(weaponName, 100)
|
||||
|
||||
cb(true)
|
||||
else
|
||||
cb(false)
|
||||
end
|
||||
|
||||
-- Weapon Component
|
||||
elseif type == 2 then
|
||||
local price = selectedWeapon.components[componentNum]
|
||||
local weaponNum, weapon = ESX.GetWeapon(weaponName)
|
||||
local component = weapon.components[componentNum]
|
||||
|
||||
if component then
|
||||
if xPlayer.getMoney() >= price then
|
||||
xPlayer.removeMoney(price, "Weapon Component Bought")
|
||||
xPlayer.addWeaponComponent(weaponName, component.name)
|
||||
|
||||
cb(true)
|
||||
else
|
||||
cb(false)
|
||||
end
|
||||
else
|
||||
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Buy Invalid Weapon Component - ^5%s^7!'):format(source, componentNum))
|
||||
cb(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
ESX.RegisterServerCallback('esx_policejob:buyJobVehicle', function(source, cb, vehicleProps, type)
|
||||
local xPlayer = ESX.Player(source)
|
||||
local job = xPlayer.getJob()
|
||||
local price = getPriceFromHash(vehicleProps.model, job.grade_name, type)
|
||||
|
||||
-- vehicle model not found
|
||||
if price == 0 then
|
||||
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Buy Invalid Vehicle - ^5%s^7!'):format(source, vehicleProps.model))
|
||||
cb(false)
|
||||
else
|
||||
if xPlayer.getMoney() >= price then
|
||||
xPlayer.removeMoney(price, "Job Vehicle Bought")
|
||||
|
||||
MySQL.insert('INSERT INTO owned_vehicles (owner, vehicle, plate, type, job, `stored`) VALUES (?, ?, ?, ?, ?, ?)', { xPlayer.getIdentifier(), json.encode(vehicleProps), vehicleProps.plate, type, job.name, true},
|
||||
function (rowsChanged)
|
||||
cb(true)
|
||||
end)
|
||||
else
|
||||
cb(false)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
ESX.RegisterServerCallback('esx_policejob:storeNearbyVehicle', function(source, cb, plates)
|
||||
local xPlayer = ESX.Player(source)
|
||||
local job = xPlayer.getJob()
|
||||
local identifier = xPlayer.getIdentifier()
|
||||
local plate = MySQL.scalar.await('SELECT plate FROM owned_vehicles WHERE owner = ? AND plate IN (?) AND job = ?', {identifier, plates, job.name})
|
||||
|
||||
if plate then
|
||||
MySQL.update('UPDATE owned_vehicles SET `stored` = true WHERE owner = ? AND plate = ? AND job = ?', {identifier, plate, job.name},
|
||||
function(rowsChanged)
|
||||
if rowsChanged == 0 then
|
||||
cb(false)
|
||||
else
|
||||
cb(plate)
|
||||
end
|
||||
end)
|
||||
else
|
||||
cb(false)
|
||||
end
|
||||
end)
|
||||
|
||||
function getPriceFromHash(vehicleHash, jobGrade, type)
|
||||
local vehicles = Config.AuthorizedVehicles[type]?[jobGrade] or {}
|
||||
|
||||
for i = 1, #vehicles do
|
||||
local vehicle = vehicles[i]
|
||||
if GetHashKey(vehicle.model) == vehicleHash then
|
||||
return vehicle.price
|
||||
end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
ESX.RegisterServerCallback('esx_policejob:getStockItems', function(source, cb)
|
||||
TriggerEvent('esx_addoninventory:getSharedInventory', 'society_police', function(inventory)
|
||||
cb(inventory.items)
|
||||
end)
|
||||
end)
|
||||
|
||||
ESX.RegisterServerCallback('esx_policejob:getPlayerInventory', function(source, cb)
|
||||
local xPlayer = ESX.Player(source)
|
||||
local items = xPlayer.getInventory(false)
|
||||
|
||||
cb({items = items})
|
||||
end)
|
||||
|
||||
AddEventHandler('onResourceStop', function(resource)
|
||||
if resource == GetCurrentResourceName() then
|
||||
TriggerEvent('esx_phone:removeNumber', 'police')
|
||||
end
|
||||
end)
|
||||
Reference in New Issue
Block a user