From 1104964fd4605a84ef31fd14a8e1bbaaea08dd8d Mon Sep 17 00:00:00 2001 From: rhpidfyre Date: Tue, 12 Mar 2024 22:32:44 -0400 Subject: [PATCH] new switch statement for Enums like Rust --- sourcemap.json | 2 +- src/server/main/Elevators/Buttons.lua | 96 ++++++++++++++------------- src/server/main/Elevators/Enums.lua | 12 ++++ src/shared/Enum.lua | 88 ++++++++++++++++++++++++ src/shared/Tags.lua | 2 +- 5 files changed, 151 insertions(+), 49 deletions(-) create mode 100644 src/server/main/Elevators/Enums.lua create mode 100644 src/shared/Enum.lua diff --git a/sourcemap.json b/sourcemap.json index 8cfcec1..bb1bd52 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":"AlgebraEasings","className":"ModuleScript","filePaths":["src/shared/AlgebraEasings.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":"Server","className":"Folder","children":[{"name":"holder","className":"ModuleScript","filePaths":["src/shared/Server/holder.lua"]}]},{"name":"String","className":"ModuleScript","filePaths":["src/shared/String.lua"]},{"name":"Tags","className":"ModuleScript","filePaths":["src/shared/Tags.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["src/shared/Tween.lua"]},{"name":"types","className":"Folder","children":[{"name":"class","className":"ModuleScript","filePaths":["src/shared/types/class.lua"]}]}]},{"name":"ServerScriptService","className":"ServerScriptService","children":[{"name":"Elevators","className":"Folder","children":[{"name":"Floors","className":"ModuleScript","filePaths":["src/server/Elevators/Floors.lua"]},{"name":"Leveling","className":"ModuleScript","filePaths":["src/server/Elevators/Leveling.lua"]},{"name":"Mover","className":"ModuleScript","filePaths":["src/server/Elevators/Mover.lua"]},{"name":"Otis1960","className":"Folder","children":[{"name":"Doors","className":"ModuleScript","filePaths":["src/server/Elevators/Otis1960/Doors.lua"]},{"name":"main","className":"Script","filePaths":["src/server/Elevators/Otis1960/main.server.lua"]}]}]},{"name":"Studio","className":"Script","filePaths":["src/server/Studio/init.server.lua"],"children":[{"name":"EditorEntities","className":"ModuleScript","filePaths":["src/server/Studio/EditorEntities.lua"]},{"name":"Lighting","className":"ModuleScript","filePaths":["src/server/Studio/Lighting/init.lua"],"children":[{"name":"Sky","className":"ModuleScript","filePaths":["src/server/Studio/Lighting/Sky.lua"]}]},{"name":"StarterPlayer","className":"ModuleScript","filePaths":["src/server/Studio/StarterPlayer.lua"]},{"name":"Workspace","className":"ModuleScript","filePaths":["src/server/Studio/Workspace.lua"]}]}]},{"name":"StarterPlayer","className":"StarterPlayer","children":[{"name":"StarterCharacterScripts","className":"StarterCharacterScripts","children":[{"name":"Client","className":"LocalScript","filePaths":["src/client/Character/Client/init.client.lua"],"children":[{"name":"Camera","className":"ModuleScript","filePaths":["src/client/Character/Client/Camera/init.lua"],"children":[{"name":"Bobbing","className":"ModuleScript","filePaths":["src/client/Character/Client/Camera/Bobbing.lua"]}]},{"name":"Crouch","className":"ModuleScript","filePaths":["src/client/Character/Client/Crouch.lua"]},{"name":"Humanoid","className":"ModuleScript","filePaths":["src/client/Character/Client/Humanoid.lua"]},{"name":"HumanoidRootPart","className":"ModuleScript","filePaths":["src/client/Character/Client/HumanoidRootPart.lua"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/client/Character/Client/SpineKinematics.lua"]}]},{"name":"Server","className":"Script","filePaths":["src/client/Character/Server/init.server.lua"],"children":[{"name":"Shadows","className":"ModuleScript","filePaths":["src/client/Character/Server/Shadows.lua"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/client/Character/Server/SpineKinematics.lua"]}]}]},{"name":"StarterPlayerScripts","className":"StarterPlayerScripts","children":[{"name":"Player","className":"LocalScript","filePaths":["src/client/Player/init.client.lua"],"children":[{"name":"CoreGuis","className":"ModuleScript","filePaths":["src/client/Player/CoreGuis.lua"]},{"name":"GuiService","className":"ModuleScript","filePaths":["src/client/Player/GuiService.lua"]},{"name":"Mouse","className":"ModuleScript","filePaths":["src/client/Player/Mouse.lua"]},{"name":"UI","className":"Folder","children":[{"name":"Crosshair","className":"ModuleScript","filePaths":["src/client/Player/UI/Crosshair.lua"]},{"name":"Vignette","className":"ModuleScript","filePaths":["src/client/Player/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":"AlgebraEasings","className":"ModuleScript","filePaths":["src/shared\\AlgebraEasings.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":"Enum","className":"ModuleScript","filePaths":["src/shared\\Enum.lua"]},{"name":"Server","className":"Folder","children":[{"name":"holder","className":"ModuleScript","filePaths":["src/shared\\Server\\holder.lua"]}]},{"name":"String","className":"ModuleScript","filePaths":["src/shared\\String.lua"]},{"name":"Tags","className":"ModuleScript","filePaths":["src/shared\\Tags.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":"EditorEntities","className":"ModuleScript","filePaths":["src/server\\main\\EditorEntities.lua"]},{"name":"Elevators","className":"Folder","children":[{"name":"Buttons","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Buttons.lua"]},{"name":"Floors","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Floors.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":"Lighting","className":"ModuleScript","filePaths":["src/server\\main\\Lighting\\init.lua"]},{"name":"StarterPlayer","className":"ModuleScript","filePaths":["src/server\\main\\StarterPlayer.lua"]},{"name":"Workspace","className":"ModuleScript","filePaths":["src/server\\main\\Workspace.lua"]}]}]}]},{"name":"StarterPlayer","className":"StarterPlayer","children":[{"name":"StarterCharacterScripts","className":"StarterCharacterScripts","children":[{"name":"rapid-CharacterRoot","className":"Actor","children":[{"name":"Client","className":"LocalScript","filePaths":["src/client/Character\\Client\\init.client.lua"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/client/Character\\Client\\Actions.lua"]},{"name":"Camera","className":"ModuleScript","filePaths":["src/client/Character\\Client\\Camera\\init.lua"],"children":[{"name":"Bobbing","className":"ModuleScript","filePaths":["src/client/Character\\Client\\Camera\\Bobbing.lua"]}]},{"name":"Humanoid","className":"ModuleScript","filePaths":["src/client/Character\\Client\\Humanoid.lua"]},{"name":"HumanoidRootPart","className":"ModuleScript","filePaths":["src/client/Character\\Client\\HumanoidRootPart.lua"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/client/Character\\Client\\SpineKinematics.lua"]}]},{"name":"Server","className":"Script","filePaths":["src/client/Character\\Server\\init.server.lua"],"children":[{"name":"Actions","className":"ModuleScript","filePaths":["src/client/Character\\Server\\Actions.lua"]},{"name":"Flashlight","className":"ModuleScript","filePaths":["src/client/Character\\Server\\Flashlight.lua"]},{"name":"Shadows","className":"ModuleScript","filePaths":["src/client/Character\\Server\\Shadows.lua"]},{"name":"SpineKinematics","className":"ModuleScript","filePaths":["src/client/Character\\Server\\SpineKinematics.lua"]}]}]}]},{"name":"StarterPlayerScripts","className":"StarterPlayerScripts","children":[{"name":"rapid-PlayerRoot","className":"Actor","children":[{"name":"Player","className":"LocalScript","filePaths":["src/client/Player\\init.client.lua"],"children":[{"name":"CoreGuis","className":"ModuleScript","filePaths":["src/client/Player\\CoreGuis.lua"]},{"name":"GuiService","className":"ModuleScript","filePaths":["src/client/Player\\GuiService.lua"]},{"name":"Mouse","className":"ModuleScript","filePaths":["src/client/Player\\Mouse.lua"]},{"name":"UI","className":"Folder","children":[{"name":"Crosshair","className":"ModuleScript","filePaths":["src/client/Player\\UI\\Crosshair.lua"]},{"name":"Health","className":"ModuleScript","filePaths":["src/client/Player\\UI\\Health.lua"]},{"name":"Vignette","className":"ModuleScript","filePaths":["src/client/Player\\UI\\Vignette.lua"]}]}]}]}]}]}]} \ No newline at end of file diff --git a/src/server/main/Elevators/Buttons.lua b/src/server/main/Elevators/Buttons.lua index 01b35f7..e8fdf1b 100644 --- a/src/server/main/Elevators/Buttons.lua +++ b/src/server/main/Elevators/Buttons.lua @@ -2,14 +2,15 @@ --!native --!strict +local Elevators = script.Parent + local RS: ReplicatedStorage = game:GetService("ReplicatedStorage") -local TagsModule = require(RS:WaitForChild("Tags")) +local TagsModule = require(RS:WaitForChild("Tags")) +local Enums = require(Elevators:WaitForChild("Enums")) type Tags = TagsModule.ExportedTags -type GetButtons = { - [string]: Instance -} +type GetButtons = {[string]: Instance} type ButtonTree = { Inst: Instance, Prompt: ProximityPrompt @@ -35,7 +36,7 @@ type Impl_Constructor = { } & Impl_Static_Props type Impl_Static_Props = { - ButtonEnum: ButtonsEnum + ButtonEnum: any } type Constructor_Fun = (Tags: Tags, Model: string) -> ClassConstructor @@ -54,12 +55,7 @@ export type ButtonsEnum = { local ButtonsModule = {} :: Impl_Constructor ButtonsModule.__index = ButtonsModule -ButtonsModule.ButtonEnum = { - Car = "CarButton", - Landing = "LandingButton", - Special = "SpecialButton", - Unknown = "UnknownButton" -} +local ButtonsEnum = Enums.ButtonsEnum function ButtonsModule.constructor(Tags, Model) return setmetatable({ @@ -102,46 +98,52 @@ function ButtonsModule:CreatePromptButtons() Prompt.MaxActivationDistance = 3 Prompt.Parent = Attachment - local Split = TagName:split('_') --CarButton = Model_ElevatorButton_1 --LandingButton = Model_ElevatorButton_Floor_1_Up --SpecialButton = Model_ElevatorButton_Open - local ButtonType = if tonumber(Split[3]) then - ButtonsModule.ButtonEnum.Car - elseif Split[3] == "Floor" and Split[4]:match('%d') then - ButtonsModule.ButtonEnum.Landing - elseif Split[2] == "ElevatorButton" then - ButtonsModule.ButtonEnum.Special - else - ButtonsModule.ButtonEnum.Unknown + local Split = TagName:split('_') + local ButtonType = tonumber(Split[3]) and + ButtonsEnum.Car + or Split[3] == "Floor" and Split[4]:match('%d') and + ButtonsEnum.Landing + or Split[2] == "ElevatorButton" and + ButtonsEnum.Special - if ButtonType == ButtonsModule.ButtonEnum.Car then - --ElevatorButton_1 - Buttons.Car[`{Split[2]}_{Split[3]}`] = { - Inst = Inst, - Prompt = Prompt - } - Prompt.ActionText = tostring(Split[3]) - Prompt.ObjectText = "Floor" - elseif ButtonType == ButtonsModule.ButtonEnum.Landing then - --ElevatorButton_Floor_1_Up - Buttons.Landing[`{Split[2]}_{Split[3]}_{Split[4]}_{Split[5]}`] = { - Inst = Inst, - Prompt = Prompt - } - Prompt.ActionText = tostring(Split[5]) - Prompt.ObjectText = `Floor {tostring(Split[4])}` - elseif ButtonType == ButtonsModule.ButtonEnum.Special then - --ElevatorButton_Open - Buttons.Special[`{Split[2]}_{Split[3]}`] = { - Inst = Inst, - Prompt = Prompt - } - Prompt.ActionText = tostring(Split[3]) - Prompt.ObjectText = "Floor" - elseif ButtonType == ButtonsModule.ButtonEnum.Unknown then - warn(`{self.Model}: Door tag was present but couldnt specify its type for use "{TagName}"`) - end + ButtonsEnum:Match(ButtonType, { + [ButtonsEnum.Car] = function() + --ElevatorButton_1 + Buttons.Car[`{Split[2]}_{Split[3]}`] = { + Inst = Inst, + Prompt = Prompt + } + Prompt.ActionText = tostring(Split[3]) + Prompt.ObjectText = "Floor" + end, + + [ButtonsEnum.Landing] = function() + --ElevatorButton_Floor_1_Up + Buttons.Landing[`{Split[2]}_{Split[3]}_{Split[4]}_{Split[5]}`] = { + Inst = Inst, + Prompt = Prompt + } + Prompt.ActionText = tostring(Split[5]) + Prompt.ObjectText = `Floor {tostring(Split[4])}` + end, + + [ButtonsEnum.Special] = function() + --ElevatorButton_Open + Buttons.Special[`{Split[2]}_{Split[3]}`] = { + Inst = Inst, + Prompt = Prompt + } + Prompt.ActionText = tostring(Split[3]) + Prompt.ObjectText = "Floor" + end, + + ["_"] = function() + warn(`{self.Model}: Door tag was present but couldnt specify its type for use "{TagName}"`) + end + }) print(`{self.Model}: created a ProximityPrompt @ "{Inst:GetFullName()}"`) end diff --git a/src/server/main/Elevators/Enums.lua b/src/server/main/Elevators/Enums.lua new file mode 100644 index 0000000..f037611 --- /dev/null +++ b/src/server/main/Elevators/Enums.lua @@ -0,0 +1,12 @@ +local RS: ReplicatedStorage = game:GetService("ReplicatedStorage") +local Enum = require(RS:WaitForChild("Enum")) + +local Enums = {} + +Enums.ButtonsEnum = Enum.Create("Buttons", { + Car = "CarButton", + Landing = "LandingButton", + Special = "SpecialButton", +}) + +return Enums \ No newline at end of file diff --git a/src/shared/Enum.lua b/src/shared/Enum.lua new file mode 100644 index 0000000..03fb5d4 --- /dev/null +++ b/src/shared/Enum.lua @@ -0,0 +1,88 @@ +--!optimize 2 +--!native +--!strict + +type EnumValue = any +type EnumName = string +type Enums = {[EnumName]: EnumValue} +type EnumsMetadata = { + __index: (self: EnumsMetadata, i: EnumName) -> EnumValue?, + __newindex: (self: EnumsMetadata, i: EnumName, v: EnumValue) -> () +} + +export type CustomEnums = { + Enums: typeof(setmetatable({} :: Enums, {} :: EnumsMetadata)) +} & CustonEnumsFunctions + +type CustonEnumsFunctions = { + Create: (Name: EnumName, EnumValue: T) -> T, + Remove: (Name: EnumName) -> () +} + +--type MatchList = { +-- [EnumValue] +--} + +local CustomEnum = {} :: CustomEnums +local EnumMeta = {} :: EnumsMetadata + +function EnumMeta.__index(self, i) + local get = rawget(self, i) + if type(i) == "string" then + return get + end + warn(`Enum: attempt to retrieve an unknown Enum "{i}".`, debug.traceback()) + return nil +end + +function EnumMeta.__newindex(self, i, v) + local PossibleEnum = rawget(self, i) + if not PossibleEnum then + if type(i) == "string" then + rawset(self, i, v) + else + error(`Enum: attempt to set an Enum but the requested name was not a string "{i}", type="{type(i)}".`, 2) + end + else + error(`Enum: attempt to set an Enum but the name "{i}" is already registered.`, 2) + end +end + +CustomEnum.Enums = setmetatable({}, EnumMeta) + +local function EnumMethods(Enum) + function Enum:Match(Result: string, MatchList) --Branch this out later + local Return: any? = nil + local b: boolean = false + + for MatchEnumName, EnumFunc in MatchList do + if MatchEnumName == Result then + Return = EnumFunc() + break + end + end + if not Return and MatchList["_"] then + Return = MatchList["_"]() + end + return Return + end +end + +function CustomEnum.Create(Name, EnumValue) + CustomEnum.Enums[Name] = EnumValue + + local Enum = CustomEnum.Enums[Name] + EnumMethods(Enum) + + return Enum +end + +function CustomEnum.Remove(Name) + if CustomEnum.Enums[Name] then + CustomEnum.Enums[Name] = nil + else + warn(`Enum: attempt to remove an Enum that does not exist "{Name}".`, debug.traceback()) + end +end + +return CustomEnum \ No newline at end of file diff --git a/src/shared/Tags.lua b/src/shared/Tags.lua index c55e882..a124d14 100644 --- a/src/shared/Tags.lua +++ b/src/shared/Tags.lua @@ -42,7 +42,7 @@ end function Tags:Nuke() local Exports = self.Exports - for i,v in Exports do + for i: string, v: Instance | {Instance} in Exports do if type(v) == "table" then for n: number = 1, #v do CS:RemoveTag(v[n], i)