light switch work and new prompt system

This commit is contained in:
2024-04-14 21:40:04 -04:00
parent f670e19c3c
commit 0fa054f97d
8 changed files with 256 additions and 90 deletions

View File

@@ -0,0 +1,48 @@
--!optimize 2
--!native
--!strict
local MapDir = script.Parent
local MainDir = MapDir.Parent
local TagService = require(MainDir:WaitForChild("TagService"))
type LightCallback = (Player: Player) -> ()
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
type Impl_Constructor = {
__index: Impl_Constructor,
constructor: Constructor_Fun,
--Class functions
AddHook: (self: ClassConstructor, Callback: LightCallback) -> (),
Enable: (self: ClassConstructor) -> (),
Disable: (self: ClassConstructor) -> ()
}
type Constructor_Fun = (LightSwitches: TagService.LightSwitchTree) -> ClassConstructor
type Constructor_Return_Props = {
LightSwitches: TagService.LightSwitchTree
}
local Lights = {} :: Impl_Constructor
Lights.__index = Lights
function Lights.constructor(LightSwitches)
return setmetatable({
LightSwitches = LightSwitches
}, Lights)
end
function Lights:AddHook(Callback)
end
function Lights:Enable()
end
function Lights:Disable()
end
return Lights

View File

@@ -0,0 +1,120 @@
--!optimize 2
--!native
--!strict
type PromptCallback = (Player: Player) -> ()
type HumanoidRootPart = BasePart
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
type Impl_Constructor = {
__index: Impl_Constructor,
constructor: Constructor_Fun,
--Class functions
AddHookTriggered: (self: ClassConstructor, Callback: PromptCallback) -> (),
AddHookTriggerEnded: (self: ClassConstructor, Callback: PromptCallback) -> (),
Enable: (self: ClassConstructor) -> (),
Disable: (self: ClassConstructor) -> ()
}
type Constructor_Fun = (Prompt: ProximityPrompt, Instance: Instance, Enabled: boolean?) -> ClassConstructor
type Constructor_Return_Props = {
Prompt: ProximityPrompt,
Instance: Instance,
__TriggeredCallback: PromptCallback?,
__TriggerEndedCallback: PromptCallback?,
__PromptConnections: {
Triggered: RBXScriptConnection?,
TriggerEnded: RBXScriptConnection?
},
}
type PromptSignal = RBXScriptSignal<Player>
type PromptSignalName = "Triggered" | "TriggerEnded"
local Prompts = {} :: Impl_Constructor
Prompts.__index = Prompts
function Prompts.constructor(Prompt, Instance)
return setmetatable({
Prompt = Prompt,
Instance = Instance,
__PromptConnections = {
Triggered = nil,
TriggerEnded = nil
}
}, Prompts)
end
local function DistanceCheck(self: ClassConstructor, Player: Player)
local PlayerCharacter = Player.Character
local Root = PlayerCharacter and PlayerCharacter:FindFirstChild("HumanoidRootPart") :: HumanoidRootPart?
if Root then
if (Root.Position-(self.Instance :: BasePart).Position).Magnitude<=self.Prompt.MaxActivationDistance+1 then
(self.__TriggeredCallback :: PromptCallback)(Player)
else
warn(`{Player.Name}, {Player.UserId} activated a prompt without being in range of MaxActivationDistance.`)
end
end
end
local EnumPromptSignals = {
["Triggered"] = DistanceCheck,
["TriggerEnded"] = DistanceCheck
}
--This is overly automated lol
local function NewPromptConnection(self: ClassConstructor, PromptSignal: PromptSignal, PromptSignalName: PromptSignalName)
if self.Prompt then
if self.Instance then
if self.__PromptConnections[PromptSignalName] and self.__PromptConnections[PromptSignalName].Connected then
warn()
end
self.__PromptConnections[PromptSignalName] = PromptSignal:Connect(function(Player: Player)
EnumPromptSignals[PromptSignalName](self, Player)
end)
else
warn("Button Hook Error! Inst is missing", debug.traceback())
end
else
warn("Button Hook Error! Prompt is missing", debug.traceback())
end
end
function Prompts:AddHookTriggered(Callback)
self.__TriggeredCallback = Callback
NewPromptConnection(self, self.Prompt.Triggered, "Triggered")
end
function Prompts:AddHookTriggerEnded(Callback)
self.__TriggerEndedCallback = Callback
NewPromptConnection(self, self.Prompt.TriggerEnded, "TriggerEnded")
end
function Prompts:Disable()
if self.__PromptConnections.Triggered and self.__PromptConnections.Triggered.Connected then
self.__PromptConnections.Triggered:Disconnect()
end
if self.__PromptConnections.TriggerEnded and self.__PromptConnections.TriggerEnded.Connected then
self.__PromptConnections.TriggerEnded:Disconnect()
end
self.Prompt.Enabled = false
end
function Prompts:Enable()
self.Prompt.Enabled = true
if self.__TriggeredCallback then
self:AddHookTriggered(self.__TriggeredCallback)
end
if self.__TriggerEndedCallback then
self:AddHookTriggerEnded(self.__TriggerEndedCallback)
end
end
return Prompts