Scripts/resources/[qb]/[qb_shops]/qb-diving/server/main.lua

125 lines
4.7 KiB
Lua
Raw Normal View History

2024-12-29 20:06:22 +00:00
local QBCore = exports['qb-core']:GetCoreObject()
local currentDivingArea = math.random(1, #Config.CoralLocations)
local availableCoral = {}
-- Functions
local function getItemPrice(amount, price)
for k, v in pairs(Config.BonusTiers) do
local modifier = #Config.BonusTiers == k and amount >= v.minAmount or amount >= v.minAmount and amount <= v.maxAmount
if modifier then
local percent = math.random(v.minBonus, v.maxBonus) / 100
local bonus = price * percent
price = price + bonus
price = math.ceil(price)
end
end
return price
end
local function hasCoral(src)
local Player = QBCore.Functions.GetPlayer(src)
availableCoral = {}
for _, v in pairs(Config.CoralTypes) do
local item = Player.Functions.GetItemByName(v.item)
if item then availableCoral[#availableCoral+1] = v end
end
return next(availableCoral)
end
-- Events
RegisterNetEvent('qb-diving:server:CallCops', function(coords)
for _, Player in pairs(QBCore.Functions.GetQBPlayers()) do
if Player then
if Player.PlayerData.job.type == "leo" and Player.PlayerData.job.onduty then
local msg = Lang:t("info.cop_msg")
TriggerClientEvent('qb-diving:client:CallCops', Player.PlayerData.source, coords, msg)
local alertData = {
title = Lang:t("info.cop_title"),
coords = coords,
description = msg
}
TriggerClientEvent("qb-phone:client:addPoliceAlert", -1, alertData)
end
end
end
end)
RegisterNetEvent('qb-diving:server:SellCoral', function()
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end
if hasCoral(src) then
for _, v in pairs(availableCoral) do
local item = Player.Functions.GetItemByName(v.item)
local price = item.amount * v.price
local reward = getItemPrice(item.amount, price)
Player.Functions.RemoveItem(item.name, item.amount)
Player.Functions.AddMoney('cash', reward, "sold-coral")
TriggerClientEvent('inventory:client:ItemBox', src, QBCore.Shared.Items[item.name], "remove")
end
else
TriggerClientEvent('QBCore:Notify', src, Lang:t("error.no_coral"), 'error')
end
end)
RegisterNetEvent('qb-diving:server:TakeCoral', function(area, coral, bool)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end
local coralType = math.random(1, #Config.CoralTypes)
local amount = math.random(1, Config.CoralTypes[coralType].maxAmount)
local ItemData = QBCore.Shared.Items[Config.CoralTypes[coralType].item]
if amount > 1 then
for _ = 1, amount, 1 do
Player.Functions.AddItem(ItemData["name"], 1)
TriggerClientEvent('inventory:client:ItemBox', src, ItemData, "add")
Wait(250)
end
else
Player.Functions.AddItem(ItemData["name"], amount)
TriggerClientEvent('inventory:client:ItemBox', src, ItemData, "add")
end
if (Config.CoralLocations[area].TotalCoral - 1) == 0 then
for _, v in pairs(Config.CoralLocations[currentDivingArea].coords.Coral) do
v.PickedUp = false
end
Config.CoralLocations[currentDivingArea].TotalCoral = Config.CoralLocations[currentDivingArea].DefaultCoral
local newLocation = math.random(1, #Config.CoralLocations)
while newLocation == currentDivingArea do
Wait(0)
newLocation = math.random(1, #Config.CoralLocations)
end
currentDivingArea = newLocation
TriggerClientEvent('qb-diving:client:NewLocations', -1)
else
Config.CoralLocations[area].coords.Coral[coral].PickedUp = bool
Config.CoralLocations[area].TotalCoral = Config.CoralLocations[area].TotalCoral - 1
end
TriggerClientEvent('qb-diving:client:UpdateCoral', -1, area, coral, bool)
end)
RegisterNetEvent('qb-diving:server:removeItemAfterFill', function()
local src = source
local Player = QBCore.Functions.GetPlayer(src)
Player.Functions.RemoveItem("diving_fill", 1)
TriggerClientEvent('inventory:client:ItemBox', src, QBCore.Shared.Items["diving_fill"], "remove")
end)
-- Callbacks
QBCore.Functions.CreateCallback('qb-diving:server:GetDivingConfig', function(_, cb)
cb(Config.CoralLocations, currentDivingArea)
end)
-- Items
QBCore.Functions.CreateUseableItem("diving_gear", function(source)
TriggerClientEvent("qb-diving:client:UseGear", source)
end)
QBCore.Functions.CreateUseableItem("diving_fill", function(source)
TriggerClientEvent("qb-diving:client:setoxygenlevel", source)
end)