From 1c026f4a52c9fc56f4f04ba573e13f674cec7fa7 Mon Sep 17 00:00:00 2001 From: unittensor Date: Sat, 20 Jul 2024 21:07:35 -0400 Subject: [PATCH] Nice and reinvented --- sourcemap.json | 2 +- .../InitElevator/RelayAlgorithm.luau | 66 ++++ .../main/Elevators/InitElevator/init.luau | 281 ++++++++++++++++++ .../Elevators/Otis1960/RelayAlgorithm.luau | 94 ------ 4 files changed, 348 insertions(+), 95 deletions(-) create mode 100644 src/server/main/Elevators/InitElevator/RelayAlgorithm.luau create mode 100644 src/server/main/Elevators/InitElevator/init.luau delete mode 100644 src/server/main/Elevators/Otis1960/RelayAlgorithm.luau diff --git a/sourcemap.json b/sourcemap.json index f66fb22..87843b2 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":"Property","className":"ModuleScript","filePaths":["src/shared/Property.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":"ButtonsManager","className":"ModuleScript","filePaths":["src/server/main/Elevators/ButtonsManager.luau"]},{"name":"HallDisplays","className":"ModuleScript","filePaths":["src/server/main/Elevators/HallDisplays.luau"]},{"name":"Lanterns","className":"ModuleScript","filePaths":["src/server/main/Elevators/Lanterns.luau"]},{"name":"Mover","className":"ModuleScript","filePaths":["src/server/main/Elevators/Mover.luau"]},{"name":"Otis1960","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/init.luau"],"children":[{"name":"Doors","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/Doors.luau"]},{"name":"Leveling","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/Leveling.luau"]},{"name":"Moving","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/Moving.luau"]},{"name":"MovingObjects","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/MovingObjects.luau"]},{"name":"PhysicalRelay","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/PhysicalRelay.luau"]},{"name":"Relay","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/Relay.luau"]},{"name":"RelayAlgorithm","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/RelayAlgorithm.luau"]}]},{"name":"TractionRopes","className":"ModuleScript","filePaths":["src/server/main/Elevators/TractionRopes.luau"]}]},{"name":"Enums","className":"Folder","children":[{"name":"Sounds","className":"ModuleScript","filePaths":["src/server/main/Enums/Sounds.luau"]}]},{"name":"Lighting","className":"ModuleScript","filePaths":["src/server/main/Lighting/init.luau"]},{"name":"Load","className":"Folder","children":[{"name":"EditorEntities","className":"ModuleScript","filePaths":["src/server/main/Load/EditorEntities.luau"]},{"name":"StarterPlayer","className":"ModuleScript","filePaths":["src/server/main/Load/StarterPlayer.luau"]},{"name":"Tags","className":"ModuleScript","filePaths":["src/server/main/Load/Tags/init.luau"],"children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server/main/Load/Tags/Buttons.luau"]},{"name":"Lights","className":"ModuleScript","filePaths":["src/server/main/Load/Tags/Lights.luau"]}]},{"name":"Workspace","className":"ModuleScript","filePaths":["src/server/main/Load/Workspace.luau"]}]},{"name":"Map","className":"Folder","children":[{"name":"Interactions","className":"Folder","children":[{"name":"LightSwitches","className":"ModuleScript","filePaths":["src/server/main/Map/Interactions/LightSwitches.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":"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":"Health","className":"ModuleScript","filePaths":["src/client/UI/Health.luau"]},{"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":"Property","className":"ModuleScript","filePaths":["src/shared/Property.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":"ButtonsManager","className":"ModuleScript","filePaths":["src/server/main/Elevators/ButtonsManager.luau"]},{"name":"HallDisplays","className":"ModuleScript","filePaths":["src/server/main/Elevators/HallDisplays.luau"]},{"name":"InitElevator","className":"ModuleScript","filePaths":["src/server/main/Elevators/InitElevator/init.luau"],"children":[{"name":"RelayAlgorithm","className":"ModuleScript","filePaths":["src/server/main/Elevators/InitElevator/RelayAlgorithm.luau"]}]},{"name":"Lanterns","className":"ModuleScript","filePaths":["src/server/main/Elevators/Lanterns.luau"]},{"name":"Otis1960","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/init.luau"],"children":[{"name":"Config","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/Config.luau"]},{"name":"Doors","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/Doors.luau"]},{"name":"Leveling","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/Leveling.luau"]},{"name":"MovingObjects","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/MovingObjects.luau"]},{"name":"PhysicalRelay","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/PhysicalRelay.luau"]}]},{"name":"TractionRopes","className":"ModuleScript","filePaths":["src/server/main/Elevators/TractionRopes.luau"]}]},{"name":"Enums","className":"Folder","children":[{"name":"Sounds","className":"ModuleScript","filePaths":["src/server/main/Enums/Sounds.luau"]}]},{"name":"Lighting","className":"ModuleScript","filePaths":["src/server/main/Lighting/init.luau"]},{"name":"Load","className":"Folder","children":[{"name":"EditorEntities","className":"ModuleScript","filePaths":["src/server/main/Load/EditorEntities.luau"]},{"name":"StarterPlayer","className":"ModuleScript","filePaths":["src/server/main/Load/StarterPlayer.luau"]},{"name":"Tags","className":"ModuleScript","filePaths":["src/server/main/Load/Tags/init.luau"],"children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server/main/Load/Tags/Buttons.luau"]},{"name":"Lights","className":"ModuleScript","filePaths":["src/server/main/Load/Tags/Lights.luau"]}]},{"name":"Workspace","className":"ModuleScript","filePaths":["src/server/main/Load/Workspace.luau"]}]},{"name":"Map","className":"Folder","children":[{"name":"Interactions","className":"Folder","children":[{"name":"LightSwitches","className":"ModuleScript","filePaths":["src/server/main/Map/Interactions/LightSwitches.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":"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":"Health","className":"ModuleScript","filePaths":["src/client/UI/Health.luau"]},{"name":"Vignette","className":"ModuleScript","filePaths":["src/client/UI/Vignette.luau"]}]}]}]}]}]}]} \ No newline at end of file diff --git a/src/server/main/Elevators/InitElevator/RelayAlgorithm.luau b/src/server/main/Elevators/InitElevator/RelayAlgorithm.luau new file mode 100644 index 0000000..62612e5 --- /dev/null +++ b/src/server/main/Elevators/InitElevator/RelayAlgorithm.luau @@ -0,0 +1,66 @@ +--!optimize 2 +--!native +--!strict + +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) -> (), + AddFloor: (self: ClassConstructor, ElevatorGoingUp: boolean, GoingUpAttribute: BoolValue, RequestedLevel: number) -> (), +} + +type Constructor_Fun = (ElevatorBoxModel: AlignPosition) -> ClassConstructor +type Constructor_Return_Props = { + ElevatorBoxModel: AlignPosition, + __FloorQueue: FloorQueue, + + Events: { + Sorted: BindableEvent + }, +} + +type DoorAttributes = { + Relay: { + Open: BoolValue + } +} + +export type FloorQueue = {number?} + +export type RelayAlgorithmConstructor = ClassConstructor + +local RelayAlgorithm = {} :: Impl_Constructor +RelayAlgorithm.__index = RelayAlgorithm + +function RelayAlgorithm.constructor(ElevatorBoxModel) + return setmetatable({ + ElevatorBoxModel = ElevatorBoxModel, + __FloorQueue = {}, + + Events = { + Sorted = Instance.new("BindableEvent") :: BindableEvent + }, + }, RelayAlgorithm) +end + +--The Otis relay based call logic +--https://youtu.be/BCN9mQOT3RQ + +function RelayAlgorithm:Sort(ElevatorGoingUp) + table.sort(self.__FloorQueue, function(a, b): boolean + if ElevatorGoingUp then + return ab + end) + self.Events.Sorted:Fire() +end + +function RelayAlgorithm:AddFloor(ElevatorGoingUp, GoingUpAttribute, RequestedLevel) + table.insert(self.__FloorQueue, ElevatorGoingUp == GoingUpAttribute.Value and 1 or #self.__FloorQueue+1, RequestedLevel) + self:Sort(ElevatorGoingUp) +end + +return RelayAlgorithm diff --git a/src/server/main/Elevators/InitElevator/init.luau b/src/server/main/Elevators/InitElevator/init.luau new file mode 100644 index 0000000..e5bf3f1 --- /dev/null +++ b/src/server/main/Elevators/InitElevator/init.luau @@ -0,0 +1,281 @@ +--!optimize 2 +--!native +--!strict + +local Elevators = script.Parent +local MainDir = Elevators.Parent +local EnumsDir = MainDir:WaitForChild("Enums") +local LoadDir = MainDir:WaitForChild("Load") + +local StorageService = game:GetService("ReplicatedStorage") +local RunService = game:GetService("RunService") + +local Enums = require(StorageService:WaitForChild("Enums")) +local SoundEnums = require(EnumsDir:WaitForChild("Sounds")) + +local Tags = require(LoadDir:WaitForChild("Tags")) + +local RelayAlgorithm = require(script:WaitForChild("RelayAlgorithm")) + +type Tags = Tags.ExportedTags +type TagsConstructor = Tags.TagsConstructor + +type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor)) +type Impl_Constructor = { + __index: Impl_Constructor, + constructor: Constructor_Fun, + --Class functions + RequestLevel: (self: ClassConstructor, RequestedLevel: number) -> boolean, + __TravelToFloor: (self: ClassConstructor, LevelInt: number, LevelVec3: number, ElevatorGoingUp: boolean) -> (), +} + +type ElevatorConfigurationTable = { + Name: Enums.ElevatorValues, + Responsiveness: number, + MaxVelocity: number, + FloorLevelingDistance: number, + FloorLeveling3PhaseDistance: number, + ParkedDistance: number, + LevelingVelocity: number, + Phase3LevelingVelocity: number, + Sounds: { + LanternChimeDirection: SoundEnums.ElevatorSoundValues, + LanternChimeLanding: SoundEnums.ElevatorSoundValues, + }, + Colors: { + ButtonActivated: Color3, + ButtonDeactivated: Color3, + LanternDisplayOn: Color3, + LanternDisplayOff: Color3, + }, +} + +type FloorLevelingPositions = {number} +type Constructor_Fun = ( + ElevatorBoxModel: UnionOperation, + ElevatorConfigurationTable: ElevatorConfigurationTable, + FloorLevelingPositions: FloorLevelingPositions +) -> ClassConstructor + +type Constructor_Return_Props = { + RelayAlgorithm: RelayAlgorithm.RelayAlgorithmConstructor, + FloorLevelingPositions: FloorLevelingPositions, + + Elevator: { + BoxModel: UnionOperation, + AlignPosition: AlignPosition, + Configuration: ElevatorConfigurationTable + }, + Attributes: { + PreviousFloor: IntValue, + CurrentFloor: IntValue, + NextFloor: IntValue, + Goal: IntValue, + GoingUp: BoolValue, + Stopped: BoolValue + }, + Events: { + CabProgression: BindableEvent, + CabTraveling: BindableEvent, + Parked: BindableEvent, + Leveling: BindableEvent, + Leveling3Phase: BindableEvent, + }, + + __Connections: { + Moving: RBXScriptConnection?, + } +} + +local Elevator = {} :: Impl_Constructor +Elevator.__index = Elevator + +local function ElevatorGoingUpDirection(CurrentFloor: number, RequestedFloor: number): boolean + -- -(CurrentFloor-RequestedFloor)>0 + -- -CurrentFloor+RequestedFloor>0 + return CurrentFloor (), - Check: (self: ClassConstructor, ElevatorGoingUp: boolean) -> number?, - AddFloor: (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: FloorQueue, - - Events: { - Sorted: BindableEvent - }, -} - -type ElevatorAttributes = { - CurrentFloor: IntValue, - GoingUp: BoolValue, - Moving: BoolValue, - - Relay: { - Goal: IntValue, - GoalYLevel: NumberValue, - ReadyForMoving: BoolValue, - } -} - -type DoorAttributes = { - Relay: { - Open: BoolValue - } -} - -export type FloorQueue = {number?} - -export type RelayAlgorithmConstructor = ClassConstructor - -local RelayAlgorithm = {} :: Impl_Constructor -RelayAlgorithm.__index = RelayAlgorithm - -function RelayAlgorithm.constructor(BoxAlignPosition, ElevatorAttributes, DoorAttributes) - return setmetatable({ - BoxAlignPosition = BoxAlignPosition, - ElevatorAttributes = ElevatorAttributes, - DoorAttributes = DoorAttributes, - __FloorQueue = {}, - - Events = { - Sorted = Instance.new("BindableEvent") :: BindableEvent - }, - }, RelayAlgorithm) -end - ---The Otis relay based call logic ---https://youtu.be/BCN9mQOT3RQ - -function RelayAlgorithm:Sort(ElevatorGoingUp) - table.sort(self.__FloorQueue, function(a, b): boolean - if ElevatorGoingUp then - return ab - end) - self.Events.Sorted:Fire() -end - -function RelayAlgorithm:Check(ElevatorGoingUp) - if self.__FloorQueue[1] == self.ElevatorAttributes.CurrentFloor.Value then - table.remove(self.__FloorQueue, 1) - end - if #self.__FloorQueue ~= 0 then - self:Sort(ElevatorGoingUp) - return self.__FloorQueue[1] - end - return nil -end - -function RelayAlgorithm:AddFloor(ElevatorGoingUp, RequestedLevel) - table.insert(self.__FloorQueue, ElevatorGoingUp == self.ElevatorAttributes.GoingUp.Value and 1 or #self.__FloorQueue+1, RequestedLevel) - self:Sort(ElevatorGoingUp) -end - -return RelayAlgorithm