From 6edbb72e579eb9763fded8a919ce4d836a9b7826 Mon Sep 17 00:00:00 2001 From: rhpidfyre Date: Mon, 11 Mar 2024 23:08:12 -0400 Subject: [PATCH] Buttons algorithm work --- src/server/main/Elevators/Buttons.lua | 128 ++++++++++++++++++++------ 1 file changed, 101 insertions(+), 27 deletions(-) diff --git a/src/server/main/Elevators/Buttons.lua b/src/server/main/Elevators/Buttons.lua index 86f98ca..01b35f7 100644 --- a/src/server/main/Elevators/Buttons.lua +++ b/src/server/main/Elevators/Buttons.lua @@ -2,44 +2,98 @@ --!native --!strict -type GetButtons = {[string]: Instance} -type ButtonTypes = { - Landing: GetButtons, - Car: GetButtons, - Special: GetButtons, - Unknown: GetButtons +local RS: ReplicatedStorage = game:GetService("ReplicatedStorage") +local TagsModule = require(RS:WaitForChild("Tags")) + +type Tags = TagsModule.ExportedTags + +type GetButtons = { + [string]: Instance +} +type ButtonTree = { + Inst: Instance, + Prompt: ProximityPrompt +} +type ButtonsTree = { + Landing: ButtonTree, + Car: ButtonTree, + Special: ButtonTree, + Unknown: { + Inst: Instance, + Prompt: ProximityPrompt? + } } -local ButtonTags = {} -ButtonTags.__index = ButtonTags +type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor)) +type Impl_Constructor = { + __index: Impl_Constructor, + constructor: Constructor_Fun, + --Class functions + Get: (self: ClassConstructor) -> GetButtons, + CreatePromptButtons: (self: ClassConstructor) -> ButtonsTree, + HookPromptButtonsGroup: (self: ClassConstructor) -> () +} & Impl_Static_Props -function ButtonTags.constructor(Tags, Model) +type Impl_Static_Props = { + ButtonEnum: ButtonsEnum +} + +type Constructor_Fun = (Tags: Tags, Model: string) -> ClassConstructor +type Constructor_Return_Props = { + Tags: Tags, + Model: string +} + +export type ButtonsEnum = { + Car: string, + Landing: string, + Special: string, + Unknown: string +} + +local ButtonsModule = {} :: Impl_Constructor +ButtonsModule.__index = ButtonsModule + +ButtonsModule.ButtonEnum = { + Car = "CarButton", + Landing = "LandingButton", + Special = "SpecialButton", + Unknown = "UnknownButton" +} + +function ButtonsModule.constructor(Tags, Model) return setmetatable({ Tags = Tags, Model = Model - }, ButtonTags) + }, ButtonsModule) end -function ButtonTags:Get() +--Button parsing + +function ButtonsModule:Get() local Buttons: GetButtons = {} - for TagName: string, Inst: Instance in self.Tags do + for TagName: string, Inst: Instance | {Instance} in self.Tags do local Split = TagName:split('_') if Split[1] == self.Model and Split[2] == "ElevatorButton" then - Buttons[TagName] = Inst + if typeof(Inst) == "Instance" then + Buttons[TagName] = Inst + else + + end end end return Buttons end -function ButtonTags:CreatePromptButtons() +function ButtonsModule:CreatePromptButtons() local ModelButtons = self:Get() - local Buttons: ButtonTypes = { + local Buttons = { Landing = {}, Car = {}, Special = {}, Unknown = {} - } + } :: ButtonsTree for TagName: string, Inst: Instance in ModelButtons do local Attachment = Instance.new("Attachment") :: Attachment @@ -52,24 +106,40 @@ function ButtonTags:CreatePromptButtons() --CarButton = Model_ElevatorButton_1 --LandingButton = Model_ElevatorButton_Floor_1_Up --SpecialButton = Model_ElevatorButton_Open - local ButtonType = tonumber(Split[3]) and "CarButton" or (Split[3] == "Floor" and Split[4]:match('%d')) and "LandingButton" or Split[3] and "SpecialButton" + 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 - if ButtonType == "CarButton" then + if ButtonType == ButtonsModule.ButtonEnum.Car then --ElevatorButton_1 - Buttons.Car[`{Split[2]}_{Split[3]}`] = Inst - + Buttons.Car[`{Split[2]}_{Split[3]}`] = { + Inst = Inst, + Prompt = Prompt + } Prompt.ActionText = tostring(Split[3]) Prompt.ObjectText = "Floor" - elseif ButtonType == "LandingButton" then + elseif ButtonType == ButtonsModule.ButtonEnum.Landing then --ElevatorButton_Floor_1_Up - Buttons.Landing[`{Split[2]}_{Split[3]}_{Split[4]}_{Split[5]}`] = Inst - + 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 == "SpecialButton" then + elseif ButtonType == ButtonsModule.ButtonEnum.Special then --ElevatorButton_Open - - else + 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 @@ -79,4 +149,8 @@ function ButtonTags:CreatePromptButtons() return Buttons end -return ButtonTags \ No newline at end of file +function ButtonsModule:HookPromptButtonsGroup() + +end + +return ButtonsModule \ No newline at end of file