TagService -> Tags and more refactoring, close to working again

This commit is contained in:
2024-04-15 22:51:43 -04:00
parent 0fa054f97d
commit 9a011c689c
9 changed files with 322 additions and 330 deletions

File diff suppressed because one or more lines are too long

View File

@@ -4,11 +4,11 @@
local ElevatorsDir = script.Parent local ElevatorsDir = script.Parent
local MainDir = ElevatorsDir.Parent local MainDir = ElevatorsDir.Parent
local TagService = require(MainDir:WaitForChild("TagService"))
local Storage: ReplicatedStorage = game:GetService("ReplicatedStorage") local TagsModule = require(MainDir:WaitForChild("Tags"))
local TagsModule = require(Storage:WaitForChild("Tags"))
local Enums = require(Storage:WaitForChild("Enums")) local Storage = game:GetService("ReplicatedStorage")
local Enums = require(Storage:WaitForChild("Enums"))
type TagsConstructor = TagsModule.TagsConstructor type TagsConstructor = TagsModule.TagsConstructor
type TagProduct = TagsModule.TagProduct type TagProduct = TagsModule.TagProduct
@@ -21,7 +21,7 @@ type Impl_Constructor = {
constructor: Constructor_Fun, constructor: Constructor_Fun,
--Class functions --Class functions
DecodeCarTag: (self: ClassConstructor, FloorTag: string) -> number?, DecodeCarTag: (self: ClassConstructor, FloorTag: string) -> number?,
CreatePromptButtons: (self: ClassConstructor) -> TagService.ButtonsTree, CreatePromptButtons: (self: ClassConstructor) -> TagsModule.ButtonsTree,
AestheticActivateButton: (self: ClassConstructor, Button: BasePart, ActivatedState: boolean, ActivatedColor: Color3) -> () AestheticActivateButton: (self: ClassConstructor, Button: BasePart, ActivatedState: boolean, ActivatedColor: Color3) -> ()
} & Impl_Static_Props } & Impl_Static_Props
@@ -33,7 +33,7 @@ type Constructor_Fun = (TagsConstructor: TagsConstructor, Model: Enums.ElevatorV
type Constructor_Return_Props = { type Constructor_Return_Props = {
Tags: TagsConstructor, Tags: TagsConstructor,
Model: Enums.ElevatorValues, Model: Enums.ElevatorValues,
Buttons: TagService.ButtonsTree Buttons: TagsModule.ButtonsTree
} }
export type ButtonsConstructor = ClassConstructor export type ButtonsConstructor = ClassConstructor

View File

@@ -2,9 +2,12 @@
--!native --!native
--!strict --!strict
local ElevatorDir = script.Parent
local MainDir = ElevatorDir.Parent
local Storage: ReplicatedStorage = game:GetService("ReplicatedStorage") local Storage: ReplicatedStorage = game:GetService("ReplicatedStorage")
local Tween = require(Storage:WaitForChild("Tween")) local Tween = require(Storage:WaitForChild("Tween"))
local Tags = require(Storage:WaitForChild("Tags")) local Tags = require(MainDir:WaitForChild("Tags"))
local Enums = require(Storage:WaitForChild("Enums")) local Enums = require(Storage:WaitForChild("Enums"))
type rbxassetid = string type rbxassetid = string
@@ -14,7 +17,7 @@ type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :
type Impl_Constructor = { type Impl_Constructor = {
__index: Impl_Constructor, __index: Impl_Constructor,
constructor: Constructor_Fun, constructor: Constructor_Fun,
Get: (Tags: Tags.TagsConstructor, Model: Enums.ElevatorValues) -> Lanterns, Get: (Tags: Tags.TagsConstructor, Model: Enums.ElevatorValues) -> Tags.Lanterns,
--Class functions --Class functions
Activate: (self: ClassConstructor, EnabledState: boolean, IsDirectionLantern: boolean, Lantern: Lantern) -> (), Activate: (self: ClassConstructor, EnabledState: boolean, IsDirectionLantern: boolean, Lantern: Lantern) -> (),
DirectionUp: (self: ClassConstructor, Enabled: boolean) -> (), DirectionUp: (self: ClassConstructor, Enabled: boolean) -> (),
@@ -24,12 +27,13 @@ type Impl_Constructor = {
} & Impl_Static_Props } & Impl_Static_Props
type Impl_Static_Props = { type Impl_Static_Props = {
Volume: number Volume: number,
LightTweenTime: number
} }
type Constructor_Fun = (MainDisplay: UnionOperation, ChimeDirectionID: rbxassetid, ChimeLandingID: rbxassetid, Lanterns: Lanterns, Colors: Colors) -> ClassConstructor type Constructor_Fun = (MainDisplay: UnionOperation, ChimeDirectionID: rbxassetid, ChimeLandingID: rbxassetid, Lanterns: Tags.Lanterns, Colors: Colors) -> ClassConstructor
type Constructor_Return_Props = { type Constructor_Return_Props = {
LanternsMap: Lanterns, LanternsMap: Tags.Lanterns,
AudioChimeDirection: Sound, AudioChimeDirection: Sound,
AudioChimeLanding: Sound, AudioChimeLanding: Sound,
Colors: Colors Colors: Colors
@@ -41,12 +45,6 @@ type Lantern = {
Played: boolean Played: boolean
} }
type Lanterns = {
[number]: Lantern,
Up: Lantern,
Down: Lantern
}
export type Colors = { export type Colors = {
Active: Color3, Active: Color3,
Off: Color3 Off: Color3
@@ -57,7 +55,8 @@ export type LanternsConstructor = ClassConstructor
local Lanterns = {} :: Impl_Constructor local Lanterns = {} :: Impl_Constructor
Lanterns.__index = Lanterns Lanterns.__index = Lanterns
Lanterns.Volume = .8 Lanterns.Volume = .5
Lanterns.LightTweenTime = 1
function Lanterns.constructor(MainDisplay, ChimeDirectionID, ChimeLandingID, LanternsMap, Colors) function Lanterns.constructor(MainDisplay, ChimeDirectionID, ChimeLandingID, LanternsMap, Colors)
local AudioChimeDirection = Instance.new("Sound") :: Sound local AudioChimeDirection = Instance.new("Sound") :: Sound
@@ -78,7 +77,7 @@ function Lanterns.constructor(MainDisplay, ChimeDirectionID, ChimeLandingID, Lan
}, Lanterns) }, Lanterns)
end end
local LanternLight = Tween.constructor(TweenInfo.new(1)) local LanternLight = Tween.constructor(TweenInfo.new(Lanterns.LightTweenTime))
function Lanterns:Activate(EnabledState, IsDirectionLantern, Lantern) function Lanterns:Activate(EnabledState, IsDirectionLantern, Lantern)
local Tween = LanternLight:Start(Lantern.Light, { local Tween = LanternLight:Start(Lantern.Light, {
@@ -97,10 +96,14 @@ function Lanterns:Activate(EnabledState, IsDirectionLantern, Lantern)
end end
function Lanterns:Reset() function Lanterns:Reset()
self.LanternsMap.Up.Played = false if self.LanternsMap.Up then
self.LanternsMap.Down.Played = false self.LanternsMap.Up.Played = false
self:Activate(false, true, self.LanternsMap.Up) self:Activate(false, true, self.LanternsMap.Up)
self:Activate(false, true, self.LanternsMap.Down) end
if self.LanternsMap.Down then
self.LanternsMap.Down.Played = false
self:Activate(false, true, self.LanternsMap.Down)
end
for n: number = 1, #self.LanternsMap do for n: number = 1, #self.LanternsMap do
self:Activate(false, false, self.LanternsMap[n]) self:Activate(false, false, self.LanternsMap[n])
@@ -109,14 +112,14 @@ function Lanterns:Reset()
end end
function Lanterns:DirectionUp(Enabled) function Lanterns:DirectionUp(Enabled)
if not self.LanternsMap.Up.Played then if self.LanternsMap.Up and not self.LanternsMap.Up.Played then
self.LanternsMap.Up.Played = true self.LanternsMap.Up.Played = true
self:Activate(Enabled, true, self.LanternsMap.Up) self:Activate(Enabled, true, self.LanternsMap.Up)
end end
end end
function Lanterns:DirectionDown(Enabled) function Lanterns:DirectionDown(Enabled)
if not self.LanternsMap.Down.Played then if self.LanternsMap.Down and not self.LanternsMap.Down.Played then
self.LanternsMap.Down.Played = true self.LanternsMap.Down.Played = true
self:Activate(Enabled, true, self.LanternsMap.Down) self:Activate(Enabled, true, self.LanternsMap.Down)
end end

View File

@@ -8,8 +8,7 @@ local MainDir = Elevators.Parent
local Storage: ReplicatedStorage = game:GetService("ReplicatedStorage") local Storage: ReplicatedStorage = game:GetService("ReplicatedStorage")
local RS: RunService = game:GetService("RunService") local RS: RunService = game:GetService("RunService")
local TagsModule = require(Storage:WaitForChild("Tags")) local Enums = require(Storage:WaitForChild("Enums"))
local Enums = require(Storage:WaitForChild("Enums"))
local Leveling = require(script:WaitForChild("Leveling")) local Leveling = require(script:WaitForChild("Leveling"))
local Doors = require(script:WaitForChild("Doors")) local Doors = require(script:WaitForChild("Doors"))
@@ -21,12 +20,12 @@ local TractionRopes = require(Elevators:WaitForChild("TractionRopes"))
local Lanterns = require(Elevators:WaitForChild("Lanterns")) local Lanterns = require(Elevators:WaitForChild("Lanterns"))
local PromptModule = require(MainDir:WaitForChild("Map"):WaitForChild("Prompts")) local PromptModule = require(MainDir:WaitForChild("Map"):WaitForChild("Prompts"))
local TagService = require(MainDir:WaitForChild("TagService")) local Tags = require(MainDir:WaitForChild("Tags"))
type rbxassetid = string type rbxassetid = string
type Tags = TagsModule.ExportedTags type Tags = Tags.ExportedTags
type TagsConstructor = TagsModule.TagsConstructor type TagsConstructor = Tags.TagsConstructor
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor)) type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
type Impl_Constructor = { type Impl_Constructor = {
@@ -49,7 +48,7 @@ type Impl_Static_Props = {
__CurrentFloor: number __CurrentFloor: number
} }
type Constructor_Fun = (TagsConstructor: TagsConstructor, TagServiceConstructor: TagService.TagsServiceConstructor) -> ClassConstructor type Constructor_Fun = (TagsConstructor: TagsConstructor, ButtonsTags: Tags.ButtonsTree, LanternsTags: Tags.Lanterns) -> ClassConstructor
type Constructor_Return_Props = { type Constructor_Return_Props = {
Tags: Tags, Tags: Tags,
MOConstructor: MovingObjects.MovingObjectsConstructor, MOConstructor: MovingObjects.MovingObjectsConstructor,
@@ -73,7 +72,10 @@ type Constructor_Return_Props = {
__MovingConnection: RBXScriptConnection?, __MovingConnection: RBXScriptConnection?,
} }
type ButtonFunction = (self: ClassConstructor, ButtonName: string, ButtonsConstructor: ButtonTags.ButtonsConstructor, ButtonTree: ButtonTags.ButtonProperties) -> () type ButtonFunction = (self: ClassConstructor, ButtonName: string, ButtonsConstructor: ButtonTags.ButtonsConstructor, ButtonTree: Tags.ButtonProperties) -> ()
type ButtonFunctions = {
[Enums.ButtonTreeValues]: ButtonFunction
}
local Otis1960 = {} :: Impl_Constructor local Otis1960 = {} :: Impl_Constructor
Otis1960.__index = Otis1960 Otis1960.__index = Otis1960
@@ -89,13 +91,13 @@ Otis1960.LanternChimeLanding = "rbxassetid://16990290265"
Otis1960.__Moving = false Otis1960.__Moving = false
Otis1960.__CurrentFloor = 1 Otis1960.__CurrentFloor = 1
local ButtonFunctions: {[Enums.ButtonTreeValues]: ButtonFunction} = { local ButtonFunctions: ButtonFunctions = {
[Enums.ButtonTree.Landing] = function(self, ButtonName, ButtonsConstructor, ButtonTree) [Enums.ButtonTree.Landing] = function(self, ButtonName, ButtonsConstructor, ButtonTree)
end, end,
[Enums.ButtonTree.Car] = function(self, ButtonName, ButtonsConstructor, ButtonTree) [Enums.ButtonTree.Car] = function(self, ButtonName, ButtonsConstructor, ButtonTree)
local DecodedFloor = TagService.Decoder.CarTag(ButtonName) local DecodedFloor = Tags.Decoders.CarTag(ButtonName)
if not DecodedFloor then if not DecodedFloor then
end end
@@ -134,7 +136,7 @@ local function HookButtons(self: ClassConstructor, ButtonsConstructor: ButtonTag
end end
end end
function Otis1960.constructor(TagsConstructor, TagServiceConstructor) function Otis1960.constructor(TagsConstructor, ButtonsTags, LanternsTags)
local self = {} :: Constructor_Return_Props local self = {} :: Constructor_Return_Props
self.ElevatorBox_1960 = TagsConstructor:Request("ElevatorMover_1960") :: UnionOperation self.ElevatorBox_1960 = TagsConstructor:Request("ElevatorMover_1960") :: UnionOperation
self.ElevatorDoor1 = TagsConstructor:Request("ElevatorDoor_1960_1") :: BasePart self.ElevatorDoor1 = TagsConstructor:Request("ElevatorDoor_1960_1") :: BasePart
@@ -155,10 +157,10 @@ function Otis1960.constructor(TagsConstructor, TagServiceConstructor)
self.MOConstructor = MovingObjects.constructor({MachineRoom = self.MachineRoom} :: MovingObjects.InstanceTree) self.MOConstructor = MovingObjects.constructor({MachineRoom = self.MachineRoom} :: MovingObjects.InstanceTree)
--Audio --Audio
local LanternDisplay = TagsConstructor:Request("Otis1960_LanternDisplayMain") :: UnionOperation local LanternDisplay = TagsConstructor:Request("Otis1960_LanternDisplayMain") :: UnionOperation
local LaternTags = TagServiceConstructor:Lanterns(Enums.Elevator.Otis1960) :: TagService.Lanterns local LanternTags = TagsConstructor:ElevatorLanterns()[Enums.Elevator.Otis1960]
self.LanternsConstructor = Lanterns.constructor(LanternDisplay, Otis1960.LanternChimeDirection, Otis1960.LanternChimeLanding, LaternTags, { self.LanternsConstructor = Lanterns.constructor(LanternDisplay, Otis1960.LanternChimeDirection, Otis1960.LanternChimeLanding, LanternTags, {
Active = Otis1960.LanternDisplayColorOn, Active = Otis1960.LanternDisplayColorOn,
Off = Otis1960.LanternDisplayColorOff Off = Otis1960.LanternDisplayColorOff
} :: Lanterns.Colors) } :: Lanterns.Colors)
@@ -177,7 +179,7 @@ function Otis1960.constructor(TagsConstructor, TagServiceConstructor)
local ClassConstructor = setmetatable(self, Otis1960) local ClassConstructor = setmetatable(self, Otis1960)
HookButtons(ClassConstructor, ButtonsConstructor, Enums.ButtonTree.Car) HookButtons(ClassConstructor, ButtonsConstructor, Enums.ButtonTree.Car)
print("[DEBUG] Otis1960 Lanterns=", LaternTags) print("[DEBUG] Otis1960 Lanterns=", LanternTags)
print("[DEBUG] Otis1960 Buttons=", Otis1960_Buttons) print("[DEBUG] Otis1960 Buttons=", Otis1960_Buttons)
print("🔝 Otis1960 initialized and ready") print("🔝 Otis1960 initialized and ready")
return ClassConstructor return ClassConstructor

View File

@@ -20,6 +20,7 @@ type Constructor_Fun = (Prompt: ProximityPrompt, Instance: Instance, Enabled: bo
type Constructor_Return_Props = { type Constructor_Return_Props = {
Prompt: ProximityPrompt, Prompt: ProximityPrompt,
Instance: Instance, Instance: Instance,
__TriggeredCallback: PromptCallback?, __TriggeredCallback: PromptCallback?,
__TriggerEndedCallback: PromptCallback?, __TriggerEndedCallback: PromptCallback?,
__PromptConnections: { __PromptConnections: {

View File

@@ -1,218 +0,0 @@
--!optimize 2
--!native
--!strict
local Storage = game:GetService("ReplicatedStorage")
local Tags = require(Storage:WaitForChild("Tags"))
local Enums = require(Storage:WaitForChild("Enums"))
type rbxassetid = string
type TagsConstructor = Tags.TagsConstructor
type TagProduct = Tags.TagProduct
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
type Impl_Constructor = {
__index: Impl_Constructor,
constructor: Constructor_Fun,
--Class functions
Lanterns: (self: ClassConstructor, ElevatorModel: Enums.ElevatorValues) -> Lanterns,
Buttons: (self: ClassConstructor, ElevatorModel: Enums.ElevatorValues) -> GetButtons,
Interactables: (self: ClassConstructor) -> InteractablesTree
} & Impl_Static_Props
type Impl_Static_Props = {
MaxLightSwitchActivationDistance: number,
MaxLightSwitchHoldDuration: number,
LightSwitchActivateSoundId: rbxassetid,
Decoder: {
CarTag: (FloorTag: string) -> number?
}
}
type Constructor_Fun = (TagsConstructor: TagsConstructor) -> ClassConstructor
type Constructor_Return_Props = {
ExportedTags: Tags.ExportedTags,
}
type Lantern = {
Inst: BasePart,
Light: BasePart?,
Played: boolean
}
export type GetButtons = {
[string]: Instance
}
export type LightSwitchTree = {
[string]: {
Switch: Instance?,
Lights: {Instance}?,
Prompt: ProximityPrompt?,
ClickSound: Sound?
}
}
export type InteractablesTree = {
LightSwitches: LightSwitchTree
}
export type Lanterns = {
[number]: Lantern,
Up: Lantern,
Down: Lantern
}
export type ButtonsTree = {
Landing: ButtonProperties,
Car: ButtonProperties,
Special: ButtonProperties,
Relays: ButtonProperties
}
export type ButtonProperties = {
Inst: Instance?,
Prompt: ProximityPrompt?,
Attachment: Attachment?
}
export type TagsServiceConstructor = ClassConstructor
local TagService = {} :: Impl_Constructor
TagService.__index = TagService
TagService.MaxLightSwitchActivationDistance = 3
TagService.MaxLightSwitchHoldDuration = .15
TagService.LightSwitchActivateSoundId = "rbxassetid://156286438"
function TagService.constructor(TagsConstructor)
return setmetatable({
ExportedTags = TagsConstructor.__export
}, TagService)
end
TagService.Decoder = {
CarTag = function(FloorTag)
local Match = FloorTag:match('%d+$')
return Match and tonumber(Match)
end
}
function TagService:Lanterns(ElevatorModel)
local Lanterns = {} :: Lanterns
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 LanternModel == ElevatorModel and IndicatorType == "DirectionIndicator" then
local Floor = tonumber(FloorHint)
if Floor then
if not Lanterns[Floor] then
Lanterns[Floor] = {
Inst = Inst :: BasePart,
Light = (Inst :: BasePart).Parent:FindFirstChild("Light") :: BasePart?,
Played = false
}
else
warn(`Lanterns: Floor "{tostring(Floor)}" was already wrote while parsing`)
end
else
if FloorHint == "Up" then
Lanterns.Up = {
Inst = Inst :: BasePart,
Light = (Inst :: BasePart).Parent:FindFirstChild("Light") :: BasePart?,
Played = false
}
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", {FloorHint}`)
end
end
end
end
return Lanterns
end
function TagService:Buttons(ElevatorModel)
local Buttons: GetButtons = {}
for TagName: string, Inst: TagProduct in self.ExportedTags do
local Split = TagName:split('_')
local ModelHint = Split[1]
local ButtonHint = Split[2]
if ModelHint == ElevatorModel and (ButtonHint == "ElevatorButton" or ButtonHint == "RelayButton") then
if typeof(Inst) == "Instance" then
Buttons[TagName] = Inst
else
warn("TODO block hit,", debug.traceback())
end
end
end
return Buttons
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 ptr = Interactables.LightSwitches[InteractObjectLocation]
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
Attachment.Parent = Switch
local Prompt = Instance.new("ProximityPrompt") :: ProximityPrompt
Prompt.MaxActivationDistance = TagService.MaxLightSwitchActivationDistance
Prompt.HoldDuration = TagService.MaxLightSwitchHoldDuration
Prompt.Parent = Attachment
local ClickSound = Instance.new("Sound") :: Sound
ClickSound.SoundId = TagService.LightSwitchActivateSoundId
ClickSound.Parent = Switch
ptr.Switch = Switch
ptr.Prompt = Prompt
ptr.ClickSound = ClickSound
elseif InteractType == Enums.Interactables.Light then
local ptr = Interactables.LightSwitches[InteractObjectLocation]
if type(Inst) == "table" then
ptr.Lights = table.clone(Inst)
else
ptr.Lights = {}
table.insert(ptr.Lights :: {Instance}, Inst)
end
end
end
end
return Interactables
end
return TagService

264
src/server/main/Tags.lua Normal file
View File

@@ -0,0 +1,264 @@
--!optimize 2
--!native
--!strict
local CS = game:GetService("CollectionService")
local Storage = game:GetService("ReplicatedStorage")
local Enums = require(Storage:WaitForChild("Enums"))
type Error = never
type rbxassetid = string
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
type Impl_Constructor = {
__index: Impl_Constructor,
constructor: Constructor_Fun,
--Class functions
Nuke: (self: ClassConstructor) -> (),
Request: (self: ClassConstructor, Name: string) -> TagProduct | Error,
__ElevatorLanterns: (self: ClassConstructor) -> LanternsTree,
__ElevatorButtons: (self: ClassConstructor) -> ElevatorButtons,
__Interactables: (self: ClassConstructor) -> InteractablesTree
} & Impl_Static_Props
type Impl_Static_Props = {
MaxLightSwitchActivationDistance: number,
MaxLightSwitchHoldDuration: number,
LightSwitchActivateSoundId: rbxassetid,
Decoders: {
CarTag: (FloorTag: string) -> number?
}
}
type Constructor_Fun = () -> ClassConstructor
type Constructor_Return_Props = {
__export: ExportedTags
}
type Lantern = {
Inst: BasePart,
Light: BasePart?,
Played: boolean
}
export type ElevatorButtons = {
[Enums.ElevatorValues]: {
[string]: Instance
}
}
export type Lanterns = {
[number]: Lantern,
Up: Lantern?,
Down: Lantern?
}
export type LanternsTree = {
[Enums.ElevatorValues]: Lanterns
}
export type LightSwitchTree = {
[string]: {
Switch: Instance?,
Lights: {Instance}?,
Prompt: ProximityPrompt?,
ClickSound: Sound?
}
}
export type InteractablesTree = {
LightSwitches: LightSwitchTree
}
export type ButtonsTree = {
Landing: ButtonProperties,
Car: ButtonProperties,
Special: ButtonProperties,
Relays: ButtonProperties
}
export type ButtonProperties = {
Inst: Instance?,
Prompt: ProximityPrompt?,
Attachment: Attachment?
}
export type TagProduct = Instance | {Instance}
export type ExportedTags = {[string]: TagProduct}
export type TagsConstructor = ClassConstructor
local Tags = {} :: Impl_Constructor
Tags.__index = Tags
Tags.MaxLightSwitchActivationDistance = 3
Tags.MaxLightSwitchHoldDuration = .15
Tags.LightSwitchActivateSoundId = "rbxassetid://156286438"
Tags.Decoders = {
CarTag = function(FloorTag)
local Match = FloorTag:match('%d+$')
return Match and tonumber(Match)
end
}
function Tags.constructor()
local Exports: ExportedTags = {}
local AllTags = CS:GetAllTags()
for n: number = 1, #AllTags do
local TagName = AllTags[n]
local Tagged = CS:GetTagged(TagName)
Exports[TagName] = #Tagged>1 and Tagged or Tagged[1]
end
return setmetatable({
__export = Exports
}, Tags)
end
function Tags:Request(Name)
return self.__export[Name] or error(`Error requesting tag name, tag name "{Name}" does not exist.`, 2)
end
function Tags:Nuke()
local Exports = self.__export
for i: string, v: TagProduct in Exports do
if type(v) == "table" then
for n: number = 1, #v do
CS:RemoveTag(v[n], i)
end
else
CS:RemoveTag(v, i)
end
end
warn(" nuked all in-game tags. Left-over tags="..table.concat(CS:GetAllTags(), ", "))
end
function Tags:__ElevatorLanterns()
local Lanterns: LanternsTree = {}
for _, EnumValue in Enums.Elevator do
Lanterns[EnumValue :: Enums.ElevatorValues] = {}
for TagName: string, Inst: TagProduct in self.__export do
local Split = TagName:split('_')
local LanternModel = Split[1]
local IndicatorType = Split[2]
local FloorHint = Split[3]
if LanternModel == (EnumValue :: string) and IndicatorType == "DirectionIndicator" then
local Floor = tonumber(FloorHint)
if Floor then
if not Lanterns[EnumValue :: Enums.ElevatorValues][Floor] then
Lanterns[EnumValue :: Enums.ElevatorValues][Floor] = {
Inst = Inst :: BasePart,
Light = ((Inst :: BasePart).Parent :: Instance):FindFirstChild("Light") :: BasePart?,
Played = false
}
else
warn(`Lanterns: Floor "{tostring(Floor)}" was already wrote while parsing`)
end
else
if FloorHint == "Up" then
Lanterns[EnumValue :: Enums.ElevatorValues].Up = {
Inst = Inst :: BasePart,
Light = ((Inst :: BasePart).Parent :: Instance):FindFirstChild("Light") :: BasePart?,
Played = false
}
elseif FloorHint == "Down" then
Lanterns[EnumValue :: Enums.ElevatorValues].Down = {
Inst = Inst :: BasePart,
Light = ((Inst :: BasePart).Parent :: Instance):FindFirstChild("Light") :: BasePart?,
Played = false
}
else
warn(`Lanterns: Unknown type paired with "DirectionIndicator", {FloorHint}`)
end
end
end
end
end
return Lanterns
end
function Tags:__ElevatorButtons()
local Buttons: ElevatorButtons = {}
for _, EnumValue in Enums.Elevator do
Buttons[EnumValue :: Enums.ElevatorValues] = {}
for TagName: string, Inst: TagProduct in self.__export do
local Split = TagName:split('_')
local ModelHint = Split[1]
local ButtonHint = Split[2]
if ModelHint == (EnumValue :: Enums.ElevatorValues) and (ButtonHint == "ElevatorButton" or ButtonHint == "RelayButton") then
if typeof(Inst) == "Instance" then
Buttons[EnumValue :: Enums.ElevatorValues][TagName] = Inst
else
warn("TODO block hit,", debug.traceback())
end
end
end
end
return Buttons
end
function Tags:__Interactables()
local Interactables: InteractablesTree = {
LightSwitches = {}
}
for TagName: string, Inst: TagProduct in self.__export 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 ptr = Interactables.LightSwitches[InteractObjectLocation]
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
Attachment.Parent = Switch
local Prompt = Instance.new("ProximityPrompt") :: ProximityPrompt
Prompt.MaxActivationDistance = Tags.MaxLightSwitchActivationDistance
Prompt.HoldDuration = Tags.MaxLightSwitchHoldDuration
Prompt.Parent = Attachment
local ClickSound = Instance.new("Sound") :: Sound
ClickSound.SoundId = Tags.LightSwitchActivateSoundId
ClickSound.Parent = Switch
ptr.Switch = Switch
ptr.Prompt = Prompt
ptr.ClickSound = ClickSound
elseif InteractType == Enums.Interactables.Light then
local ptr = Interactables.LightSwitches[InteractObjectLocation]
if type(Inst) == "table" then
ptr.Lights = table.clone(Inst)
else
ptr.Lights = {}
table.insert(ptr.Lights :: {Instance}, Inst)
end
end
end
end
return Interactables
end
return Tags

View File

@@ -4,8 +4,8 @@
local ShowEditorEntities = game:GetService("RunService"):IsServer() local ShowEditorEntities = game:GetService("RunService"):IsServer()
local Storage = game:GetService("ReplicatedStorage") local Storage = game:GetService("ReplicatedStorage")
local TagsModule = require(Storage:WaitForChild("Tags")) local Enums = require(Storage:WaitForChild("Enums"))
local Elevators = script:WaitForChild("Elevators") local Elevators = script:WaitForChild("Elevators")
local Otis1960_Module = require(Elevators:WaitForChild("Otis1960")) local Otis1960_Module = require(Elevators:WaitForChild("Otis1960"))
@@ -13,14 +13,13 @@ local Otis1960_Module = require(Elevators:WaitForChild("Otis1960"))
local Map = script:WaitForChild("Map") local Map = script:WaitForChild("Map")
local LightSwitchesConstructor = require(Map:WaitForChild("LightSwitches")) local LightSwitchesConstructor = require(Map:WaitForChild("LightSwitches"))
local TagService = require(script:WaitForChild("TagService")) local TagsModule = require(script:WaitForChild("Tags"))
local HideEditorEntities = require(script:WaitForChild("EditorEntities")) local HideEditorEntities = require(script:WaitForChild("EditorEntities"))
local Lighting_Stuff = require(script:WaitForChild("Lighting")) local Lighting_Stuff = require(script:WaitForChild("Lighting"))
local Workspace_Stuff = require(script:WaitForChild("Workspace")) local Workspace_Stuff = require(script:WaitForChild("Workspace"))
local StarterPlayer_Stuff = require(script:WaitForChild("StarterPlayer")) local StarterPlayer_Stuff = require(script:WaitForChild("StarterPlayer"))
local TagsConstructor = TagsModule.constructor() local TagsConstructor = TagsModule.constructor()
local TagServiceConstructor = TagService.constructor(TagsConstructor)
print("[DEBUG] Tags=", TagsConstructor.__export) print("[DEBUG] Tags=", TagsConstructor.__export)
HideEditorEntities.indexAll(ShowEditorEntities) HideEditorEntities.indexAll(ShowEditorEntities)
@@ -31,10 +30,15 @@ Lighting_Stuff()
Workspace_Stuff() Workspace_Stuff()
--Map --Map
local Interactables = TagServiceConstructor:Interactables() local Interactables = TagsConstructor:__Interactables()
print("[DEBUG] Interactables=", Interactables) print("[DEBUG] Interactables=", Interactables)
local LightSwitches = LightSwitchesConstructor.constructor(Interactables.LightSwitches) --local LightSwitches = LightSwitchesConstructor.constructor(Interactables.LightSwitches)
--Start the elevators --Start the elevators
local Otis1960 = Otis1960_Module.constructor(TagsConstructor, TagServiceConstructor) local Buttons = TagsConstructor:__ElevatorButtons()
local Lanterns = TagsConstructor:__ElevatorLanterns()
local Otis1960Lanterns = Lanterns[Enums.Elevator.Otis1960]
local Otis1960Buttons = Buttons[Enums.Elevator.Otis1960]
local Otis1960 = Otis1960_Module.constructor(TagsConstructor, Otis1960Buttons, Otis1960Lanterns)

View File

@@ -1,64 +0,0 @@
--!optimize 2
--!native
--!strict
type Error = never
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
type Impl_Constructor = {
__index: Impl_Constructor,
constructor: Constructor_Fun,
--Class functions
Nuke: (self: ClassConstructor) -> (),
Request: (self: ClassConstructor, Name: string) -> TagProduct | Error
}
type Constructor_Fun = () -> ClassConstructor
type Constructor_Return_Props = {
__export: ExportedTags
}
export type TagProduct = Instance | {Instance}
export type ExportedTags = {[string]: TagProduct}
export type TagsConstructor = ClassConstructor
local Tags = {} :: Impl_Constructor
Tags.__index = Tags
local CS: CollectionService = game:GetService("CollectionService")
function Tags.constructor()
local Exports: ExportedTags = {}
local AllTags = CS:GetAllTags()
for n: number = 1, #AllTags do
local TagName = AllTags[n]
local Tagged = CS:GetTagged(TagName)
Exports[TagName] = #Tagged>1 and Tagged or Tagged[1]
end
return setmetatable({
__export = Exports
}, Tags)
end
function Tags:Request(Name)
return self.__export[Name] or error(`Error requesting tag name, tag name "{Name}" does not exist.`, 2)
end
function Tags:Nuke()
local Exports = self.__export
for i: string, v: TagProduct in Exports do
if type(v) == "table" then
for n: number = 1, #v do
CS:RemoveTag(v[n], i)
end
else
CS:RemoveTag(v, i)
end
end
warn(" nuked all in-game tags. Left-over tags="..table.concat(CS:GetAllTags(), ", "))
end
return Tags