mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
129 lines
4.3 KiB
Lua
129 lines
4.3 KiB
Lua
|
|
--[[
|
||
|
|
| This file was obtained through the combined efforts
|
||
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
||
|
|
|
|
||
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
||
|
|
|
|
||
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||
|
|
--]]
|
||
|
|
|
||
|
|
|
||
|
|
--- Helper library for reading/writing files to the data folder.
|
||
|
|
-- @module ix.data
|
||
|
|
|
||
|
|
ix.data = ix.data or {}
|
||
|
|
ix.data.stored = ix.data.stored or {}
|
||
|
|
|
||
|
|
-- Create a folder to store data in.
|
||
|
|
file.CreateDir("helix")
|
||
|
|
|
||
|
|
--- Populates a file in the `data/helix` folder with some serialized data.
|
||
|
|
-- @realm shared
|
||
|
|
-- @string key Name of the file to save
|
||
|
|
-- @param value Some sort of data to save
|
||
|
|
-- @bool[opt=false] bGlobal Whether or not to write directly to the `data/helix` folder, or the `data/helix/schema` folder,
|
||
|
|
-- where `schema` is the name of the current schema.
|
||
|
|
-- @bool[opt=false] bIgnoreMap Whether or not to ignore the map and save in the schema folder, rather than
|
||
|
|
-- `data/helix/schema/map`, where `map` is the name of the current map.
|
||
|
|
function ix.data.Set(key, value, bGlobal, bIgnoreMap)
|
||
|
|
-- Get the base path to write to.
|
||
|
|
local path = "helix/" .. (bGlobal and "" or Schema.folder .. "/") .. (bIgnoreMap and "" or game.GetMap() .. "/")
|
||
|
|
|
||
|
|
-- Create the schema folder if the data is not global.
|
||
|
|
if (!bGlobal) then
|
||
|
|
file.CreateDir("helix/" .. Schema.folder .. "/")
|
||
|
|
end
|
||
|
|
|
||
|
|
-- If we're not ignoring the map, create a folder for the map.
|
||
|
|
file.CreateDir(path)
|
||
|
|
-- Write the data using JSON encoding.
|
||
|
|
file.Write(path .. key .. ".txt", util.TableToJSON({value}))
|
||
|
|
|
||
|
|
-- Cache the data value here.
|
||
|
|
ix.data.stored[key] = value
|
||
|
|
|
||
|
|
return path
|
||
|
|
end
|
||
|
|
|
||
|
|
--- Retrieves the contents of a saved file in the `data/helix` folder.
|
||
|
|
-- @realm shared
|
||
|
|
-- @string key Name of the file to load
|
||
|
|
-- @param default Value to return if the file could not be loaded successfully
|
||
|
|
-- @bool[opt=false] bGlobal Whether or not the data is in the `data/helix` folder, or the `data/helix/schema` folder,
|
||
|
|
-- where `schema` is the name of the current schema.
|
||
|
|
-- @bool[opt=false] bIgnoreMap Whether or not to ignore the map and load from the schema folder, rather than
|
||
|
|
-- `data/helix/schema/map`, where `map` is the name of the current map.
|
||
|
|
-- @bool[opt=false] bRefresh Whether or not to skip the cache and forcefully load from disk.
|
||
|
|
-- @return Value associated with the key, or the default that was given if it doesn't exists
|
||
|
|
function ix.data.Get(key, default, bGlobal, bIgnoreMap, bRefresh)
|
||
|
|
-- If it exists in the cache, return the cached value so it is faster.
|
||
|
|
if (!bRefresh) then
|
||
|
|
local stored = ix.data.stored[key]
|
||
|
|
|
||
|
|
if (stored != nil) then
|
||
|
|
return stored
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Get the path to read from.
|
||
|
|
local path = "helix/" .. (bGlobal and "" or Schema.folder .. "/") .. (bIgnoreMap and "" or game.GetMap() .. "/")
|
||
|
|
-- Read the data from a local file.
|
||
|
|
local contents = file.Read(path .. key .. ".txt", "DATA")
|
||
|
|
|
||
|
|
if (contents and contents != "") then
|
||
|
|
local status, decoded = pcall(util.JSONToTable, contents)
|
||
|
|
|
||
|
|
if (status and decoded) then
|
||
|
|
local value = decoded[1]
|
||
|
|
|
||
|
|
if (value != nil) then
|
||
|
|
return value
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Backwards compatibility.
|
||
|
|
-- This may be removed in the future.
|
||
|
|
status, decoded = pcall(pon.decode, contents)
|
||
|
|
|
||
|
|
if (status and decoded) then
|
||
|
|
local value = decoded[1]
|
||
|
|
|
||
|
|
if (value != nil) then
|
||
|
|
return value
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
return default
|
||
|
|
end
|
||
|
|
|
||
|
|
--- Deletes the contents of a saved file in the `data/helix` folder.
|
||
|
|
-- @realm shared
|
||
|
|
-- @string key Name of the file to delete
|
||
|
|
-- @bool[opt=false] bGlobal Whether or not the data is in the `data/helix` folder, or the `data/helix/schema` folder,
|
||
|
|
-- where `schema` is the name of the current schema.
|
||
|
|
-- @bool[opt=false] bIgnoreMap Whether or not to ignore the map and delete from the schema folder, rather than
|
||
|
|
-- `data/helix/schema/map`, where `map` is the name of the current map.
|
||
|
|
-- @treturn bool Whether or not the deletion has succeeded
|
||
|
|
function ix.data.Delete(key, bGlobal, bIgnoreMap)
|
||
|
|
-- Get the path to read from.
|
||
|
|
local path = "helix/" .. (bGlobal and "" or Schema.folder .. "/") .. (bIgnoreMap and "" or game.GetMap() .. "/")
|
||
|
|
-- Read the data from a local file.
|
||
|
|
local contents = file.Read(path .. key .. ".txt", "DATA")
|
||
|
|
|
||
|
|
if (contents and contents != "") then
|
||
|
|
file.Delete(path .. key .. ".txt")
|
||
|
|
ix.data.stored[key] = nil
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
if (SERVER) then
|
||
|
|
timer.Create("ixSaveData", 600, 0, function()
|
||
|
|
hook.Run("SaveData")
|
||
|
|
end)
|
||
|
|
end
|