From 2f753474b1bb92e66ae933a89faceb49552d786b Mon Sep 17 00:00:00 2001 From: unittensor Date: Sat, 1 Jun 2024 00:58:30 -0400 Subject: [PATCH] Physical relays --- sourcemap.json | 2 +- src/server/main/Elevators/ButtonsManager.lua | 7 +- src/server/main/Elevators/Lanterns.lua | 8 +- .../main/Elevators/Otis1960/PhysicalRelay.lua | 107 ++++++++++++++++++ src/server/main/Elevators/Otis1960/Relay.lua | 66 +++++++---- .../Elevators/Otis1960/RelayAlgorithm.lua | 8 +- src/server/main/Elevators/Otis1960/init.lua | 95 +++++++++------- src/server/main/Enums/Sounds.lua | 10 +- src/server/main/Load/Tags/Buttons.lua | 37 +++--- src/server/main/Load/Tags/init.lua | 52 +++++---- .../main/Map/Interactions/LightSwitches.lua | 3 +- 11 files changed, 278 insertions(+), 117 deletions(-) create mode 100644 src/server/main/Elevators/Otis1960/PhysicalRelay.lua diff --git a/sourcemap.json b/sourcemap.json index 75202a4..88170bb 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":"Relay","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/Relay.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 +{"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":"PhysicalRelay","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/PhysicalRelay.lua"]},{"name":"Relay","className":"ModuleScript","filePaths":["src/server/main/Elevators/Otis1960/Relay.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/ButtonsManager.lua b/src/server/main/Elevators/ButtonsManager.lua index bef01e8..5d8af11 100644 --- a/src/server/main/Elevators/ButtonsManager.lua +++ b/src/server/main/Elevators/ButtonsManager.lua @@ -123,7 +123,6 @@ function ButtonFunctions:LandingButton(ButtonID, ButtonTree, Callback, Fallback) end end - function ButtonFunctions:SpecialButton(ButtonID, ButtonName, ButtonTree, Callback) --precomputing speed if ButtonID == Enums.SpecialButton.Stop then @@ -142,7 +141,7 @@ function ButtonFunctions:SpecialButton(ButtonID, ButtonName, ButtonTree, Callbac end function ButtonFunctions:__DeactivateButton(Button, Glass) - local Part = Glass and Glass or Button + local Part = Glass or Button Part.Material = Enum.Material.Glass Part.Color = self.ElevatorButtonColors.ButtonDeactivated @@ -150,7 +149,7 @@ function ButtonFunctions:__DeactivateButton(Button, Glass) end function ButtonFunctions:__ActivateButton(Button, Glass) - local Part = Glass and Glass or Button + local Part = Glass or Button Part.Material = Enum.Material.Neon Part.Color = self.ElevatorButtonColors.ButtonActivated @@ -159,7 +158,7 @@ end function ButtonFunctions:AestheticActivateButton(Button) local Glass = Button:FindFirstChild("Glass") :: BasePart? - local LookVec = (Glass and Glass or Button).CFrame.LookVector/50 + local LookVec = (Glass or Button).CFrame.LookVector/50 if Glass then Glass.Position+=LookVec self:__ActivateButton(Button, Glass) diff --git a/src/server/main/Elevators/Lanterns.lua b/src/server/main/Elevators/Lanterns.lua index 89a8854..184b4d1 100644 --- a/src/server/main/Elevators/Lanterns.lua +++ b/src/server/main/Elevators/Lanterns.lua @@ -30,16 +30,16 @@ type Impl_Constructor = { } & Impl_Static_Props type Impl_Static_Props = { - Volume: number, + Volume: number, LightTweenTime: number } type Constructor_Fun = (MainDisplay: UnionOperation, LanternsMap: Tags.Lanterns, ElevatorSounds: ElevatorSounds, Colors: ElevatorButtonColors) -> ClassConstructor type Constructor_Return_Props = { - LanternsMap: Tags.Lanterns, + LanternsMap: Tags.Lanterns, AudioChimeDirection: Sound, - AudioChimeLanding: Sound, - Colors: ElevatorButtonColors + AudioChimeLanding: Sound, + Colors: ElevatorButtonColors } type ElevatorAttributes = { diff --git a/src/server/main/Elevators/Otis1960/PhysicalRelay.lua b/src/server/main/Elevators/Otis1960/PhysicalRelay.lua new file mode 100644 index 0000000..a69f971 --- /dev/null +++ b/src/server/main/Elevators/Otis1960/PhysicalRelay.lua @@ -0,0 +1,107 @@ +--!optimize 2 +--!native +--!strict + +local Elevators = script.Parent +local MainDir = Elevators.Parent.Parent +local LoadDir = MainDir:WaitForChild("Load") + +local Storage = game:GetService("ReplicatedStorage") + +local Tween = require(Storage:WaitForChild("Tween")) +local Enums = require(Storage:WaitForChild("Enums")) +local Tags = require(LoadDir:WaitForChild("Tags")) + +type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor)) +type Impl_Constructor = { + __index: Impl_Constructor, + constructor: Constructor_Fun, + --Class functions + SetState: (self: ClassConstructor, RelayName: string, State: boolean) -> () +} & Impl_Static_Props + +type Impl_Static_Props = { + ActivatedAngle: number, + DeActivatedAngle: number, + AnimationTime: number +} + +type Constructor_Fun = (ElevatorModel: Enums.ElevatorValues, RelayTagList: Tags.ButtonDictionary) -> ClassConstructor +type Constructor_Return_Props = { + ElevatorModel: Enums.ElevatorValues, + RelayTagList: Tags.ButtonDictionary & { + AudioActivated: Sound, + AudoDeactivated: Sound + } +} + +export type PhysicalRelayConstructor = ClassConstructor + +local PhysicalRelay = {} :: Impl_Constructor +PhysicalRelay.__index = PhysicalRelay + +PhysicalRelay.ActivatedAngle = 13 +PhysicalRelay.DeActivatedAngle = -13 +PhysicalRelay.AnimationTime = .05 + +function PhysicalRelay.constructor(ElevatorModel, RelayTagList) + --Idk how to construct an ideal way to identify these, + --Hard coding it is + for RelayName, RelayProperties in RelayTagList do + if RelayProperties.Inst then + local RelayAudioActivated = Instance.new("Sound") + local RelayAudioDeActivated = Instance.new("Sound") + RelayAudioActivated.Volume = 1 + RelayAudioDeActivated.Volume = 1 + + if ElevatorModel == Enums.Elevator.Otis1960 then + if RelayProperties.Name == "240 V" or + RelayProperties.Name == "440 V" or + RelayProperties.Name == "UP" or + RelayProperties.Name == "DOWN" + then + RelayAudioActivated.SoundId = "" + RelayAudioDeActivated.SoundId = "" + else + RelayAudioActivated.SoundId = "" + RelayAudioDeActivated.SoundId = "" + end + + RelayAudioActivated.Parent = RelayProperties.Inst + end + else + warn() + end + end + + return setmetatable({ + ElevatorModel = ElevatorModel, + RelayTagList = RelayTagList + }, PhysicalRelay) +end + +local Animation = Tween.constructor(TweenInfo.new(PhysicalRelay.AnimationTime, Enum.EasingStyle.Linear)) + +local function OtimRelayAnimation(Relay: BasePart, State: boolean) + local T = Animation:Start(Relay, { + CFrame = Relay.CFrame*CFrame.Angles(math.rad(State and PhysicalRelay.ActivatedAngle or PhysicalRelay.DeActivatedAngle), 0, 0) + }) + + T.Completed:Once(function() + + end) +end + +function PhysicalRelay:SetState(RelayName, State) + local Relay = self.RelayTagList[`RelayButton_{RelayName}`] + + if Relay then + if self.ElevatorModel == Enums.Elevator.Otis1960 then + OtimRelayAnimation(Relay.Inst :: BasePart, State) + end + else + warn(`Physical Relay "{RelayName}" does not exist! it will physically not work`) + end +end + +return PhysicalRelay \ No newline at end of file diff --git a/src/server/main/Elevators/Otis1960/Relay.lua b/src/server/main/Elevators/Otis1960/Relay.lua index ae0d3f0..642687c 100644 --- a/src/server/main/Elevators/Otis1960/Relay.lua +++ b/src/server/main/Elevators/Otis1960/Relay.lua @@ -2,8 +2,11 @@ --!native --!strict -local RelayAlgorithmModule = require(script.Parent:WaitForChild("RelayAlgorithm")) -local DoorsModule = require(script.Parent:WaitForChild("Doors")) +local ElevatorDir = script.Parent + +local RelayAlgorithmModule = require(ElevatorDir:WaitForChild("RelayAlgorithm")) +local DoorsModule = require(ElevatorDir:WaitForChild("Doors")) +local PhysicalRelay = require(ElevatorDir:WaitForChild("PhysicalRelay")) type Leveling = { Leveling: {number}, @@ -25,9 +28,18 @@ type Impl_Constructor = { __GoalYLevel: (self: ClassConstructor) -> (), } -type Constructor_Fun = (RelayAlgorthm: RelayAlgorithmModule.RelayAlgorithmConstructor, ElevatorAttributes: ElevatorAttributes, DoorAttributes: DoorAttributes, Leveling: Leveling, BoxAlignPosition: BoxAlignPosition, ElevatorBox: ElevatorBox) -> ClassConstructor +type Constructor_Fun = ( + PhysicalRelay: PhysicalRelay.PhysicalRelayConstructor, + RelayAlgorthm: RelayAlgorithmModule.RelayAlgorithmConstructor, + ElevatorAttributes: ElevatorAttributes, + DoorAttributes: DoorAttributes, + Leveling: Leveling, + BoxAlignPosition: BoxAlignPosition, + ElevatorBox: ElevatorBox +) -> ClassConstructor type Constructor_Return_Props = { + PhysicalRelay: PhysicalRelay.PhysicalRelayConstructor, RelayAlgorthm: RelayAlgorithmModule.RelayAlgorithmConstructor, ElevatorAttributes: ElevatorAttributes, DoorAttributes: DoorAttributes, @@ -36,18 +48,18 @@ type Constructor_Return_Props = { ElevatorBox: ElevatorBox, __Connections: { - Ready: RBXScriptConnection?, - Open: RBXScriptConnection?, - GoalYLevel: RBXScriptConnection?, - Goal: RBXScriptConnection? + ReadyForMoving: RBXScriptConnection?, + Open: RBXScriptConnection?, + GoalYLevel: RBXScriptConnection?, + Goal: RBXScriptConnection? } } type ElevatorAttributes = { Relay: { - Ready: BoolValue, - GoalYLevel: NumberValue, - Goal: IntValue + ReadyForMoving: BoolValue, + GoalYLevel: NumberValue, + Goal: IntValue }, Stopped: BoolValue @@ -60,8 +72,9 @@ export type RelayConstructor = ClassConstructor local Relay = {} :: Impl_Constructor Relay.__index = Relay -function Relay.constructor(RelayAlgorthm, ElevatorAttributes, DoorAttributes, LevelingModule, BoxAlignPosition, ElevatorBox) +function Relay.constructor(PhysicalRelay, RelayAlgorthm, ElevatorAttributes, DoorAttributes, LevelingModule, BoxAlignPosition, ElevatorBox) return setmetatable({ + PhysicalRelay = PhysicalRelay, RelayAlgorthm = RelayAlgorthm, ElevatorAttributes = ElevatorAttributes, DoorAttributes = DoorAttributes, @@ -69,22 +82,22 @@ function Relay.constructor(RelayAlgorthm, ElevatorAttributes, DoorAttributes, Le BoxAlignPosition = BoxAlignPosition, ElevatorBox = ElevatorBox, - __Connections = {} + __Connections = {} }, Relay) end function Relay:__Ready() - if not self.ElevatorAttributes.Relay.Ready.Value then + if not self.ElevatorAttributes.Relay.ReadyForMoving.Value then self:__GoalYLevel() end end function Relay:__Open() - self.ElevatorAttributes.Relay.Ready.Value = self.DoorAttributes.Relay.Open.Value + self.ElevatorAttributes.Relay.ReadyForMoving.Value = not self.DoorAttributes.Relay.Open.Value end function Relay:__GoalYLevel() - if not self.ElevatorAttributes.Relay.Ready.Value then + if self.ElevatorAttributes.Relay.ReadyForMoving.Value then self.BoxAlignPosition.Position = Vector3.new( self.ElevatorBox.Position.X, self.ElevatorAttributes.Relay.GoalYLevel.Value, @@ -100,29 +113,36 @@ function Relay:__Goal() end function Relay:BulkConnect() - self.__Connections.Ready = self.ElevatorAttributes.Relay.Ready:GetPropertyChangedSignal("Value"):Connect(function() - print("Relay=Ready","State=", self.ElevatorAttributes.Relay.Ready.Value) + local ReadyForMovingRelay = self.ElevatorAttributes.Relay.ReadyForMoving + local OpenRelay = self.DoorAttributes.Relay.Open + + self.__Connections.ReadyForMoving = ReadyForMovingRelay:GetPropertyChangedSignal("Value"):Connect(function() + self.PhysicalRelay:SetState("RD", ReadyForMovingRelay.Value) + if not self.ElevatorAttributes.Stopped.Value then self:__Ready() end end) - self.__Connections.Open = self.DoorAttributes.Relay.Open:GetPropertyChangedSignal("Value"):Connect(function() - print("Relay=Open","State=", self.DoorAttributes.Relay.Open.Value) + self.__Connections.Open = OpenRelay:GetPropertyChangedSignal("Value"):Connect(function() + self.PhysicalRelay:SetState("DO", OpenRelay.Value) + if not self.ElevatorAttributes.Stopped.Value then self:__Open() end end) self.__Connections.GoalYLevel = self.ElevatorAttributes.Relay.GoalYLevel:GetPropertyChangedSignal("Value"):Connect(function() - print("Relay=GoalYLevel","State=", self.ElevatorAttributes.Relay.GoalYLevel.Value) + + if not self.ElevatorAttributes.Stopped.Value then self:__GoalYLevel() end end) self.__Connections.Goal = self.ElevatorAttributes.Relay.Goal:GetPropertyChangedSignal("Value"):Connect(function() - print("Relay=Goal","State=", self.ElevatorAttributes.Relay.Goal.Value) + + if not self.ElevatorAttributes.Stopped.Value then self:__Goal() end @@ -130,8 +150,8 @@ function Relay:BulkConnect() end function Relay:BulkDisconnect() - if self.__Connections.Ready and self.__Connections.Ready.Connected then - self.__Connections.Ready:Disconnect() + if self.__Connections.ReadyForMoving and self.__Connections.ReadyForMoving.Connected then + self.__Connections.ReadyForMoving:Disconnect() end if self.__Connections.Open and self.__Connections.Open.Connected then self.__Connections.Open:Disconnect() diff --git a/src/server/main/Elevators/Otis1960/RelayAlgorithm.lua b/src/server/main/Elevators/Otis1960/RelayAlgorithm.lua index d887acb..918fba9 100644 --- a/src/server/main/Elevators/Otis1960/RelayAlgorithm.lua +++ b/src/server/main/Elevators/Otis1960/RelayAlgorithm.lua @@ -29,6 +29,12 @@ type ElevatorAttributes = { CurrentFloor: IntValue, GoingUp: BoolValue, Moving: BoolValue, + + Relay: { + Goal: IntValue, + GoalYLevel: NumberValue, + ReadyForMoving: BoolValue, + } } type DoorAttributes = { @@ -89,7 +95,7 @@ end function RelayAlgorithm:AddFloor(ElevatorGoingUp, RequestedLevel) self:RawInsert(ElevatorGoingUp, RequestedLevel) - return not self.ElevatorAttributes.Moving.Value and self.DoorAttributes.Relay.Open.Value + return not self.ElevatorAttributes.Relay.ReadyForMoving.Value 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 088f4e6..e35fd58 100644 --- a/src/server/main/Elevators/Otis1960/init.lua +++ b/src/server/main/Elevators/Otis1960/init.lua @@ -5,6 +5,7 @@ --Set relay tags through studio command line --[[ local s = game.Selection:Get()[1] + for i,v in s:GetChildren() do if v:IsA("Model") then local main = v:FindFirstChild("main") @@ -37,6 +38,7 @@ local Doors = require(script:WaitForChild("Doors")) local MovingObjects = require(script:WaitForChild("MovingObjects")) local RelayAlgorithm = require(script:WaitForChild("RelayAlgorithm")) local Relay = require(script:WaitForChild("Relay")) +local PhysicalRelays = require(script:WaitForChild("PhysicalRelay")) local HallDisplays = require(Elevators:WaitForChild("HallDisplays")) local ElevatorMover = require(Elevators:WaitForChild("Mover")) @@ -54,12 +56,8 @@ 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, - __MoveTo: (self: ClassConstructor, GoingUp: boolean, RequestedLevel: number) -> (), + RequestLevelAsync: (self: ClassConstructor, RequestedLevel: number) -> boolean, + __MoveToAsync: (self: ClassConstructor, GoingUp: boolean, RequestedLevel: number) -> (), __MovingHeartbeat: (self: ClassConstructor, GoingUp: boolean, RequestedLevel: number) -> (), } & Impl_Static_Props @@ -89,9 +87,9 @@ type Impl_Static_Props = { Stopped: BoolValue, Relay: { - Goal: IntValue, - GoalYLevel: NumberValue, - Ready: BoolValue, + Goal: IntValue, + GoalYLevel: NumberValue, + ReadyForMoving: BoolValue, } }, Events: { @@ -99,7 +97,13 @@ type Impl_Static_Props = { } } -type Constructor_Fun = (TagsConstructor: TagsConstructor, ButtonsTags: Tags.ElevatorButtons, LanternsTags: Tags.Lanterns, LandingDoors: Tags.LandingTags) -> ClassConstructor +type Constructor_Fun = ( + TagsConstructor: TagsConstructor, + ButtonsTags: Tags.ElevatorButtons, + LanternsTags: Tags.Lanterns, + LandingDoors: Tags.LandingTags +) -> ClassConstructor + type Constructor_Return_Props = { Tags: Tags, MOConstructor: MovingObjects.MovingObjectsConstructor, @@ -125,6 +129,7 @@ type Constructor_Return_Props = { ButtonsConstructor: Buttons.ButtonsConstructor, RelayAlgorithmConstructor: RelayAlgorithm.RelayAlgorithmConstructor, RelayConstructor: Relay.RelayConstructor, + PhysicalRelays: PhysicalRelays.PhysicalRelayConstructor, __Connections: { Moving: RBXScriptConnection?, @@ -162,9 +167,9 @@ Elevator.Attributes = { Stopped = Instance.new("BoolValue") :: BoolValue, Relay = { - Ready = Instance.new("BoolValue") :: BoolValue, - Goal = Instance.new("IntValue") :: IntValue, - GoalYLevel = Instance.new("NumberValue") :: NumberValue, + ReadyForMoving = Instance.new("BoolValue") :: BoolValue, + Goal = Instance.new("IntValue") :: IntValue, + GoalYLevel = Instance.new("NumberValue") :: NumberValue, }, } @@ -176,21 +181,22 @@ Elevator.Attributes.CurrentFloor.Value = 1 Elevator.Attributes.Moving.Value = false Elevator.Attributes.GoingUp.Value = false -Elevator.Attributes.Relay.Goal.Value = 1 -Elevator.Attributes.Relay.GoalYLevel.Value = LevelingModule.Leveling[Elevator.Attributes.CurrentFloor.Value] -Elevator.Attributes.Relay.Ready.Value = false +Elevator.Attributes.Relay.Goal.Value = 1 +Elevator.Attributes.Relay.GoalYLevel.Value = LevelingModule.Leveling[Elevator.Attributes.CurrentFloor.Value] +Elevator.Attributes.Relay.ReadyForMoving.Value = false local Attributes = Elevator.Attributes --Math function for determining if the elevator goal is to move upwards or not local function ElevatorGoingUpDirection(CurrentFloor: number, RequestedFloor: number): boolean - --(CurrentFloor-RequestedFloor)>0 - return -CurrentFloor+RequestedFloor>0 + -- -(CurrentFloor-RequestedFloor)>0 + -- -CurrentFloor+RequestedFloor>0 + return CurrentFloor ClassConstructor +type Constructor_Fun = (TagsConstructor: TagsConstructor, ModelButtons: Tags.ElevatorButtons, ElevatorModel: Enums.ElevatorValues) -> ClassConstructor type Constructor_Return_Props = { - Tags: TagsConstructor, - ModelButtons: Tags.ElevatorButtons, - Buttons: Tags.ButtonsTree + Tags: TagsConstructor, + ModelButtons: Tags.ElevatorButtons, + ElevatorModel: Enums.ElevatorValues, + Buttons: Tags.ButtonsTree } export type ButtonsTagsConstructor = ClassConstructor @@ -44,15 +45,19 @@ ButtonsModule.__index = ButtonsModule ButtonsModule.DefaultMaxActivationDistance = 3 ButtonsModule.DefaultHoldDuration = .30 -function ButtonsModule.constructor(TagsConstructor, ModelButtons) +function ButtonsModule.constructor(TagsConstructor, ModelButtons, ElevatorModel) return setmetatable({ - Tags = TagsConstructor, - ModelButtons = ModelButtons, + Tags = TagsConstructor, + ModelButtons = ModelButtons, + ElevatorModel = ElevatorModel, + Buttons = { - Landing = {}, - Car = {}, - Special = {}, - Relays = {} + [ElevatorModel] = { + Landing = {}, + Car = {}, + Special = {}, + Relays = {} + } } }, ButtonsModule) end @@ -91,7 +96,7 @@ function ButtonsModule:CreatePromptButtons() Prompt.ActionText = tostring(Split[3]) Prompt.ObjectText = "Floor" - self.Buttons.Car[`{Split[2]}_{Split[3]}`] = { + self.Buttons[self.ElevatorModel].Car[`{Split[2]}_{Split[3]}`] = { Inst = Inst, Prompt = Prompt, Attachment = Attachment @@ -103,7 +108,7 @@ function ButtonsModule:CreatePromptButtons() Prompt.ActionText = `Send Elevator {Name}` Prompt.ObjectText = `Floor {tostring(Split[4])}` - self.Buttons.Landing[`{Split[2]}_{Split[3]}_{Split[4]}_{Split[5]}`] = { + self.Buttons[self.ElevatorModel].Landing[`{Split[2]}_{Split[3]}_{Split[4]}_{Split[5]}`] = { Inst = Inst, Prompt = Prompt, Attachment = Attachment, @@ -116,7 +121,7 @@ function ButtonsModule:CreatePromptButtons() Prompt.ActionText = Name Prompt.ObjectText = "Elevator" - self.Buttons.Special[`{Split[2]}_{Split[3]}`] = { + self.Buttons[self.ElevatorModel].Special[`{Split[2]}_{Split[3]}`] = { Inst = Inst, Prompt = Prompt, Attachment = Attachment, @@ -129,7 +134,7 @@ function ButtonsModule:CreatePromptButtons() Prompt.ActionText = "Activate" Prompt.ObjectText = "Relay" - self.Buttons.Relays[`{Split[2]}_{Split[3]}`] = { + self.Buttons[self.ElevatorModel].Relays[`{Split[2]}_{Split[3]}`] = { Inst = Inst, Prompt = Prompt, Attachment = Attachment, diff --git a/src/server/main/Load/Tags/init.lua b/src/server/main/Load/Tags/init.lua index cae3909..6e6189b 100644 --- a/src/server/main/Load/Tags/init.lua +++ b/src/server/main/Load/Tags/init.lua @@ -25,7 +25,7 @@ type Impl_Constructor = { type Impl_Static_Props = { Decoders: { - CarTag: (FloorTag: string) -> number?, + CarTag: (FloorTag: string) -> number?, HallTag: (FloorTag: string) -> number? } } @@ -61,29 +61,29 @@ export type LanternsTree = { } export type LightSwitchProperties = { - Switch: Instance?, - Lights: {Instance}?, - LightSources: {Instance}?, - Prompt: ProximityPrompt?, - ClickSound: Sound?, - ColorActivated: Color3?, - ColorDeactivated: Color3?, - ActivatedMaterial: string?, + Switch: Instance?, + Lights: {Instance}?, + LightSources: {Instance}?, + Prompt: ProximityPrompt?, + ClickSound: Sound?, + ColorActivated: Color3?, + ColorDeactivated: Color3?, + ActivatedMaterial: string?, DeactivatedMaterial: string?, - Enabled: boolean? + Enabled: boolean? } export type LightSwitchPropertiesSafe = { - Switch: Instance, - Lights: {Instance}, - LightSources: {Instance}, - Prompt: ProximityPrompt, - ClickSound: Sound, - ColorActivated: Color3, - ColorDeactivated: Color3, - ActivatedMaterial: string, + Switch: Instance, + Lights: {Instance}, + LightSources: {Instance}, + Prompt: ProximityPrompt, + ClickSound: Sound, + ColorActivated: Color3, + ColorDeactivated: Color3, + ActivatedMaterial: string, DeactivatedMaterial: string, - Enabled: boolean + Enabled: boolean } export type LightSwitchTree = { @@ -94,11 +94,17 @@ export type InteractablesTree = { LightSwitches: LightSwitchTree } +export type ButtonDictionary = { + [string]: ButtonProperties +} + export type ButtonsTree = { - Car: ButtonProperties, - Landing: ButtonProperties, - Special: ButtonProperties, - Relays: ButtonProperties + [Enums.ElevatorValues]: { + Car: ButtonDictionary, + Landing: ButtonDictionary, + Special: ButtonDictionary, + Relays: ButtonDictionary + } } export type ButtonProperties = { diff --git a/src/server/main/Map/Interactions/LightSwitches.lua b/src/server/main/Map/Interactions/LightSwitches.lua index 1eb6f0d..8e6a1ac 100644 --- a/src/server/main/Map/Interactions/LightSwitches.lua +++ b/src/server/main/Map/Interactions/LightSwitches.lua @@ -125,7 +125,8 @@ function Lights:Init() LightProperties.Lights and LightProperties.LightSources and LightProperties.ActivatedMaterial and - LightProperties.DeactivatedMaterial then + LightProperties.DeactivatedMaterial + then if LightProperties.Enabled then EnabledState = true LightProperties.Prompt.ActionText = "Toggle Off"