mirror of
https://github.com/unixtensor/Roblox-Elevator-Game.git
synced 2026-02-04 02:26:49 +00:00
light switch work and new prompt system
This commit is contained in:
48
src/server/main/Map/LightSwitches.lua
Normal file
48
src/server/main/Map/LightSwitches.lua
Normal 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
|
||||
120
src/server/main/Map/Prompts.lua
Normal file
120
src/server/main/Map/Prompts.lua
Normal 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
|
||||
Reference in New Issue
Block a user