@quenty/settings 11.6.0 → 11.6.1-canary.478.2801f00.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/package.json +28 -26
- package/src/Client/Player/PlayerSettingsClient.lua +12 -17
- package/src/Client/SettingsServiceClient.lua +4 -4
- package/src/Server/Player/PlayerHasSettings.lua +6 -6
- package/src/Server/Player/PlayerSettings.lua +16 -19
- package/src/Server/SettingsService.lua +6 -4
- package/src/Shared/Interface/PlayerSettingsInterface.lua +16 -0
- package/src/Shared/Player/PlayerSettingsUtils.lua +2 -6
- package/src/Shared/Setting/SettingDefinition.lua +19 -5
- package/src/Shared/Setting/SettingDefinitionProvider.lua +32 -12
- package/src/Shared/Setting/SettingProperty.lua +2 -2
- package/src/Client/SettingsBindersClient.lua +0 -12
- package/src/Server/SettingsBindersServer.lua +0 -14
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [11.6.1-canary.478.2801f00.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/settings@11.6.0...@quenty/settings@11.6.1-canary.478.2801f00.0) (2024-08-24)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* Unedited all changes ([60e64e3](https://github.com/Quenty/NevermoreEngine/commit/60e64e3efce17c10c4b8965871187d231b338dd4))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
# [11.6.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/settings@11.5.0...@quenty/settings@11.6.0) (2024-05-09)
|
|
7
18
|
|
|
8
19
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quenty/settings",
|
|
3
|
-
"version": "11.6.0",
|
|
3
|
+
"version": "11.6.1-canary.478.2801f00.0",
|
|
4
4
|
"description": "Centralized player settings service",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Roblox",
|
|
@@ -25,33 +25,35 @@
|
|
|
25
25
|
"Quenty"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@quenty/attributeutils": "
|
|
29
|
-
"@quenty/baseobject": "
|
|
30
|
-
"@quenty/binder": "
|
|
31
|
-
"@quenty/cmdrservice": "
|
|
32
|
-
"@quenty/datastore": "
|
|
33
|
-
"@quenty/
|
|
34
|
-
"@quenty/
|
|
35
|
-
"@quenty/
|
|
36
|
-
"@quenty/
|
|
37
|
-
"@quenty/
|
|
38
|
-
"@quenty/
|
|
39
|
-
"@quenty/
|
|
40
|
-
"@quenty/
|
|
41
|
-
"@quenty/
|
|
42
|
-
"@quenty/
|
|
43
|
-
"@quenty/
|
|
44
|
-
"@quenty/
|
|
45
|
-
"@quenty/
|
|
46
|
-
"@quenty/
|
|
47
|
-
"@quenty/
|
|
48
|
-
"@quenty/
|
|
49
|
-
"@quenty/
|
|
50
|
-
"@quenty/
|
|
51
|
-
"@quenty/
|
|
28
|
+
"@quenty/attributeutils": "14.3.1-canary.478.2801f00.0",
|
|
29
|
+
"@quenty/baseobject": "10.3.1-canary.478.2801f00.0",
|
|
30
|
+
"@quenty/binder": "14.4.1-canary.478.2801f00.0",
|
|
31
|
+
"@quenty/cmdrservice": "13.5.1-canary.478.2801f00.0",
|
|
32
|
+
"@quenty/datastore": "13.5.1-canary.478.2801f00.0",
|
|
33
|
+
"@quenty/ducktype": "5.3.1-canary.478.2801f00.0",
|
|
34
|
+
"@quenty/enumutils": "3.2.0",
|
|
35
|
+
"@quenty/jsonutils": "10.3.1-canary.478.2801f00.0",
|
|
36
|
+
"@quenty/loader": "10.3.1-canary.478.2801f00.0",
|
|
37
|
+
"@quenty/maid": "3.2.0",
|
|
38
|
+
"@quenty/observablecollection": "12.3.1-canary.478.2801f00.0",
|
|
39
|
+
"@quenty/playerbinder": "14.4.1-canary.478.2801f00.0",
|
|
40
|
+
"@quenty/playerutils": "8.3.1-canary.478.2801f00.0",
|
|
41
|
+
"@quenty/remotefunctionutils": "10.3.1-canary.478.2801f00.0",
|
|
42
|
+
"@quenty/remoting": "12.4.1-canary.478.2801f00.0",
|
|
43
|
+
"@quenty/rx": "13.3.1-canary.478.2801f00.0",
|
|
44
|
+
"@quenty/rxbinderutils": "14.4.1-canary.478.2801f00.0",
|
|
45
|
+
"@quenty/servicebag": "11.4.1-canary.478.2801f00.0",
|
|
46
|
+
"@quenty/signal": "7.3.1-canary.478.2801f00.0",
|
|
47
|
+
"@quenty/statestack": "14.4.1-canary.478.2801f00.0",
|
|
48
|
+
"@quenty/string": "3.2.0",
|
|
49
|
+
"@quenty/symbol": "3.1.0",
|
|
50
|
+
"@quenty/table": "3.5.0",
|
|
51
|
+
"@quenty/throttle": "10.3.1-canary.478.2801f00.0",
|
|
52
|
+
"@quenty/tie": "10.5.1-canary.478.2801f00.0",
|
|
53
|
+
"@quenty/valueobject": "13.3.1-canary.478.2801f00.0"
|
|
52
54
|
},
|
|
53
55
|
"publishConfig": {
|
|
54
56
|
"access": "public"
|
|
55
57
|
},
|
|
56
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "2801f00e2650bc489a90fedd4613c5ccc9d6f449"
|
|
57
59
|
}
|
|
@@ -10,13 +10,15 @@ local require = require(script.Parent.loader).load(script)
|
|
|
10
10
|
|
|
11
11
|
local Players = game:GetService("Players")
|
|
12
12
|
|
|
13
|
+
local Binder = require("Binder")
|
|
13
14
|
local DataStoreStringUtils = require("DataStoreStringUtils")
|
|
14
15
|
local Maid = require("Maid")
|
|
15
16
|
local Observable = require("Observable")
|
|
16
17
|
local PlayerSettingsBase = require("PlayerSettingsBase")
|
|
17
18
|
local PlayerSettingsConstants = require("PlayerSettingsConstants")
|
|
19
|
+
local PlayerSettingsInterface = require("PlayerSettingsInterface")
|
|
18
20
|
local PlayerSettingsUtils = require("PlayerSettingsUtils")
|
|
19
|
-
local
|
|
21
|
+
local Remoting = require("Remoting")
|
|
20
22
|
local Symbol = require("Symbol")
|
|
21
23
|
local ThrottledFunction = require("ThrottledFunction")
|
|
22
24
|
local ValueObject = require("ValueObject")
|
|
@@ -27,8 +29,6 @@ local PlayerSettingsClient = setmetatable({}, PlayerSettingsBase)
|
|
|
27
29
|
PlayerSettingsClient.ClassName = "PlayerSettingsClient"
|
|
28
30
|
PlayerSettingsClient.__index = PlayerSettingsClient
|
|
29
31
|
|
|
30
|
-
require("PromiseRemoteFunctionMixin"):Add(PlayerSettingsClient, PlayerSettingsConstants.REMOTE_FUNCTION_NAME)
|
|
31
|
-
|
|
32
32
|
--[=[
|
|
33
33
|
See [SettingsBindersClient] and [SettingsServiceClient] on how to properly use this class.
|
|
34
34
|
|
|
@@ -40,21 +40,23 @@ function PlayerSettingsClient.new(folder, serviceBag)
|
|
|
40
40
|
local self = setmetatable(PlayerSettingsBase.new(folder, serviceBag), PlayerSettingsClient)
|
|
41
41
|
|
|
42
42
|
if self:GetPlayer() == Players.LocalPlayer then
|
|
43
|
+
self._remoting = self._maid:Add(Remoting.new(self._obj, "PlayerSettings", Remoting.Realms.CLIENT))
|
|
44
|
+
|
|
43
45
|
self._toReplicate = nil
|
|
44
46
|
self._toReplicateCallbacks = {}
|
|
45
47
|
|
|
46
48
|
-- We only want to keep this data here until we're
|
|
47
49
|
-- actually done sending and the server acknowledges this is the state that
|
|
48
50
|
-- we have. Otherwise we accept the server as the state of truth
|
|
49
|
-
self._pendingReplicationDataInTransit = ValueObject.new(nil)
|
|
50
|
-
self._maid:GiveTask(self._pendingReplicationDataInTransit)
|
|
51
|
+
self._pendingReplicationDataInTransit = self._maid:Add(ValueObject.new(nil))
|
|
51
52
|
|
|
52
53
|
-- We need to avoid sending these quickly because otherwise
|
|
53
54
|
-- sliding a slider can lag out stuff.
|
|
54
|
-
self._queueSendSettingsFunc = ThrottledFunction.new(0.3, function()
|
|
55
|
+
self._queueSendSettingsFunc = self._maid:Add(ThrottledFunction.new(0.3, function()
|
|
55
56
|
self:_sendSettings()
|
|
56
|
-
end, { leading = true, trailing = true })
|
|
57
|
-
|
|
57
|
+
end, { leading = true, trailing = true }))
|
|
58
|
+
|
|
59
|
+
self._maid:GiveTask(PlayerSettingsInterface.Client:Implement(self._obj, self))
|
|
58
60
|
end
|
|
59
61
|
|
|
60
62
|
return self
|
|
@@ -229,14 +231,7 @@ end
|
|
|
229
231
|
function PlayerSettingsClient:_promiseReplicateSettings(settingsMap)
|
|
230
232
|
assert(type(settingsMap) == "table", "Bad settingsMap")
|
|
231
233
|
|
|
232
|
-
return self:
|
|
233
|
-
:Then(function(remoteFunction)
|
|
234
|
-
return self._maid:GivePromise(RemoteFunctionUtils.promiseInvokeServer(
|
|
235
|
-
remoteFunction,
|
|
236
|
-
PlayerSettingsConstants.REQUEST_UPDATE_SETTINGS,
|
|
237
|
-
settingsMap))
|
|
238
|
-
end)
|
|
234
|
+
return self._remoting.RequestUpdateSettings:PromiseInvokeServer(settingsMap)
|
|
239
235
|
end
|
|
240
236
|
|
|
241
|
-
|
|
242
|
-
return PlayerSettingsClient
|
|
237
|
+
return Binder.new("PlayerSettings", PlayerSettingsClient)
|
|
@@ -32,7 +32,7 @@ function SettingsServiceClient:Init(serviceBag)
|
|
|
32
32
|
|
|
33
33
|
-- Internal
|
|
34
34
|
self._serviceBag:GetService(require("SettingRegistryServiceShared")):RegisterSettingService(self)
|
|
35
|
-
self.
|
|
35
|
+
self._playerSettingsBinder = self._serviceBag:GetService(require("PlayerSettingsClient"))
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
function SettingsServiceClient:Start()
|
|
@@ -84,7 +84,7 @@ end
|
|
|
84
84
|
function SettingsServiceClient:ObservePlayerSettings(player)
|
|
85
85
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
86
86
|
|
|
87
|
-
return PlayerSettingsUtils.observePlayerSettings(self.
|
|
87
|
+
return PlayerSettingsUtils.observePlayerSettings(self._playerSettingsBinder, player)
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
--[=[
|
|
@@ -96,7 +96,7 @@ end
|
|
|
96
96
|
function SettingsServiceClient:ObservePlayerSettingsBrio(player)
|
|
97
97
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
98
98
|
|
|
99
|
-
return PlayerSettingsUtils.observePlayerSettingsBrio(self.
|
|
99
|
+
return PlayerSettingsUtils.observePlayerSettingsBrio(self._playerSettingsBinder, player)
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
--[=[
|
|
@@ -108,7 +108,7 @@ end
|
|
|
108
108
|
function SettingsServiceClient:GetPlayerSettings(player)
|
|
109
109
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
110
110
|
|
|
111
|
-
return PlayerSettingsUtils.getPlayerSettings(self.
|
|
111
|
+
return PlayerSettingsUtils.getPlayerSettings(self._playerSettingsBinder, player)
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
--[=[
|
|
@@ -6,10 +6,11 @@ local require = require(script.Parent.loader).load(script)
|
|
|
6
6
|
|
|
7
7
|
local BaseObject = require("BaseObject")
|
|
8
8
|
local PlayerSettingsUtils = require("PlayerSettingsUtils")
|
|
9
|
-
local
|
|
9
|
+
local PlayerSettings = require("PlayerSettings")
|
|
10
10
|
local PlayerDataStoreService = require("PlayerDataStoreService")
|
|
11
11
|
local DataStoreStringUtils = require("DataStoreStringUtils")
|
|
12
12
|
local PlayerSettingsConstants = require("PlayerSettingsConstants")
|
|
13
|
+
local PlayerBinder = require("PlayerBinder")
|
|
13
14
|
|
|
14
15
|
local PlayerHasSettings = setmetatable({}, BaseObject)
|
|
15
16
|
PlayerHasSettings.ClassName = "PlayerHasSettings"
|
|
@@ -19,7 +20,7 @@ function PlayerHasSettings.new(player, serviceBag)
|
|
|
19
20
|
local self = setmetatable(BaseObject.new(player), PlayerHasSettings)
|
|
20
21
|
|
|
21
22
|
self._serviceBag = assert(serviceBag, "No serviceBag")
|
|
22
|
-
self.
|
|
23
|
+
self._playerSettingsBinder = self._serviceBag:GetService(PlayerSettings)
|
|
23
24
|
self._playerDataStoreService = self._serviceBag:GetService(PlayerDataStoreService)
|
|
24
25
|
|
|
25
26
|
self:_promiseLoadSettings()
|
|
@@ -28,8 +29,7 @@ function PlayerHasSettings.new(player, serviceBag)
|
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
function PlayerHasSettings:_promiseLoadSettings()
|
|
31
|
-
self._settings = PlayerSettingsUtils.create(
|
|
32
|
-
self._maid:GiveTask(self._settings)
|
|
32
|
+
self._settings = self._maid:Add(PlayerSettingsUtils.create())
|
|
33
33
|
|
|
34
34
|
self._maid:GivePromise(self._playerDataStoreService:PromiseDataStore(self._obj))
|
|
35
35
|
:Then(function(dataStore)
|
|
@@ -51,7 +51,7 @@ function PlayerHasSettings:_promiseLoadSettings()
|
|
|
51
51
|
end)
|
|
52
52
|
end)
|
|
53
53
|
:Catch(function(err)
|
|
54
|
-
warn(("[PlayerHasSettings] - Failed to load settings for player. %s"
|
|
54
|
+
warn(string.format("[PlayerHasSettings] - Failed to load settings for player. %s", tostring(err)))
|
|
55
55
|
end)
|
|
56
56
|
:Finally(function()
|
|
57
57
|
-- Parent anyway...
|
|
@@ -84,4 +84,4 @@ function PlayerHasSettings:_handleAttributeChanged(subStore, attributeName)
|
|
|
84
84
|
subStore:Store(settingName, newValue)
|
|
85
85
|
end
|
|
86
86
|
|
|
87
|
-
return PlayerHasSettings
|
|
87
|
+
return PlayerBinder.new("PlayerHasSettings", PlayerHasSettings)
|
|
@@ -4,11 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
local require = require(script.Parent.loader).load(script)
|
|
6
6
|
|
|
7
|
+
local Binder = require("Binder")
|
|
8
|
+
local DataStoreStringUtils = require("DataStoreStringUtils")
|
|
7
9
|
local PlayerSettingsBase = require("PlayerSettingsBase")
|
|
8
10
|
local PlayerSettingsConstants = require("PlayerSettingsConstants")
|
|
11
|
+
local PlayerSettingsInterface = require("PlayerSettingsInterface")
|
|
9
12
|
local PlayerSettingsUtils = require("PlayerSettingsUtils")
|
|
13
|
+
local Remoting = require("Remoting")
|
|
10
14
|
local SettingRegistryServiceShared = require("SettingRegistryServiceShared")
|
|
11
|
-
local DataStoreStringUtils = require("DataStoreStringUtils")
|
|
12
15
|
|
|
13
16
|
local PlayerSettings = setmetatable({}, PlayerSettingsBase)
|
|
14
17
|
PlayerSettings.ClassName = "PlayerSettings"
|
|
@@ -20,15 +23,7 @@ function PlayerSettings.new(obj, serviceBag)
|
|
|
20
23
|
self._serviceBag = assert(serviceBag, "No serviceBag")
|
|
21
24
|
self._settingRegistryServiceShared = self._serviceBag:GetService(SettingRegistryServiceShared)
|
|
22
25
|
|
|
23
|
-
self
|
|
24
|
-
self._remoteFunction.Name = PlayerSettingsConstants.REMOTE_FUNCTION_NAME
|
|
25
|
-
self._remoteFunction.Archivable = false
|
|
26
|
-
self._remoteFunction.Parent = self._obj
|
|
27
|
-
self._maid:GiveTask(self._remoteFunction)
|
|
28
|
-
|
|
29
|
-
self._remoteFunction.OnServerInvoke = function(...)
|
|
30
|
-
return self:_handleServerInvoke(...)
|
|
31
|
-
end
|
|
26
|
+
self:_setupRemoting()
|
|
32
27
|
|
|
33
28
|
self._maid:GiveTask(self._settingRegistryServiceShared:ObserveRegisteredDefinitionsBrio():Subscribe(function(brio)
|
|
34
29
|
if brio:IsDead() then
|
|
@@ -39,6 +34,8 @@ function PlayerSettings.new(obj, serviceBag)
|
|
|
39
34
|
self:EnsureInitialized(value:GetSettingName(), value:GetDefaultValue())
|
|
40
35
|
end))
|
|
41
36
|
|
|
37
|
+
self._maid:GiveTask(PlayerSettingsInterface.Server:Implement(self._obj, self))
|
|
38
|
+
|
|
42
39
|
return self
|
|
43
40
|
end
|
|
44
41
|
|
|
@@ -65,17 +62,17 @@ function PlayerSettings:EnsureInitialized(settingName, defaultValue)
|
|
|
65
62
|
end
|
|
66
63
|
end
|
|
67
64
|
|
|
68
|
-
function PlayerSettings:
|
|
69
|
-
|
|
65
|
+
function PlayerSettings:_setupRemoting()
|
|
66
|
+
self._remoting = self._maid:Add(Remoting.new(self._obj, "PlayerSettings", Remoting.Realms.SERVER))
|
|
70
67
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
end
|
|
68
|
+
self._maid:Add(self._remoting.RequestUpdateSettings:Bind(function(player, settingsMap)
|
|
69
|
+
assert(self:GetPlayer() == player, "Bad player")
|
|
70
|
+
|
|
71
|
+
return self:_setSettingsMap(settingsMap)
|
|
72
|
+
end))
|
|
76
73
|
end
|
|
77
74
|
|
|
78
|
-
function PlayerSettings:
|
|
75
|
+
function PlayerSettings:_setSettingsMap(settingsMap)
|
|
79
76
|
assert(type(settingsMap) == "table", "Bad settingsMap")
|
|
80
77
|
|
|
81
78
|
for settingName, value in pairs(settingsMap) do
|
|
@@ -123,4 +120,4 @@ function PlayerSettings:_setSettings(settingsMap)
|
|
|
123
120
|
end
|
|
124
121
|
end
|
|
125
122
|
|
|
126
|
-
return PlayerSettings
|
|
123
|
+
return Binder.new("PlayerSettings", PlayerSettings)
|
|
@@ -22,26 +22,28 @@ function SettingsService:Init(serviceBag)
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
-- Internal
|
|
25
|
-
self.
|
|
25
|
+
self._playerSettingsBinder = self._serviceBag:GetService(require("PlayerSettings"))
|
|
26
|
+
self._serviceBag:GetService(require("PlayerHasSettings"))
|
|
27
|
+
|
|
26
28
|
self._serviceBag:GetService(require("SettingRegistryServiceShared")):RegisterSettingService(self)
|
|
27
29
|
end
|
|
28
30
|
|
|
29
31
|
function SettingsService:ObservePlayerSettingsBrio(player)
|
|
30
32
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
31
33
|
|
|
32
|
-
return PlayerSettingsUtils.observePlayerSettingsBrio(self.
|
|
34
|
+
return PlayerSettingsUtils.observePlayerSettingsBrio(self._playerSettingsBinder, player)
|
|
33
35
|
end
|
|
34
36
|
|
|
35
37
|
function SettingsService:ObservePlayerSettings(player)
|
|
36
38
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
37
39
|
|
|
38
|
-
return PlayerSettingsUtils.observePlayerSettings(self.
|
|
40
|
+
return PlayerSettingsUtils.observePlayerSettings(self._playerSettingsBinder, player)
|
|
39
41
|
end
|
|
40
42
|
|
|
41
43
|
function SettingsService:GetPlayerSettings(player)
|
|
42
44
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
43
45
|
|
|
44
|
-
return PlayerSettingsUtils.getPlayerSettings(self.
|
|
46
|
+
return PlayerSettingsUtils.getPlayerSettings(self._playerSettingsBinder, player)
|
|
45
47
|
end
|
|
46
48
|
|
|
47
49
|
function SettingsService:PromisePlayerSettings(player, cancelToken)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
--[=[
|
|
2
|
+
@class PlayerSettingsInterface
|
|
3
|
+
]=]
|
|
4
|
+
|
|
5
|
+
local require = require(script.Parent.loader).load(script)
|
|
6
|
+
|
|
7
|
+
local TieDefinition = require("TieDefinition")
|
|
8
|
+
|
|
9
|
+
return TieDefinition.new("PlayerSettings", {
|
|
10
|
+
GetSettingProperty = TieDefinition.Types.METHOD;
|
|
11
|
+
GetValue = TieDefinition.Types.METHOD;
|
|
12
|
+
SetValue = TieDefinition.Types.METHOD;
|
|
13
|
+
ObserveValue = TieDefinition.Types.METHOD;
|
|
14
|
+
RestoreDefault = TieDefinition.Types.METHOD;
|
|
15
|
+
EnsureInitialized = TieDefinition.Types.METHOD;
|
|
16
|
+
})
|
|
@@ -20,16 +20,12 @@ local PlayerSettingsUtils = {}
|
|
|
20
20
|
--[=[
|
|
21
21
|
Creates a new player settings
|
|
22
22
|
|
|
23
|
-
@param binder Binder<PlayerSettings>
|
|
24
23
|
@return Folder
|
|
25
24
|
]=]
|
|
26
|
-
function PlayerSettingsUtils.create(
|
|
27
|
-
assert(Binder.isBinder(binder), "No binder")
|
|
28
|
-
|
|
25
|
+
function PlayerSettingsUtils.create()
|
|
29
26
|
local playerSettings = Instance.new("Folder")
|
|
30
27
|
playerSettings.Name = PlayerSettingsConstants.PLAYER_SETTINGS_NAME
|
|
31
|
-
|
|
32
|
-
binder:Bind(playerSettings)
|
|
28
|
+
playerSettings:AddTag("PlayerSettings")
|
|
33
29
|
|
|
34
30
|
return playerSettings
|
|
35
31
|
end
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
local SettingDefinition = require("SettingDefinition")
|
|
11
11
|
|
|
12
12
|
return require("SettingDefinitionProvider").new({
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
LastTimeUpdateSeen = 0;
|
|
14
|
+
LastTimeShopSeen = 0;
|
|
15
15
|
})
|
|
16
16
|
```
|
|
17
17
|
|
|
@@ -24,6 +24,7 @@ local Players = game:GetService("Players")
|
|
|
24
24
|
|
|
25
25
|
local SettingProperty = require("SettingProperty")
|
|
26
26
|
local ServiceBag = require("ServiceBag")
|
|
27
|
+
local DuckTypeUtils = require("DuckTypeUtils")
|
|
27
28
|
|
|
28
29
|
local SettingDefinition = {}
|
|
29
30
|
SettingDefinition.ClassName = "SettingDefinition"
|
|
@@ -38,11 +39,12 @@ SettingDefinition.__index = SettingDefinition
|
|
|
38
39
|
@return SettingDefinition<T>
|
|
39
40
|
]=]
|
|
40
41
|
function SettingDefinition.new(settingName, defaultValue)
|
|
41
|
-
local self = setmetatable({}, SettingDefinition)
|
|
42
|
-
|
|
43
42
|
assert(type(settingName) == "string", "Bad settingName")
|
|
44
43
|
assert(defaultValue ~= nil, "DefaultValue cannot be nil")
|
|
45
44
|
|
|
45
|
+
local self = setmetatable({}, SettingDefinition)
|
|
46
|
+
|
|
47
|
+
|
|
46
48
|
self._settingName = settingName
|
|
47
49
|
self._defaultValue = defaultValue
|
|
48
50
|
|
|
@@ -51,6 +53,16 @@ function SettingDefinition.new(settingName, defaultValue)
|
|
|
51
53
|
return self
|
|
52
54
|
end
|
|
53
55
|
|
|
56
|
+
--[=[
|
|
57
|
+
Returns true if the value is a setting definition
|
|
58
|
+
|
|
59
|
+
@param value any
|
|
60
|
+
@return boolean
|
|
61
|
+
]=]
|
|
62
|
+
function SettingDefinition.isSettingDefinition(value)
|
|
63
|
+
return DuckTypeUtils.isImplementation(SettingDefinition, value)
|
|
64
|
+
end
|
|
65
|
+
|
|
54
66
|
--[=[
|
|
55
67
|
Gets a new setting property for the given definition
|
|
56
68
|
|
|
@@ -60,7 +72,9 @@ end
|
|
|
60
72
|
]=]
|
|
61
73
|
function SettingDefinition:GetSettingProperty(serviceBag, player)
|
|
62
74
|
assert(ServiceBag.isServiceBag(serviceBag), "Bad serviceBag")
|
|
63
|
-
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
75
|
+
assert(typeof(player) == "Instance" and player:IsA("Player") or player == nil, "Bad player")
|
|
76
|
+
|
|
77
|
+
player = player or Players.LocalPlayer
|
|
64
78
|
|
|
65
79
|
return SettingProperty.new(serviceBag, player, self)
|
|
66
80
|
end
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
local SettingDefinition = require("SettingDefinition")
|
|
16
16
|
|
|
17
17
|
return require("SettingDefinitionProvider").new({
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
KeyBinding = Enum.KeyCode.X;
|
|
19
|
+
CameraShake = true;
|
|
20
|
+
CameraSensitivity = 1;
|
|
21
21
|
})
|
|
22
22
|
```
|
|
23
23
|
|
|
@@ -28,6 +28,7 @@ local require = require(script.Parent.loader).load(script)
|
|
|
28
28
|
|
|
29
29
|
local SettingRegistryServiceShared = require("SettingRegistryServiceShared")
|
|
30
30
|
local Maid = require("Maid")
|
|
31
|
+
local SettingDefinition = require("SettingDefinition")
|
|
31
32
|
|
|
32
33
|
local SettingDefinitionProvider = {}
|
|
33
34
|
SettingDefinitionProvider.ClassName = "SettingDefinitionProvider"
|
|
@@ -41,9 +42,9 @@ SettingDefinitionProvider.__index = SettingDefinitionProvider
|
|
|
41
42
|
local SettingDefinition = require("SettingDefinition")
|
|
42
43
|
|
|
43
44
|
return require("SettingDefinitionProvider").new({
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
KeyBinding = Enum.KeyCode.X;
|
|
46
|
+
CameraShake = true;
|
|
47
|
+
CameraSensitivity = 1;
|
|
47
48
|
})
|
|
48
49
|
```
|
|
49
50
|
|
|
@@ -56,14 +57,33 @@ function SettingDefinitionProvider.new(settingDefinitions)
|
|
|
56
57
|
self._settingDefinitions = {}
|
|
57
58
|
self._lookup = {}
|
|
58
59
|
|
|
59
|
-
for
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
for key, value in pairs(settingDefinitions) do
|
|
61
|
+
if type(key) == "number" then
|
|
62
|
+
assert(SettingDefinition.isSettingDefinition(key), "Bad settingDefinition")
|
|
63
|
+
|
|
64
|
+
self:_addSettingDefinition(key)
|
|
65
|
+
elseif type(key) == "string" then
|
|
66
|
+
if SettingDefinition.isSettingDefinition(value) then
|
|
67
|
+
self:_addSettingDefinition(value)
|
|
68
|
+
else
|
|
69
|
+
local definition = SettingDefinition.new(key, value)
|
|
70
|
+
self:_addSettingDefinition(definition)
|
|
71
|
+
end
|
|
72
|
+
else
|
|
73
|
+
error("Bad key for settingDefinitions")
|
|
74
|
+
end
|
|
62
75
|
end
|
|
63
76
|
|
|
64
77
|
return self
|
|
65
78
|
end
|
|
66
79
|
|
|
80
|
+
function SettingDefinitionProvider:_addSettingDefinition(settingDefinition)
|
|
81
|
+
assert(SettingDefinition.isSettingDefinition(settingDefinition), "Bad settingDefinition")
|
|
82
|
+
|
|
83
|
+
table.insert(self._settingDefinitions, settingDefinition)
|
|
84
|
+
self._lookup[settingDefinition:GetSettingName()] = settingDefinition
|
|
85
|
+
end
|
|
86
|
+
|
|
67
87
|
--[=[
|
|
68
88
|
Initializes the provider, storing the data in [SettingRegistryServiceShared]
|
|
69
89
|
|
|
@@ -104,9 +124,9 @@ end
|
|
|
104
124
|
local SettingDefinition = require("SettingDefinition")
|
|
105
125
|
|
|
106
126
|
local provider = require("SettingDefinitionProvider").new({
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
127
|
+
KeyBinding = Enum.KeyCode.X;
|
|
128
|
+
CameraShake = true;
|
|
129
|
+
CameraSensitivity = 1;
|
|
110
130
|
})
|
|
111
131
|
|
|
112
132
|
local service = serviceBag:GetService(provider)
|
|
@@ -83,7 +83,7 @@ function SettingProperty:__index(index)
|
|
|
83
83
|
elseif SettingProperty[index] then
|
|
84
84
|
return SettingProperty[index]
|
|
85
85
|
else
|
|
86
|
-
error(("%q is not a member of SettingProperty %s"
|
|
86
|
+
error(string.format("%q is not a member of SettingProperty %s", tostring(index), self._definition:GetSettingName()))
|
|
87
87
|
end
|
|
88
88
|
end
|
|
89
89
|
|
|
@@ -91,7 +91,7 @@ function SettingProperty:__newindex(index, value)
|
|
|
91
91
|
if index == "Value" then
|
|
92
92
|
self:SetValue(value)
|
|
93
93
|
elseif index == "DefaultValue" or index == "Changed" or SettingProperty[index] then
|
|
94
|
-
error(("Cannot set %q"
|
|
94
|
+
error(string.format("Cannot set %q", tostring(index)))
|
|
95
95
|
else
|
|
96
96
|
rawset(self, index, value)
|
|
97
97
|
end
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
--[=[
|
|
2
|
-
@class SettingsBindersClient
|
|
3
|
-
]=]
|
|
4
|
-
|
|
5
|
-
local require = require(script.Parent.loader).load(script)
|
|
6
|
-
|
|
7
|
-
local BinderProvider = require("BinderProvider")
|
|
8
|
-
local Binder = require("Binder")
|
|
9
|
-
|
|
10
|
-
return BinderProvider.new(script.Name, function(self, serviceBag)
|
|
11
|
-
self:Add(Binder.new("PlayerSettings", require("PlayerSettingsClient"), serviceBag))
|
|
12
|
-
end)
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
--[=[
|
|
2
|
-
@class SettingsBindersServer
|
|
3
|
-
]=]
|
|
4
|
-
|
|
5
|
-
local require = require(script.Parent.loader).load(script)
|
|
6
|
-
|
|
7
|
-
local BinderProvider = require("BinderProvider")
|
|
8
|
-
local Binder = require("Binder")
|
|
9
|
-
local PlayerBinder = require("PlayerBinder")
|
|
10
|
-
|
|
11
|
-
return BinderProvider.new(script.Name, function(self, serviceBag)
|
|
12
|
-
self:Add(Binder.new("PlayerSettings", require("PlayerSettings"), serviceBag))
|
|
13
|
-
self:Add(PlayerBinder.new("PlayerHasSettings", require("PlayerHasSettings"), serviceBag))
|
|
14
|
-
end)
|