mirror of
https://github.com/unixtensor/Roblox-Elevator-Game.git
synced 2025-12-14 14:51:55 +00:00
Light module
This commit is contained in:
@@ -5,7 +5,12 @@
|
||||
local MapDir = script.Parent
|
||||
local MainDir = MapDir.Parent
|
||||
|
||||
local TagService = require(MainDir:WaitForChild("Tags"))
|
||||
local Storage = game:GetService("ReplicatedStorage")
|
||||
|
||||
local TagService = require(MainDir:WaitForChild("Tags"))
|
||||
local TweenModule = require(Storage:WaitForChild("Tween"))
|
||||
|
||||
local PromptsConstructor = require(MapDir:WaitForChild("Prompts"))
|
||||
|
||||
type LightCallback = (Player: Player) -> ()
|
||||
|
||||
@@ -14,9 +19,11 @@ type Impl_Constructor = {
|
||||
__index: Impl_Constructor,
|
||||
constructor: Constructor_Fun,
|
||||
--Class functions
|
||||
AddHook: (self: ClassConstructor, Callback: LightCallback) -> (),
|
||||
Enable: (self: ClassConstructor) -> (),
|
||||
Disable: (self: ClassConstructor) -> ()
|
||||
Create: (self: ClassConstructor) -> (),
|
||||
} & Impl_Static_Props
|
||||
|
||||
type Impl_Static_Props = {
|
||||
SwitchAnimationTime: number
|
||||
}
|
||||
|
||||
type Constructor_Fun = (LightSwitches: TagService.LightSwitchTree) -> ClassConstructor
|
||||
@@ -24,25 +31,83 @@ type Constructor_Return_Props = {
|
||||
LightSwitches: TagService.LightSwitchTree
|
||||
}
|
||||
|
||||
export type LightProperties = TagService.LightSwitchProperties
|
||||
|
||||
local Lights = {} :: Impl_Constructor
|
||||
Lights.__index = Lights
|
||||
|
||||
Lights.SwitchAnimationTime = .1
|
||||
|
||||
local LightSwitchTween = TweenModule.constructor(TweenInfo.new(Lights.SwitchAnimationTime, Enum.EasingStyle.Linear))
|
||||
|
||||
function Lights.constructor(LightSwitches)
|
||||
return setmetatable({
|
||||
LightSwitches = LightSwitches
|
||||
}, Lights)
|
||||
end
|
||||
|
||||
function Lights:AddHook(Callback)
|
||||
|
||||
local function ToggleSwitchLight(EnabledState: boolean, LightObject: BasePart, LightProperties: LightProperties)
|
||||
local Light = LightObject:FindFirstChildWhichIsA("PointLight", true) or LightObject:FindFirstChildWhichIsA("SpotLight", true)
|
||||
|
||||
if Light then
|
||||
Light.Enabled = EnabledState
|
||||
end
|
||||
if EnabledState then
|
||||
if LightProperties.ColorActivated then
|
||||
LightObject.Color = LightProperties.ColorActivated
|
||||
LightObject.Material = Enum.Material.Neon
|
||||
end
|
||||
else
|
||||
if LightProperties.ColorDeactivated then
|
||||
LightObject.Color = LightProperties.ColorDeactivated
|
||||
LightObject.Material = Enum.Material.SmoothPlastic
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Lights:Enable()
|
||||
local function SwitchAnimation(EnabledState: boolean, LightProperties: LightProperties)
|
||||
local Switch = LightProperties.Switch
|
||||
|
||||
if Switch then
|
||||
if EnabledState then
|
||||
LightSwitchTween:Start(Switch, {
|
||||
CFrame = CFrame.new(Switch.Position)*CFrame.Angles(0,math.rad(90),0)+Vector3.new(0,.15,0)
|
||||
})
|
||||
else
|
||||
LightSwitchTween:Start(Switch, {
|
||||
CFrame = CFrame.new(Switch.Position)*CFrame.Angles(0,math.rad(90),math.rad(70))-Vector3.new(0,.15,0)
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Lights:Disable()
|
||||
--[[
|
||||
Guide for lights with toggable switches:
|
||||
TODO
|
||||
]]
|
||||
function Lights:Create()
|
||||
for _, LightProperties in self.LightSwitches do
|
||||
if LightProperties.Prompt and LightProperties.Switch then
|
||||
local Prompt = PromptsConstructor.constructor(LightProperties.Prompt, LightProperties.Switch)
|
||||
local EnabledState = false
|
||||
|
||||
if LightProperties.ColorDeactivated and LightProperties.ColorActivated and LightProperties.Prompt and LightProperties.Lights then
|
||||
Prompt:AddHookTriggered(function(_Player: Player)
|
||||
EnabledState = not EnabledState
|
||||
|
||||
SwitchAnimation(EnabledState, LightProperties)
|
||||
if LightProperties.ClickSound then
|
||||
LightProperties.ClickSound:Play()
|
||||
end
|
||||
for n: number = 1, #LightProperties.Lights do
|
||||
ToggleSwitchLight(EnabledState, LightProperties.Lights[n], LightProperties)
|
||||
end
|
||||
end)
|
||||
else
|
||||
warn(`Prompt failed`)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return Lights
|
||||
@@ -2,16 +2,18 @@
|
||||
--!native
|
||||
--!strict
|
||||
|
||||
type PromptCallback = (Player: Player) -> ()
|
||||
type PromptCallback = (Player: Player) -> ()
|
||||
type HumanoidRootPart = BasePart
|
||||
type PromptSignal = RBXScriptSignal<Player>
|
||||
type PromptSignalName = "Triggered" | "TriggerEnded"
|
||||
|
||||
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) -> (),
|
||||
AddHookTriggered: (self: ClassConstructor, Callback: PromptCallback) -> PromptSignal?,
|
||||
AddHookTriggerEnded: (self: ClassConstructor, Callback: PromptCallback) -> PromptSignal?,
|
||||
Enable: (self: ClassConstructor) -> (),
|
||||
Disable: (self: ClassConstructor) -> ()
|
||||
}
|
||||
@@ -29,9 +31,6 @@ type Constructor_Return_Props = {
|
||||
},
|
||||
}
|
||||
|
||||
type PromptSignal = RBXScriptSignal<Player>
|
||||
type PromptSignalName = "Triggered" | "TriggerEnded"
|
||||
|
||||
local Prompts = {} :: Impl_Constructor
|
||||
Prompts.__index = Prompts
|
||||
|
||||
@@ -67,6 +66,8 @@ local EnumPromptSignals = {
|
||||
|
||||
--This is overly automated lol
|
||||
local function NewPromptConnection(self: ClassConstructor, PromptSignal: PromptSignal, PromptSignalName: PromptSignalName)
|
||||
local Signal: PromptSignal?
|
||||
|
||||
if self.Prompt then
|
||||
if self.Instance then
|
||||
if self.__PromptConnections[PromptSignalName] and self.__PromptConnections[PromptSignalName].Connected then
|
||||
@@ -76,25 +77,28 @@ local function NewPromptConnection(self: ClassConstructor, PromptSignal: PromptS
|
||||
self.__PromptConnections[PromptSignalName] = PromptSignal:Connect(function(Player: Player)
|
||||
EnumPromptSignals[PromptSignalName](self, Player)
|
||||
end)
|
||||
Signal = self.__PromptConnections[PromptSignalName]
|
||||
else
|
||||
warn("Button Hook Error! Inst is missing", debug.traceback())
|
||||
end
|
||||
else
|
||||
warn("Button Hook Error! Prompt is missing", debug.traceback())
|
||||
end
|
||||
|
||||
return Signal
|
||||
end
|
||||
|
||||
function Prompts:AddHookTriggered(Callback)
|
||||
self.__TriggeredCallback = Callback
|
||||
|
||||
--These dont make sense...
|
||||
NewPromptConnection(self, self.Prompt.Triggered, "Triggered")
|
||||
return NewPromptConnection(self, self.Prompt.Triggered, "Triggered")
|
||||
end
|
||||
|
||||
function Prompts:AddHookTriggerEnded(Callback)
|
||||
self.__TriggerEndedCallback = Callback
|
||||
|
||||
NewPromptConnection(self, self.Prompt.TriggerEnded, "TriggerEnded")
|
||||
return NewPromptConnection(self, self.Prompt.TriggerEnded, "TriggerEnded")
|
||||
end
|
||||
|
||||
function Prompts:Disable()
|
||||
@@ -111,10 +115,10 @@ end
|
||||
function Prompts:Enable()
|
||||
self.Prompt.Enabled = true
|
||||
|
||||
if self.__TriggeredCallback then
|
||||
if self.__TriggeredCallback and not (self.__PromptConnections.Triggered and self.__PromptConnections.Triggered.Connected) then
|
||||
self:AddHookTriggered(self.__TriggeredCallback)
|
||||
end
|
||||
if self.__TriggerEndedCallback then
|
||||
if self.__TriggerEndedCallback and not (self.__PromptConnections.TriggerEnded and self.__PromptConnections.TriggerEnded.Connected) then
|
||||
self:AddHookTriggerEnded(self.__TriggerEndedCallback)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -10,10 +10,6 @@ local Enums = require(Storage:WaitForChild("Enums"))
|
||||
local Elevators = script:WaitForChild("Elevators")
|
||||
local Otis1960_Module = require(Elevators:WaitForChild("Otis1960"))
|
||||
|
||||
local Map = script:WaitForChild("Map")
|
||||
local LightSwitchesConstructor = require(Map:WaitForChild("LightSwitches"))
|
||||
local PromptsConstructor = require(Map:WaitForChild("Prompts"))
|
||||
|
||||
local TagsModule = require(script:WaitForChild("Tags"))
|
||||
local HideEditorEntities = require(script:WaitForChild("EditorEntities"))
|
||||
local Lighting_Stuff = require(script:WaitForChild("Lighting"))
|
||||
@@ -30,67 +26,10 @@ StarterPlayer_Stuff()
|
||||
Lighting_Stuff()
|
||||
Workspace_Stuff()
|
||||
|
||||
|
||||
--Map
|
||||
local Interactables = TagsConstructor:__Interactables()
|
||||
print("[DEBUG] Interactables=", Interactables)
|
||||
|
||||
--Temporary
|
||||
--[[
|
||||
Guide for lights with toggable switches:
|
||||
TODO
|
||||
]]
|
||||
local TweenModule = require(Storage:WaitForChild("Tween"))
|
||||
local LightSwitchTween = TweenModule.constructor(TweenInfo.new(.1, Enum.EasingStyle.Linear))
|
||||
|
||||
for _, LightProperties in Interactables.LightSwitches do
|
||||
if LightProperties.Prompt and LightProperties.Switch then
|
||||
local Prompt = PromptsConstructor.constructor(LightProperties.Prompt, LightProperties.Switch)
|
||||
local LightEnabled = false
|
||||
|
||||
if LightProperties.ColorDeactivated and LightProperties.ColorActivated and LightProperties.Prompt and LightProperties.Lights then
|
||||
Prompt:AddHookTriggered(function(_Player: Player)
|
||||
LightEnabled = not LightEnabled
|
||||
|
||||
local Switch = LightProperties.Switch
|
||||
if LightEnabled then
|
||||
LightSwitchTween:Start(Switch, {
|
||||
CFrame = CFrame.new(Switch.Position)*CFrame.Angles(0,math.rad(90),0)+Vector3.new(0,.15,0)
|
||||
})
|
||||
else
|
||||
LightSwitchTween:Start(Switch, {
|
||||
CFrame = CFrame.new(Switch.Position)*CFrame.Angles(0,math.rad(90),math.rad(70))-Vector3.new(0,.15,0)
|
||||
})
|
||||
end
|
||||
|
||||
if LightProperties.ClickSound then
|
||||
LightProperties.ClickSound:Play()
|
||||
end
|
||||
|
||||
for n: number = 1, #LightProperties.Lights do
|
||||
local LightObj = LightProperties.Lights[n]
|
||||
local Light = LightObj:FindFirstChildWhichIsA("PointLight", true) or LightObj:FindFirstChildWhichIsA("SpotLight", true)
|
||||
if Light then
|
||||
Light.Enabled = LightEnabled
|
||||
end
|
||||
if LightEnabled then
|
||||
LightObj.Color = LightProperties.ColorActivated
|
||||
LightObj.Material = Enum.Material.Neon
|
||||
else
|
||||
LightObj.Color = LightProperties.ColorDeactivated
|
||||
LightObj.Material = Enum.Material.SmoothPlastic
|
||||
end
|
||||
end
|
||||
end)
|
||||
else
|
||||
warn("failed")
|
||||
end
|
||||
end
|
||||
end
|
||||
--
|
||||
|
||||
--local LightSwitches = LightSwitchesConstructor.constructor(Interactables.LightSwitches)
|
||||
|
||||
--Start the elevators
|
||||
local Buttons = TagsConstructor:__ElevatorButtons()
|
||||
print("[DEBUG] Buttons=", Buttons)
|
||||
|
||||
Reference in New Issue
Block a user