/
ResetService.lua
69 lines (52 loc) · 1.76 KB
/
ResetService.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
--[=[
Handles reset requests since Roblox's reset system doesn't handle ragdolls correctly
@server
@class ResetService
]=]
local require = require(script.Parent.loader).load(script)
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Remoting = require("Remoting")
local Maid = require("Maid")
local StateStack = require("StateStack")
local PlayerUtils = require("PlayerUtils")
local Promise = require("Promise")
local ResetService = {}
ResetService.ServiceName = "ResetService"
--[=[
Initializes the reset service. Should be done via a [ServiceBag].
]=]
function ResetService:Init()
assert(not self._remoteEvent, "Already initialized")
self._maid = Maid.new()
self._remoting = self._maid:Add(Remoting.new(ReplicatedStorage, "ResetService"))
self._maid:GiveTask(self._remoting.ResetCharacter:Bind(function(player)
return self:PromiseResetCharacter(player)
end))
self._resetProviderStack = self._maid:Add(StateStack.new(function(player)
return PlayerUtils.promiseLoadCharacter(player)
end, "function"))
end
--[=[
Pushes a reset provider onto the reset service
@param promiseReset function -- Reset provider
@return MaidTask
]=]
function ResetService:PushResetProvider(promiseReset)
assert(type(promiseReset) == "function", "Bad promiseReset")
return self._resetProviderStack:PushState(promiseReset)
end
function ResetService:PromiseResetCharacter(player)
assert(typeof(player) == "Instance", "Bad player")
if not player:IsDescendantOf(game) then
return Promise.rejected("Player is not descendant of game")
end
local provider = self._resetProviderStack:GetState()
if not provider then
return Promise.rejected("No reset provider")
end
return provider(player)
end
function ResetService:Destroy()
self._maid:DoCleaning()
end
return ResetService