@@ -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
2022type 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
4246end
@@ -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
6572end
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 , {})
8091end
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+
82107function 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
105133end
106134
107135function ClientInterface :DeletePlayerKey (player : Player , key )
@@ -163,4 +191,16 @@ function ClientInterface:GetPlayerKeyChangedSignal(player: Player, key): Signal.
163191 return self ._signals [player ][key ]
164192end
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+
166206return ClientInterface
0 commit comments