diff --git a/sourcemap.json b/sourcemap.json index 40c81ef..c604ce7 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"ElevatorGame","className":"DataModel","filePaths":["default.project.json"],"children":[{"name":"ReplicatedFirst","className":"ReplicatedFirst","children":[{"name":"intro","className":"LocalScript","filePaths":["src/load/intro/init.client.lua"],"children":[{"name":"IntroGui","className":"ModuleScript","filePaths":["src/load/intro/IntroGui.lua"]}]}]},{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Algebra","className":"ModuleScript","filePaths":["src/shared/Algebra.lua"]},{"name":"Client","className":"Folder","children":[{"name":"Camera","className":"ModuleScript","filePaths":["src/shared/Client/Camera.lua"]},{"name":"KeyBinds","className":"ModuleScript","filePaths":["src/shared/Client/KeyBinds.lua"]}]},{"name":"Delta","className":"ModuleScript","filePaths":["src/shared/Delta.lua"]},{"name":"Enums","className":"ModuleScript","filePaths":["src/shared/Enums.lua"]},{"name":"Property","className":"ModuleScript","filePaths":["src/shared/Property.lua"]},{"name":"Server","className":"Folder","children":[{"name":"holder","className":"ModuleScript","filePaths":["src/shared/Server/holder.lua"]}]},{"name":"Tween","className":"ModuleScript","filePaths":["src/shared/Tween.lua"]}]},{"name":"ServerScriptService","className":"ServerScriptService","children":[{"name":"rapid/server","className":"Actor","children":[{"name":"main","className":"Script","filePaths":["src/server/main/init.server.lua"],"children":[{"name":"Elevators","className":"Folder","children":[{"name":"ButtonsManager","className":"ModuleScript","filePaths":["src/server/main/Elevators/ButtonsManager.lua"]},{"name":"HallDisplays","className":"ModuleScript","filePaths":["src/server/main/Elevators/HallDisplays.lua"]},{"name":"Lanterns","className":"ModuleScript","filePaths":["src/server/main/Elevators/Lanterns.lua"]},{"name":"Mover","className":"ModuleScript","filePaths":["src/server/main/Elevators/Mover.lua"]},{"name":"Otis1960","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/init.lua"],"children":[{"name":"Doors","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/Doors.lua"]},{"name":"Leveling","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/Leveling.lua"]},{"name":"MovingObjects","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/MovingObjects.lua"]}]},{"name":"TractionRopes","className":"ModuleScript","filePaths":["src/server/main/Elevators/TractionRopes.lua"]}]},{"name":"Enums","className":"Folder","children":[{"name":"Sounds","className":"ModuleScript","filePaths":["src/server/main/Enums/Sounds.lua"]}]},{"name":"Lighting","className":"ModuleScript","filePaths":["src/server/main/Lighting/init.lua"]},{"name":"Load","className":"Folder","children":[{"name":"EditorEntities","className":"ModuleScript","filePaths":["src/server/main/Load/EditorEntities.lua"]},{"name":"StarterPlayer","className":"ModuleScript","filePaths":["src/server/main/Load/StarterPlayer.lua"]},{"name":"Tags","className":"ModuleScript","filePaths":["src/server/main/Load/Tags/init.lua"],"children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server/main/Load/Tags/Buttons.lua"]},{"name":"Lights","className":"ModuleScript","filePaths":["src/server/main/Load/Tags/Lights.lua"]}]},{"name":"Workspace","className":"ModuleScript","filePaths":["src/server/main/Load/Workspace.lua"]}]},{"name":"Map","className":"Folder","children":[{"name":"Interactions","className":"Folder","children":[{"name":"LightSwitches","className":"ModuleScript","filePaths":["src/server/main/Map/Interactions/LightSwitches.lua"]}]},{"name":"Prompts","className":"ModuleScript","filePaths":["src/server/main/Map/Prompts.lua"]}]},{"name":"PlayerAdded","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/init.lua"],"children":[{"name":"Character","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/init.lua"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/Actions.lua"]},{"name":"Flashlight","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/Flashlight.lua"]},{"name":"Shadows","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/Shadows.lua"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/SpineKinematics.lua"]}]},{"name":"Users","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Users.lua"]}]}]}]}]},{"name":"StarterPlayer","className":"StarterPlayer","children":[{"name":"StarterPlayerScripts","className":"StarterPlayerScripts","children":[{"name":"rapid/client","className":"Folder","children":[{"name":"Player","className":"LocalScript","filePaths":["src/client/init.client.lua"],"children":[{"name":"Character","className":"ModuleScript","filePaths":["src/client/Character/init.lua"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/client/Character/Actions.lua"]},{"name":"Camera","className":"ModuleScript","filePaths":["src/client/Character/Camera/init.lua"],"children":[{"name":"Bobbing","className":"ModuleScript","filePaths":["src/client/Character/Camera/Bobbing.lua"]}]},{"name":"Humanoid","className":"ModuleScript","filePaths":["src/client/Character/Humanoid.lua"]},{"name":"HumanoidRootPart","className":"ModuleScript","filePaths":["src/client/Character/HumanoidRootPart.lua"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/client/Character/SpineKinematics.lua"]}]},{"name":"CoreGuis","className":"ModuleScript","filePaths":["src/client/CoreGuis.lua"]},{"name":"GuiService","className":"ModuleScript","filePaths":["src/client/GuiService.lua"]},{"name":"Mouse","className":"ModuleScript","filePaths":["src/client/Mouse.lua"]},{"name":"UI","className":"Folder","children":[{"name":"Crosshair","className":"ModuleScript","filePaths":["src/client/UI/Crosshair.lua"]},{"name":"Health","className":"ModuleScript","filePaths":["src/client/UI/Health.lua"]},{"name":"Vignette","className":"ModuleScript","filePaths":["src/client/UI/Vignette.lua"]}]}]}]}]}]}]} \ No newline at end of file +{"name":"ElevatorGame","className":"DataModel","filePaths":["default.project.json"],"children":[{"name":"ReplicatedFirst","className":"ReplicatedFirst","children":[{"name":"intro","className":"LocalScript","filePaths":["src/load/intro/init.client.lua"],"children":[{"name":"IntroGui","className":"ModuleScript","filePaths":["src/load/intro/IntroGui.lua"]}]}]},{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Algebra","className":"ModuleScript","filePaths":["src/shared/Algebra.lua"]},{"name":"Client","className":"Folder","children":[{"name":"Camera","className":"ModuleScript","filePaths":["src/shared/Client/Camera.lua"]},{"name":"KeyBinds","className":"ModuleScript","filePaths":["src/shared/Client/KeyBinds.lua"]}]},{"name":"Delta","className":"ModuleScript","filePaths":["src/shared/Delta.lua"]},{"name":"Enums","className":"ModuleScript","filePaths":["src/shared/Enums.lua"]},{"name":"Property","className":"ModuleScript","filePaths":["src/shared/Property.lua"]},{"name":"Server","className":"Folder","children":[{"name":"holder","className":"ModuleScript","filePaths":["src/shared/Server/holder.lua"]}]},{"name":"Tween","className":"ModuleScript","filePaths":["src/shared/Tween.lua"]}]},{"name":"ServerScriptService","className":"ServerScriptService","children":[{"name":"rapid/server","className":"Actor","children":[{"name":"main","className":"Script","filePaths":["src/server/main/init.server.lua"],"children":[{"name":"Elevators","className":"Folder","children":[{"name":"ButtonsManager","className":"ModuleScript","filePaths":["src/server/main/Elevators/ButtonsManager.lua"]},{"name":"HallDisplays","className":"ModuleScript","filePaths":["src/server/main/Elevators/HallDisplays.lua"]},{"name":"Lanterns","className":"ModuleScript","filePaths":["src/server/main/Elevators/Lanterns.lua"]},{"name":"Mover","className":"ModuleScript","filePaths":["src/server/main/Elevators/Mover.lua"]},{"name":"Otis1960","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/init.lua"],"children":[{"name":"Doors","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/Doors.lua"]},{"name":"Leveling","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/Leveling.lua"]},{"name":"MovingObjects","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/MovingObjects.lua"]},{"name":"RelayAlgorithm","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/RelayAlgorithm.lua"]}]},{"name":"TractionRopes","className":"ModuleScript","filePaths":["src/server/main/Elevators/TractionRopes.lua"]}]},{"name":"Enums","className":"Folder","children":[{"name":"Sounds","className":"ModuleScript","filePaths":["src/server/main/Enums/Sounds.lua"]}]},{"name":"Lighting","className":"ModuleScript","filePaths":["src/server/main/Lighting/init.lua"]},{"name":"Load","className":"Folder","children":[{"name":"EditorEntities","className":"ModuleScript","filePaths":["src/server/main/Load/EditorEntities.lua"]},{"name":"StarterPlayer","className":"ModuleScript","filePaths":["src/server/main/Load/StarterPlayer.lua"]},{"name":"Tags","className":"ModuleScript","filePaths":["src/server/main/Load/Tags/init.lua"],"children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server/main/Load/Tags/Buttons.lua"]},{"name":"Lights","className":"ModuleScript","filePaths":["src/server/main/Load/Tags/Lights.lua"]}]},{"name":"Workspace","className":"ModuleScript","filePaths":["src/server/main/Load/Workspace.lua"]}]},{"name":"Map","className":"Folder","children":[{"name":"Interactions","className":"Folder","children":[{"name":"LightSwitches","className":"ModuleScript","filePaths":["src/server/main/Map/Interactions/LightSwitches.lua"]}]},{"name":"Prompts","className":"ModuleScript","filePaths":["src/server/main/Map/Prompts.lua"]}]},{"name":"PlayerAdded","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/init.lua"],"children":[{"name":"Character","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/init.lua"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/Actions.lua"]},{"name":"Flashlight","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/Flashlight.lua"]},{"name":"Shadows","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/Shadows.lua"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Character/SpineKinematics.lua"]}]},{"name":"Users","className":"ModuleScript","filePaths":["src/server/main/PlayerAdded/Users.lua"]}]}]}]}]},{"name":"StarterPlayer","className":"StarterPlayer","children":[{"name":"StarterPlayerScripts","className":"StarterPlayerScripts","children":[{"name":"rapid/client","className":"Folder","children":[{"name":"Player","className":"LocalScript","filePaths":["src/client/init.client.lua"],"children":[{"name":"Character","className":"ModuleScript","filePaths":["src/client/Character/init.lua"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/client/Character/Actions.lua"]},{"name":"Camera","className":"ModuleScript","filePaths":["src/client/Character/Camera/init.lua"],"children":[{"name":"Bobbing","className":"ModuleScript","filePaths":["src/client/Character/Camera/Bobbing.lua"]}]},{"name":"Humanoid","className":"ModuleScript","filePaths":["src/client/Character/Humanoid.lua"]},{"name":"HumanoidRootPart","className":"ModuleScript","filePaths":["src/client/Character/HumanoidRootPart.lua"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/client/Character/SpineKinematics.lua"]}]},{"name":"CoreGuis","className":"ModuleScript","filePaths":["src/client/CoreGuis.lua"]},{"name":"GuiService","className":"ModuleScript","filePaths":["src/client/GuiService.lua"]},{"name":"Mouse","className":"ModuleScript","filePaths":["src/client/Mouse.lua"]},{"name":"UI","className":"Folder","children":[{"name":"Crosshair","className":"ModuleScript","filePaths":["src/client/UI/Crosshair.lua"]},{"name":"Health","className":"ModuleScript","filePaths":["src/client/UI/Health.lua"]},{"name":"Vignette","className":"ModuleScript","filePaths":["src/client/UI/Vignette.lua"]}]}]}]}]}]}]} \ No newline at end of file diff --git a/src/server/main/Elevators/Otis1960/Doors.lua b/src/server/main/Elevators/Otis1960/Doors.lua index b97560b..1dc8143 100644 --- a/src/server/main/Elevators/Otis1960/Doors.lua +++ b/src/server/main/Elevators/Otis1960/Doors.lua @@ -22,8 +22,8 @@ type Impl_Constructor = { __index: Impl_Constructor, constructor: Constructor_Fun, --Class functions - __DetectSensorHit: (self: ClassConstructor, DoorTween1: Tween, DoorTween2: Tween) -> RBXScriptConnection, - ToggleElevatorDoors: (self: ClassConstructor, opening: boolean, floor: number) -> () + __DetectSensorHit: (self: ClassConstructor, DoorTween1: Tween, DoorTween2: Tween) -> RBXScriptConnection, + ToggleElevatorDoorsAsync: (self: ClassConstructor, opening: boolean, floor: number) -> () } & Impl_Static_Props type Constructor_Fun = (FloorDoorsTags: Tags.LandingTags, ElevatorBox: BasePart, ElevatorDoor1: BasePart, ElevatorDoor2: BasePart, ElevatorDoorSensor: Folder) -> ClassConstructor @@ -72,6 +72,10 @@ Doors.Attributes = { Doors.Attributes.DoorsOpen.Value = false +Doors.Attributes.DoorsOpen:GetPropertyChangedSignal("Value"):Connect(function() + print("DoorsOpen=",Doors.Attributes.DoorsOpen.Value) +end) + local Attributes = Doors.Attributes function Doors.constructor(FloorDoorsTags, ElevatorBox, ElevatorDoor1, ElevatorDoor2, ElevatorDoorSensor) @@ -103,7 +107,6 @@ end local init_floors_opened: FloorDoors = {} local init_floors_closed: FloorDoors = {} - local function DoorsAnimationFloor(FloorDoors: {Instance?}, Floor: number, opening: boolean?, activated_via_censor: boolean?): (Tween?, Tween?) local Door2Tween_Floor: Tween? local Door1Tween_Floor: Tween? @@ -249,7 +252,7 @@ end function Doors:__DetectSensorHit(DoorTween1, DoorTween2) local Step = nil - if Doors.Sensors and not Attributes.DoorsOpen.Value then + if Doors.Sensors and Attributes.DoorsOpen.Value then raycastParams.FilterDescendantsInstances = {self.ElevatorBox, table.unpack(RayIgnoring)} Step = RS.Heartbeat:Connect(function(_dt) @@ -268,7 +271,7 @@ function Doors:__DetectSensorHit(DoorTween1, DoorTween2) return Step end -function Doors:ToggleElevatorDoors(opening, floor) +function Doors:ToggleElevatorDoorsAsync(opening, floor) --short circuiting central if opening then if not Attributes.DoorsOpen.Value then diff --git a/src/server/main/Elevators/Otis1960/RelayAlgorithm.lua b/src/server/main/Elevators/Otis1960/RelayAlgorithm.lua index 39cfba2..a08b425 100644 --- a/src/server/main/Elevators/Otis1960/RelayAlgorithm.lua +++ b/src/server/main/Elevators/Otis1960/RelayAlgorithm.lua @@ -2,7 +2,39 @@ --!native --!strict -local RelayAlgorithm = {} +type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor)) +type Impl_Constructor = { + __index: Impl_Constructor, + constructor: Constructor_Fun, + --Class functions + Sort: (self: ClassConstructor, ElevatorGoingUp: boolean) -> (), + Check: (self: ClassConstructor, ElevatorGoingUp: boolean) -> (), + Insert: (self: ClassConstructor, ElevatorGoingUp: boolean, RequestedLevel: number) -> (), +} + +type Constructor_Fun = (BoxAlignPosition: AlignPosition, ElevatorAttributes: ElevatorAttributes, DoorAttributes: DoorAttributes) -> ClassConstructor +type Constructor_Return_Props = { + BoxAlignPosition: AlignPosition, + ElevatorAttributes: ElevatorAttributes, + DoorAttributes: DoorAttributes, + __FloorQueue: Floors +} + +type Floors = {number} + +type ElevatorAttributes = { + CurrentFloor: IntValue, + GoingUp: BoolValue, + GoalFloor: IntValue +} + +type DoorAttributes = { + DoorsOpen: BoolValue +} + +export type RelayAlgorithmConstructor = ClassConstructor + +local RelayAlgorithm = {} :: Impl_Constructor RelayAlgorithm.__index = RelayAlgorithm function RelayAlgorithm.constructor(BoxAlignPosition, ElevatorAttributes, DoorAttributes) @@ -50,12 +82,7 @@ function RelayAlgorithm:Check(ElevatorGoingUp) table.remove(self.__FloorQueue, 1) end if #self.__FloorQueue ~= 0 then - --local ElevatorGoingUp = ElevatorGoingUpDirection(self.Attributes.CurrentFloor.Value, self.__FloorQueue[1]) - --self.Attributes.GoingUp.Value = ElevatorGoingUp - - self:SortQueue(ElevatorGoingUp) - --self:__GoToFloor(Leveling[self.__FloorQueue[1]], ElevatorGoingUp) - + self:Sort(ElevatorGoingUp) return true end @@ -64,26 +91,7 @@ end function RelayAlgorithm:Insert(ElevatorGoingUp, RequestedLevel) table.insert(self.__FloorQueue, ElevatorGoingUp == self.ElevatorAttributes.GoingUp.Value and 1 or #self.__FloorQueue+1, RequestedLevel) - self:SortQueue(ElevatorGoingUp) + self:Sort(ElevatorGoingUp) end -function RelayAlgorithm:Proceed(ElevatorGoingUp, RequestedLevel) - self:Insert(RequestedLevel, ElevatorGoingUp) - - return self.ElevatorAttributes.GoingUp.Value and not self.DoorAttributes.DoorsOpen.Value -end - ---[==[ -local function ToFloorQueue(self: ClassConstructor, ElevatorGoingUp: boolean, RequestedLevel: number, GoalLevelVEC: number) - local ElevatorBoxCurrentPos = self.ElevatorBox_1960.Position - - InsertFloorQueue(self, RequestedLevel, ElevatorGoingUp) - - if ElevatorGoingUp == Attributes.GoingUp.Value and not Doors.Attributes.DoorsOpen.Value then - self.BoxAlignPosition.Position = Vector3.new(ElevatorBoxCurrentPos.X, self.__FloorQueue[1], ElevatorBoxCurrentPos.Z) - end -end - -]==]-- - return RelayAlgorithm \ No newline at end of file diff --git a/src/server/main/Elevators/Otis1960/init.lua b/src/server/main/Elevators/Otis1960/init.lua index 6a010eb..85013c4 100644 --- a/src/server/main/Elevators/Otis1960/init.lua +++ b/src/server/main/Elevators/Otis1960/init.lua @@ -32,9 +32,10 @@ local ButtonTags = require(TagsDir:WaitForChild("Buttons")) local Enums = require(Storage:WaitForChild("Enums")) local SoundEnums = require(EnumsDir:WaitForChild("Sounds")) -local Leveling = require(script:WaitForChild("Leveling")) -local Doors = require(script:WaitForChild("Doors")) -local MovingObjects = require(script:WaitForChild("MovingObjects")) +local Leveling = require(script:WaitForChild("Leveling")) +local Doors = require(script:WaitForChild("Doors")) +local MovingObjects = require(script:WaitForChild("MovingObjects")) +local RelayAlgorithm = require(script:WaitForChild("RelayAlgorithm")) local HallDisplays = require(Elevators:WaitForChild("HallDisplays")) local ElevatorMover = require(Elevators:WaitForChild("Mover")) @@ -52,9 +53,13 @@ type Impl_Constructor = { __index: Impl_Constructor, constructor: Constructor_Fun, --Class functions + Leveled: (self: ClassConstructor, RequestedLevel: number) -> (), + Leveling: (self: ClassConstructor, RequestedLevel: number) -> (), + FloorPassingUp: (self: ClassConstructor, ElevatorPositionY: number, RequestedLevel: number) -> (), + FloorPassingDown: (self: ClassConstructor, ElevatorPositionY: number, RequestedLevel: number) -> (), + RequestLevel: (self: ClassConstructor, RequestedLevel: number) -> boolean, __GoToFloor: (self: ClassConstructor, Level: number, GoingUp: boolean) -> (), __MovingHeartbeat: (self: ClassConstructor, GoingUp: boolean) -> (), - RequestLevelAsync: (self: ClassConstructor, RequestedLevel: number) -> boolean } & Impl_Static_Props type Impl_Static_Props = { @@ -90,30 +95,30 @@ type Impl_Static_Props = { type Constructor_Fun = (TagsConstructor: TagsConstructor, ButtonsTags: Tags.ElevatorButtons, LanternsTags: Tags.Lanterns, LandingDoors: Tags.LandingTags) -> ClassConstructor type Constructor_Return_Props = { - Tags: Tags, - MOConstructor: MovingObjects.MovingObjectsConstructor, - LanternsConstructor: Lanterns.LanternsConstructor, - HallDisplaysConstructor: HallDisplays.HallDisplaysConstructor, - ElevatorBox_1960: UnionOperation, - ElevatorDoor1: BasePart, - ElevatorDoor2: BasePart, - ElevatorDoorSensor: Folder, - BoxAttachment: Attachment, - BoxAlignPosition: AlignPosition, - BoxAlignOrientation: AlignOrientation, - ElevatorDoorsConstructor: Doors.DoorConstructor, - Ropes: {Instance}, - TractionRopesConstructor: TractionRopes.TractionRopesConstructor, - Pulley: UnionOperation, - Pulley2: UnionOperation, - Governor: UnionOperation, - GovernorFlyballs: Part, - PieplatePulley: UnionOperation, - MachineRoom: MovingObjects.MachineRoom, - HallDisplays: {Instance}, - ButtonsConstructor: Buttons.ButtonsConstructor, - FloorQueue: {number}, - __MovingConnection: RBXScriptConnection?, + Tags: Tags, + MOConstructor: MovingObjects.MovingObjectsConstructor, + LanternsConstructor: Lanterns.LanternsConstructor, + HallDisplaysConstructor: HallDisplays.HallDisplaysConstructor, + ElevatorBox_1960: UnionOperation, + ElevatorDoor1: BasePart, + ElevatorDoor2: BasePart, + ElevatorDoorSensor: Folder, + BoxAttachment: Attachment, + BoxAlignPosition: AlignPosition, + BoxAlignOrientation: AlignOrientation, + ElevatorDoorsConstructor: Doors.DoorConstructor, + Ropes: {Instance}, + TractionRopesConstructor: TractionRopes.TractionRopesConstructor, + Pulley: UnionOperation, + Pulley2: UnionOperation, + Governor: UnionOperation, + GovernorFlyballs: Part, + PieplatePulley: UnionOperation, + MachineRoom: MovingObjects.MachineRoom, + HallDisplays: {Instance}, + ButtonsConstructor: Buttons.ButtonsConstructor, + RelayAlgorithmConstructor: RelayAlgorithm.RelayAlgorithmConstructor, + __MovingConnection: RBXScriptConnection?, } local Elevator = {} :: Impl_Constructor @@ -165,7 +170,7 @@ end local function _ActivatedFloorButton(self: ClassConstructor, ButtonFloor: number, ButtonTree: Tags.ButtonPropertiesSafe) ButtonTree.Prompt.Enabled = false - local Some = self:RequestLevelAsync(ButtonFloor) + local Some = self:RequestLevel(ButtonFloor) if Some then local FloorTracker: RBXScriptConnection @@ -292,23 +297,23 @@ function Elevator.constructor(TagsConstructor, ButtonsTags, LanternsTags, Landin self.BoxAlignPosition, self.BoxAlignOrientation = ElevatorMover(self.ElevatorBox_1960, self.ElevatorBox_1960.Position, Elevator.Responsiveness, Elevator.MaxVelocity) + self.RelayAlgorithmConstructor = RelayAlgorithm.constructor(self.BoxAlignPosition, Attributes, Doors.Attributes) + local ClassConstructor = setmetatable(self, Elevator) IterateButtons(ClassConstructor, ButtonsTagsConstructor) - self.FloorQueue = {} - --Open the elevator doors on server start task.spawn(function() self.LanternsConstructor:Toggle(true, Attributes.CurrentFloor.Value) self.HallDisplaysConstructor:SetHallDisplays(Attributes.CurrentFloor.Value) - self.ElevatorDoorsConstructor:ToggleElevatorDoors(true, Attributes.CurrentFloor.Value) + self.ElevatorDoorsConstructor:ToggleElevatorDoorsAsync(true, Attributes.CurrentFloor.Value) end) print(`🔝 {Elevator.Name} initialized and ready`) return ClassConstructor end -local function FloorLeveled(self: ClassConstructor, RequestedLevel: number) +function Elevator:Leveled(RequestedLevel) (self.__MovingConnection :: RBXScriptConnection):Disconnect() Attributes.Moving.Value = false Attributes.CurrentFloor.Value = RequestedLevel @@ -317,15 +322,22 @@ local function FloorLeveled(self: ClassConstructor, RequestedLevel: number) self.LanternsConstructor:Reset(Attributes.CurrentFloor.Value) task.wait(Elevator.QueueWaitTime) - CheckQueue(self) + + local ElevatorGoingUp = ElevatorGoingUpDirection(Attributes.CurrentFloor.Value, RequestedLevel) + + if self.RelayAlgorithmConstructor:Check(ElevatorGoingUp) then + --More floors in the queue + Attributes.GoingUp.Value = ElevatorGoingUp + self:__GoToFloor(Leveling[self.RelayAlgorithmConstructor.__FloorQueue[1]], ElevatorGoingUp) + end end -local function FloorLeveling(self: ClassConstructor, RequestedLevel: number) +function Elevator:Leveling(RequestedLevel) self.BoxAlignPosition.MaxVelocity = 1 self.LanternsConstructor:Toggle(true, RequestedLevel) end -local function FloorPassingUp(self: ClassConstructor, ElevatorPositionY: number, RequestedLevel: number) +function Elevator:FloorPassingUp(ElevatorPositionY, RequestedLevel) if ElevatorPositionY>=Leveling[Attributes.CurrentFloor.Value+1] then Attributes.CurrentFloor.Value+=1 @@ -334,7 +346,7 @@ local function FloorPassingUp(self: ClassConstructor, ElevatorPositionY: number, end end -local function FloorPassingDown(self: ClassConstructor, ElevatorPositionY: number, RequestedLevel: number) +function Elevator:FloorPassingDown(ElevatorPositionY, RequestedLevel) if ElevatorPositionY<=Leveling[Attributes.CurrentFloor.Value-1] then Attributes.CurrentFloor.Value-=1 @@ -343,7 +355,7 @@ local function FloorPassingDown(self: ClassConstructor, ElevatorPositionY: numbe end end -function Elevator:__MovingHeartbeat(GoingUp: boolean) +function Elevator:__MovingHeartbeat(GoingUp) local Delta = 0 local DoorsOpeningEvent = false @@ -351,9 +363,12 @@ function Elevator:__MovingHeartbeat(GoingUp: boolean) self.__MovingConnection:Disconnect() end + --Only used for the X and Z axis + local ElevatorPositionInit: Vector3 = self.ElevatorBox_1960.Position + self.__MovingConnection = RS.Heartbeat:Connect(function(_dt) Delta+=1 - local FloorGoal: number = self.FloorQueue[1] + local FloorGoal: number = self.RelayAlgorithmConstructor.__FloorQueue[1] Attributes.Moving.Value = true Attributes.GoalFloor.Value = FloorGoal @@ -368,42 +383,44 @@ function Elevator:__MovingHeartbeat(GoingUp: boolean) --Kill the connection if GoingUp then - FloorPassingUp(self, ElevatorPositionY, FloorGoal) + self:FloorPassingUp(ElevatorPositionY, FloorGoal) if ElevatorPositionY>=BoxAlignY-Elevator.FloorLevelingDistance then - FloorLeveling(self, FloorGoal) + self:Leveling(FloorGoal) if not DoorsOpeningEvent and ElevatorPositionY>=BoxAlignY-Elevator.DoorOpeningDistance then DoorsOpeningEvent = true - self.ElevatorDoorsConstructor:ToggleElevatorDoors(true, FloorGoal) + self.ElevatorDoorsConstructor:ToggleElevatorDoorsAsync(true, FloorGoal) end end if ElevatorPositionY>=BoxAlignY-Elevator.LeveledDistance then - FloorLeveled(self, FloorGoal) + self:Leveled(FloorGoal) end else - FloorPassingDown(self, ElevatorPositionY, FloorGoal) + self:FloorPassingDown(ElevatorPositionY, FloorGoal) if ElevatorPositionY<=BoxAlignY+Elevator.FloorLevelingDistance then - FloorLeveling(self, FloorGoal) + self:Leveling(FloorGoal) if not DoorsOpeningEvent and ElevatorPositionY>=BoxAlignY-Elevator.DoorOpeningDistance then DoorsOpeningEvent = true - self.ElevatorDoorsConstructor:ToggleElevatorDoors(true, FloorGoal) + self.ElevatorDoorsConstructor:ToggleElevatorDoorsAsync(true, FloorGoal) end end if ElevatorPositionY<=BoxAlignY+Elevator.LeveledDistance then - FloorLeveled(self, FloorGoal) + self:Leveled(FloorGoal) end end + + self.BoxAlignPosition.Position = Vector3.new(ElevatorPositionInit.X, Leveling[FloorGoal], ElevatorPositionInit.Z) end) end function Elevator:__GoToFloor(GoalLevelVEC, GoingUp) if Doors.Attributes.DoorsOpen.Value then - self.ElevatorDoorsConstructor:ToggleElevatorDoors(false, Attributes.CurrentFloor.Value) + self.ElevatorDoorsConstructor:ToggleElevatorDoorsAsync(false, Attributes.CurrentFloor.Value) end if GoingUp then @@ -413,28 +430,31 @@ function Elevator:__GoToFloor(GoalLevelVEC, GoingUp) end self.MOConstructor:UpdateCFrame() - local ElevatorBoxCurrentPos = self.ElevatorBox_1960.Position - self:__MovingHeartbeat(GoingUp) + local ElevatorBoxCurrentPos = self.ElevatorBox_1960.Position self.BoxAlignPosition.Position = Vector3.new(ElevatorBoxCurrentPos.X, GoalLevelVEC, ElevatorBoxCurrentPos.Z) end -function Elevator:RequestLevelAsync(RequestedLevel) +function Elevator:RequestLevel(RequestedLevel) local GoalLevelVEC: number? = Leveling[RequestedLevel] if GoalLevelVEC and GoalLevelVEC ~= Attributes.CurrentFloor.Value then local ElevatorGoingUp = ElevatorGoingUpDirection(Attributes.CurrentFloor.Value, RequestedLevel) if Attributes.Moving.Value then - ToFloorQueue(self, ElevatorGoingUp, RequestedLevel, GoalLevelVEC) + self.RelayAlgorithmConstructor:Insert(ElevatorGoingUp, RequestedLevel) else - Attributes.GoingUp.Value = ElevatorGoingUp - - if Doors.Attributes.DoorsOpen and #self.FloorQueue == 0 then - self:__GoToFloor(GoalLevelVEC, ElevatorGoingUp) + if Doors.Attributes.DoorsOpen then + Attributes.GoingUp.Value = ElevatorGoingUp + + if Doors.Attributes.DoorsOpen and #self.RelayAlgorithmConstructor.__FloorQueue == 0 then + self:__GoToFloor(GoalLevelVEC, ElevatorGoingUp) + end + self.RelayAlgorithmConstructor:Insert(ElevatorGoingUp, RequestedLevel) + else + self.RelayAlgorithmConstructor:Insert(ElevatorGoingUp, RequestedLevel) end - InsertFloorQueue(self, RequestedLevel, ElevatorGoingUp) end else warn(`[{Elevator.Name}]: landing out of range or equals the same range as the goal, requested landing: {tostring(RequestedLevel)}`)