yeah sure here’s the code for it: (Keep in mind this code replicates the statsTbl
, not the skillStats
table
[/quote]
local plrConst = {}
local activeTbl = {}
local RunService = game:GetService("RunService")
local transferEvent = script.transfer
function constructMetatbl(originalTbl, callback)
local events = {}
local changedEvent = Instance.new("BindableEvent")
local proxy = setmetatable({}, {
__index = function(self, key)
return rawget(originalTbl, key)
end,
__newindex = function(self, key, v)
if callback then
callback(key, v)
end
changedEvent:Fire(key, v)
if events[key] then
for i, bindable in pairs(events[key]) do
bindable:Fire(v)
end
end
return rawset(originalTbl, key, v)
end,
})
rawset(proxy, "Changed",changedEvent.Event ) -- rawset to prevent data from being changed
--proxy.Changed = changedEvent.Event
local function getPropertyChangedSignal(key)
local properyChangedEvent = Instance.new("BindableEvent")
events[key] = events[key] or {}
table.insert(events[key], properyChangedEvent)
return properyChangedEvent.Event
end
rawset(proxy, "getPropertyChangedSignal", getPropertyChangedSignal)
return proxy
end
function plrConst:addNewPlr(plr, dataTbl)
if not activeTbl[plr] then
local plrStatsProxy = constructMetatbl(plrStatsTbl, function(key, v)
transferEvent:FireClient(plr, {tab = "plrStats", Key = key, Val = v})
end)
local dataProxy = constructMetatbl(dataTbl, function(key, v)
transferEvent:FireClient(plr, {tab = "data", Key = key, Val = v})
end)
local newTbl = {
plrStats = plrStatsProxy,
data = dataProxy,
}
activeTbl[plr] = newTbl
transferEvent:FireClient(plr, {newTbl = { -- send non-metatables cuz client can't recieve metatables
plrStats = plrStatsTbl,
data = dataTbl,
}})
return newTbl
end
end
function plrConst:returnTbl(plr, key)
if activeTbl[plr] then
return activeTbl[plr][key] or activeTbl[plr]
end
end
function plrConst:updateKeyInStats(plr, key, val)
if activeTbl[plr] then
activeTbl[plr].plrStats[key] = val
end
end
function plrConst:updateStats(plr, newStats)
activeTbl[plr].plrStats = newStats
transferEvent:FireClient(plr, {stats = newStats})
end
function plrConst:updateKeyInData(plr, key, val)
activeTbl[plr].data[key] = val
end
if RunService:IsClient() then
local plr = game.Players.LocalPlayer
transferEvent.OnClientEvent:Connect(function(args)
if args.newTbl then -- construct
args.newTbl = {
plrStats = constructMetatbl(args.newTbl.plrStats),
data = constructMetatbl(args.newTbl.data),
}
activeTbl[plr] = args.newTbl or activeTbl[plr]
end
--printTable(args, "")
if args.Key and args.tab then
activeTbl[plr][args.tab][args.Key] = args.Val
end
end)
end
return plrConst
Although binding a changed event and update the table does work, I’m trying to avoid this to get maximum efficiency