diff --git a/obsidian/Elevators.md b/obsidian/Elevators.md
deleted file mode 100644
index e69de29..0000000
diff --git a/obsidian/Interactables.md b/obsidian/Interactables.md
index c65a6e1..2cdc4ea 100644
--- a/obsidian/Interactables.md
+++ b/obsidian/Interactables.md
@@ -1,14 +1,15 @@
-# Lights
-#### Properties
+## Lights
+##### Properties / Attributes
- Activated #Color3
- - The color that is shown on the Light Props once
-- ActivatedMaterial #string / #MaterialName
+- ActivatedMaterial #string
- Deactivated #Color3
-- DeactivatedMaterial #string / #MaterialName
+- DeactivatedMaterial #string
- Enabled #boolean
-#### Tag
-* `Interact_LightSwitch_*AreaName*`
- * `Interact` - *Interact Initializer* [`Not Changable`]
+##### Tag
+* ### Interact_LightSwitch_Area
+ * `Interact` - *Interact Initialize* [`Not Changable`]
* `LightSwitch` - *Interaction Type* [`Not Changable`]
- * `*AreaName*` - *Area name, must be unique and cannot use the same names* [`Changable`]
-
+ * `AreaName` - *Area name, must be unique and cannot use the same names* [`Changable`]
+## Elevator
+ * ##### Cab
+
\ No newline at end of file
diff --git a/readme b/readme.md
similarity index 100%
rename from readme
rename to readme.md
diff --git a/sourcemap.json b/sourcemap.json
index b47c4cd..b1af83f 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":"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":"Events","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/Events.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":"Doors","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/Doors.luau"]},{"name":"Events","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/Events/init.luau"],"children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/Events/Buttons.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":"TractionRopes","className":"ModuleScript","filePaths":["src/server/main/Elevators/Map/Haughton/TractionRopes.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":"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":"Doors","className":"ModuleScript","filePaths":["src/server/main/Types/Enums/Doors.luau"]},{"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
index fe597a7..bcbbe4f 100644
--- a/src/server/main/Elevators/ButtonManager.luau
+++ b/src/server/main/Elevators/ButtonManager.luau
@@ -13,7 +13,7 @@ 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 FloorButtonActivatedCallback = (ButtonFloor: number) -> ()
type StopButtonActivatedCallback = (Toggled: boolean) -> ()
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
diff --git a/src/server/main/Elevators/Map/Haughton/Buttons.luau b/src/server/main/Elevators/Map/Haughton/Buttons.luau
index 1ac38f6..ae8cca0 100644
--- a/src/server/main/Elevators/Map/Haughton/Buttons.luau
+++ b/src/server/main/Elevators/Map/Haughton/Buttons.luau
@@ -20,7 +20,8 @@ type Impl_Constructor = {
__index: Impl_Constructor,
constructor: Constructor_Fun,
--Class functions
- InitForElevator: (self: ClassConstructor, MaxActivationDistance: number?, AddedOffset: Vector3?) -> ()
+ InitForElevator: (self: ClassConstructor, MaxActivationDistance: number?, AddedOffset: Vector3?) -> (),
+ Get: (self: ClassConstructor, ButtonType: Enums.ButtonTreeValues, ButtonID: number) -> Tags.ButtonProperties?
}
type Constructor_Fun = (
@@ -33,21 +34,24 @@ type Constructor_Return_Props = {
ElevatorModel: Enums.ElevatorValues,
ButtonTags: Tags.ElevatorButtons,
CurrentFloor: IntValue,
- Events: Events
+ Events: Events,
+ __PromptButtons__: Tags.ButtonsTree?
}
export type Events = {
- FloorButtonActivated: RBXScriptSignal,
+ FloorButtonActivated: RBXScriptSignal,
__eventInstances__: {
FloorButtonActivated: BindableEvent
}
}
+export type constructor = ClassConstructor
+
local Buttons = {} :: Impl_Constructor
Buttons.__index = Buttons
function Buttons.constructor(ElevatorModel, ButtonTags, CurrentFloor)
- local ButtonActivated = Instance.new("BindableEvent")
+ local ButtonActivated = Instance.new("BindableEvent") :: BindableEvent
return setmetatable({
ElevatorModel = ElevatorModel,
@@ -69,24 +73,36 @@ function Buttons:InitForElevator(MaxActivationDistance, AddedOffset)
local ButtonManagerConstructor = ButtonManager.constructor(self.CurrentFloor)
local ButtonTagsConstructor = ButtonTags.constructor(self.ButtonTags, self.ElevatorModel)
- local Prompt = ButtonTagsConstructor:CreatePromptButtons()
- local CarButtonPrompts = Prompt[self.ElevatorModel].Car
+ self.__PromptButtons__ = ButtonTagsConstructor:CreatePromptButtons()
+
+ local CarButtonPrompts = (self.__PromptButtons__ :: Tags.ButtonsTree)[self.ElevatorModel].Car
for PromptType, PromptProperties in CarButtonPrompts do
- if PromptProperties.Attachment and PromptProperties.Inst and PromptProperties.Prompt then
- PromptProperties.Prompt.MaxActivationDistance = MaxActivationDistance :: number
- PromptProperties.Attachment.Position+=AddedOffset :: Vector3
+ PromptProperties.Prompt.MaxActivationDistance = MaxActivationDistance :: number
+ PromptProperties.Attachment.Position+=AddedOffset :: Vector3
- ButtonManagerConstructor:CarButton(PromptType, PromptProperties, function(ButtonFloor: number | string)
- self.Events.__eventInstances__.FloorButtonActivated:Fire(true, ButtonFloor, PromptProperties :: Tags.ButtonPropertiesSafe)
- end, function(ButtonFloor: number | string)
- self.Events.__eventInstances__.FloorButtonActivated:Fire(false, ButtonFloor, PromptProperties :: Tags.ButtonPropertiesSafe)
- end)
- else
- warn()
- end
+ ButtonManagerConstructor:CarButton(PromptType, PromptProperties, function(ButtonFloor: number)
+ self.Events.__eventInstances__.FloorButtonActivated:Fire(true, ButtonFloor, PromptProperties)
+ end, function(ButtonFloor: number)
+ self.Events.__eventInstances__.FloorButtonActivated:Fire(false, ButtonFloor, PromptProperties)
+ end)
end
end
+function Buttons:Get(ButtonType, ButtonName)
+ assert(self.__PromptButtons__, `Initialize the elevator buttons first before using :Get, self.__PromptButtons__={self.__PromptButtons__}`)
+
+ local Button = self.__PromptButtons__[self.ElevatorModel][ButtonType] :: Tags.ButtonDictionary?
+ if Button then
+ --mega cringe
+ for ButtonFullName: string, ButtonProps: Tags.ButtonProperties in Button do
+ if ButtonProps.ID == ButtonName then
+ return ButtonProps
+ end
+ end
+ end
+ return nil
+end
+
return Buttons
\ No newline at end of file
diff --git a/src/server/main/Elevators/Map/Haughton/Doors.luau b/src/server/main/Elevators/Map/Haughton/Doors.luau
new file mode 100644
index 0000000..c8ddba6
--- /dev/null
+++ b/src/server/main/Elevators/Map/Haughton/Doors.luau
@@ -0,0 +1,48 @@
+--!optimize 2
+--!native
+--!strict
+
+local ParentDir = script.Parent
+local ElevatorsDir = ParentDir.Parent.Parent
+local MainDir = ElevatorsDir.Parent
+
+local DoorEnums = require(MainDir:WaitForChild("Types"):WaitForChild("Enums"):WaitForChild("Doors"))
+
+type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
+type Impl_Constructor = {
+ __index: Impl_Constructor,
+ constructor: Constructor_Fun,
+ --Class functions
+}
+
+type LandingDoorsTree = {
+ [number]: {BasePart}
+}
+type CabDoorsTree = {
+ [number]: {BasePart}
+}
+
+type Constructor_Fun = (
+
+) -> ClassConstructor
+
+type Constructor_Return_Props = {
+
+}
+
+local Doors = {}
+Doors.__index = Doors
+
+function Doors.constructor(CabDoorsType, LandingDoorsType, LandingDoorsTree, CabDoorsTree)
+ return setmetatable({}, Doors)
+end
+
+function Doors:Open()
+
+end
+
+function Doors:Close()
+
+end
+
+return Doors
\ No newline at end of file
diff --git a/src/server/main/Elevators/Map/Haughton/Events.luau b/src/server/main/Elevators/Map/Haughton/Events.luau
deleted file mode 100644
index c0f5361..0000000
--- a/src/server/main/Elevators/Map/Haughton/Events.luau
+++ /dev/null
@@ -1,131 +0,0 @@
---!optimize 2
---!native
---!strict
-
-local ParentDir = script.Parent
-local ElevatorsDir = ParentDir.Parent.Parent
-local MainDir = ElevatorsDir.Parent
-
-local StorageService = game:GetService("ReplicatedStorage")
-
-local Enums = require(StorageService:WaitForChild("Enums"))
-local InitElevator = require(ElevatorsDir:WaitForChild("System"))
-local Buttons = require(ParentDir:WaitForChild("Buttons"))
-local MovingObjects = require(ParentDir:WaitForChild("MovingObjects"))
-local TagsModule = require(MainDir:WaitForChild("Map"):WaitForChild("Load"):WaitForChild("Tags"))
-local ElevatorTypes = require(MainDir:WaitForChild("Types"):WaitForChild("Elevator"))
-
-type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
-
-type Impl_Constructor = {
- __index: Impl_Constructor,
- constructor: Constructor_Fun,
- --Class functions
- Elevator: (self: ClassConstructor) -> (),
- Buttons: (self: ClassConstructor) -> ()
-}
-
-type Constructor_Fun = (
- InitElevatorConstructor: InitElevator.constructor,
- ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable,
- ElevatorEvents: InitElevator.Events,
- ElevatorAttributes: InitElevator.Attributes,
- ButtonEvents: Buttons.Events,
- ElevatorBoxModel: BasePart,
- Leveling: {number},
- MovingObjectsConstructor: MovingObjects.constructor
-) -> ClassConstructor
-
-type Constructor_Return_Props = {
- InitElevatorConstructor: InitElevator.constructor,
- ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable,
- ElevatorEvents: InitElevator.Events,
- ElevatorAttributes: InitElevator.Attributes,
- ButtonEvents: Buttons.Events,
- ElevatorBoxModel: BasePart,
- Leveling: {number},
- MovingObjectsConstructor: MovingObjects.constructor
-}
-
-local Events = {} :: Impl_Constructor
-Events.__index = Events
-
-function Events.constructor(InitElevatorConstructor, ElevatorConfig, ElevatorEvents, ElevatorAttributes, ButtonEvents, ElevatorBoxModel, Leveling, MovingObjectsConstructor)
- return setmetatable({
- InitElevatorConstructor = InitElevatorConstructor,
- ElevatorConfig = ElevatorConfig,
- ElevatorEvents = ElevatorEvents,
- ElevatorAttributes = ElevatorAttributes,
- ButtonEvents = ButtonEvents,
- ElevatorBoxModel = ElevatorBoxModel,
- Leveling = Leveling,
- MovingObjectsConstructor = MovingObjectsConstructor
- }, Events)
-end
-
-function Events:Elevator()
- self.ElevatorEvents.Traveling:Connect(function(_DeltaTime: number, CabPosition: Vector3)
- local CabVelocity = self.ElevatorBoxModel:GetVelocityAtPosition(CabPosition)
- local TravelingUpwards = self.ElevatorAttributes.TravelingUpwards.Value
-
- self.MovingObjectsConstructor:RotatePulleyWheel(TravelingUpwards, CabVelocity.Y)
- self.MovingObjectsConstructor:RotateRotodials(CabVelocity.Y)
- end)
- self.ElevatorEvents.Progression:Connect(function(previousFloor: number, CurrentFloor: number, NextFloor: number)
-
- end)
- self.ElevatorEvents.Leveling:Connect(function()
- self.MovingObjectsConstructor:RotateRelayCogs2Async()
- end)
- self.ElevatorEvents.Leveling3Phase:Connect(function()
-
- end)
- self.ElevatorEvents.ManualTravelRequested:Connect(function()
- self.MovingObjectsConstructor:ControllerStartAsync()
- task.wait(1)
- self.MovingObjectsConstructor:RotateRelayCogs1Async().Completed:Wait()
- self.InitElevatorConstructor:StartTraveling()
- end)
- self.ElevatorEvents.TravelStart:Connect(function()
-
- end)
- self.ElevatorEvents.Parked:Connect(function()
- self.MovingObjectsConstructor:RotateRelayCogs3()
- end)
-end
-
-local function ElevatorGoingUpDirection(CurrentFloor: number, RequestedFloor: number): boolean
- return CurrentFloor ()
+}
+
+type Constructor_Fun = (ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable, ElevatorConstructor: InitElevator.constructor, ButtonsConstructor: Buttons.constructor) -> ClassConstructor
+
+type Constructor_Return_Props = {
+ ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable,
+ ElevatorConstructor: InitElevator.constructor,
+ ButtonsConstructor: Buttons.constructor
+}
+
+local ButtonEvents = {} :: Impl_Constructor
+ButtonEvents.__index = ButtonEvents
+
+function ButtonEvents.constructor(ElevatorConfig, ElevatorConstructor, ButtonsConstructor)
+ return setmetatable({
+ ElevatorConfig = ElevatorConfig,
+ ElevatorConstructor = ElevatorConstructor,
+ ButtonsConstructor = ButtonsConstructor
+ }, ButtonEvents)
+end
+
+local function ElevatorGoingUpDirection(CurrentFloor: number, RequestedFloor: number): boolean
+ return CurrentFloor ()
+}
+
+type Constructor_Fun = (
+ ElevatorConstructor: InitElevator.constructor,
+ ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable,
+ ButtonsConstructor: Buttons.constructor,
+ ElevatorBoxModel: BasePart,
+ Leveling: {number},
+ MovingObjectsConstructor: MovingObjects.constructor,
+ TractionRopesConstructor: TractionRopes.constructor
+) -> ClassConstructor
+
+type Constructor_Return_Props = {
+ ElevatorConstructor: InitElevator.constructor,
+ ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable,
+ ButtonsConstructor: Buttons.constructor,
+ ElevatorBoxModel: BasePart,
+ Leveling: {number},
+ MovingObjectsConstructor: MovingObjects.constructor,
+ TractionRopesConstructor: TractionRopes.constructor
+}
+
+local Events = {} :: Impl_Constructor
+Events.__index = Events
+
+function Events.constructor(
+ ElevatorConstructor,
+ ElevatorConfig,
+ ButtonsConstructor,
+ ElevatorBoxModel,
+ Leveling,
+ MovingObjectsConstructor,
+ TractionRopesConstructor
+)
+ return setmetatable({
+ ElevatorConstructor = ElevatorConstructor,
+ ElevatorConfig = ElevatorConfig,
+ ButtonsConstructor = ButtonsConstructor,
+ ElevatorBoxModel = ElevatorBoxModel,
+ Leveling = Leveling,
+ MovingObjectsConstructor = MovingObjectsConstructor,
+ TractionRopesConstructor = TractionRopesConstructor
+ }, Events)
+end
+
+local function ElevatorEvents(self: ClassConstructor)
+ self.ElevatorConstructor.Events.Traveling:Connect(function(_DeltaTime: number, CabPosition: Vector3)
+ local CabVelocity = self.ElevatorBoxModel:GetVelocityAtPosition(CabPosition)
+ local TravelingUpwards = self.ElevatorConstructor.Attributes.TravelingUpwards.Value
+
+ self.TractionRopesConstructor:Update()
+ self.MovingObjectsConstructor:RotatePulleyWheel(TravelingUpwards, CabVelocity.Y)
+ self.MovingObjectsConstructor:RotateRotodials(CabVelocity.Y)
+ end)
+ -- self.ElevatorConstructor.Events.Progression:Connect(function(previousFloor: number, CurrentFloor: number, NextFloor: number)
+
+ -- end)
+ self.ElevatorConstructor.Events.Leveling:Connect(function()
+ self.MovingObjectsConstructor:RotateRelayCogs2Async()
+ end)
+ -- self.ElevatorConstructor.Events.Leveling3Phase:Connect(function()
+
+ -- end)
+ self.ElevatorConstructor.Events.ManualTravelRequested:Connect(function()
+ self.MovingObjectsConstructor:ControllerStartAsync()
+ task.wait(1)
+ self.MovingObjectsConstructor:RotateRelayCogs1Async().Completed:Wait()
+ self.ElevatorConstructor:StartTraveling()
+ end)
+ -- self.ElevatorConstructor.Events.TravelStart:Connect(function()
+
+ -- end)
+ self.ElevatorConstructor.Events.Parked:Connect(function()
+ self.MovingObjectsConstructor:RotateRelayCogs3()
+ end)
+end
+
+function Events:InitButtons()
+ ElevatorEvents(self)
+
+ local ButtonEventsConstructor = ButtonEvents.constructor(self.ElevatorConfig, self.ElevatorConstructor, self.ButtonsConstructor)
+ ButtonEventsConstructor:Events()
+end
+
+return Events
\ No newline at end of file
diff --git a/src/server/main/Elevators/Map/Haughton/MovingObjects.luau b/src/server/main/Elevators/Map/Haughton/MovingObjects.luau
index 26f71c4..773ebb3 100644
--- a/src/server/main/Elevators/Map/Haughton/MovingObjects.luau
+++ b/src/server/main/Elevators/Map/Haughton/MovingObjects.luau
@@ -60,9 +60,16 @@ type Constructor_Return_Props = {
Rotodials: {Instance}
}
+type LowPassSoundeffects = {
+ SoundGroup: SoundGroup,
+ EqualizerSoundEffect: EqualizerSoundEffect
+}
+
export type constructor = ClassConstructor
local TS = game:GetService("TweenService")
+local SS = game:GetService("SoundService")
+local RandomNew = Random.new()
local MovingObjects = {} :: Impl_Constructor
MovingObjects.__index = MovingObjects
@@ -70,7 +77,32 @@ MovingObjects.__index = MovingObjects
MovingObjects.RotateRotodialsSensitivity = 40
MovingObjects.PulleyWheelRotationSensitivity = 2
+local function LowPassSoundEffects(): LowPassSoundeffects
+ local SoundGroup = Instance.new("SoundGroup") :: SoundGroup
+ SoundGroup.Volume = 1
+ local EqualizerSoundEffect = Instance.new("EqualizerSoundEffect") :: EqualizerSoundEffect
+ EqualizerSoundEffect.HighGain = -15
+ EqualizerSoundEffect.LowGain = 0
+ EqualizerSoundEffect.MidGain = -35
+
+ EqualizerSoundEffect.Parent = SoundGroup
+ SoundGroup.Parent = SS
+
+ return {
+ SoundGroup = SoundGroup,
+ EqualizerSoundEffect = EqualizerSoundEffect
+ }
+end
+
+local function SmoothAudioRollin(Audio: Sound, Time: number, Goal: number)
+ TS:Create(Audio, TweenInfo.new(Time, Enum.EasingStyle.Linear), {
+ Volume = Goal
+ }):Play()
+end
+
function MovingObjects.constructor(TagsConstructor)
+ local AudioEffect = LowPassSoundEffects()
+
local PulleyWheel = TagsConstructor:Request("Haughton_PulleyWheel") :: BasePart
local Cog2_Row1 = TagsConstructor:Request("Haughton_Cog2_Row1") :: BasePart
@@ -87,7 +119,16 @@ function MovingObjects.constructor(TagsConstructor)
local Controller_Clicks = TagsConstructor:Request("Haughton_Controller_Clicks") :: Sound
local Pulley_Moving = TagsConstructor:Request("Haughton_Pulley_Moving") :: Sound
local Pulley_Start = TagsConstructor:Request("Haughton_Pulley_Start") :: Sound
- Controller_Hum.Looped = true
+
+ -- Haughton_Relay_Close.SoundGroup = AudioEffect.SoundGroup
+ -- Haughton_Relay_FullOpen.SoundGroup = AudioEffect.SoundGroup
+ -- Haughton_Relay_Open.SoundGroup = AudioEffect.SoundGroup
+ -- Controller_Start.SoundGroup = AudioEffect.SoundGroup
+ -- Controller_Hum.SoundGroup = AudioEffect.SoundGroup
+ -- Controller_End.SoundGroup = AudioEffect.SoundGroup
+ -- Controller_Clicks.SoundGroup = AudioEffect.SoundGroup
+ -- Pulley_Moving.SoundGroup = AudioEffect.SoundGroup
+ -- Pulley_Start.SoundGroup = AudioEffect.SoundGroup
local MagnetCog_Row1 = TagsConstructor:Request("Haughton_MagnetCog_Row1") :: BasePart
local MagnetCog_Row2 = TagsConstructor:Request("Haughton_MagnetCog_Row2") :: BasePart
@@ -176,10 +217,12 @@ local function ElectricalFlash(Flash: PointLight)
end
function MovingObjects:ControllerStartAsync()
- if math.random(1,30) == 1 then
+ if RandomNew:NextInteger(1,30) == 1 then
self.Controller_Start.SoundId = "rbxassetid://108739293674278"
+ self.Controller_Start.Volume = 1
else
self.Controller_Start.SoundId = "rbxassetid://75136143926200"
+ self.Controller_Start.Volume = 1.8
end
self.Controller_Start:Play()
self.Controller_Start.Ended:Wait()
@@ -192,9 +235,13 @@ function MovingObjects:RotateRelayCogs1Async()
task.wait(.30)
RotateRelayCogs(true, false, self.MagnetCog_Row2, self.Cog2_Row2, self.Row2_CounterWeight, self.Row2_Relays)
task.wait(.30)
+
self.Pulley_Start:Play()
+ SmoothAudioRollin(self.Pulley_Start, 2, 1.8)
+
task.spawn(function()
self.Pulley_Start.Ended:Wait()
+ self.Pulley_Start.Volume = 0
self.Pulley_Moving:Play()
end)
return RotateRelayCogs(true, true, self.MagnetCog_Row4, self.Cog2_Row4, self.Row4_CounterWeight, self.Row4_Relays)
@@ -210,7 +257,7 @@ function MovingObjects:RotateRelayCogs2Async()
RotateRelayCogs(false, true,self.MagnetCog_Row4, self.Cog2_Row4, self.Row4_CounterWeight, self.Row4_Relays)
ElectricalFlash(self.Row4_Flash)
self.Pulley_Moving:Stop()
- task.wait(2)
+ task.wait(RandomNew:NextNumber(2,4))
self.Controller_Clicks:Play()
end
@@ -226,8 +273,9 @@ function MovingObjects:RotateRelayCogs3()
end
function MovingObjects:RotateRotodials(Elevator_Y_Velocity)
+ local rad = math.rad(Elevator_Y_Velocity/MovingObjects.RotateRotodialsSensitivity)
for n: number = 1, #self.Rotodials do
- (self.Rotodials[n] :: BasePart).CFrame*=CFrame.Angles(math.rad(Elevator_Y_Velocity/MovingObjects.RotateRotodialsSensitivity),0,0)
+ (self.Rotodials[n] :: BasePart).CFrame*=CFrame.Angles(rad,0,0)
end
end
diff --git a/src/server/main/Elevators/Map/Haughton/TractionRopes.luau b/src/server/main/Elevators/Map/Haughton/TractionRopes.luau
new file mode 100644
index 0000000..cef4f3f
--- /dev/null
+++ b/src/server/main/Elevators/Map/Haughton/TractionRopes.luau
@@ -0,0 +1,56 @@
+--!optimize 2
+--!native
+--!strict
+
+type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
+
+type Impl_Constructor = {
+ __index: Impl_Constructor,
+ constructor: Constructor_Fun,
+ --Class functions
+ Update: (self: ClassConstructor) -> ()
+}
+
+type Constructor_Fun = (CabRopesObject: BasePart, PulleyRopesObject: BasePart) -> ClassConstructor
+
+type Constructor_Return_Props = {
+ CabRopesObject: BasePart,
+ PulleyRopesObject: BasePart,
+ PulleyCables: {RopeConstraint}
+}
+
+export type constructor = ClassConstructor
+
+local TractionRopes = {} :: Impl_Constructor
+TractionRopes.__index = TractionRopes
+
+function TractionRopes.constructor(CabRopesObject, PulleyRopesObject)
+ local PulleyCables = {}
+ local PulleyCablesChildren = PulleyRopesObject:GetChildren()
+
+ for n: number = 1, #PulleyCablesChildren do
+ local Object = PulleyCablesChildren[n] :: Instance
+ if Object:IsA("BasePart") then
+ local Rope = Object:FindFirstChildOfClass("RopeConstraint")
+ if Rope then
+ table.insert(PulleyCables, Rope)
+ end
+ end
+ end
+ assert(#PulleyCables>0, "0 RopeConstraint's were found for an elevator with traction ropes!")
+
+ return setmetatable({
+ CabRopesObject = CabRopesObject,
+ PulleyRopesObject = PulleyRopesObject,
+ PulleyCables = PulleyCables
+ }, TractionRopes)
+end
+
+function TractionRopes:Update()
+ local StudLength = (self.PulleyRopesObject.Position-self.CabRopesObject.Position).Magnitude+1
+ for n: number = 1, #self.PulleyCables do
+ self.PulleyCables[n].Length = StudLength
+ end
+end
+
+return TractionRopes
\ 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 23e8b47..6c6b4ca 100644
--- a/src/server/main/Elevators/Map/Haughton/init.luau
+++ b/src/server/main/Elevators/Map/Haughton/init.luau
@@ -12,21 +12,29 @@ 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 TractionRopes = require(script:WaitForChild("TractionRopes"))
local TagsModule = require(MainDir:WaitForChild("Map"):WaitForChild("Load"):WaitForChild("Tags"))
return function(TagsConstructor: TagsModule.TagsConstructor, ButtonTags: TagsModule.ElevatorButtons, LanternTags: TagsModule.Lanterns, LandingDoorTags: TagsModule.LandingTags)
local ElevatorModel = TagsConstructor:Request("Elevator_Haughton") :: Model
+ local CabRopesObject = TagsConstructor:Request("Haughton_Rope_Cab") :: BasePart
+ local PulleyRopesObject = TagsConstructor:Request("Haughton_Rope_Pulley") :: BasePart
local ElevatorBoxModel = ElevatorModel:WaitForChild("Mover") :: BasePart
local Elevator = InitElevator.constructor(ElevatorBoxModel, Config, Leveling)
local MovingObjectsConstructor = MovingObjects.constructor(TagsConstructor)
local ButtonsConstructor = Buttons.constructor(Config.Name, ButtonTags, Elevator.Attributes.CurrentFloor)
- local EventsConstructor = Events.constructor(Elevator, Config, Elevator.Events, Elevator.Attributes, ButtonsConstructor.Events, ElevatorBoxModel, Leveling, MovingObjectsConstructor)
+ local TractionRopesConstructor = TractionRopes.constructor(CabRopesObject, PulleyRopesObject)
+ local EventsConstructor = Events.constructor(
+ Elevator,
+ Config,
+ ButtonsConstructor,
+ ElevatorBoxModel,
+ Leveling,
+ MovingObjectsConstructor,
+ TractionRopesConstructor
+ )
- EventsConstructor:Elevator()
- EventsConstructor:Buttons()
+ EventsConstructor:InitButtons()
ButtonsConstructor:InitForElevator(2, Vector3.new(-.05,0,0))
-
- -- task.wait(3)
- -- Elevator:RequestLevelAsync(7, "Down")
end
diff --git a/src/server/main/Elevators/System/init.luau b/src/server/main/Elevators/System/init.luau
index ed3ea17..4ab4216 100644
--- a/src/server/main/Elevators/System/init.luau
+++ b/src/server/main/Elevators/System/init.luau
@@ -252,7 +252,7 @@ local function GoingUpDirectionToDirectionEnum(CurrentFloor: number, RequestedFl
end
local function CheckFloorQueue(self: ClassConstructor)
- self.Elevator.AlignPosition.MaxVelocity = 0
+ SmoothVelocity(self, 0, 1)
local DirectionToDirectionQueue = self.Attributes.TravelingUpwards.Value and self.RelayAlgorithm.FloorQueue.Up or self.RelayAlgorithm.FloorQueue.Down
local DirectionToOppositeDirectionQueue = self.Attributes.TravelingUpwards.Value and self.RelayAlgorithm.FloorQueue.Down or self.RelayAlgorithm.FloorQueue.Up
@@ -413,13 +413,14 @@ 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, 3)
+ SmoothVelocity(self, self.Elevator.Configuration.MaxVelocity, 5)
end
function Elevator:RequestLevelAsync(RequestedLevel, Direction)
local Level = self:GetLevel(RequestedLevel)
if Level then
+ --Some patch solution for cab calls
if (RequestedLevel == 1 and Direction == Enums.ElevatorCallDirection.Down) then
self.ewarnStudio(`Impossible direction requested, Direction={Direction}, RequestedLevel={RequestedLevel}. correcting...`)
Direction = Enums.ElevatorCallDirection.Up
diff --git a/src/server/main/Elevators/TractionRopes.luau b/src/server/main/Elevators/TractionRopes.luau
deleted file mode 100644
index e7ed7b2..0000000
--- a/src/server/main/Elevators/TractionRopes.luau
+++ /dev/null
@@ -1,53 +0,0 @@
---!optimize 2
---!native
---!strict
-
-type RopeTags = {Instance}
-type Leveling = {number}
-
-type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
-type Impl_Constructor = {
- __index: Impl_Constructor,
- constructor: Constructor_Fun,
- --Class functions
- Move: (self: ClassConstructor, Offset: number, ElevatorPosition: Vector3) -> (),
- Stopped: (self: ClassConstructor) -> (),
-}
-
-type Constructor_Fun = (RopeTags: RopeTags, ElevatorBox: BasePart, Leveling: Leveling) -> ClassConstructor
-type Constructor_Return_Props = {
- Ropes: RopeTags,
- Leveling: Leveling,
- BiggestRopeLength: number,
-}
-
-export type TractionRopesConstructor = ClassConstructor
-
-local TractionRopes = {} :: Impl_Constructor
-TractionRopes.__index = TractionRopes
-
-function TractionRopes.constructor(RopeTags, ElevatorBox, Leveling)
- local ArbitraryRopeContact = RopeTags[1].Parent :: BasePart
- local HighestLevel = Leveling[#Leveling]
- local BiggestRopeLength = HighestLevel-(ArbitraryRopeContact.Position.Y-HighestLevel)
-
- return setmetatable({
- Ropes = RopeTags,
- Leveling = Leveling,
- BiggestRopeLength = BiggestRopeLength
- }, TractionRopes)
-end
-
-function TractionRopes:Move(Offset, ElevatorPosition)
- local l = self.BiggestRopeLength-ElevatorPosition.Y+Offset
-
- for i: number = 1, #self.Ropes do
- (self.Ropes[i] :: RopeConstraint).Length = l
- end
-end
-
-function TractionRopes:Stopped()
-
-end
-
-return TractionRopes
diff --git a/src/server/main/Map/Load/Tags/Buttons.luau b/src/server/main/Map/Load/Tags/Buttons.luau
index a0ca919..a961156 100644
--- a/src/server/main/Map/Load/Tags/Buttons.luau
+++ b/src/server/main/Map/Load/Tags/Buttons.luau
@@ -20,20 +20,20 @@ type Impl_Constructor = {
__index: Impl_Constructor,
constructor: Constructor_Fun,
--Class functions
- DecodeCarTag: (self: ClassConstructor, FloorTag: string) -> number?,
+ DecodeCarTag: (self: ClassConstructor, FloorTag: string) -> number?,
CreatePromptButtons: (self: ClassConstructor) -> Tags.ButtonsTree,
} & Impl_Static_Props
type Impl_Static_Props = {
DefaultMaxActivationDistance: number,
- DefaultHoldDuration: number
+ DefaultHoldDuration: number
}
type Constructor_Fun = (ModelButtons: Tags.ElevatorButtons, ElevatorModel: Enums.ElevatorValues) -> ClassConstructor
type Constructor_Return_Props = {
- ModelButtons: Tags.ElevatorButtons,
+ ModelButtons: Tags.ElevatorButtons,
ElevatorModel: Enums.ElevatorValues,
- Buttons: Tags.ButtonsTree
+ Buttons: Tags.ButtonsTree
}
export type ButtonsTagsConstructor = ClassConstructor
@@ -42,7 +42,7 @@ local ButtonsModule = {} :: Impl_Constructor
ButtonsModule.__index = ButtonsModule
ButtonsModule.DefaultMaxActivationDistance = 3
-ButtonsModule.DefaultHoldDuration = .30
+ButtonsModule.DefaultHoldDuration = 0
function ButtonsModule.constructor(ModelButtons, ElevatorModel)
return setmetatable({
@@ -79,7 +79,7 @@ function ButtonsModule:CreatePromptButtons()
local ButtonType: Enums.ButtonValues? = if tonumber(Split[3]) then
Enums.Button.Car
- elseif Split[3] == "Floor" and Split[4]:match('%d') then
+ elseif Split[3] == "Floor" and Split[4]:match('%d') then --how do i stop opinionated info
Enums.Button.Landing
elseif Split[2] == "ElevatorButton" then
Enums.Button.Special
@@ -90,22 +90,29 @@ function ButtonsModule:CreatePromptButtons()
if ButtonType == Enums.Button.Car then
--ElevatorButton_1
+ local ID = tonumber(Split[3])
+ if ID then
+ local Name = (Inst:GetAttribute("Name") :: string?) or tostring(Split[3])
+ Inst:SetAttribute("Name", nil)
- Prompt.ActionText = tostring(Split[3])
- Prompt.ObjectText = "Floor"
-
- self.Buttons[self.ElevatorModel].Car[`{Split[2]}_{Split[3]}`] = {
- Inst = Inst,
- Prompt = Prompt,
- Attachment = Attachment
- }
+ Prompt.ActionText = Name
+ Prompt.ObjectText = "Floor"
+ self.Buttons[self.ElevatorModel].Car[`{Split[2]}_{Split[3]}`] = {
+ Inst = Inst,
+ Prompt = Prompt,
+ Attachment = Attachment,
+ ID = ID,
+ Name = Name
+ }
+ else
+ warn(`Button ID failed! {Split[1]}: button: "{Split[3]}" did not represent a number, ID={ID}`)
+ end
elseif ButtonType == Enums.Button.Landing then
--ElevatorButton_Floor_1_Up
local Name = tostring(Split[5])
Prompt.ActionText = `Send Elevator {Name}`
Prompt.ObjectText = `Floor {tostring(Split[4])}`
-
self.Buttons[self.ElevatorModel].Landing[`{Split[2]}_{Split[3]}_{Split[4]}_{Split[5]}`] = {
Inst = Inst,
Prompt = Prompt,
@@ -118,7 +125,6 @@ function ButtonsModule:CreatePromptButtons()
local Name = tostring(Split[3])
Prompt.ActionText = Name
Prompt.ObjectText = "Elevator"
-
self.Buttons[self.ElevatorModel].Special[`{Split[2]}_{Split[3]}`] = {
Inst = Inst,
Prompt = Prompt,
@@ -131,7 +137,6 @@ function ButtonsModule:CreatePromptButtons()
Prompt.Exclusivity = Enum.ProximityPromptExclusivity.OneGlobally --why does this not work...
Prompt.ActionText = "Activate"
Prompt.ObjectText = "Relay"
-
self.Buttons[self.ElevatorModel].Relays[`{Split[2]}_{Split[3]}`] = {
Inst = Inst,
Prompt = Prompt,
diff --git a/src/server/main/Map/Load/Tags/Lights.luau b/src/server/main/Map/Load/Tags/Lights.luau
index 8433a82..98eeab8 100644
--- a/src/server/main/Map/Load/Tags/Lights.luau
+++ b/src/server/main/Map/Load/Tags/Lights.luau
@@ -87,11 +87,11 @@ function Lights:Functionality(DefinedProperties)
ClickSound.SoundId = LightProperties.LightSwitchActivateSoundId
ClickSound.Parent = self.Switch
- LightAddresses.ColorActivated = self.Switch:GetAttribute("Activated")
- LightAddresses.ColorDeactivated = self.Switch:GetAttribute("Deactivated")
- LightAddresses.ActivatedMaterial = self.Switch:GetAttribute("ActivatedMaterial")
- LightAddresses.DeactivatedMaterial = self.Switch:GetAttribute("DeactivatedMaterial")
- LightAddresses.Enabled = self.Switch:GetAttribute("Enabled")
+ LightAddresses.ColorActivated = self.Switch:GetAttribute("Activated") :: Color3?
+ LightAddresses.ColorDeactivated = self.Switch:GetAttribute("Deactivated") :: Color3?
+ LightAddresses.ActivatedMaterial = self.Switch:GetAttribute("ActivatedMaterial") :: string?
+ LightAddresses.DeactivatedMaterial = self.Switch:GetAttribute("DeactivatedMaterial") :: string?
+ LightAddresses.Enabled = self.Switch:GetAttribute("Enabled") :: boolean?
LightAddresses.Attachment = Attachment
LightAddresses.Prompt = Prompt
LightAddresses.ClickSound = ClickSound
diff --git a/src/server/main/Map/Load/Tags/init.luau b/src/server/main/Map/Load/Tags/init.luau
index eebdf2d..79813e2 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 | string)?,
+ CarTag: (FloorTag: string) -> number?,
HallTag: (FloorTag: string) -> number?
}
}
@@ -98,7 +98,7 @@ export type ButtonDictionary = {
[string]: ButtonProperties
}
-export type RelayProperties = ButtonProperties & {
+export type RelayProperties = Properties & {
Unique: boolean,
ActiveState: boolean,
PhysicalSound: {
@@ -114,24 +114,25 @@ export type RelayDictionary = {
export type ButtonsTree = {
[Enums.ElevatorValues]: {
Car: ButtonDictionary,
- Landing: ButtonDictionary,
- Special: ButtonDictionary,
+ Landing: Properties,
+ Special: Properties,
Relays: RelayDictionary
}
}
export type ButtonProperties = {
- Inst: Instance?,
- Prompt: ProximityPrompt?,
- Attachment: Attachment?,
- Name: string?
-}
-
-export type ButtonPropertiesSafe = {
Inst: Instance,
Prompt: ProximityPrompt,
Attachment: Attachment,
- Name: string?
+ ID: number,
+ Name: string
+}
+
+export type Properties = {
+ Inst: Instance,
+ Prompt: ProximityPrompt,
+ Attachment: Attachment,
+ Name: string
}
export type ExportedTags = {
@@ -154,9 +155,8 @@ Tags.__index = Tags
Tags.Decoders = {
CarTag = function(FloorTag)
- local Match = FloorTag:match('%w+$')
-
- return Match and (tonumber(Match) or tostring(Match))
+ local Match = FloorTag:match('%d+$')
+ return Match and tonumber(Match)
end,
HallTag = function(FloorTag)
@@ -201,8 +201,6 @@ function Tags:Nuke()
warn("☢️ nuked all in-game tags. Left-over tags="..table.concat(CS:GetAllTags(), ", "))
end
---Parsers:
-
function Tags:__ElevatorLanterns()
local Lanterns: LanternsTree = {}
diff --git a/src/server/main/Types/Enums/Doors.luau b/src/server/main/Types/Enums/Doors.luau
new file mode 100644
index 0000000..6b6ecd8
--- /dev/null
+++ b/src/server/main/Types/Enums/Doors.luau
@@ -0,0 +1,17 @@
+--!optimize 2
+--!native
+--!strict
+
+local DoorEnums = {}
+
+export type DoorEnumValues = typeof(DoorEnums.Door)
+export type SingleSpeed = "SingleSpeed"
+export type DoubleSpeed = "DoubleSpeed"
+export type TripleSpeed = "TripleSpeed"
+DoorEnums.Door = {
+ SingleSpeed = "SingleSpeed" :: SingleSpeed,
+ DoubleSpeed = "DoubleSpeed" :: DoubleSpeed,
+ TripleSpeed = "TripleSpeed" :: TripleSpeed
+}
+
+return DoorEnums
\ No newline at end of file
diff --git a/src/shared/Enums.luau b/src/shared/Enums.luau
index 07c8482..58c6356 100644
--- a/src/shared/Enums.luau
+++ b/src/shared/Enums.luau
@@ -51,7 +51,8 @@ export type EnumElevatorCallDirections = typeof(Enums.ElevatorCallDirection)
export type ElevatorCallDirectionValues = typeof(Enums.ElevatorCallDirection.Up) | typeof(Enums.ElevatorCallDirection.Down)
Enums.ElevatorCallDirection = {
Up = "Up" :: "Up",
- Down = "Down" :: "Down"
+ Down = "Down" :: "Down",
+ Cab = "Cab" :: "Cab"
}
return Enums