From 8af537f9dec660f96ba034d2a1f98793c14564b3 Mon Sep 17 00:00:00 2001 From: unixtensor Date: Tue, 20 Aug 2024 16:29:06 -0400 Subject: [PATCH] Haughton elevator and work on the buttons and new structure --- sourcemap.json | 2 +- src/server/main/Elevators/ButtonManager.luau | 86 +++++++++ src/server/main/Elevators/Buttons.luau | 135 -------------- .../main/Elevators/Map/Haughton/Buttons.luau | 71 ++++++++ .../main/Elevators/Map/Haughton/Config.luau | 46 ++++- .../main/Elevators/Map/Haughton/Leveling.luau | 8 +- .../Elevators/Map/Haughton/MovingObjects.luau | 164 ++++++++++++++++-- .../main/Elevators/Map/Haughton/init.luau | 84 ++------- src/server/main/Elevators/System/init.luau | 6 +- src/server/main/Map/Load/EditorEntities.luau | 15 +- src/server/main/Map/Load/Tags/Buttons.luau | 12 +- src/server/main/Map/Load/Tags/init.luau | 8 +- src/server/main/Types/Elevator.luau | 41 +++-- 13 files changed, 419 insertions(+), 259 deletions(-) create mode 100644 src/server/main/Elevators/ButtonManager.luau delete mode 100644 src/server/main/Elevators/Buttons.luau create mode 100644 src/server/main/Elevators/Map/Haughton/Buttons.luau diff --git a/sourcemap.json b/sourcemap.json index c649b86..335d68e 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.luau"],"children":[{"name":"IntroGui","className":"ModuleScript","filePaths":["src/load/intro/IntroGui.luau"]}]}]},{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Algebra","className":"ModuleScript","filePaths":["src/shared/Algebra.luau"]},{"name":"Client","className":"Folder","children":[{"name":"Camera","className":"ModuleScript","filePaths":["src/shared/Client/Camera.luau"]},{"name":"KeyBinds","className":"ModuleScript","filePaths":["src/shared/Client/KeyBinds.luau"]}]},{"name":"Delta","className":"ModuleScript","filePaths":["src/shared/Delta.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src/shared/Enums.luau"]},{"name":"Output","className":"ModuleScript","filePaths":["src/shared/Output.luau"]},{"name":"Server","className":"Folder","children":[{"name":"holder","className":"ModuleScript","filePaths":["src/shared/Server/holder.luau"]}]},{"name":"Tween","className":"ModuleScript","filePaths":["src/shared/Tween.luau"]}]},{"name":"ServerScriptService","className":"ServerScriptService","children":[{"name":"rapid/server","className":"Actor","children":[{"name":"main","className":"Script","filePaths":["src/server/main/init.server.luau"],"children":[{"name":"Elevators","className":"Folder","children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server/main/Elevators/Buttons.luau"]},{"name":"Lanterns","className":"ModuleScript","filePaths":["src/server/main/Elevators/Lanterns.luau"]},{"name":"Map","className":"Folder","children":[{"name":"Haughton","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/init.luau"],"children":[{"name":"Config","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/Config.luau"]},{"name":"Leveling","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/Leveling.luau"]},{"name":"MovingObjects","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/MovingObjects.luau"]}]},{"name":"Otis1960","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Otis1960/init.luau"],"children":[{"name":"Config","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Otis1960/Config.luau"]},{"name":"Leveling","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Otis1960/Leveling.luau"]},{"name":"MovingObjects","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Otis1960/MovingObjects.luau"]},{"name":"PhysicalRelay","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Otis1960/PhysicalRelay.luau"]}]}]},{"name":"System","className":"ModuleScript","filePaths":["src/server/main/Elevators/System/init.luau"],"children":[{"name":"RelayAlgorithm","className":"ModuleScript","filePaths":["src/server/main/Elevators/System/RelayAlgorithm.luau"]}]},{"name":"TractionRopes","className":"ModuleScript","filePaths":["src/server/main/Elevators/TractionRopes.luau"]}]},{"name":"Map","className":"Folder","children":[{"name":"Interactions","className":"Folder","children":[{"name":"LightSwitches","className":"ModuleScript","filePaths":["src/server/main/Map/Interactions/LightSwitches.luau"]}]},{"name":"Lighting","className":"ModuleScript","filePaths":["src/server/main/Map/Lighting/init.luau"]},{"name":"Load","className":"Folder","children":[{"name":"EditorEntities","className":"ModuleScript","filePaths":["src/server/main/Map/Load/EditorEntities.luau"]},{"name":"StarterPlayer","className":"ModuleScript","filePaths":["src/server/main/Map/Load/StarterPlayer.luau"]},{"name":"Tags","className":"ModuleScript","filePaths":["src/server/main/Map/Load/Tags/init.luau"],"children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server/main/Map/Load/Tags/Buttons.luau"]},{"name":"Lights","className":"ModuleScript","filePaths":["src/server/main/Map/Load/Tags/Lights.luau"]}]},{"name":"Workspace","className":"ModuleScript","filePaths":["src/server/main/Map/Load/Workspace.luau"]}]},{"name":"Prompts","className":"ModuleScript","filePaths":["src/server/main/Map/Prompts.luau"]}]},{"name":"PlayerAdded","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/init.luau"],"children":[{"name":"Character","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/init.luau"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/Actions.luau"]},{"name":"Flashlight","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/Flashlight.luau"]},{"name":"Shadows","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/Shadows.luau"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/SpineKinematics.luau"]}]},{"name":"Users","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Users.luau"]}]},{"name":"Types","className":"Folder","children":[{"name":"Elevator","className":"ModuleScript","filePaths":["src/server/main/Types/Elevator.luau"]},{"name":"Enums","className":"Folder","children":[{"name":"Sounds","className":"ModuleScript","filePaths":["src/server/main/Types/Enums/Sounds.luau"]}]}]}]}]}]},{"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.luau"],"children":[{"name":"Character","className":"ModuleScript","filePaths":["src/client/Character/init.luau"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/client/Character/Actions.luau"]},{"name":"Camera","className":"ModuleScript","filePaths":["src/client/Character/Camera/init.luau"],"children":[{"name":"Bobbing","className":"ModuleScript","filePaths":["src/client/Character/Camera/Bobbing.luau"]}]},{"name":"Humanoid","className":"ModuleScript","filePaths":["src/client/Character/Humanoid.luau"]},{"name":"HumanoidRootPart","className":"ModuleScript","filePaths":["src/client/Character/HumanoidRootPart.luau"]},{"name":"Sound","className":"Folder","children":[{"name":"Relays","className":"ModuleScript","filePaths":["src/client/Character/Sound/Relays.luau"]}]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/client/Character/SpineKinematics.luau"]}]},{"name":"CoreGuis","className":"ModuleScript","filePaths":["src/client/CoreGuis.luau"]},{"name":"GuiService","className":"ModuleScript","filePaths":["src/client/GuiService.luau"]},{"name":"Mouse","className":"ModuleScript","filePaths":["src/client/Mouse.luau"]},{"name":"UI","className":"Folder","children":[{"name":"Crosshair","className":"ModuleScript","filePaths":["src/client/UI/Crosshair.luau"]},{"name":"Iris","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/init.lua","src/client/UI/Iris/default.project.json"],"children":[{"name":"API","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/API.lua"]},{"name":"Internal","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/Internal.lua"]},{"name":"Types","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/Types.lua"]},{"name":"config","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/config.lua"]},{"name":"demoWindow","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/demoWindow.lua"]},{"name":"widgets","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/init.lua"],"children":[{"name":"Button","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Button.lua"]},{"name":"Checkbox","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Checkbox.lua"]},{"name":"Combo","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Combo.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Format.lua"]},{"name":"Image","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Image.lua"]},{"name":"Input","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Input.lua"]},{"name":"Menu","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Menu.lua"]},{"name":"Plot","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Plot.lua"]},{"name":"RadioButton","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/RadioButton.lua"]},{"name":"Root","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Root.lua"]},{"name":"Table","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Table.lua"]},{"name":"Text","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Text.lua"]},{"name":"Tree","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Tree.lua"]},{"name":"Window","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Window.lua"]}]}]},{"name":"Vignette","className":"ModuleScript","filePaths":["src/client/UI/Vignette.luau"]}]}]}]}]}]}]} \ 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.luau"],"children":[{"name":"IntroGui","className":"ModuleScript","filePaths":["src/load/intro/IntroGui.luau"]}]}]},{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Algebra","className":"ModuleScript","filePaths":["src/shared/Algebra.luau"]},{"name":"Client","className":"Folder","children":[{"name":"Camera","className":"ModuleScript","filePaths":["src/shared/Client/Camera.luau"]},{"name":"KeyBinds","className":"ModuleScript","filePaths":["src/shared/Client/KeyBinds.luau"]}]},{"name":"Delta","className":"ModuleScript","filePaths":["src/shared/Delta.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src/shared/Enums.luau"]},{"name":"Output","className":"ModuleScript","filePaths":["src/shared/Output.luau"]},{"name":"Server","className":"Folder","children":[{"name":"holder","className":"ModuleScript","filePaths":["src/shared/Server/holder.luau"]}]},{"name":"Tween","className":"ModuleScript","filePaths":["src/shared/Tween.luau"]}]},{"name":"ServerScriptService","className":"ServerScriptService","children":[{"name":"rapid/server","className":"Actor","children":[{"name":"main","className":"Script","filePaths":["src/server/main/init.server.luau"],"children":[{"name":"Elevators","className":"Folder","children":[{"name":"ButtonManager","className":"ModuleScript","filePaths":["src/server/main/Elevators/ButtonManager.luau"]},{"name":"Lanterns","className":"ModuleScript","filePaths":["src/server/main/Elevators/Lanterns.luau"]},{"name":"Map","className":"Folder","children":[{"name":"Haughton","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/init.luau"],"children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/Buttons.luau"]},{"name":"Config","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/Config.luau"]},{"name":"Leveling","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/Leveling.luau"]},{"name":"MovingObjects","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/MovingObjects.luau"]}]},{"name":"Otis1960","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Otis1960/init.luau"],"children":[{"name":"Config","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Otis1960/Config.luau"]},{"name":"Leveling","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Otis1960/Leveling.luau"]},{"name":"MovingObjects","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Otis1960/MovingObjects.luau"]},{"name":"PhysicalRelay","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Otis1960/PhysicalRelay.luau"]}]}]},{"name":"System","className":"ModuleScript","filePaths":["src/server/main/Elevators/System/init.luau"],"children":[{"name":"RelayAlgorithm","className":"ModuleScript","filePaths":["src/server/main/Elevators/System/RelayAlgorithm.luau"]}]},{"name":"TractionRopes","className":"ModuleScript","filePaths":["src/server/main/Elevators/TractionRopes.luau"]}]},{"name":"Map","className":"Folder","children":[{"name":"Interactions","className":"Folder","children":[{"name":"LightSwitches","className":"ModuleScript","filePaths":["src/server/main/Map/Interactions/LightSwitches.luau"]}]},{"name":"Lighting","className":"ModuleScript","filePaths":["src/server/main/Map/Lighting/init.luau"]},{"name":"Load","className":"Folder","children":[{"name":"EditorEntities","className":"ModuleScript","filePaths":["src/server/main/Map/Load/EditorEntities.luau"]},{"name":"StarterPlayer","className":"ModuleScript","filePaths":["src/server/main/Map/Load/StarterPlayer.luau"]},{"name":"Tags","className":"ModuleScript","filePaths":["src/server/main/Map/Load/Tags/init.luau"],"children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server/main/Map/Load/Tags/Buttons.luau"]},{"name":"Lights","className":"ModuleScript","filePaths":["src/server/main/Map/Load/Tags/Lights.luau"]}]},{"name":"Workspace","className":"ModuleScript","filePaths":["src/server/main/Map/Load/Workspace.luau"]}]},{"name":"Prompts","className":"ModuleScript","filePaths":["src/server/main/Map/Prompts.luau"]}]},{"name":"PlayerAdded","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/init.luau"],"children":[{"name":"Character","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/init.luau"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/Actions.luau"]},{"name":"Flashlight","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/Flashlight.luau"]},{"name":"Shadows","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/Shadows.luau"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/SpineKinematics.luau"]}]},{"name":"Users","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Users.luau"]}]},{"name":"Types","className":"Folder","children":[{"name":"Elevator","className":"ModuleScript","filePaths":["src/server/main/Types/Elevator.luau"]},{"name":"Enums","className":"Folder","children":[{"name":"Sounds","className":"ModuleScript","filePaths":["src/server/main/Types/Enums/Sounds.luau"]}]}]}]}]}]},{"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.luau"],"children":[{"name":"Character","className":"ModuleScript","filePaths":["src/client/Character/init.luau"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/client/Character/Actions.luau"]},{"name":"Camera","className":"ModuleScript","filePaths":["src/client/Character/Camera/init.luau"],"children":[{"name":"Bobbing","className":"ModuleScript","filePaths":["src/client/Character/Camera/Bobbing.luau"]}]},{"name":"Humanoid","className":"ModuleScript","filePaths":["src/client/Character/Humanoid.luau"]},{"name":"HumanoidRootPart","className":"ModuleScript","filePaths":["src/client/Character/HumanoidRootPart.luau"]},{"name":"Sound","className":"Folder","children":[{"name":"Relays","className":"ModuleScript","filePaths":["src/client/Character/Sound/Relays.luau"]}]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/client/Character/SpineKinematics.luau"]}]},{"name":"CoreGuis","className":"ModuleScript","filePaths":["src/client/CoreGuis.luau"]},{"name":"GuiService","className":"ModuleScript","filePaths":["src/client/GuiService.luau"]},{"name":"Mouse","className":"ModuleScript","filePaths":["src/client/Mouse.luau"]},{"name":"UI","className":"Folder","children":[{"name":"Crosshair","className":"ModuleScript","filePaths":["src/client/UI/Crosshair.luau"]},{"name":"Iris","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/init.lua","src/client/UI/Iris/default.project.json"],"children":[{"name":"API","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/API.lua"]},{"name":"Internal","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/Internal.lua"]},{"name":"Types","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/Types.lua"]},{"name":"config","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/config.lua"]},{"name":"demoWindow","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/demoWindow.lua"]},{"name":"widgets","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/init.lua"],"children":[{"name":"Button","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Button.lua"]},{"name":"Checkbox","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Checkbox.lua"]},{"name":"Combo","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Combo.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Format.lua"]},{"name":"Image","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Image.lua"]},{"name":"Input","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Input.lua"]},{"name":"Menu","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Menu.lua"]},{"name":"Plot","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Plot.lua"]},{"name":"RadioButton","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/RadioButton.lua"]},{"name":"Root","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Root.lua"]},{"name":"Table","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Table.lua"]},{"name":"Text","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Text.lua"]},{"name":"Tree","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Tree.lua"]},{"name":"Window","className":"ModuleScript","filePaths":["src/client/UI/Iris/lib/widgets/Window.lua"]}]}]},{"name":"Vignette","className":"ModuleScript","filePaths":["src/client/UI/Vignette.luau"]}]}]}]}]}]}]} \ No newline at end of file diff --git a/src/server/main/Elevators/ButtonManager.luau b/src/server/main/Elevators/ButtonManager.luau new file mode 100644 index 0000000..fe597a7 --- /dev/null +++ b/src/server/main/Elevators/ButtonManager.luau @@ -0,0 +1,86 @@ +--!optimize 2 +--!native +--!strict + +local Elevators = script.Parent +local Main = Elevators.Parent + +local Storage = game:GetService("ReplicatedStorage") + +local Enums = require(Storage:WaitForChild("Enums")) + +local Map = Main:WaitForChild("Map") +local PromptModule = require(Map:WaitForChild("Prompts")) +local Tags = require(Map:WaitForChild("Load"):WaitForChild("Tags")) + +type FloorButtonActivatedCallback = (ButtonFloor: number | string) -> () +type StopButtonActivatedCallback = (Toggled: boolean) -> () + +type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor)) +type Impl_Constructor = { + __index: Impl_Constructor, + constructor: Constructor_Fun, + --Class functions + CarButton: (self: ClassConstructor, ButtonID: string, ButtonTree: Tags.ButtonProperties, Callback: FloorButtonActivatedCallback, Fallback: FloorButtonActivatedCallback) -> (), + LandingButton: (self: ClassConstructor, ButtonID: string, ButtonTree: Tags.ButtonProperties, Callback: FloorButtonActivatedCallback, Fallback: FloorButtonActivatedCallback) -> (), + SpecialButton: (self: ClassConstructor, ButtonName: Enums.SpecialButtonValues, ButtonID: string, ButtonTree: Tags.ButtonProperties, Callback: StopButtonActivatedCallback) -> (), +} + +type Constructor_Fun = (CurrentFloor: IntValue) -> ClassConstructor +type Constructor_Return_Props = { + CurrentFloor: IntValue +} + +export type ButtonsConstructor = ClassConstructor + +local ButtonFunctions = {} :: Impl_Constructor +ButtonFunctions.__index = ButtonFunctions + +--ButtonTags.ButtonsConstructor +function ButtonFunctions.constructor(CurrentFloor) + return setmetatable({CurrentFloor = CurrentFloor}, ButtonFunctions) +end + +function ButtonFunctions:CarButton(ButtonID, ButtonTree, Callback, Fallback) + local DecodedCarFloorTag = Tags.Decoders.CarTag(ButtonID) + if DecodedCarFloorTag then + local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance) + Prompt:Triggered(function(Player: Player, _, __) + if DecodedCarFloorTag == self.CurrentFloor.Value then + Fallback(DecodedCarFloorTag) + else + Callback(DecodedCarFloorTag) + end + end) + end +end + +function ButtonFunctions:LandingButton(ButtonID, ButtonTree, Callback, Fallback) + local DecodedHallFloorTag = Tags.Decoders.HallTag(ButtonID) + if DecodedHallFloorTag then + local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance) + Prompt:Triggered(function(Player: Player, _, __) + if DecodedHallFloorTag == self.CurrentFloor.Value then + Fallback(DecodedHallFloorTag) + else + Callback(DecodedHallFloorTag) + end + end) + end +end + +function ButtonFunctions:SpecialButton(ButtonID, ButtonName, ButtonTree, Callback) + --precomputing speed + if ButtonID == Enums.SpecialButton.Stop then + local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance) + local Toggled = false + Prompt:Triggered(function(Player: Player, _, __) + Toggled = not Toggled + Callback(Toggled) + end) + else + warn(``) + end +end + +return ButtonFunctions diff --git a/src/server/main/Elevators/Buttons.luau b/src/server/main/Elevators/Buttons.luau deleted file mode 100644 index 420402c..0000000 --- a/src/server/main/Elevators/Buttons.luau +++ /dev/null @@ -1,135 +0,0 @@ ---!optimize 2 ---!native ---!strict - -local Elevators = script.Parent -local Main = Elevators.Parent -local Load = Main:WaitForChild("Load") - -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")) - -type FloorButtonActivatedCallback = (ButtonFloor: number) -> () -type FloorButtonActivatedFallback = FloorButtonActivatedCallback -type StopButtonActivatedCallback = (Toggled: SpecialButtonToggle) -> () - -type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor)) -type Impl_Constructor = { - __index: Impl_Constructor, - constructor: Constructor_Fun, - --Class functions - CarButton: (self: ClassConstructor, ButtonID: string, ButtonTree: Tags.ButtonProperties, Callback: FloorButtonActivatedCallback, Fallback: FloorButtonActivatedFallback) -> (), - LandingButton: (self: ClassConstructor, ButtonID: string, ButtonTree: Tags.ButtonProperties, Callback: FloorButtonActivatedCallback, Fallback: FloorButtonActivatedFallback) -> (), - SpecialButton: (self: ClassConstructor, ButtonName: Enums.SpecialButtonValues, ButtonID: string, ButtonTree: Tags.ButtonProperties, Callback: StopButtonActivatedCallback) -> (), -} & Impl_Static_Props - -type Impl_Static_Props = { - ButtonHoldDuration: number, - AestheticDeactivateTime: number -} - -type Constructor_Fun = (ElevatorAttributes: ElevatorAttributes, ElevatorButtonColors: ElevatorButtonColors) -> ClassConstructor -type Constructor_Return_Props = { - ElevatorAttributes: ElevatorAttributes, - ElevatorButtonColors: ElevatorButtonColors -} - -type ElevatorAttributes = { - CurrentFloor: IntValue, - Moving: BoolValue, -} - -type ElevatorEvents = { - ButtonActivated: BindableEvent -} - -type ElevatorButtonColors = { - ButtonActivated: Color3, - ButtonDeactivated: Color3, - LanternDisplayOn: Color3, - LanternDisplayOff: Color3, -} - -export type SpecialButtonToggle = boolean - -export type ButtonsConstructor = ClassConstructor - -local ButtonFunctions = {} :: Impl_Constructor -ButtonFunctions.__index = ButtonFunctions - -ButtonFunctions.ButtonHoldDuration = .30 -ButtonFunctions.AestheticDeactivateTime = .30 - ---ButtonTags.ButtonsConstructor -function ButtonFunctions.constructor(ElevatorAttributes, ElevatorButtonColors) - return setmetatable({ - ElevatorAttributes = ElevatorAttributes, - ElevatorButtonColors = ElevatorButtonColors - }, ButtonFunctions) -end - -function ButtonFunctions:CarButton(ButtonID, ButtonTree, Callback, Fallback) - local DecodedCarFloorTag = Tags.Decoders.CarTag(ButtonID) - - if DecodedCarFloorTag then - local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance) - - Prompt:Triggered(function(Player: Player, _, __) - self:AestheticActivateButton(ButtonTree.Inst :: BasePart) - - if DecodedCarFloorTag == self.ElevatorAttributes.CurrentFloor.Value then - Fallback(DecodedCarFloorTag) - - task.delay(ButtonFunctions.AestheticDeactivateTime, function() - self:__DeactivateButton(ButtonTree.Inst :: BasePart, (ButtonTree.Inst :: Instance):FindFirstChild("Glass") :: BasePart?) - end) - else - Callback(DecodedCarFloorTag) - end - end) - end -end - -function ButtonFunctions:LandingButton(ButtonID, ButtonTree, Callback, Fallback) - local DecodedHallFloorTag = Tags.Decoders.HallTag(ButtonID) - - if DecodedHallFloorTag then - local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance) - - Prompt:Triggered(function(Player: Player, _, __) - self:AestheticActivateButton(ButtonTree.Inst :: BasePart) - - if DecodedHallFloorTag == self.ElevatorAttributes.CurrentFloor.Value then - Fallback(DecodedHallFloorTag) - - task.delay(ButtonFunctions.AestheticDeactivateTime, function() - self:__DeactivateButton(ButtonTree.Inst :: BasePart, (ButtonTree.Inst :: Instance):FindFirstChild("Glass") :: BasePart?) - end) - else - Callback(DecodedHallFloorTag) - end - end) - end -end - -function ButtonFunctions:SpecialButton(ButtonID, ButtonName, ButtonTree, Callback) - --precomputing speed - if ButtonID == Enums.SpecialButton.Stop then - local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance) - local Toggled = false - - Prompt:Triggered(function(Player: Player, _, __) - Toggled = not Toggled - - Callback(Toggled) - end) - else - warn(``) - end -end - -return ButtonFunctions diff --git a/src/server/main/Elevators/Map/Haughton/Buttons.luau b/src/server/main/Elevators/Map/Haughton/Buttons.luau new file mode 100644 index 0000000..585907c --- /dev/null +++ b/src/server/main/Elevators/Map/Haughton/Buttons.luau @@ -0,0 +1,71 @@ +--!optimize 2 +--!native +--!strict + +local ParentDir = script.Parent +local MapDir = ParentDir.Parent +local ElevatorDir = MapDir.Parent +local MainDir = ElevatorDir.Parent +local TagsModule = MainDir:WaitForChild("Map"):WaitForChild("Load"):WaitForChild("Tags") + +local StorageService = game:GetService("ReplicatedStorage") + +local Enums = require(StorageService:WaitForChild("Enums")) +local ButtonTags = require(TagsModule:WaitForChild("Buttons")) +local Tags = require(TagsModule) +local ButtonManager = require(ElevatorDir:WaitForChild("ButtonManager")) + +type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor)) +type Impl_Constructor = { + __index: Impl_Constructor, + constructor: Constructor_Fun, + --Class functions + Hook: (self: ClassConstructor) -> () +} + +type Constructor_Fun = (ElevatorModel: Enums.ElevatorValues, ButtonTags: Tags.ElevatorButtons, CurrentFloor: IntValue) -> ClassConstructor +type Constructor_Return_Props = { + ElevatorModel: Enums.ElevatorValues, + ButtonTags: Tags.ElevatorButtons, + CurrentFloor: IntValue +} + +local Buttons = {} :: Impl_Constructor +Buttons.__index = Buttons + +function Buttons.constructor(ElevatorModel, ButtonTags, CurrentFloor) + return setmetatable({ + ElevatorModel = ElevatorModel, + ButtonTags = ButtonTags, + CurrentFloor = CurrentFloor, + }, Buttons) +end + +local function CarButtonActivated(ButtonFloor: number | string) + print("Activated", ButtonFloor) +end + +function Buttons:Hook() + local ButtonManagerConstructor = ButtonManager.constructor(self.CurrentFloor) + local ButtonTagsConstructor = ButtonTags.constructor(self.ButtonTags, self.ElevatorModel) + local Prompt = ButtonTagsConstructor:CreatePromptButtons() + + for ButtonID: string, ButtonInstance: Instance in self.ButtonTags do + local CarButtonPrompts = Prompt[self.ElevatorModel].Car + + for PromptType, PromptProperties in CarButtonPrompts do + if PromptProperties.Attachment and PromptProperties.Inst and PromptProperties.Prompt then + PromptProperties.Prompt.MaxActivationDistance = 2 + PromptProperties.Attachment.Position-=Vector3.new(.01,0,0) + + ButtonManagerConstructor:CarButton(ButtonID, PromptProperties, CarButtonActivated, function(ButtonFloor: number | string) + print("Fallback", ButtonFloor) + end) + else + warn() + end + end + end +end + +return Buttons \ No newline at end of file diff --git a/src/server/main/Elevators/Map/Haughton/Config.luau b/src/server/main/Elevators/Map/Haughton/Config.luau index f74f985..acef75d 100644 --- a/src/server/main/Elevators/Map/Haughton/Config.luau +++ b/src/server/main/Elevators/Map/Haughton/Config.luau @@ -11,25 +11,53 @@ local StorageService = game:GetService("ReplicatedStorage") local Types = MainDir:WaitForChild("Types") local Enums = require(StorageService:WaitForChild("Enums")) local ElevatorTypes = require(Types:WaitForChild("Elevator")) -local SoundEnums = require(Types:WaitForChild("Enums"):WaitForChild("Sounds")) +--local SoundEnums = require(Types:WaitForChild("Enums"):WaitForChild("Sounds")) local HaughtonConfiguration = {} :: ElevatorTypes.ElevatorConfigurationTable HaughtonConfiguration.Name = Enums.Elevator.Haughton -HaughtonConfiguration.FloorLevelingDistance = 4 +HaughtonConfiguration.FloorLevelingDistance = 6 HaughtonConfiguration.FloorLeveling3PhaseDistance = 1.5 -HaughtonConfiguration.LevelingVelocity = 1 -HaughtonConfiguration.Phase3LevelingVelocity = 1 +HaughtonConfiguration.LevelingVelocity = .5 +HaughtonConfiguration.Phase3LevelingVelocity = .5 HaughtonConfiguration.ParkedDistance = 0.2 HaughtonConfiguration.Responsiveness = 5 -HaughtonConfiguration.MaxVelocity = 10 +HaughtonConfiguration.MaxVelocity = 7 + HaughtonConfiguration.Functions = { ManualTravelStart = true } + HaughtonConfiguration.Colors = { - ButtonActivated = Color3.fromRGB(180,0,0), - ButtonDeactivated = Color3.fromRGB(139,139,139), - LanternDisplayOn = Color3.fromRGB(44,255,157), - LanternDisplayOff = Color3.fromRGB(255,29,101), + ButtonActivated = { + Color = Color3.fromRGB(162, 106, 76), + Material = Enum.Material.Neon + }, + ButtonDeactivated = { + Color = Color3.fromRGB(136, 143, 145), + Material = Enum.Material.SmoothPlastic + }, + LanternIndicator = { + On = { + Up = { + Color = Color3.fromRGB(44, 255, 157), + Material = Enum.Material.Neon + }, + Down = { + Color = Color3.fromRGB(255, 29, 101), + Material = Enum.Material.Neon + }, + }, + Off = { + Up = { + Color = Color3.fromRGB(172, 174, 197), + Material = Enum.Material.SmoothPlastic + }, + Down = { + Color = Color3.fromRGB(172, 174, 197), + Material = Enum.Material.SmoothPlastic + }, + } + } } return HaughtonConfiguration diff --git a/src/server/main/Elevators/Map/Haughton/Leveling.luau b/src/server/main/Elevators/Map/Haughton/Leveling.luau index 6ee2552..ea0ee9f 100644 --- a/src/server/main/Elevators/Map/Haughton/Leveling.luau +++ b/src/server/main/Elevators/Map/Haughton/Leveling.luau @@ -3,6 +3,12 @@ --!strict return { - [1] = 1.163, + [1] = 1.163, --Basement [2] = 19.163, + [3] = 37.507, + [4] = 55.464, + [5] = 73.383, + [6] = 91.301, + [7] = 109.243, + [8] = 127.185, } diff --git a/src/server/main/Elevators/Map/Haughton/MovingObjects.luau b/src/server/main/Elevators/Map/Haughton/MovingObjects.luau index 2a6ed36..8d1131c 100644 --- a/src/server/main/Elevators/Map/Haughton/MovingObjects.luau +++ b/src/server/main/Elevators/Map/Haughton/MovingObjects.luau @@ -2,28 +2,127 @@ --!native --!strict +local ParentDir = script.Parent +local ElevatorsDir = ParentDir.Parent +local MainDir = ElevatorsDir.Parent.Parent + +local TagsModule = require(MainDir:WaitForChild("Map"):WaitForChild("Load"):WaitForChild("Tags")) + type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor)) type Impl_Constructor = { __index: Impl_Constructor, constructor: Constructor_Fun, --Class functions - RotateRelayCogs: (self: ClassConstructor, InwardsDirection: boolean, SextetRow: boolean, Faulting: boolean, MagnetCog: BasePart, Cog2: BasePart, CounterWeight: BasePart, Row3_RelayDown: BasePart) -> Tween + RotateRelayCogs1Async: (self: ClassConstructor) -> (), + RotateRelayCogs2Async: (self: ClassConstructor) -> (), + RotateRelayCogs3: (self: ClassConstructor) -> (), + RotateRotodials: (self: ClassConstructor, Elevator_Y_Velocity: number) -> (), + RotatePulleyWheel: (self: ClassConstructor, TravelingUpwards: boolean, Elevator_Y_Velocity: number) -> (), +} & Impl_Static_Props + +type Impl_Static_Props = { + RotateRotodialsSensitivity: number, + PulleyWheelRotationSensitivity: number } -type Constructor_Fun = () -> ClassConstructor -type Constructor_Return_Props = {} +type Constructor_Fun = (TagsConstructor: TagsModule.TagsConstructor) -> ClassConstructor +type Constructor_Return_Props = { + PulleyWheel: BasePart, + Cog2_Row1: BasePart, + Cog2_Row2: BasePart, + Cog2_Row3: BasePart, + Cog2_Row4: BasePart, + Relay_Close: Sound, + Relay_FullOpen: Sound, + Relay_Open: Sound, + MagnetCog_Row1: BasePart, + MagnetCog_Row2: BasePart, + MagnetCog_Row3: BasePart, + MagnetCog_Row4: BasePart, + Row1_CounterWeight: BasePart, + Row1_Flash: PointLight, + Row1_Relays: BasePart, + Row2_CounterWeight: BasePart, + Row2_Flash: PointLight, + Row2_Relays: BasePart, + Row3_CounterWeight: BasePart, + Row3_RelayDown: BasePart, + Row4_CounterWeight: BasePart, + Row4_Flash: PointLight, + Row4_Relays: BasePart, + Rotodials: {Instance} +} local TS = game:GetService("TweenService") local MovingObjects = {} :: Impl_Constructor MovingObjects.__index = MovingObjects -function MovingObjects.constructor() - return setmetatable({}, MovingObjects) +MovingObjects.RotateRotodialsSensitivity = 40 +MovingObjects.PulleyWheelRotationSensitivity = 2 + +function MovingObjects.constructor(TagsConstructor) + local PulleyWheel = TagsConstructor:Request("Haughton_PulleyWheel") :: BasePart + + local Cog2_Row1 = TagsConstructor:Request("Haughton_Cog2_Row1") :: BasePart + local Cog2_Row2 = TagsConstructor:Request("Haughton_Cog2_Row2") :: BasePart + local Cog2_Row3 = TagsConstructor:Request("Haughton_Cog2_Row3") :: BasePart + local Cog2_Row4 = TagsConstructor:Request("Haughton_Cog2_Row4") :: BasePart + + local Haughton_Relay_Close = TagsConstructor:Request("Haughton_Relay_Close") :: Sound + local Haughton_Relay_FullOpen = TagsConstructor:Request("Haughton_Relay_FullOpen") :: Sound + local Haughton_Relay_Open = TagsConstructor:Request("Haughton_Relay_Open") :: Sound + + local MagnetCog_Row1 = TagsConstructor:Request("Haughton_MagnetCog_Row1") :: BasePart + local MagnetCog_Row2 = TagsConstructor:Request("Haughton_MagnetCog_Row2") :: BasePart + local MagnetCog_Row3 = TagsConstructor:Request("Haughton_MagnetCog_Row3") :: BasePart + local MagnetCog_Row4 = TagsConstructor:Request("Haughton_MagnetCog_Row4") :: BasePart + + local Row1_CounterWeight = TagsConstructor:Request("Haughton_Row1_CounterWeight") :: BasePart + local Row1_Flash = TagsConstructor:Request("Haughton_Row1_Flash") :: PointLight + local Row1_Relays = TagsConstructor:Request("Haughton_Row1_Relays") :: BasePart + local Row2_CounterWeight = TagsConstructor:Request("Haughton_Row2_CounterWeight") :: BasePart + local Row2_Flash = TagsConstructor:Request("Haughton_Row2_Flash") :: PointLight + local Row2_Relays = TagsConstructor:Request("Haughton_Row2_Relays") :: BasePart + local Row3_CounterWeight = TagsConstructor:Request("Haughton_Row3_CounterWeight") :: BasePart + local Row3_RelayDown = TagsConstructor:Request("Haughton_Row3_Relay_Down") :: BasePart + local Row4_CounterWeight = TagsConstructor:Request("Haughton_Row4_CounterWeight") :: BasePart + local Row4_Flash = TagsConstructor:Request("Haughton_Row4_Flash") :: PointLight + local Row4_Relays = TagsConstructor:Request("Haughton_Row4_Relays") :: BasePart + + local Rotodials = TagsConstructor:Request("Haughton_Rotodial") :: {Instance} + + return setmetatable({ + PulleyWheel = PulleyWheel, + Cog2_Row1 = Cog2_Row1, + Cog2_Row2 = Cog2_Row2, + Cog2_Row3 = Cog2_Row3, + Cog2_Row4 = Cog2_Row4, + Relay_Close = Haughton_Relay_Close, + Relay_FullOpen = Haughton_Relay_FullOpen, + Relay_Open = Haughton_Relay_Open, + MagnetCog_Row1 = MagnetCog_Row1, + MagnetCog_Row2 = MagnetCog_Row2, + MagnetCog_Row3 = MagnetCog_Row3, + MagnetCog_Row4 = MagnetCog_Row4, + Row1_CounterWeight = Row1_CounterWeight, + Row1_Flash = Row1_Flash, + Row1_Relays = Row1_Relays, + Row2_CounterWeight = Row2_CounterWeight, + Row2_Flash = Row2_Flash, + Row2_Relays = Row2_Relays, + Row3_CounterWeight = Row3_CounterWeight, + Row3_RelayDown = Row3_RelayDown, + Row4_CounterWeight = Row4_CounterWeight, + Row4_Flash = Row4_Flash, + Row4_Relays = Row4_Relays, + Rotodials = Rotodials, + }, MovingObjects) end -function MovingObjects:RotateRelayCogs(InwardsDirection, SextetRow, Faulting, MagnetCog, Cog2, CounterWeight, Row_Relays) - local CogTweenInfo = TweenInfo.new(InwardsDirection and .25 or (Faulting and 5 or 3), InwardsDirection and Enum.EasingStyle.Quad or Enum.EasingStyle.Elastic) +local function RotateRelayCogs(InwardsDirection: boolean, SextetRow: boolean, MagnetCog: BasePart, Cog2: BasePart, CounterWeight: BasePart, Row_Relays: BasePart): Tween + local CogTweenInfo = TweenInfo.new(InwardsDirection and .105 or 3, InwardsDirection and Enum.EasingStyle.Quad or Enum.EasingStyle.Elastic) + local LinearTween = TweenInfo.new(.105, Enum.EasingStyle.Linear) local MagnetCogTween = TS:Create(MagnetCog, CogTweenInfo, { CFrame = MagnetCog.CFrame*CFrame.Angles(math.rad(InwardsDirection and -90 or 90), 0, 0) @@ -32,10 +131,10 @@ function MovingObjects:RotateRelayCogs(InwardsDirection, SextetRow, Faulting, Ma CFrame = Cog2.CFrame*CFrame.Angles(math.rad(InwardsDirection and 90 or -90), 0, 0) }) - local CounterWeightTween = TS:Create(CounterWeight, TweenInfo.new(.105, Enum.EasingStyle.Linear), { - Position = InwardsDirection and CounterWeight.Position+Vector3.new(0,.23,0) or CounterWeight.Position-Vector3.new(0,.23,0) + local CounterWeightTween = TS:Create(CounterWeight, LinearTween, { + Position = CounterWeight.Position+Vector3.new(0,InwardsDirection and .23 or -.23,0) }) - local RelaysTween = TS:Create(Row_Relays, TweenInfo.new(.105, Enum.EasingStyle.Linear), { + local RelaysTween = TS:Create(Row_Relays, LinearTween, { CFrame = Row_Relays.CFrame*CFrame.Angles(0,0,math.rad(SextetRow and (InwardsDirection and 6 or -6) or InwardsDirection and -6 or 6)) }) @@ -47,4 +146,49 @@ function MovingObjects:RotateRelayCogs(InwardsDirection, SextetRow, Faulting, Ma return MagnetCogTween end +local function ElectricalFlash(Flash: PointLight) + Flash.Enabled = true + task.delay(.07, function() + Flash.Enabled = false + end) +end + +function MovingObjects:RotateRelayCogs1Async() + self.Relay_Close:Play() + RotateRelayCogs(true, false, self.MagnetCog_Row3, self.Cog2_Row3, self.Row3_CounterWeight, self.Row3_RelayDown) + task.wait(.30) + RotateRelayCogs(true, false, self.MagnetCog_Row2, self.Cog2_Row2, self.Row2_CounterWeight, self.Row2_Relays) + task.wait(.30) + RotateRelayCogs(true, true, self.MagnetCog_Row4, self.Cog2_Row4, self.Row4_CounterWeight, self.Row4_Relays) +end + +function MovingObjects:RotateRelayCogs2Async() + self.Relay_Open:Play() + RotateRelayCogs(false, false, self.MagnetCog_Row2, self.Cog2_Row2, self.Row2_CounterWeight, self.Row2_Relays) + ElectricalFlash(self.Row2_Flash) + + RotateRelayCogs(true, true, self.MagnetCog_Row1, self.Cog2_Row1, self.Row1_CounterWeight, self.Row1_Relays) + task.wait(.1) + RotateRelayCogs(false, true,self.MagnetCog_Row4, self.Cog2_Row4, self.Row4_CounterWeight, self.Row4_Relays) + ElectricalFlash(self.Row4_Flash) +end + +function MovingObjects:RotateRelayCogs3() + RotateRelayCogs(false, true, self.MagnetCog_Row1, self.Cog2_Row1, self.Row1_CounterWeight, self.Row1_Relays) + ElectricalFlash(self.Row1_Flash) + + RotateRelayCogs(false, false, self.MagnetCog_Row3, self.Cog2_Row3, self.Row3_CounterWeight, self.Row3_RelayDown) + self.Relay_FullOpen:Play() +end + +function MovingObjects:RotateRotodials(Elevator_Y_Velocity) + for n: number = 1, #self.Rotodials do + (self.Rotodials[n] :: BasePart).CFrame*=CFrame.Angles(math.rad(Elevator_Y_Velocity/MovingObjects.RotateRotodialsSensitivity),0,0) + end +end + +function MovingObjects:RotatePulleyWheel(TravelingUpwards, Elevator_Y_Velocity) + self.PulleyWheel.CFrame*=CFrame.Angles(math.rad((TravelingUpwards and -Elevator_Y_Velocity or Elevator_Y_Velocity)/MovingObjects.PulleyWheelRotationSensitivity),0,0) +end + return MovingObjects \ No newline at end of file diff --git a/src/server/main/Elevators/Map/Haughton/init.luau b/src/server/main/Elevators/Map/Haughton/init.luau index d3cc896..3fb1058 100644 --- a/src/server/main/Elevators/Map/Haughton/init.luau +++ b/src/server/main/Elevators/Map/Haughton/init.luau @@ -6,103 +6,45 @@ local ParentDir = script.Parent local ElevatorsDir = ParentDir.Parent local MainDir = ElevatorsDir.Parent -local StorageService = game:GetService("ReplicatedStorage") - -local Enums = require(StorageService:WaitForChild("Enums")) local InitElevator = require(ElevatorsDir:WaitForChild("System")) local Config = require(script:WaitForChild("Config")) +local Buttons = require(script:WaitForChild("Buttons")) local Leveling = require(script:WaitForChild("Leveling")) local MovingObjects = require(script:WaitForChild("MovingObjects")) local TagsModule = require(MainDir:WaitForChild("Map"):WaitForChild("Load"):WaitForChild("Tags")) -local function ElectricalFlash(Flash: PointLight) - Flash.Enabled = true - task.delay(.07, function() - Flash.Enabled = false - end) -end - return function(TagsConstructor: TagsModule.TagsConstructor, ButtonTags: TagsModule.ElevatorButtons, LanternTags: TagsModule.Lanterns, LandingDoorTags: TagsModule.LandingTags) + local ElevatorModel = TagsConstructor:Request("Elevator_Haughton") :: Model local ElevatorBoxModel = ElevatorModel:WaitForChild("Mover") :: BasePart - local MagnetCog_Row3 = TagsConstructor:Request("Haughton_MagnetCog_Row3") :: BasePart - local Cog2_Row3 = TagsConstructor:Request("Haughton_Cog2_Row3") :: BasePart - local Row3_CounterWeight = TagsConstructor:Request("Haughton_Row3_CounterWeight") :: BasePart - local Row3_RelayDown = TagsConstructor:Request("Haughton_Row3_Relay_Down") :: BasePart - - local Haughton_Relay_Close = TagsConstructor:Request("Haughton_Relay_Close") :: Sound - local Haughton_Relay_Open = TagsConstructor:Request("Haughton_Relay_Open") :: Sound - local Haughton_Relay_FullOpen = TagsConstructor:Request("Haughton_Relay_FullOpen") :: Sound - - local MagnetCog_Row1 = TagsConstructor:Request("Haughton_MagnetCog_Row1") :: BasePart - local Cog2_Row1 = TagsConstructor:Request("Haughton_Cog2_Row1") :: BasePart - local Row1_CounterWeight = TagsConstructor:Request("Haughton_Row1_CounterWeight") :: BasePart - local Row1_Relays = TagsConstructor:Request("Haughton_Row1_Relays") :: BasePart - local Row1_Flash = TagsConstructor:Request("Haughton_Row1_Flash") :: PointLight - - local MagnetCog_Row2 = TagsConstructor:Request("Haughton_MagnetCog_Row2") :: BasePart - local Cog2_Row2 = TagsConstructor:Request("Haughton_Cog2_Row2") :: BasePart - local Row2_CounterWeight = TagsConstructor:Request("Haughton_Row2_CounterWeight") :: BasePart - local Row2_Relays = TagsConstructor:Request("Haughton_Row2_Relays") :: BasePart - local Row2_Flash = TagsConstructor:Request("Haughton_Row2_Flash") :: PointLight - - local MagnetCog_Row4 = TagsConstructor:Request("Haughton_MagnetCog_Row4") :: BasePart - local Cog2_Row4 = TagsConstructor:Request("Haughton_Cog2_Row4") :: BasePart - local Row4_CounterWeight = TagsConstructor:Request("Haughton_Row4_CounterWeight") :: BasePart - local Row4_Relays = TagsConstructor:Request("Haughton_Row4_Relays") :: BasePart - local Row4_Flash = TagsConstructor:Request("Haughton_Row4_Flash") :: PointLight - - --sneaky Machine room stuff hehe - local PulleyWheel = TagsConstructor:Request("Haughton_PulleyWheel") :: BasePart - local Elevator = InitElevator.constructor(ElevatorBoxModel, Config, Leveling) - local MovingObjectsConstructor = MovingObjects.constructor() - task.wait(3) - task.spawn(function() - Elevator:RequestLevelAsync(2, Enums.ElevatorCallDirection.Down) - end) + local MovingObjectsConstructor = MovingObjects.constructor(TagsConstructor) + local ButtonsConstructor = Buttons.constructor(Config.Name, ButtonTags, Elevator.Attributes.CurrentFloor) Elevator.Events.Traveling:Connect(function(_DeltaTime: number, CabPosition: Vector3) local CabVelocity = ElevatorBoxModel:GetVelocityAtPosition(CabPosition) - local Pulley_Y_Direction = (Elevator.Attributes.TravelingUpwards.Value and -CabVelocity.Y or CabVelocity.Y) + local TravelingUpwards = Elevator.Attributes.TravelingUpwards.Value - PulleyWheel.CFrame*=CFrame.Angles(math.rad(Pulley_Y_Direction/2),0,0) + MovingObjectsConstructor:RotatePulleyWheel(TravelingUpwards, CabVelocity.Y) + MovingObjectsConstructor:RotateRotodials(CabVelocity.Y) end) + Elevator.Events.Progression:Connect(function(previousFloor: number, CurrentFloor: number, NextFloor: number) warn("previousFloor=",previousFloor,"CurrentFloor=", CurrentFloor, "NextFloor=",NextFloor) end) Elevator.Events.Leveling:Connect(function() - Haughton_Relay_Open:Play() - MovingObjectsConstructor:RotateRelayCogs(false, false, false, MagnetCog_Row2, Cog2_Row2, Row2_CounterWeight, Row2_Relays) - ElectricalFlash(Row2_Flash) - - MovingObjectsConstructor:RotateRelayCogs(true, true, false, MagnetCog_Row1, Cog2_Row1, Row1_CounterWeight, Row1_Relays) - task.wait(.1) - MovingObjectsConstructor:RotateRelayCogs(false, true, false, MagnetCog_Row4, Cog2_Row4, Row4_CounterWeight, Row4_Relays) - ElectricalFlash(Row4_Flash) + MovingObjectsConstructor:RotateRelayCogs2Async() end) Elevator.Events.Parked:Connect(function() - MovingObjectsConstructor:RotateRelayCogs(false, true, false, MagnetCog_Row1, Cog2_Row1, Row1_CounterWeight, Row1_Relays) - ElectricalFlash(Row1_Flash) - - MovingObjectsConstructor:RotateRelayCogs(false, false, false, MagnetCog_Row3, Cog2_Row3, Row3_CounterWeight, Row3_RelayDown) - Haughton_Relay_FullOpen:Play() + MovingObjectsConstructor:RotateRelayCogs3() end) - Haughton_Relay_Close:Play() - MovingObjectsConstructor:RotateRelayCogs(true, false, false, MagnetCog_Row3, Cog2_Row3, Row3_CounterWeight, Row3_RelayDown) - task.wait(.30) - MovingObjectsConstructor:RotateRelayCogs(true, false, false, MagnetCog_Row2, Cog2_Row2, Row2_CounterWeight, Row2_Relays).Completed:Once(function() - MovingObjectsConstructor:RotateRelayCogs(true, true, true, MagnetCog_Row1, Cog2_Row1, Row1_CounterWeight, Row1_Relays) - task.wait(.35) - MovingObjectsConstructor:RotateRelayCogs(false, true, true, MagnetCog_Row1, Cog2_Row1, Row1_CounterWeight, Row1_Relays) - end) - task.wait(.30) - MovingObjectsConstructor:RotateRelayCogs(true, true, false, MagnetCog_Row4, Cog2_Row4, Row4_CounterWeight, Row4_Relays) + ButtonsConstructor:Hook() - Elevator:StartTraveling() + -- MovingObjectsConstructor:RotateRelayCogs1Async() + -- Elevator:StartTraveling() end diff --git a/src/server/main/Elevators/System/init.luau b/src/server/main/Elevators/System/init.luau index e954a9e..2c3f34c 100644 --- a/src/server/main/Elevators/System/init.luau +++ b/src/server/main/Elevators/System/init.luau @@ -306,7 +306,7 @@ local function CabTraveling(self: ClassConstructor, deltaTime: number, LEVEL_VEC if ElevatorPosition.Y>=LEVEL_VEC3_Y_WRAP.Y-self.Elevator.Configuration.FloorLevelingDistance then if not Debounce.Leveling then self.Events.__eventInstances__.Leveling:Fire() - SmoothVelocity(self, self.Elevator.Configuration.LevelingVelocity, .5) + SmoothVelocity(self, self.Elevator.Configuration.LevelingVelocity, 1) Debounce.Leveling = true end @@ -338,7 +338,7 @@ local function CabTraveling(self: ClassConstructor, deltaTime: number, LEVEL_VEC if ElevatorPosition.Y<=LEVEL_VEC3_Y_WRAP.Y+self.Elevator.Configuration.FloorLevelingDistance then if not Debounce.Leveling then self.Events.__eventInstances__.Leveling:Fire() - SmoothVelocity(self, self.Elevator.Configuration.LevelingVelocity, .5) + SmoothVelocity(self, self.Elevator.Configuration.LevelingVelocity, 1) Debounce.Leveling = true end @@ -394,7 +394,7 @@ function Elevator:__TravelToFloorAsync(Level_Int, LEVEL_VEC3_Y_WRAP) --Set the elevator's AlignPosition to the floor Y vector self.Elevator.AlignPosition.Position = Vector3.new(self.Elevator.AlignPosition.Position.X, LEVEL_VEC3_Y_WRAP.Y, self.Elevator.AlignPosition.Position.Z) --Set the elevator's velocity - SmoothVelocity(self, self.Elevator.Configuration.MaxVelocity, 10) + SmoothVelocity(self, self.Elevator.Configuration.MaxVelocity, 3) end function Elevator:RequestLevelAsync(RequestedLevel, Direction) diff --git a/src/server/main/Map/Load/EditorEntities.luau b/src/server/main/Map/Load/EditorEntities.luau index 30b92c1..93ceec4 100644 --- a/src/server/main/Map/Load/EditorEntities.luau +++ b/src/server/main/Map/Load/EditorEntities.luau @@ -7,9 +7,10 @@ type HideEditor = (a1: BasePart | Folder, a2: boolean) -> () type LuaChangeableContainer = Script | LocalScript -local Players: Players = game:GetService("Players") -local CS: CollectionService = game:GetService("CollectionService") -local Storage: ReplicatedStorage = game:GetService("ReplicatedStorage") +local Players = game:GetService("Players") +local CS = game:GetService("CollectionService") +local Storage = game:GetService("ReplicatedStorage") +local RS = game:GetService("RunService") local ServerStorage = Storage:WaitForChild("Server") @@ -70,7 +71,7 @@ function StudioEntities.indexAll(enabled: boolean) if #StudioEntities.IndexedEntities == 0 then --Run when the server starts local WorkspaceEnt = workspace:GetDescendants() - + for i = 1, #WorkspaceEnt do local Item: Instance = WorkspaceEnt[i] local Case: HideEditor = EditorEntities[Item.Name] @@ -80,8 +81,10 @@ function StudioEntities.indexAll(enabled: boolean) end if Item:IsA("BasePart") then + if not RS:IsStudio() then + Item.Locked = true + end Item.CanTouch = false --Do micro optimizations - Item.Locked = true --Security from exploiters if not Item.Anchored and table.find(CS:GetTags(Item), "ServerGuard_Physics") then @@ -96,7 +99,7 @@ function StudioEntities.indexAll(enabled: boolean) elseif Item:IsA("LuaSourceContainer") then --Cant allow scripts outside of the framework --mini algIsAorthim to see if the script is part of the rhpid-framework character or not local Model = Item:FindFirstAncestorOfClass("Model") - + if Model and not Players:GetPlayerFromCharacter(Model) then if Item:IsA("Script") or Item:IsA("LocalScript") then Item.Enabled = false diff --git a/src/server/main/Map/Load/Tags/Buttons.luau b/src/server/main/Map/Load/Tags/Buttons.luau index 7444133..a0ca919 100644 --- a/src/server/main/Map/Load/Tags/Buttons.luau +++ b/src/server/main/Map/Load/Tags/Buttons.luau @@ -29,9 +29,8 @@ type Impl_Static_Props = { DefaultHoldDuration: number } -type Constructor_Fun = (TagsConstructor: TagsConstructor, ModelButtons: Tags.ElevatorButtons, ElevatorModel: Enums.ElevatorValues) -> ClassConstructor +type Constructor_Fun = (ModelButtons: Tags.ElevatorButtons, ElevatorModel: Enums.ElevatorValues) -> ClassConstructor type Constructor_Return_Props = { - Tags: TagsConstructor, ModelButtons: Tags.ElevatorButtons, ElevatorModel: Enums.ElevatorValues, Buttons: Tags.ButtonsTree @@ -45,14 +44,13 @@ ButtonsModule.__index = ButtonsModule ButtonsModule.DefaultMaxActivationDistance = 3 ButtonsModule.DefaultHoldDuration = .30 -function ButtonsModule.constructor(TagsConstructor, ModelButtons, ElevatorModel) +function ButtonsModule.constructor(ModelButtons, ElevatorModel) return setmetatable({ - Tags = TagsConstructor, ModelButtons = ModelButtons, ElevatorModel = ElevatorModel, - + Buttons = { - [ElevatorModel] = { + [ElevatorModel] = { Landing = {}, Car = {}, Special = {}, @@ -79,7 +77,7 @@ function ButtonsModule:CreatePromptButtons() local Split = TagName:split('_') - local ButtonType: Enums.ButtonValues? = if tonumber(Split[3]) then + local ButtonType: Enums.ButtonValues? = if tonumber(Split[3]) then Enums.Button.Car elseif Split[3] == "Floor" and Split[4]:match('%d') then Enums.Button.Landing diff --git a/src/server/main/Map/Load/Tags/init.luau b/src/server/main/Map/Load/Tags/init.luau index c110942..eebdf2d 100644 --- a/src/server/main/Map/Load/Tags/init.luau +++ b/src/server/main/Map/Load/Tags/init.luau @@ -25,7 +25,7 @@ type Impl_Constructor = { type Impl_Static_Props = { Decoders: { - CarTag: (FloorTag: string) -> number?, + CarTag: (FloorTag: string) -> (number | string)?, HallTag: (FloorTag: string) -> number? } } @@ -154,8 +154,9 @@ Tags.__index = Tags Tags.Decoders = { CarTag = function(FloorTag) - local Match = FloorTag:match('%d+$') - return Match and tonumber(Match) + local Match = FloorTag:match('%w+$') + + return Match and (tonumber(Match) or tostring(Match)) end, HallTag = function(FloorTag) @@ -369,7 +370,6 @@ function Tags:__Interactables() ptr.ColorDeactivated = LightAddress.ColorDeactivated ptr.ActivatedMaterial = LightAddress.ActivatedMaterial ptr.DeactivatedMaterial = LightAddress.DeactivatedMaterial - elseif InteractType == Enums.InteractType.Light then if type(Inst) == "table" then ptr.Lights = Inst diff --git a/src/server/main/Types/Elevator.luau b/src/server/main/Types/Elevator.luau index 94f9dcc..db3b628 100644 --- a/src/server/main/Types/Elevator.luau +++ b/src/server/main/Types/Elevator.luau @@ -1,3 +1,7 @@ +--!optimize 2 +--!native +--!strict + local EnumsDir = script.Parent:WaitForChild("Enums") local StorageService = game:GetService("ReplicatedStorage") @@ -5,28 +9,41 @@ local StorageService = game:GetService("ReplicatedStorage") local Enums = require(StorageService:WaitForChild("Enums")) local SoundEnums = require(EnumsDir:WaitForChild("Sounds")) +type ButtonProperties = { + Color: Color3, + Material: Enum.Material +} + export type ElevatorConfigurationTable = { - Name: Enums.ElevatorValues, - Responsiveness: number, - MaxVelocity: number, - FloorLevelingDistance: number, + Name: Enums.ElevatorValues, + Responsiveness: number, + MaxVelocity: number, + FloorLevelingDistance: number, FloorLeveling3PhaseDistance: number, - ParkedDistance: number, - LevelingVelocity: number, - Phase3LevelingVelocity: number, + ParkedDistance: number, + LevelingVelocity: number, + Phase3LevelingVelocity: number, Functions: { ManualTravelStart: boolean, }, Sounds: { LanternChimeDirection: SoundEnums.ElevatorSoundValues, - LanternChimeLanding: SoundEnums.ElevatorSoundValues, + LanternChimeLanding: SoundEnums.ElevatorSoundValues, }, Colors: { - ButtonActivated: Color3, - ButtonDeactivated: Color3, - LanternDisplayOn: Color3, - LanternDisplayOff: Color3, + ButtonActivated: ButtonProperties, + ButtonDeactivated: ButtonProperties, + LanternIndicator: { + On: { + Up: ButtonProperties, + Down: ButtonProperties + }, + Off: { + Up: ButtonProperties, + Down: ButtonProperties + } + }, }, }