Skip to content

Commit d10c095

Browse files
committed
Enhanced ClientInterface
1 parent 1c7fa52 commit d10c095

1 file changed

Lines changed: 40 additions & 0 deletions

File tree

src/State/Modules/ClientInterface.luau

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,19 @@ export type ClientManager = {
1010
GetPlayerData: (self: ClientManager, player: Player) -> { any },
1111
SetPlayerData: (self: ClientManager, player: Player, val: {}) -> nil,
1212
DeletePlayerData: (self: ClientManager, player: Player) -> nil,
13+
UpdatePlayerData: (self: ClientManager, player: Player, callback: (any) -> any) -> nil,
1314
SetPlayerKey: (self: ClientManager, player: Player, key: any, val: any) -> nil,
1415
DeletePlayerKey: (self: ClientManager, player: Player, key: any) -> nil,
1516
UpdatePlayerKey: (self: ClientManager, player: Player, key: any, callback: (any) -> any) -> nil,
1617
GetPlayerKey: (self: ClientManager, player: Player, key: any) -> any,
1718
GetPlayerKeyChangedSignal: (self: ClientManager, player: Player, key: any) -> Signal.Signal<any>,
19+
GetPlayerDataChangedSignal: (self: ClientManager, player: Player) -> Signal.Signal<any>,
1820
}
1921

2022
type self = {
2123
_state: {},
2224
_signals: { [Player]: { [any]: Signal.Signal<any> } },
25+
_dataChangedSignal: { [Player]: Signal.Signal<any> },
2326
_name: string,
2427
} & ClientManager
2528

@@ -37,6 +40,7 @@ function ClientInterface.new(name: string): self | nil
3740
self._name = name
3841
self._state = {}
3942
self._signals = {}
43+
self._dataChangedSignal = {}
4044

4145
return self
4246
end
@@ -61,6 +65,9 @@ function ClientInterface:SetPlayerData(player: Player, val: {})
6165
end
6266

6367
Network.Fire("_FRAMEWORK/UpdateSharedInterface-" .. self._name, player, val)
68+
if Signal.Is(self._dataChangedSignal[player]) then
69+
self._dataChangedSignal[player]:Fire(val)
70+
end
6471
self._state[player] = val
6572
end
6673

@@ -75,10 +82,28 @@ function ClientInterface:DeletePlayerData(player: Player)
7582
v:Destroy()
7683
end
7784
end
85+
if Signal.Is(self._dataChangedSignal[player]) then
86+
self._dataChangedSignal[player]:Destroy()
87+
end
88+
self._dataChangedSignal[player] = nil
7889
self._signals[player] = {}
7990
self:SetPlayerData(player, {})
8091
end
8192

93+
function ClientInterface:UpdatePlayerData(player: Player, callback: (old: any) -> any)
94+
if typeof(player) ~= "Instance" or not player:IsDescendantOf(Players) then
95+
return
96+
end
97+
self = self :: self
98+
local old = self:GetPlayerData(player)
99+
if not old then
100+
return
101+
end
102+
103+
local newVal = callback(old)
104+
self:SetPlayerData(player, newVal)
105+
end
106+
82107
function ClientInterface:SetPlayerKey(player: Player, key, val)
83108
if typeof(player) ~= "Instance" or not player:IsDescendantOf(Players) then
84109
warn("Expected a table, got " .. typeof(player))
@@ -102,6 +127,9 @@ function ClientInterface:SetPlayerKey(player: Player, key, val)
102127
Network.Fire("_FRAMEWORK/UpdateSharedInterface-" .. self._name, player, changes)
103128

104129
self._state[player][key] = val
130+
if Signal.Is(self._dataChangedSignal[player]) then
131+
self._dataChangedSignal[player]:Fire(self:GetPlayerData(player))
132+
end
105133
end
106134

107135
function ClientInterface:DeletePlayerKey(player: Player, key)
@@ -163,4 +191,16 @@ function ClientInterface:GetPlayerKeyChangedSignal(player: Player, key): Signal.
163191
return self._signals[player][key]
164192
end
165193

194+
function ClientInterface:GetPlayerDataChangedSignal(player: Player): Signal.Signal<any> | nil
195+
if typeof(player) ~= "Instance" or not player:IsDescendantOf(Players) then
196+
return
197+
end
198+
self = self :: self
199+
if not Signal.Is(self._dataChangedSignal[player]) then
200+
self._dataChangedSignal[player] = Signal.new()
201+
end
202+
203+
return self._dataChangedSignal[player]
204+
end
205+
166206
return ClientInterface

0 commit comments

Comments
 (0)