From f670e19c3cc5f3ff3fc1c14139458a6f27c6a40c Mon Sep 17 00:00:00 2001 From: unittensor Date: Sun, 14 Apr 2024 01:16:58 -0400 Subject: [PATCH] work on light switches --- sourcemap.json | 2 +- src/server/main/TagService.lua | 102 ++++++++++++++---- .../main/Elevators => shared}/Enums.lua | 23 +++- 3 files changed, 100 insertions(+), 27 deletions(-) rename src/{server/main/Elevators => shared}/Enums.lua (57%) diff --git a/sourcemap.json b/sourcemap.json index d36cc26..be71765 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":"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":"Enums","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Enums.lua"]},{"name":"Floors","className":"ModuleScript","filePaths":["src/server\\main\\Elevators\\Floors.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":"Lighting","className":"ModuleScript","filePaths":["src/server\\main\\Lighting\\init.lua"]},{"name":"StarterPlayer","className":"ModuleScript","filePaths":["src/server\\main\\StarterPlayer.lua"]},{"name":"TagService","className":"ModuleScript","filePaths":["src/server\\main\\TagService.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 +{"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":"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":"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":"Lighting","className":"ModuleScript","filePaths":["src/server\\main\\Lighting\\init.lua"]},{"name":"StarterPlayer","className":"ModuleScript","filePaths":["src/server\\main\\StarterPlayer.lua"]},{"name":"TagService","className":"ModuleScript","filePaths":["src/server\\main\\TagService.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/TagService.lua b/src/server/main/TagService.lua index ee8c9a0..2d1e4dc 100644 --- a/src/server/main/TagService.lua +++ b/src/server/main/TagService.lua @@ -2,12 +2,9 @@ --!native --!strict -local ParentDir = script.Parent -local Elevators = ParentDir:WaitForChild("Elevators") -local ElevatorEnums = require(Elevators:WaitForChild("Enums")) - local Storage = game:GetService("ReplicatedStorage") local Tags = require(Storage:WaitForChild("Tags")) +local Enums = require(Storage:WaitForChild("Enums")) type TagsConstructor = Tags.TagsConstructor type TagProduct = Tags.TagProduct @@ -17,17 +14,18 @@ type Impl_Constructor = { __index: Impl_Constructor, constructor: Constructor_Fun, --Class functions - Lanterns: (self: ClassConstructor, ElevatorModel: ElevatorEnums.ElevatorValues) -> Lanterns, - Buttons: (self: ClassConstructor, ElevatorModel: ElevatorEnums.ElevatorValues) -> GetButtons, - Interactables: (self: ClassConstructor) -> () + Lanterns: (self: ClassConstructor, ElevatorModel: Enums.ElevatorValues) -> Lanterns, + Buttons: (self: ClassConstructor, ElevatorModel: Enums.ElevatorValues) -> GetButtons, + Interactables: (self: ClassConstructor) -> InteractablesTree } & Impl_Static_Props -type Decoders = { - CarTag: (FloorTag: string) -> () -} - type Impl_Static_Props = { - Decoders: Decoders + DefaultMaxLightSwitchActivationDistance: number, + DefaultMaxLightSwitchHoldDuration: number, + + Decoder: { + CarTag: (FloorTag: string) -> () + } } type Constructor_Fun = (TagsConstructor: TagsConstructor) -> ClassConstructor @@ -40,7 +38,19 @@ type Lantern = { Light: BasePart?, Played: boolean } -type GetButtons = {[string]: Instance} + +type GetButtons = { + [string]: Instance +} +type InteractablesTree = { + LightSwitches: { + [string]: { + Switch: Instance?, + Lights: {Instance}?, + Prompt: ProximityPrompt? + } + } +} export type Lanterns = { [number]: Lantern, @@ -70,7 +80,10 @@ function TagService.constructor(TagsConstructor) }, TagService) end -TagService.Decoders = { +TagService.DefaultMaxLightSwitchActivationDistance = 3 +TagService.DefaultMaxLightSwitchHoldDuration = .15 + +TagService.Decoder = { CarTag = function(FloorTag) local Match = FloorTag:match('%d+$') return Match and tonumber(Match) @@ -82,9 +95,12 @@ function TagService:Lanterns(ElevatorModel) for TagName: string, Inst: TagProduct in self.ExportedTags do local Split = TagName:split('_') + local LanternModel = Split[1] + local IndicatorType = Split[2] + local FloorHint = Split[3] - if Split[1] == ElevatorModel and Split[2] == "DirectionIndicator" then - local Floor = tonumber(Split[3]) + if LanternModel == ElevatorModel and IndicatorType == "DirectionIndicator" then + local Floor = tonumber(FloorHint) if Floor then if not Lanterns[Floor] then @@ -97,20 +113,20 @@ function TagService:Lanterns(ElevatorModel) warn(`Lanterns: Floor "{tostring(Floor)}" was already wrote while parsing`) end else - if Split[3] == "Up" then + if FloorHint == "Up" then Lanterns.Up = { Inst = Inst :: BasePart, Light = (Inst :: BasePart).Parent:FindFirstChild("Light") :: BasePart?, Played = false } - elseif Split[3] == "Down" then + elseif FloorHint == "Down" then Lanterns.Down = { Inst = Inst :: BasePart, Light = (Inst :: BasePart).Parent:FindFirstChild("Light") :: BasePart?, Played = false } else - warn(`Lanterns: Unknown type paired with "DirectionIndicator", {Split[3]}`) + warn(`Lanterns: Unknown type paired with "DirectionIndicator", {FloorHint}`) end end end @@ -124,8 +140,10 @@ function TagService:Buttons(ElevatorModel) for TagName: string, Inst: TagProduct in self.ExportedTags do local Split = TagName:split('_') + local ModelHint = Split[1] + local ButtonHint = Split[2] - if Split[1] == ElevatorModel and (Split[2] == "ElevatorButton" or Split[2] == "RelayButton") then + if ModelHint == ElevatorModel and (ButtonHint == "ElevatorButton" or ButtonHint == "RelayButton") then if typeof(Inst) == "Instance" then Buttons[TagName] = Inst else @@ -138,7 +156,49 @@ function TagService:Buttons(ElevatorModel) end function TagService:Interactables() - + local Interactables: InteractablesTree = { + LightSwitches = {} + } + + for TagName: string, Inst: TagProduct in self.ExportedTags do + local Split = TagName:split('_') + local InteractHint = Split[1] + local InteractType = Split[2] + local InteractObjectLocation = Split[3] + + if InteractHint == "Interact" then + Interactables.LightSwitches[InteractObjectLocation] = {} + + if InteractType == Enums.Interactables.LightSwitch then + local itype = type(Inst) == "table" + local Switch = itype and (Inst :: {Instance})[1] or Inst :: Instance + if itype then + warn(`2 or more light switch tags were present under the same name, using the first index. "{TagName}". This feature is not implemented yet`) + end + + local Attachment = Instance.new("Attachment") + Attachment.Parent = Switch + local Prompt = Instance.new("ProximityPrompt") + Prompt.MaxActivationDistance = TagService.DefaultMaxLightSwitchActivationDistance + Prompt.HoldDuration = TagService.DefaultMaxLightSwitchHoldDuration + Prompt.Parent = Attachment + + Interactables.LightSwitches[InteractObjectLocation].Switch = Switch + Interactables.LightSwitches[InteractObjectLocation].Prompt = Prompt + elseif InteractType == Enums.Interactables.Light then + local p = Interactables.LightSwitches[InteractObjectLocation] + + if type(Inst) == "table" then + p.Lights = table.clone(Inst) + else + p.Lights = {} + table.insert(p.Lights :: {Instance}, Inst) + end + end + end + end + + return Interactables end return TagService \ No newline at end of file diff --git a/src/server/main/Elevators/Enums.lua b/src/shared/Enums.lua similarity index 57% rename from src/server/main/Elevators/Enums.lua rename to src/shared/Enums.lua index 67e2938..13dfa6f 100644 --- a/src/server/main/Elevators/Enums.lua +++ b/src/shared/Enums.lua @@ -2,13 +2,18 @@ --!native --!strict - local Enums = {} -export type EnumValue = EnumButton | EnumButtonTree | EnumElevator -export type EnumButton = typeof(Enums.Button) -export type EnumButtonTree = typeof(Enums.ButtonTree) -export type EnumElevator = typeof(Enums.Elevator) +export type EnumValue = EnumButton | EnumButtonTree | EnumElevator | EnumInteractables +export type EnumButton = typeof(Enums.Button) +export type EnumButtonTree = typeof(Enums.ButtonTree) +export type EnumElevator = typeof(Enums.Elevator) +export type EnumInteractables = typeof(Enums.Interactables) + +export type ButtonValues = typeof(Enums.Button.Car) | + typeof(Enums.Button.Landing) | + typeof(Enums.Button.Special) | + typeof(Enums.Button.Relay) export type ButtonTreeValues = typeof(Enums.ButtonTree.Car) | typeof(Enums.ButtonTree.Landing) | @@ -16,6 +21,9 @@ export type ButtonTreeValues = typeof(Enums.ButtonTree.Car) | typeof(Enums.ButtonTree.Relays) | typeof(Enums.ButtonTree.Unknown) +export type InteractablesValues = typeof(Enums.Interactables.LightSwitch) | + typeof(Enums.Interactables.Light) + export type ElevatorValues = typeof(Enums.Elevator.Otis1960) Enums.Button = { @@ -37,4 +45,9 @@ Enums.Elevator = { Otis1960 = "Otis1960" :: "Otis1960" } +Enums.Interactables = { + LightSwitch = "LightSwitch" :: "LightSwitch", + Light = "Light" :: "Light" +} + return Enums \ No newline at end of file