From 73045d5bf6ae1e2786a40ae6d5510628c27e23b8 Mon Sep 17 00:00:00 2001 From: unittensor Date: Sat, 11 May 2024 00:03:21 -0400 Subject: [PATCH] Big elevator refactoring --- obsidian/Elevators.md | 0 sourcemap.json | 2 +- src/server/main/Elevators/Buttons.lua | 156 ++++++++++++++---- .../Elevators/{Otis1960 => }/HallDisplays.lua | 0 src/server/main/Elevators/Lanterns.lua | 39 +++-- .../main/Elevators/Otis1960/Leveling.lua | 2 +- src/server/main/Elevators/Otis1960/init.lua | 148 +++++++++++------ src/server/main/Enums/Sounds.lua | 19 +++ src/server/main/Load/Tags/Buttons.lua | 48 +----- 9 files changed, 272 insertions(+), 142 deletions(-) create mode 100644 obsidian/Elevators.md rename src/server/main/Elevators/{Otis1960 => }/HallDisplays.lua (100%) create mode 100644 src/server/main/Enums/Sounds.lua diff --git a/obsidian/Elevators.md b/obsidian/Elevators.md new file mode 100644 index 0000000..e69de29 diff --git a/sourcemap.json b/sourcemap.json index ab85fce..8d76dba 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"ElevatorGame","className":"DataModel","filePaths":["default.project.json"],"children":[{"name":"ReplicatedFirst","className":"ReplicatedFirst","children":[{"name":"intro","className":"LocalScript","filePaths":["src/load\\intro\\init.client.lua"],"children":[{"name":"IntroGui","className":"ModuleScript","filePaths":["src/load\\intro\\IntroGui.lua"]}]}]},{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Algebra","className":"ModuleScript","filePaths":["src/shared\\Algebra.lua"]},{"name":"Client","className":"Folder","children":[{"name":"Camera","className":"ModuleScript","filePaths":["src/shared\\Client\\Camera.lua"]},{"name":"KeyBinds","className":"ModuleScript","filePaths":["src/shared\\Client\\KeyBinds.lua"]}]},{"name":"Delta","className":"ModuleScript","filePaths":["src/shared\\Delta.lua"]},{"name":"Enums","className":"ModuleScript","filePaths":["src/shared\\Enums.lua"]},{"name":"Property","className":"ModuleScript","filePaths":["src/shared\\Property.lua"]},{"name":"Server","className":"Folder","children":[{"name":"holder","className":"ModuleScript","filePaths":["src/shared\\Server\\holder.lua"]}]},{"name":"Tween","className":"ModuleScript","filePaths":["src/shared\\Tween.lua"]}]},{"name":"ServerScriptService","className":"ServerScriptService","children":[{"name":"rapid/server","className":"Actor","children":[{"name":"main","className":"Script","filePaths":["src/server\\main\\init.server.lua"],"children":[{"name":"Elevators","className":"Folder","children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Buttons.lua"]},{"name":"Lanterns","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Lanterns.lua"]},{"name":"Mover","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Mover.lua"]},{"name":"Otis1960","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Otis1960\\init.lua"],"children":[{"name":"Doors","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Otis1960\\Doors.lua"]},{"name":"HallDisplays","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Otis1960\\HallDisplays.lua"]},{"name":"Leveling","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Otis1960\\Leveling.lua"]},{"name":"MovingObjects","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Otis1960\\MovingObjects.lua"]}]},{"name":"TractionRopes","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\TractionRopes.lua"]}]},{"name":"Lighting","className":"ModuleScript","filePaths":["src/server\\main\\Lighting\\init.lua"]},{"name":"Load","className":"Folder","children":[{"name":"EditorEntities","className":"ModuleScript","filePaths":["src/server\\main\\Load\\EditorEntities.lua"]},{"name":"StarterPlayer","className":"ModuleScript","filePaths":["src/server\\main\\Load\\StarterPlayer.lua"]},{"name":"Tags","className":"ModuleScript","filePaths":["src/server\\main\\Load\\Tags\\init.lua"],"children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server\\main\\Load\\Tags\\Buttons.lua"]},{"name":"Lights","className":"ModuleScript","filePaths":["src/server\\main\\Load\\Tags\\Lights.lua"]}]},{"name":"Workspace","className":"ModuleScript","filePaths":["src/server\\main\\Load\\Workspace.lua"]}]},{"name":"Map","className":"Folder","children":[{"name":"Interactions","className":"Folder","children":[{"name":"LightSwitches","className":"ModuleScript","filePaths":["src/server\\main\\Map\\Interactions\\LightSwitches.lua"]}]},{"name":"Prompts","className":"ModuleScript","filePaths":["src/server\\main\\Map\\Prompts.lua"]}]},{"name":"PlayerAdded","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\init.lua"],"children":[{"name":"Character","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\Character\\init.lua"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\Character\\Actions.lua"]},{"name":"Flashlight","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\Character\\Flashlight.lua"]},{"name":"Shadows","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\Character\\Shadows.lua"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\Character\\SpineKinematics.lua"]}]},{"name":"Users","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\Users.lua"]}]}]}]}]},{"name":"StarterPlayer","className":"StarterPlayer","children":[{"name":"StarterPlayerScripts","className":"StarterPlayerScripts","children":[{"name":"rapid/client","className":"Folder","children":[{"name":"Player","className":"LocalScript","filePaths":["src/client\\init.client.lua"],"children":[{"name":"Character","className":"ModuleScript","filePaths":["src/client\\Character\\init.lua"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/client\\Character\\Actions.lua"]},{"name":"Camera","className":"ModuleScript","filePaths":["src/client\\Character\\Camera\\init.lua"],"children":[{"name":"Bobbing","className":"ModuleScript","filePaths":["src/client\\Character\\Camera\\Bobbing.lua"]}]},{"name":"Humanoid","className":"ModuleScript","filePaths":["src/client\\Character\\Humanoid.lua"]},{"name":"HumanoidRootPart","className":"ModuleScript","filePaths":["src/client\\Character\\HumanoidRootPart.lua"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/client\\Character\\SpineKinematics.lua"]}]},{"name":"CoreGuis","className":"ModuleScript","filePaths":["src/client\\CoreGuis.lua"]},{"name":"GuiService","className":"ModuleScript","filePaths":["src/client\\GuiService.lua"]},{"name":"Mouse","className":"ModuleScript","filePaths":["src/client\\Mouse.lua"]},{"name":"UI","className":"Folder","children":[{"name":"Crosshair","className":"ModuleScript","filePaths":["src/client\\UI\\Crosshair.lua"]},{"name":"Health","className":"ModuleScript","filePaths":["src/client\\UI\\Health.lua"]},{"name":"Vignette","className":"ModuleScript","filePaths":["src/client\\UI\\Vignette.lua"]}]}]}]}]}]}]} \ No newline at end of file +{"name":"ElevatorGame","className":"DataModel","filePaths":["default.project.json"],"children":[{"name":"ReplicatedFirst","className":"ReplicatedFirst","children":[{"name":"intro","className":"LocalScript","filePaths":["src/load\\intro\\init.client.lua"],"children":[{"name":"IntroGui","className":"ModuleScript","filePaths":["src/load\\intro\\IntroGui.lua"]}]}]},{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Algebra","className":"ModuleScript","filePaths":["src/shared\\Algebra.lua"]},{"name":"Client","className":"Folder","children":[{"name":"Camera","className":"ModuleScript","filePaths":["src/shared\\Client\\Camera.lua"]},{"name":"KeyBinds","className":"ModuleScript","filePaths":["src/shared\\Client\\KeyBinds.lua"]}]},{"name":"Delta","className":"ModuleScript","filePaths":["src/shared\\Delta.lua"]},{"name":"Enums","className":"ModuleScript","filePaths":["src/shared\\Enums.lua"]},{"name":"Property","className":"ModuleScript","filePaths":["src/shared\\Property.lua"]},{"name":"Server","className":"Folder","children":[{"name":"holder","className":"ModuleScript","filePaths":["src/shared\\Server\\holder.lua"]}]},{"name":"Tween","className":"ModuleScript","filePaths":["src/shared\\Tween.lua"]}]},{"name":"ServerScriptService","className":"ServerScriptService","children":[{"name":"rapid/server","className":"Actor","children":[{"name":"main","className":"Script","filePaths":["src/server\\main\\init.server.lua"],"children":[{"name":"Elevators","className":"Folder","children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Buttons.lua"]},{"name":"HallDisplays","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\HallDisplays.lua"]},{"name":"Lanterns","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Lanterns.lua"]},{"name":"Mover","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Mover.lua"]},{"name":"Otis1960","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Otis1960\\init.lua"],"children":[{"name":"Doors","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Otis1960\\Doors.lua"]},{"name":"Leveling","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Otis1960\\Leveling.lua"]},{"name":"MovingObjects","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Otis1960\\MovingObjects.lua"]}]},{"name":"TractionRopes","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\TractionRopes.lua"]}]},{"name":"Enums","className":"Folder","children":[{"name":"Sounds","className":"ModuleScript","filePaths":["src/server\\main\\Enums\\Sounds.lua"]}]},{"name":"Lighting","className":"ModuleScript","filePaths":["src/server\\main\\Lighting\\init.lua"]},{"name":"Load","className":"Folder","children":[{"name":"EditorEntities","className":"ModuleScript","filePaths":["src/server\\main\\Load\\EditorEntities.lua"]},{"name":"StarterPlayer","className":"ModuleScript","filePaths":["src/server\\main\\Load\\StarterPlayer.lua"]},{"name":"Tags","className":"ModuleScript","filePaths":["src/server\\main\\Load\\Tags\\init.lua"],"children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server\\main\\Load\\Tags\\Buttons.lua"]},{"name":"Lights","className":"ModuleScript","filePaths":["src/server\\main\\Load\\Tags\\Lights.lua"]}]},{"name":"Workspace","className":"ModuleScript","filePaths":["src/server\\main\\Load\\Workspace.lua"]}]},{"name":"Map","className":"Folder","children":[{"name":"Interactions","className":"Folder","children":[{"name":"LightSwitches","className":"ModuleScript","filePaths":["src/server\\main\\Map\\Interactions\\LightSwitches.lua"]}]},{"name":"Prompts","className":"ModuleScript","filePaths":["src/server\\main\\Map\\Prompts.lua"]}]},{"name":"PlayerAdded","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\init.lua"],"children":[{"name":"Character","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\Character\\init.lua"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\Character\\Actions.lua"]},{"name":"Flashlight","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\Character\\Flashlight.lua"]},{"name":"Shadows","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\Character\\Shadows.lua"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\Character\\SpineKinematics.lua"]}]},{"name":"Users","className":"ModuleScript","filePaths":["src/server\\main\\PlayerAdded\\Users.lua"]}]}]}]}]},{"name":"StarterPlayer","className":"StarterPlayer","children":[{"name":"StarterPlayerScripts","className":"StarterPlayerScripts","children":[{"name":"rapid/client","className":"Folder","children":[{"name":"Player","className":"LocalScript","filePaths":["src/client\\init.client.lua"],"children":[{"name":"Character","className":"ModuleScript","filePaths":["src/client\\Character\\init.lua"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/client\\Character\\Actions.lua"]},{"name":"Camera","className":"ModuleScript","filePaths":["src/client\\Character\\Camera\\init.lua"],"children":[{"name":"Bobbing","className":"ModuleScript","filePaths":["src/client\\Character\\Camera\\Bobbing.lua"]}]},{"name":"Humanoid","className":"ModuleScript","filePaths":["src/client\\Character\\Humanoid.lua"]},{"name":"HumanoidRootPart","className":"ModuleScript","filePaths":["src/client\\Character\\HumanoidRootPart.lua"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/client\\Character\\SpineKinematics.lua"]}]},{"name":"CoreGuis","className":"ModuleScript","filePaths":["src/client\\CoreGuis.lua"]},{"name":"GuiService","className":"ModuleScript","filePaths":["src/client\\GuiService.lua"]},{"name":"Mouse","className":"ModuleScript","filePaths":["src/client\\Mouse.lua"]},{"name":"UI","className":"Folder","children":[{"name":"Crosshair","className":"ModuleScript","filePaths":["src/client\\UI\\Crosshair.lua"]},{"name":"Health","className":"ModuleScript","filePaths":["src/client\\UI\\Health.lua"]},{"name":"Vignette","className":"ModuleScript","filePaths":["src/client\\UI\\Vignette.lua"]}]}]}]}]}]}]} \ No newline at end of file diff --git a/src/server/main/Elevators/Buttons.lua b/src/server/main/Elevators/Buttons.lua index b134969..5ef9464 100644 --- a/src/server/main/Elevators/Buttons.lua +++ b/src/server/main/Elevators/Buttons.lua @@ -5,67 +5,151 @@ local Elevators = script.Parent local Main = Elevators.Parent local Load = Main:WaitForChild("Load") -local TagsDir = Load:WaitForChild("Tags") local Storage = game:GetService("ReplicatedStorage") +local Enums = require(Storage:WaitForChild("Enums")) + local PromptModule = require(Main:WaitForChild("Map"):WaitForChild("Prompts")) +local Tags = require(Load:WaitForChild("Tags")) -local Tags = require(Load:WaitForChild("Tags")) -local Enums = require(Storage:WaitForChild("Enums")) -local ButtonTags = require(TagsDir:WaitForChild("Buttons")) +type ButtonActivatedCallback = (Floor: number) -> () -local ButtonFunctions = {} +type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor)) +type Impl_Constructor = { + __index: Impl_Constructor, + constructor: Constructor_Fun, + --Class functions + CarButton: (self: ClassConstructor, ButtonName: string, ButtonTree: Tags.ButtonProperties, Callback: ButtonActivatedCallback) -> (), + LandingButton: (self: ClassConstructor, ButtonName: string, ButtonTree: Tags.ButtonProperties, Callback: ButtonActivatedCallback) -> (), + AestheticActivateButton: (self: ClassConstructor, Button: BasePart, Glass: BasePart?) -> (), + __DeactivateButton: (self: ClassConstructor, Button: BasePart, Glass: BasePart?) -> (), + __ActivateButton: (self: ClassConstructor, Button: BasePart, Glass: BasePart?) -> (), +} & Impl_Static_Props + +type Impl_Static_Props = { + ButtonHoldDuration: number +} + +type Constructor_Fun = (ElevatorAttributes: ElevatorAttributes, ElevatorEvents: ElevatorEvents, ElevatorButtonColors: ElevatorButtonColors) -> ClassConstructor +type Constructor_Return_Props = { + ElevatorAttributes: ElevatorAttributes, + ElevatorEvents: ElevatorEvents, + ElevatorButtonColors: ElevatorButtonColors +} + +type ElevatorAttributes = { + PassingFloor: IntValue, + Moving: BoolValue, + CurrentFloor: IntValue +} + +type ElevatorEvents = { + ButtonActivated: BindableEvent +} + +type ElevatorButtonColors = { + ButtonActivated: Color3, + ButtonDeactivated: Color3, + LanternDisplayOn: Color3, + LanternDisplayOff: Color3, +} + +local ButtonFunctions = {} :: Impl_Constructor ButtonFunctions.__index = ButtonFunctions +ButtonFunctions.ButtonHoldDuration = .30 + --ButtonTags.ButtonsConstructor -function ButtonFunctions.constructor(ElevatorConstructor, ElevatorAttributes, ElevatorEvents, ButtonsConstructor) +function ButtonFunctions.constructor(ElevatorAttributes, ElevatorEvents, ElevatorButtonColors) return setmetatable({ - ElevatorAttributes = ElevatorAttributes, - ElevatorEvents = ElevatorEvents, - ElevatorConstructor = ElevatorConstructor, - ButtonsConstructor = ButtonsConstructor + ElevatorAttributes = ElevatorAttributes, + ElevatorEvents = ElevatorEvents, + ElevatorButtonColors = ElevatorButtonColors }, ButtonFunctions) end -function ButtonFunctions:ActivateButton(Floor: number, ButtonEnum: Enums.ButtonTreeValues, ButtonName: string, ButtonTree: Tags.ButtonProperties) - local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance) +function ButtonFunctions:CarButton(ButtonName, ButtonTree, Callback) + local DecodedCarFloorTag = Tags.Decoders.CarTag(ButtonName) - Prompt:Triggered(function(Player: Player) - self.ElevatorEvents.ButtonActivated:Fire(ButtonEnum, ButtonName, self.ButtonsConstructor, ButtonTree) + if DecodedCarFloorTag then + local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance) - self.ButtonsConstructor:AestheticActivateButton(ButtonTree.Inst :: BasePart, Otis1960.ButtonActivatedColor) + Prompt:Triggered(function(Player: Player) + self.ElevatorEvents.ButtonActivated:Fire(Enums.Button.Car, ButtonName, self, ButtonTree) - if Floor == self.ElevatorAttributes.Attributes.CurrentFloor.Value then - self.ButtonsConstructor:DeactivateButton(ButtonTree.Inst :: BasePart, Otis1960.ButtonDeactivatedColor) - else - self.ElevatorConstructor:GoToLevel(Floor) - end - end) -end + task.spawn(function() + self:AestheticActivateButton(ButtonTree.Inst :: BasePart) + end) -function ButtonFunctions:LandingButton(ButtonName, ButtonsConstructor, ButtonTree) - local DecodedFloor = Tags.Decoders.HallTag(ButtonName) - - if DecodedFloor then - self:ActivateButton(DecodedFloor, Enums.ButtonTree.Landing, ButtonName, ButtonsConstructor, ButtonTree) - else - warn(`Otis1960: Failed to decode hall button, ButtonName={ButtonName}`) + if DecodedCarFloorTag == self.ElevatorAttributes.CurrentFloor.Value then + self:__DeactivateButton(ButtonTree.Inst :: BasePart, (ButtonTree.Inst :: Instance):FindFirstChild("Glass") :: BasePart?) + else + Callback(DecodedCarFloorTag) + end + end) end end -function ButtonFunctions:CarButton(ButtonName, ButtonsConstructor, ButtonTree) - local DecodedFloor = Tags.Decoders.CarTag(ButtonName) - - if DecodedFloor then - self:ActivateButton(DecodedFloor, Enums.ButtonTree.Car, ButtonName, ButtonsConstructor, ButtonTree) - else - warn(`Otis1960: Failed to decode car button, ButtonName={ButtonName}`) +function ButtonFunctions:LandingButton(ButtonName, ButtonTree, Callback) + local DecodedHallFloorTag = Tags.Decoders.HallTag(ButtonName) + + if DecodedHallFloorTag then + local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance) + + Prompt:Triggered(function(Player: Player) + self.ElevatorEvents.ButtonActivated:Fire(Enums.Button.Landing, ButtonName, self, ButtonTree) + + task.spawn(function() + self:AestheticActivateButton(ButtonTree.Inst :: BasePart) + end) + + if DecodedHallFloorTag == self.ElevatorAttributes.CurrentFloor.Value then + self:__DeactivateButton(ButtonTree.Inst :: BasePart, (ButtonTree.Inst :: Instance):FindFirstChild("Glass") :: BasePart?) + else + Callback(DecodedHallFloorTag) + end + end) end end +--[[ function ButtonFunctions:SpecialButton(ButtonName, ButtonsConstructor, ButtonTree) end +]] + +function ButtonFunctions:__DeactivateButton(Button, Glass) + local Part = Glass and Glass or Button + + Part.Material = Enum.Material.Glass + Part.Color = self.ElevatorButtonColors.ButtonDeactivated + Part.Transparency = 0.3 +end + +function ButtonFunctions:__ActivateButton(Button, Glass) + local Part = Glass and Glass or Button + + Part.Material = Enum.Material.Neon + Part.Color = self.ElevatorButtonColors.ButtonActivated + Part.Transparency = 0 +end + +function ButtonFunctions:AestheticActivateButton(Button) + local Glass = Button:FindFirstChild("Glass") :: BasePart? + local LookVec = (Glass and Glass or Button).CFrame.LookVector/50 + if Glass then + Glass.Position+=LookVec + self:__ActivateButton(Button, Glass) + end + + Button.Position+=LookVec + task.wait(.30) + + if Glass then + Glass.Position-=LookVec + end + Button.Position-=LookVec +end return ButtonFunctions \ No newline at end of file diff --git a/src/server/main/Elevators/Otis1960/HallDisplays.lua b/src/server/main/Elevators/HallDisplays.lua similarity index 100% rename from src/server/main/Elevators/Otis1960/HallDisplays.lua rename to src/server/main/Elevators/HallDisplays.lua diff --git a/src/server/main/Elevators/Lanterns.lua b/src/server/main/Elevators/Lanterns.lua index 9259c51..ff96657 100644 --- a/src/server/main/Elevators/Lanterns.lua +++ b/src/server/main/Elevators/Lanterns.lua @@ -11,6 +11,8 @@ local Tween = require(Storage:WaitForChild("Tween")) local Tags = require(LoadDir:WaitForChild("Tags")) local Enums = require(Storage:WaitForChild("Enums")) +local SoundEnums = require(MainDir:WaitForChild("Enums"):WaitForChild("Sounds")) + type rbxassetid = string type TagProduct = Tags.TagProduct @@ -32,17 +34,34 @@ type Impl_Static_Props = { LightTweenTime: number } -type Constructor_Fun = (MainDisplay: UnionOperation, ChimeDirectionID: rbxassetid, ChimeLandingID: rbxassetid, Lanterns: Tags.Lanterns, Colors: Colors) -> ClassConstructor +type Constructor_Fun = (MainDisplay: UnionOperation, LanternsMap: Tags.Lanterns, ElevatorSounds: ElevatorSounds, Colors: ElevatorButtonColors) -> ClassConstructor type Constructor_Return_Props = { LanternsMap: Tags.Lanterns, AudioChimeDirection: Sound, AudioChimeLanding: Sound, - Colors: Colors + Colors: ElevatorButtonColors } -export type Colors = { - Active: Color3, - Off: Color3 +type ElevatorAttributes = { + PassingFloor: IntValue, + Moving: BoolValue, + CurrentFloor: IntValue +} + +type ElevatorEvents = { + ButtonActivated: BindableEvent +} + +type ElevatorButtonColors = { + ButtonActivated: Color3, + ButtonDeactivated: Color3, + LanternDisplayOn: Color3, + LanternDisplayOff: Color3, +} + +type ElevatorSounds = { + LanternChimeDirection: SoundEnums.Otis1960LanternChimeDirection, + LanternChimeLanding: SoundEnums.Otis1960LanternChimeLanding, } export type LanternsConstructor = ClassConstructor @@ -53,12 +72,12 @@ Lanterns.__index = Lanterns Lanterns.Volume = .5 Lanterns.LightTweenTime = 1 -function Lanterns.constructor(MainDisplay, ChimeDirectionID, ChimeLandingID, LanternsMap, Colors) +function Lanterns.constructor(MainDisplay, LanternsMap, ElevatorSounds, Colors) local AudioChimeDirection = Instance.new("Sound") :: Sound - AudioChimeDirection.SoundId = ChimeDirectionID + AudioChimeDirection.SoundId = ElevatorSounds.LanternChimeDirection AudioChimeDirection.Volume = Lanterns.Volume local AudioChimeLanding = Instance.new("Sound") :: Sound - AudioChimeLanding.SoundId = ChimeLandingID + AudioChimeLanding.SoundId = ElevatorSounds.LanternChimeLanding AudioChimeLanding.Volume = Lanterns.Volume AudioChimeDirection.Parent = MainDisplay @@ -76,7 +95,7 @@ local LanternLight = Tween.constructor(TweenInfo.new(Lanterns.LightTweenTime)) function Lanterns:Activate(EnabledState, IsDirectionLantern, Lantern, Chime) local Tween = LanternLight:Start(Lantern.Light, { - Color = EnabledState and self.Colors.Active or self.Colors.Off + Color = EnabledState and self.Colors.LanternDisplayOn or self.Colors.LanternDisplayOff }) if EnabledState then @@ -93,7 +112,7 @@ function Lanterns:Activate(EnabledState, IsDirectionLantern, Lantern, Chime) if Lantern.PointLight then Lantern.PointLight.Enabled = true LanternLight:Start(Lantern.PointLight, { - Color = self.Colors.Active + Color = self.Colors.LanternDisplayOn }) end else diff --git a/src/server/main/Elevators/Otis1960/Leveling.lua b/src/server/main/Elevators/Otis1960/Leveling.lua index 782647b..20964b5 100644 --- a/src/server/main/Elevators/Otis1960/Leveling.lua +++ b/src/server/main/Elevators/Otis1960/Leveling.lua @@ -2,7 +2,7 @@ --!native --!strict -local Leveling = { +local Leveling: {number} = { [1] = 13.041, [2] = 37.973, [3] = 62.978, diff --git a/src/server/main/Elevators/Otis1960/init.lua b/src/server/main/Elevators/Otis1960/init.lua index 327d50f..ab6ebd8 100644 --- a/src/server/main/Elevators/Otis1960/init.lua +++ b/src/server/main/Elevators/Otis1960/init.lua @@ -4,27 +4,30 @@ local Elevators = script.Parent local MainDir = Elevators.Parent +local EnumsDir = MainDir:WaitForChild("Enums") local LoadDir = MainDir:WaitForChild("Load") +local TagsDir = LoadDir:WaitForChild("Tags") local Storage = game:GetService("ReplicatedStorage") local RS = game:GetService("RunService") -local Enums = require(Storage:WaitForChild("Enums")) +local ButtonTags = require(TagsDir:WaitForChild("Buttons")) + +local Enums = require(Storage:WaitForChild("Enums")) +local SoundEnums = require(EnumsDir:WaitForChild("Sounds")) local Leveling = require(script:WaitForChild("Leveling")) local Doors = require(script:WaitForChild("Doors")) local MovingObjects = require(script:WaitForChild("MovingObjects")) -local HallDisplays = require(script:WaitForChild("HallDisplays")) +local HallDisplays = require(Elevators:WaitForChild("HallDisplays")) local ElevatorMover = require(Elevators:WaitForChild("Mover")) -local ButtonTags = require(Elevators:WaitForChild("Buttons")) local TractionRopes = require(Elevators:WaitForChild("TractionRopes")) local Lanterns = require(Elevators:WaitForChild("Lanterns")) +local Buttons = require(Elevators:WaitForChild("Buttons")) local Tags = require(LoadDir:WaitForChild("Tags")) -type rbxassetid = string - type Tags = Tags.ExportedTags type TagsConstructor = Tags.TagsConstructor @@ -34,27 +37,31 @@ type Impl_Constructor = { constructor: Constructor_Fun, --Class functions __MoveFloors: (self: ClassConstructor, Level: number, RequestedLevel: number, GoingUp: boolean) -> (), - GoToLevel: (self: ClassConstructor, RequestedLevel: number) -> () + RequestLevel: (self: ClassConstructor, RequestedLevel: number) -> () } & Impl_Static_Props type Impl_Static_Props = { - Name: Enums.ElevatorValues, - Responsiveness: number, - MaxVelocity: number, - ButtonActivatedColor: Color3, - ButtonDeactivatedColor: Color3, - LanternDisplayColorOn: Color3, - LanternDisplayColorOff: Color3, - LanternChimeDirection: rbxassetid, - LanternChimeLanding: rbxassetid, - FloorLevelingDistance: number, - DoorOpeningDistance: number, - LeveledDistance: number, + Name: Enums.ElevatorValues, + Responsiveness: number, + MaxVelocity: number, + FloorLevelingDistance: number, + DoorOpeningDistance: number, + LeveledDistance: number, + Sounds: { + LanternChimeDirection: SoundEnums.Otis1960LanternChimeDirection, + LanternChimeLanding: SoundEnums.Otis1960LanternChimeLanding, + }, + Colors: { + ButtonActivated: Color3, + ButtonDeactivated: Color3, + LanternDisplayOn: Color3, + LanternDisplayOff: Color3, + }, Attributes: { PassingFloor: IntValue, - Moving: BoolValue, - CurrentFloor: IntValue + CurrentFloor: IntValue, + Moving: BoolValue }, Events: { ButtonActivated: BindableEvent @@ -92,23 +99,29 @@ export type Otis1960Constructor = ClassConstructor local Otis1960 = {} :: Impl_Constructor Otis1960.__index = Otis1960 -Otis1960.Name = Enums.Elevator.Otis1960 -Otis1960.FloorLevelingDistance = 2.5 -Otis1960.DoorOpeningDistance = Otis1960.FloorLevelingDistance/2.8 -Otis1960.LeveledDistance = 0.5 -Otis1960.Responsiveness = 50 -Otis1960.MaxVelocity = 10 -Otis1960.ButtonActivatedColor = Color3.fromRGB(180,0,0) -Otis1960.ButtonDeactivatedColor = Color3.fromRGB(139,139,139) -Otis1960.LanternDisplayColorOn = Color3.fromRGB(255,114,71) -Otis1960.LanternDisplayColorOff = Color3.fromRGB(55,55,55) -Otis1960.LanternChimeDirection = "rbxassetid://16990287228" -Otis1960.LanternChimeLanding = "rbxassetid://16990290265" +Otis1960.Name = Enums.Elevator.Otis1960 +Otis1960.FloorLevelingDistance = 2.5 +Otis1960.DoorOpeningDistance = Otis1960.FloorLevelingDistance/2.8 +Otis1960.LeveledDistance = 0.5 +Otis1960.Responsiveness = 50 +Otis1960.MaxVelocity = 10 + +Otis1960.Sounds = { + LanternChimeDirection = SoundEnums.Otis1960.LanternChimeDirection, + LanternChimeLanding = SoundEnums.Otis1960.LanternChimeLanding +} + +Otis1960.Colors = { + ButtonActivated = Color3.fromRGB(180,0,0), + ButtonDeactivated = Color3.fromRGB(139,139,139), + LanternDisplayOn = Color3.fromRGB(255,114,71), + LanternDisplayOff = Color3.fromRGB(55,55,55), +} Otis1960.Attributes = { - PassingFloor = Instance.new("IntValue") :: IntValue, - Moving = Instance.new("BoolValue") :: BoolValue, - CurrentFloor = Instance.new("IntValue") :: IntValue + PassingFloor = Instance.new("IntValue") :: IntValue, + CurrentFloor = Instance.new("IntValue") :: IntValue, + Moving = Instance.new("BoolValue") :: BoolValue } Otis1960.Events = { @@ -121,18 +134,34 @@ Otis1960.Attributes.CurrentFloor.Value = 1 local Attributes = Otis1960.Attributes -local function HookButtons(self: ClassConstructor, ButtonsConstructor: ButtonTags.ButtonsConstructor, ButtonType: Enums.EnumValue) - local ButtonFunctions = require(script:WaitForChild("ButtonFunctions")) +local ButtonsConstructor = Buttons.constructor(Otis1960.Attributes, Otis1960.Events, Otis1960.Colors) +local function HookButtons(self: ClassConstructor, ButtonNameType: Enums.ButtonTreeValues, ButtonName: string, ButtonTree) + if ButtonNameType == Enums.ButtonTree.Car then + ButtonsConstructor:CarButton(ButtonName, ButtonTree, function(Floor: number) + self:RequestLevel(Floor) + end) + elseif ButtonNameType == Enums.ButtonTree.Landing then + ButtonsConstructor:LandingButton(ButtonName, ButtonTree, function(Floor: number) + self:RequestLevel(Floor) + end) + elseif ButtonNameType == Enums.ButtonTree.Special then + + elseif ButtonNameType == Enums.ButtonTree.Relays then + + elseif ButtonNameType == Enums.ButtonTree.Unknown then + + else + warn(`[{Otis1960.Name}]: Could not iterate a button, ButtonNameType={ButtonNameType}`) + end +end + +local function IterateButtons(self: ClassConstructor, ButtonsConstructor: ButtonTags.ButtonsConstructor) for ButtonNameType, ButtonList in ButtonsConstructor.Buttons do for ButtonName, ButtonTree in ButtonList do if ButtonTree.Prompt then if ButtonTree.Inst then - local Button = ButtonFunctions[ButtonNameType :: Enums.ButtonTreeValues] - - if Button then - Button(self, ButtonName, ButtonsConstructor, ButtonTree) - end + HookButtons(self, ButtonNameType :: Enums.ButtonTreeValues, ButtonName, ButtonTree) else warn(`{ButtonTree} is missing the field "Inst"`) end @@ -172,10 +201,7 @@ function Otis1960.constructor(TagsConstructor, ButtonsTags, LanternsTags, Landin self.ElevatorDoors = Doors.constructor(LandingDoors, self.ElevatorBox_1960, self.ElevatorDoor1, self.ElevatorDoor2, self.ElevatorDoorSensor) self.TractionRopes = TractionRopes.constructor(self.Ropes, self.ElevatorBox_1960, Leveling) - self.LanternsConstructor = Lanterns.constructor(LanternDisplay, Otis1960.LanternChimeDirection, Otis1960.LanternChimeLanding, LanternsTags, { - Active = Otis1960.LanternDisplayColorOn, - Off = Otis1960.LanternDisplayColorOff - } :: Lanterns.Colors) + self.LanternsConstructor = Lanterns.constructor(LanternDisplay, LanternsTags, Otis1960.Sounds, Otis1960.Colors) local ButtonsConstructor = ButtonTags.constructor(TagsConstructor, ButtonsTags) local Otis1960_Buttons = ButtonsConstructor:CreatePromptButtons() @@ -187,7 +213,7 @@ function Otis1960.constructor(TagsConstructor, ButtonsTags, LanternsTags, Landin self.BoxAlignOrientation = ElevatorMover(self.ElevatorBox_1960, self.ElevatorBox_1960.Position, Otis1960.Responsiveness, Otis1960.MaxVelocity) local ClassConstructor = setmetatable(self, Otis1960) - HookButtons(ClassConstructor, ButtonsConstructor, Enums.ButtonTree.Car) + IterateButtons(ClassConstructor, ButtonsConstructor) --Open the elevator doors on server start task.spawn(function() @@ -301,13 +327,33 @@ function Otis1960:__MoveFloors(GoalLevelVEC, RequestedLevel, GoingUp) self.BoxAlignPosition.Position = Vector3.new(ElevatorBoxCurrentPos.X, GoalLevelVEC, ElevatorBoxCurrentPos.Z) end -function Otis1960:GoToLevel(RequestedLevel) +local FloorAdvancer = {} + +--My clever math function for determining if the elevator goal is to move upwards or not +local function ElevatorDirectionGoingUp(Floor: number, RequestedFloor: number): boolean + return -(Floor-RequestedFloor)>0 +end + +function Otis1960:RequestLevel(RequestedLevel) local GoalLevelVEC: number = Leveling[RequestedLevel] if GoalLevelVEC and GoalLevelVEC ~= Attributes.CurrentFloor.Value then - local GoingUp: boolean = -(Attributes.CurrentFloor.Value-RequestedLevel)>0 --My clever math function for determining if the elevator goal is to move upwards or not - - self:__MoveFloors(GoalLevelVEC, RequestedLevel, GoingUp) + --My clever math function for determining if the elevator goal is to move upwards or not + local GoingUp = ElevatorDirectionGoingUp(Attributes.CurrentFloor.Value, RequestedLevel) + + if Attributes.Moving.Value then + if GoingUp then + if Attributes.CurrentFloor.Value<=RequestedLevel then + self:__MoveFloors(GoalLevelVEC, RequestedLevel, GoingUp) + end + else + if Attributes.CurrentFloor.Value>=RequestedLevel then + self:__MoveFloors(GoalLevelVEC, RequestedLevel, GoingUp) + end + end + else + self:__MoveFloors(GoalLevelVEC, RequestedLevel, GoingUp) + end else warn(`[{Otis1960.Name}]: landing out of range or equals the same range as the goal, requested landing: {tostring(RequestedLevel)}`) end diff --git a/src/server/main/Enums/Sounds.lua b/src/server/main/Enums/Sounds.lua new file mode 100644 index 0000000..8905a6e --- /dev/null +++ b/src/server/main/Enums/Sounds.lua @@ -0,0 +1,19 @@ +--!optimize 2 +--!native +--!strict + +local SoundEnums = {} + +export type Otis1960Sounds = typeof(SoundEnums.Otis1960) + +export type Otis1960LanternChimeDirection = "rbxassetid://16990287228" +export type Otis1960LanternChimeLanding = "rbxassetid://16990290265" + +export type Otis1960SoundValues = Otis1960LanternChimeDirection | Otis1960LanternChimeLanding + +SoundEnums.Otis1960 = { + LanternChimeDirection = "rbxassetid://16990287228" :: Otis1960LanternChimeDirection, + LanternChimeLanding = "rbxassetid://16990290265" :: Otis1960LanternChimeLanding +} + +return SoundEnums \ No newline at end of file diff --git a/src/server/main/Load/Tags/Buttons.lua b/src/server/main/Load/Tags/Buttons.lua index 0007858..619d87d 100644 --- a/src/server/main/Load/Tags/Buttons.lua +++ b/src/server/main/Load/Tags/Buttons.lua @@ -2,11 +2,10 @@ --!native --!strict -local ElevatorsDir = script.Parent -local MainDir = ElevatorsDir.Parent -local LoadDir = MainDir:WaitForChild("Load") +local TagsDir = script.Parent +local LoadDir = TagsDir.Parent -local Tags = require(ElevatorsDir:WaitForChild("Tags")) +local Tags = require(LoadDir:WaitForChild("Tags")) local Storage = game:GetService("ReplicatedStorage") local Enums = require(Storage:WaitForChild("Enums")) @@ -21,11 +20,8 @@ type Impl_Constructor = { __index: Impl_Constructor, constructor: Constructor_Fun, --Class functions - DecodeCarTag: (self: ClassConstructor, FloorTag: string) -> number?, - CreatePromptButtons: (self: ClassConstructor) -> Tags.ButtonsTree, - AestheticActivateButton: (self: ClassConstructor, Button: BasePart, ActivatedColor: Color3) -> (), - DeactivateButton: (self: ClassConstructor, Button: BasePart, DeactivatedColor: Color3) -> (), - ActivateButton: (self: ClassConstructor, Button: BasePart, ActivatedColor: Color3) -> (), + DecodeCarTag: (self: ClassConstructor, FloorTag: string) -> number?, + CreatePromptButtons: (self: ClassConstructor) -> Tags.ButtonsTree, } & Impl_Static_Props type Impl_Static_Props = { @@ -145,38 +141,4 @@ function ButtonsModule:CreatePromptButtons() return self.Buttons end -function ButtonsModule:DeactivateButton(Button, DeactivatedColor) - local Glass = Button:FindFirstChild("Glass") :: BasePart? - local Part = Glass and Glass or Button - - Part.Material = Enum.Material.Glass - Part.Color = DeactivatedColor - Part.Transparency = 0.3 -end - -function ButtonsModule:ActivateButton(Button, ActivatedColor) - local Glass = Button:FindFirstChild("Glass") :: BasePart? - local Part = Glass and Glass or Button - - Part.Material = Enum.Material.Neon - Part.Color = ActivatedColor - Part.Transparency = 0 -end - -function ButtonsModule:AestheticActivateButton(Button, ActivatedColor) - local Glass = Button:FindFirstChild("Glass") :: BasePart? - local LookVec = (Glass and Glass or Button).CFrame.LookVector/50 - if Glass then - Glass.Position+=LookVec - self:ActivateButton(Glass, ActivatedColor) - end - - Button.Position+=LookVec - task.wait(.30) - if Glass then - Glass.Position-=LookVec - end - Button.Position-=LookVec -end - return ButtonsModule \ No newline at end of file