107 lines
		
	
	
		
			No EOL
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			No EOL
		
	
	
		
			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) | 
