107 lines
3.2 KiB
Lua
107 lines
3.2 KiB
Lua
-- track down what we've added to global state
|
|
local sentState = {}
|
|
|
|
-- money system
|
|
local ms = exports['money']
|
|
|
|
-- get the fountain content from storage
|
|
local function getMoneyForId(fountainId)
|
|
return GetResourceKvpInt(('money:%s'):format(fountainId)) / 100.0
|
|
end
|
|
|
|
-- set the fountain content in storage + state
|
|
local function setMoneyForId(fountainId, money)
|
|
GlobalState['fountain_' .. fountainId] = math.tointeger(money)
|
|
|
|
return SetResourceKvpInt(('money:%s'):format(fountainId), math.tointeger(money * 100.0))
|
|
end
|
|
|
|
-- get the nearest fountain to the player + ID
|
|
local function getMoneyFountain(id, source)
|
|
local coords = GetEntityCoords(GetPlayerPed(source))
|
|
|
|
for _, v in pairs(moneyFountains) do
|
|
if v.id == id then
|
|
if #(v.coords - coords) < 2.5 then
|
|
return v
|
|
end
|
|
end
|
|
end
|
|
|
|
return nil
|
|
end
|
|
|
|
-- generic function for events
|
|
local function handleFountainStuff(source, id, pickup)
|
|
-- if near the fountain we specify
|
|
local fountain = getMoneyFountain(id, source)
|
|
|
|
if fountain then
|
|
-- and we can actually use the fountain already
|
|
local player = Player(source)
|
|
|
|
local nextUse = player.state['fountain_nextUse']
|
|
if not nextUse then
|
|
nextUse = 0
|
|
end
|
|
|
|
-- GetGameTimer ~ GetNetworkTime on client
|
|
if nextUse <= GetGameTimer() then
|
|
-- not rate limited
|
|
local success = false
|
|
local money = getMoneyForId(fountain.id)
|
|
|
|
-- decide the op
|
|
if pickup then
|
|
-- if the fountain is rich enough to get the per-use amount
|
|
if money >= fountain.amount then
|
|
-- give the player money
|
|
if ms:addMoney(source, 'cash', fountain.amount) then
|
|
money -= fountain.amount
|
|
success = true
|
|
end
|
|
end
|
|
else
|
|
-- if the player is rich enough
|
|
if ms:removeMoney(source, 'cash', fountain.amount) then
|
|
-- add to the fountain
|
|
money += fountain.amount
|
|
success = true
|
|
end
|
|
end
|
|
|
|
-- save it and set the player's cooldown
|
|
if success then
|
|
setMoneyForId(fountain.id, money)
|
|
player.state['fountain_nextUse'] = GetGameTimer() + GetConvarInt('moneyFountain_cooldown', 5000)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- event for picking up fountain->player
|
|
RegisterNetEvent('money_fountain:tryPickup')
|
|
AddEventHandler('money_fountain:tryPickup', function(id)
|
|
handleFountainStuff(source, id, true)
|
|
end)
|
|
|
|
-- event for donating player->fountain
|
|
RegisterNetEvent('money_fountain:tryPlace')
|
|
AddEventHandler('money_fountain:tryPlace', function(id)
|
|
handleFountainStuff(source, id, false)
|
|
end)
|
|
|
|
-- listener: if a new fountain is added, set its current money in state
|
|
CreateThread(function()
|
|
while true do
|
|
Wait(500)
|
|
|
|
for _, fountain in pairs(moneyFountains) do
|
|
if not sentState[fountain.id] then
|
|
GlobalState['fountain_' .. fountain.id] = math.tointeger(getMoneyForId(fountain.id))
|
|
|
|
sentState[fountain.id] = true
|
|
end
|
|
end
|
|
end
|
|
end) |