zworld-em/Content/Script/Core/DataMgr.lua
2025-05-11 22:07:21 +08:00

147 lines
4.5 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local DataMgr = setmetatable({},{
__index = function(t, key)
return require("Datas."..key)
end})
function DataMgr.Print_t ( t )
-- print table
local print_r_cache={}
local function sub_print_r(t,indent)
if (print_r_cache[tostring(t)]) then
print(indent.."*"..tostring(t))
else
print_r_cache[tostring(t)]=true
if (type(t)=="table") then
for pos,val in pairs(t) do
if (type(val)=="table") then
print(indent.."["..pos.."] => "..tostring(t).." {")
sub_print_r(val,indent..string.rep(" ",string.len(pos)+8))
print(indent..string.rep(" ",string.len(pos)+6).."}")
elseif (type(val)=="string") then
print(indent.."["..pos..'] => "'..val..'"')
else
print(indent.."["..pos.."] => "..tostring(val))
end
end
else
print(indent..tostring(t))
end
end
end
if (type(t)=="table") then
print(tostring(t).." {")
sub_print_r(t," ")
print("}")
else
sub_print_r(t," ")
end
print()
end
function DataMgr.GetData(filename)
local pro_path = UE4.UKismetSystemLibrary.GetProjectContentDirectory()
local file = io.open(pro_path..'../Datas/'..filename .. '.json', "r")
local info = file:read("*a")
file:close()
local json= require("rapidjson")
local res = json.decode(info)
return res
end
function DataMgr.GetLevelLoaderJsonData(shortname)
local pro_path = UE4.UKismetSystemLibrary.GetProjectContentDirectory()
local path=pro_path..'Script/Datas/Houdini_data/'..shortname .. '.json'
local info = UE4.URuntimeCommonFunctionLibrary.LoadFile(path)
-- local file = io.open(path, "r")
-- local info = file:read("*a")
-- file:close()
local json= require("rapidjson")
local res = json.decode(info)
return res
end
-- 预加载数据表将所有的数据表全部加载到内存中减少之后读表index的时间消耗
function DataMgr.PreLoad()
local DataNames = require("Datas.DataNames")
for _, DataName in pairs(DataNames) do
require("Datas."..DataName)
end
end
local all_tables = {}
function DataMgr.CollectTable(Table)
for k, tbl in pairs(all_tables) do
if tbl == Table then
all_tables[k] = nil
for k, v in pairs(tbl) do
if type(v) == "table" then
DataMgr.CollectTable(v)
end
end
break
end
end
end
DataMgr.ReadOnly_NewIndex = function(t, k, v)
local rawset = rawset
local getmetatable = getmetatable
error("没法对导表数据【" .. tostring(t.__name) .."】中字段【" .. tostring(k) .. "】进行写操作")
end
function DataMgr.CleanAllTable()
all_tables = {}
local DataNames = require("Datas.DataNames")
local HotFix = require("HotFix")
local data_module_table = rawget(HotFix, "data_module_table")
for _, DataName in pairs(DataNames) do
if not (data_module_table and data_module_table[DataName]) then
require("UnLuaHotReload").RemoveLoadedModule("Datas."..DataName)
end
end
end
function read_only(name, tbl)
if not all_tables[tbl] then
local tbl_mt = getmetatable(tbl)
if not tbl_mt then
tbl_mt = {}
setmetatable(tbl, tbl_mt)
end
local proxy = tbl_mt.__read_only_proxy
if not proxy then
proxy = {__name = name}
tbl_mt.__read_only_proxy = proxy
local proxy_mt = {
__index = tbl,
__newindex = DataMgr.ReadOnly_NewIndex,
__pairs = function (t) return pairs(tbl) end,
-- __ipairs = function (t) return ipairs(tbl) end, 5.3版本不需要此方法
__len = function (t) return #tbl end,
__read_only_proxy = proxy
}
setmetatable(proxy, proxy_mt)
end
all_tables[tbl] = proxy
for k, v in pairs(tbl) do
if type(v) == "table" then
tbl[k] = read_only(name, v)
end
end
end
return all_tables[tbl]
end
--if URuntimeCommonFunctionLibrary.IsDebugDataTable() then
if true then
DataMgr.ReadOnly = read_only
else
DataMgr.ReadOnly = function (name, tbl)
return tbl
end
end
_G.DataMgr = DataMgr
return DataMgr