mirror of
https://github.com/unixtensor/Roblox-Elevator-Game.git
synced 2025-12-14 06:41:55 +00:00
Haughton elevator and work on the buttons and new structure
This commit is contained in:
File diff suppressed because one or more lines are too long
86
src/server/main/Elevators/ButtonManager.luau
Normal file
86
src/server/main/Elevators/ButtonManager.luau
Normal file
@@ -0,0 +1,86 @@
|
||||
--!optimize 2
|
||||
--!native
|
||||
--!strict
|
||||
|
||||
local Elevators = script.Parent
|
||||
local Main = Elevators.Parent
|
||||
|
||||
local Storage = game:GetService("ReplicatedStorage")
|
||||
|
||||
local Enums = require(Storage:WaitForChild("Enums"))
|
||||
|
||||
local Map = Main:WaitForChild("Map")
|
||||
local PromptModule = require(Map:WaitForChild("Prompts"))
|
||||
local Tags = require(Map:WaitForChild("Load"):WaitForChild("Tags"))
|
||||
|
||||
type FloorButtonActivatedCallback = (ButtonFloor: number | string) -> ()
|
||||
type StopButtonActivatedCallback = (Toggled: boolean) -> ()
|
||||
|
||||
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
|
||||
type Impl_Constructor = {
|
||||
__index: Impl_Constructor,
|
||||
constructor: Constructor_Fun,
|
||||
--Class functions
|
||||
CarButton: (self: ClassConstructor, ButtonID: string, ButtonTree: Tags.ButtonProperties, Callback: FloorButtonActivatedCallback, Fallback: FloorButtonActivatedCallback) -> (),
|
||||
LandingButton: (self: ClassConstructor, ButtonID: string, ButtonTree: Tags.ButtonProperties, Callback: FloorButtonActivatedCallback, Fallback: FloorButtonActivatedCallback) -> (),
|
||||
SpecialButton: (self: ClassConstructor, ButtonName: Enums.SpecialButtonValues, ButtonID: string, ButtonTree: Tags.ButtonProperties, Callback: StopButtonActivatedCallback) -> (),
|
||||
}
|
||||
|
||||
type Constructor_Fun = (CurrentFloor: IntValue) -> ClassConstructor
|
||||
type Constructor_Return_Props = {
|
||||
CurrentFloor: IntValue
|
||||
}
|
||||
|
||||
export type ButtonsConstructor = ClassConstructor
|
||||
|
||||
local ButtonFunctions = {} :: Impl_Constructor
|
||||
ButtonFunctions.__index = ButtonFunctions
|
||||
|
||||
--ButtonTags.ButtonsConstructor
|
||||
function ButtonFunctions.constructor(CurrentFloor)
|
||||
return setmetatable({CurrentFloor = CurrentFloor}, ButtonFunctions)
|
||||
end
|
||||
|
||||
function ButtonFunctions:CarButton(ButtonID, ButtonTree, Callback, Fallback)
|
||||
local DecodedCarFloorTag = Tags.Decoders.CarTag(ButtonID)
|
||||
if DecodedCarFloorTag then
|
||||
local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance)
|
||||
Prompt:Triggered(function(Player: Player, _, __)
|
||||
if DecodedCarFloorTag == self.CurrentFloor.Value then
|
||||
Fallback(DecodedCarFloorTag)
|
||||
else
|
||||
Callback(DecodedCarFloorTag)
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function ButtonFunctions:LandingButton(ButtonID, ButtonTree, Callback, Fallback)
|
||||
local DecodedHallFloorTag = Tags.Decoders.HallTag(ButtonID)
|
||||
if DecodedHallFloorTag then
|
||||
local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance)
|
||||
Prompt:Triggered(function(Player: Player, _, __)
|
||||
if DecodedHallFloorTag == self.CurrentFloor.Value then
|
||||
Fallback(DecodedHallFloorTag)
|
||||
else
|
||||
Callback(DecodedHallFloorTag)
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function ButtonFunctions:SpecialButton(ButtonID, ButtonName, ButtonTree, Callback)
|
||||
--precomputing speed
|
||||
if ButtonID == Enums.SpecialButton.Stop then
|
||||
local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance)
|
||||
local Toggled = false
|
||||
Prompt:Triggered(function(Player: Player, _, __)
|
||||
Toggled = not Toggled
|
||||
Callback(Toggled)
|
||||
end)
|
||||
else
|
||||
warn(``)
|
||||
end
|
||||
end
|
||||
|
||||
return ButtonFunctions
|
||||
@@ -1,135 +0,0 @@
|
||||
--!optimize 2
|
||||
--!native
|
||||
--!strict
|
||||
|
||||
local Elevators = script.Parent
|
||||
local Main = Elevators.Parent
|
||||
local Load = Main:WaitForChild("Load")
|
||||
|
||||
local Storage = game:GetService("ReplicatedStorage")
|
||||
|
||||
local Enums = require(Storage:WaitForChild("Enums"))
|
||||
|
||||
local PromptModule = require(Main:WaitForChild("Map"):WaitForChild("Prompts"))
|
||||
local Tags = require(Load:WaitForChild("Tags"))
|
||||
|
||||
type FloorButtonActivatedCallback = (ButtonFloor: number) -> ()
|
||||
type FloorButtonActivatedFallback = FloorButtonActivatedCallback
|
||||
type StopButtonActivatedCallback = (Toggled: SpecialButtonToggle) -> ()
|
||||
|
||||
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
|
||||
type Impl_Constructor = {
|
||||
__index: Impl_Constructor,
|
||||
constructor: Constructor_Fun,
|
||||
--Class functions
|
||||
CarButton: (self: ClassConstructor, ButtonID: string, ButtonTree: Tags.ButtonProperties, Callback: FloorButtonActivatedCallback, Fallback: FloorButtonActivatedFallback) -> (),
|
||||
LandingButton: (self: ClassConstructor, ButtonID: string, ButtonTree: Tags.ButtonProperties, Callback: FloorButtonActivatedCallback, Fallback: FloorButtonActivatedFallback) -> (),
|
||||
SpecialButton: (self: ClassConstructor, ButtonName: Enums.SpecialButtonValues, ButtonID: string, ButtonTree: Tags.ButtonProperties, Callback: StopButtonActivatedCallback) -> (),
|
||||
} & Impl_Static_Props
|
||||
|
||||
type Impl_Static_Props = {
|
||||
ButtonHoldDuration: number,
|
||||
AestheticDeactivateTime: number
|
||||
}
|
||||
|
||||
type Constructor_Fun = (ElevatorAttributes: ElevatorAttributes, ElevatorButtonColors: ElevatorButtonColors) -> ClassConstructor
|
||||
type Constructor_Return_Props = {
|
||||
ElevatorAttributes: ElevatorAttributes,
|
||||
ElevatorButtonColors: ElevatorButtonColors
|
||||
}
|
||||
|
||||
type ElevatorAttributes = {
|
||||
CurrentFloor: IntValue,
|
||||
Moving: BoolValue,
|
||||
}
|
||||
|
||||
type ElevatorEvents = {
|
||||
ButtonActivated: BindableEvent
|
||||
}
|
||||
|
||||
type ElevatorButtonColors = {
|
||||
ButtonActivated: Color3,
|
||||
ButtonDeactivated: Color3,
|
||||
LanternDisplayOn: Color3,
|
||||
LanternDisplayOff: Color3,
|
||||
}
|
||||
|
||||
export type SpecialButtonToggle = boolean
|
||||
|
||||
export type ButtonsConstructor = ClassConstructor
|
||||
|
||||
local ButtonFunctions = {} :: Impl_Constructor
|
||||
ButtonFunctions.__index = ButtonFunctions
|
||||
|
||||
ButtonFunctions.ButtonHoldDuration = .30
|
||||
ButtonFunctions.AestheticDeactivateTime = .30
|
||||
|
||||
--ButtonTags.ButtonsConstructor
|
||||
function ButtonFunctions.constructor(ElevatorAttributes, ElevatorButtonColors)
|
||||
return setmetatable({
|
||||
ElevatorAttributes = ElevatorAttributes,
|
||||
ElevatorButtonColors = ElevatorButtonColors
|
||||
}, ButtonFunctions)
|
||||
end
|
||||
|
||||
function ButtonFunctions:CarButton(ButtonID, ButtonTree, Callback, Fallback)
|
||||
local DecodedCarFloorTag = Tags.Decoders.CarTag(ButtonID)
|
||||
|
||||
if DecodedCarFloorTag then
|
||||
local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance)
|
||||
|
||||
Prompt:Triggered(function(Player: Player, _, __)
|
||||
self:AestheticActivateButton(ButtonTree.Inst :: BasePart)
|
||||
|
||||
if DecodedCarFloorTag == self.ElevatorAttributes.CurrentFloor.Value then
|
||||
Fallback(DecodedCarFloorTag)
|
||||
|
||||
task.delay(ButtonFunctions.AestheticDeactivateTime, function()
|
||||
self:__DeactivateButton(ButtonTree.Inst :: BasePart, (ButtonTree.Inst :: Instance):FindFirstChild("Glass") :: BasePart?)
|
||||
end)
|
||||
else
|
||||
Callback(DecodedCarFloorTag)
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function ButtonFunctions:LandingButton(ButtonID, ButtonTree, Callback, Fallback)
|
||||
local DecodedHallFloorTag = Tags.Decoders.HallTag(ButtonID)
|
||||
|
||||
if DecodedHallFloorTag then
|
||||
local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance)
|
||||
|
||||
Prompt:Triggered(function(Player: Player, _, __)
|
||||
self:AestheticActivateButton(ButtonTree.Inst :: BasePart)
|
||||
|
||||
if DecodedHallFloorTag == self.ElevatorAttributes.CurrentFloor.Value then
|
||||
Fallback(DecodedHallFloorTag)
|
||||
|
||||
task.delay(ButtonFunctions.AestheticDeactivateTime, function()
|
||||
self:__DeactivateButton(ButtonTree.Inst :: BasePart, (ButtonTree.Inst :: Instance):FindFirstChild("Glass") :: BasePart?)
|
||||
end)
|
||||
else
|
||||
Callback(DecodedHallFloorTag)
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function ButtonFunctions:SpecialButton(ButtonID, ButtonName, ButtonTree, Callback)
|
||||
--precomputing speed
|
||||
if ButtonID == Enums.SpecialButton.Stop then
|
||||
local Prompt = PromptModule.constructor(ButtonTree.Prompt :: ProximityPrompt, ButtonTree.Inst :: Instance)
|
||||
local Toggled = false
|
||||
|
||||
Prompt:Triggered(function(Player: Player, _, __)
|
||||
Toggled = not Toggled
|
||||
|
||||
Callback(Toggled)
|
||||
end)
|
||||
else
|
||||
warn(``)
|
||||
end
|
||||
end
|
||||
|
||||
return ButtonFunctions
|
||||
71
src/server/main/Elevators/Map/Haughton/Buttons.luau
Normal file
71
src/server/main/Elevators/Map/Haughton/Buttons.luau
Normal file
@@ -0,0 +1,71 @@
|
||||
--!optimize 2
|
||||
--!native
|
||||
--!strict
|
||||
|
||||
local ParentDir = script.Parent
|
||||
local MapDir = ParentDir.Parent
|
||||
local ElevatorDir = MapDir.Parent
|
||||
local MainDir = ElevatorDir.Parent
|
||||
local TagsModule = MainDir:WaitForChild("Map"):WaitForChild("Load"):WaitForChild("Tags")
|
||||
|
||||
local StorageService = game:GetService("ReplicatedStorage")
|
||||
|
||||
local Enums = require(StorageService:WaitForChild("Enums"))
|
||||
local ButtonTags = require(TagsModule:WaitForChild("Buttons"))
|
||||
local Tags = require(TagsModule)
|
||||
local ButtonManager = require(ElevatorDir:WaitForChild("ButtonManager"))
|
||||
|
||||
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
|
||||
type Impl_Constructor = {
|
||||
__index: Impl_Constructor,
|
||||
constructor: Constructor_Fun,
|
||||
--Class functions
|
||||
Hook: (self: ClassConstructor) -> ()
|
||||
}
|
||||
|
||||
type Constructor_Fun = (ElevatorModel: Enums.ElevatorValues, ButtonTags: Tags.ElevatorButtons, CurrentFloor: IntValue) -> ClassConstructor
|
||||
type Constructor_Return_Props = {
|
||||
ElevatorModel: Enums.ElevatorValues,
|
||||
ButtonTags: Tags.ElevatorButtons,
|
||||
CurrentFloor: IntValue
|
||||
}
|
||||
|
||||
local Buttons = {} :: Impl_Constructor
|
||||
Buttons.__index = Buttons
|
||||
|
||||
function Buttons.constructor(ElevatorModel, ButtonTags, CurrentFloor)
|
||||
return setmetatable({
|
||||
ElevatorModel = ElevatorModel,
|
||||
ButtonTags = ButtonTags,
|
||||
CurrentFloor = CurrentFloor,
|
||||
}, Buttons)
|
||||
end
|
||||
|
||||
local function CarButtonActivated(ButtonFloor: number | string)
|
||||
print("Activated", ButtonFloor)
|
||||
end
|
||||
|
||||
function Buttons:Hook()
|
||||
local ButtonManagerConstructor = ButtonManager.constructor(self.CurrentFloor)
|
||||
local ButtonTagsConstructor = ButtonTags.constructor(self.ButtonTags, self.ElevatorModel)
|
||||
local Prompt = ButtonTagsConstructor:CreatePromptButtons()
|
||||
|
||||
for ButtonID: string, ButtonInstance: Instance in self.ButtonTags do
|
||||
local CarButtonPrompts = Prompt[self.ElevatorModel].Car
|
||||
|
||||
for PromptType, PromptProperties in CarButtonPrompts do
|
||||
if PromptProperties.Attachment and PromptProperties.Inst and PromptProperties.Prompt then
|
||||
PromptProperties.Prompt.MaxActivationDistance = 2
|
||||
PromptProperties.Attachment.Position-=Vector3.new(.01,0,0)
|
||||
|
||||
ButtonManagerConstructor:CarButton(ButtonID, PromptProperties, CarButtonActivated, function(ButtonFloor: number | string)
|
||||
print("Fallback", ButtonFloor)
|
||||
end)
|
||||
else
|
||||
warn()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return Buttons
|
||||
@@ -11,25 +11,53 @@ local StorageService = game:GetService("ReplicatedStorage")
|
||||
local Types = MainDir:WaitForChild("Types")
|
||||
local Enums = require(StorageService:WaitForChild("Enums"))
|
||||
local ElevatorTypes = require(Types:WaitForChild("Elevator"))
|
||||
local SoundEnums = require(Types:WaitForChild("Enums"):WaitForChild("Sounds"))
|
||||
--local SoundEnums = require(Types:WaitForChild("Enums"):WaitForChild("Sounds"))
|
||||
|
||||
local HaughtonConfiguration = {} :: ElevatorTypes.ElevatorConfigurationTable
|
||||
HaughtonConfiguration.Name = Enums.Elevator.Haughton
|
||||
HaughtonConfiguration.FloorLevelingDistance = 4
|
||||
HaughtonConfiguration.FloorLevelingDistance = 6
|
||||
HaughtonConfiguration.FloorLeveling3PhaseDistance = 1.5
|
||||
HaughtonConfiguration.LevelingVelocity = 1
|
||||
HaughtonConfiguration.Phase3LevelingVelocity = 1
|
||||
HaughtonConfiguration.LevelingVelocity = .5
|
||||
HaughtonConfiguration.Phase3LevelingVelocity = .5
|
||||
HaughtonConfiguration.ParkedDistance = 0.2
|
||||
HaughtonConfiguration.Responsiveness = 5
|
||||
HaughtonConfiguration.MaxVelocity = 10
|
||||
HaughtonConfiguration.MaxVelocity = 7
|
||||
|
||||
HaughtonConfiguration.Functions = {
|
||||
ManualTravelStart = true
|
||||
}
|
||||
|
||||
HaughtonConfiguration.Colors = {
|
||||
ButtonActivated = Color3.fromRGB(180,0,0),
|
||||
ButtonDeactivated = Color3.fromRGB(139,139,139),
|
||||
LanternDisplayOn = Color3.fromRGB(44,255,157),
|
||||
LanternDisplayOff = Color3.fromRGB(255,29,101),
|
||||
ButtonActivated = {
|
||||
Color = Color3.fromRGB(162, 106, 76),
|
||||
Material = Enum.Material.Neon
|
||||
},
|
||||
ButtonDeactivated = {
|
||||
Color = Color3.fromRGB(136, 143, 145),
|
||||
Material = Enum.Material.SmoothPlastic
|
||||
},
|
||||
LanternIndicator = {
|
||||
On = {
|
||||
Up = {
|
||||
Color = Color3.fromRGB(44, 255, 157),
|
||||
Material = Enum.Material.Neon
|
||||
},
|
||||
Down = {
|
||||
Color = Color3.fromRGB(255, 29, 101),
|
||||
Material = Enum.Material.Neon
|
||||
},
|
||||
},
|
||||
Off = {
|
||||
Up = {
|
||||
Color = Color3.fromRGB(172, 174, 197),
|
||||
Material = Enum.Material.SmoothPlastic
|
||||
},
|
||||
Down = {
|
||||
Color = Color3.fromRGB(172, 174, 197),
|
||||
Material = Enum.Material.SmoothPlastic
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return HaughtonConfiguration
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
--!strict
|
||||
|
||||
return {
|
||||
[1] = 1.163,
|
||||
[1] = 1.163, --Basement
|
||||
[2] = 19.163,
|
||||
[3] = 37.507,
|
||||
[4] = 55.464,
|
||||
[5] = 73.383,
|
||||
[6] = 91.301,
|
||||
[7] = 109.243,
|
||||
[8] = 127.185,
|
||||
}
|
||||
|
||||
@@ -2,28 +2,127 @@
|
||||
--!native
|
||||
--!strict
|
||||
|
||||
local ParentDir = script.Parent
|
||||
local ElevatorsDir = ParentDir.Parent
|
||||
local MainDir = ElevatorsDir.Parent.Parent
|
||||
|
||||
local TagsModule = require(MainDir:WaitForChild("Map"):WaitForChild("Load"):WaitForChild("Tags"))
|
||||
|
||||
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
|
||||
type Impl_Constructor = {
|
||||
__index: Impl_Constructor,
|
||||
constructor: Constructor_Fun,
|
||||
--Class functions
|
||||
RotateRelayCogs: (self: ClassConstructor, InwardsDirection: boolean, SextetRow: boolean, Faulting: boolean, MagnetCog: BasePart, Cog2: BasePart, CounterWeight: BasePart, Row3_RelayDown: BasePart) -> Tween
|
||||
RotateRelayCogs1Async: (self: ClassConstructor) -> (),
|
||||
RotateRelayCogs2Async: (self: ClassConstructor) -> (),
|
||||
RotateRelayCogs3: (self: ClassConstructor) -> (),
|
||||
RotateRotodials: (self: ClassConstructor, Elevator_Y_Velocity: number) -> (),
|
||||
RotatePulleyWheel: (self: ClassConstructor, TravelingUpwards: boolean, Elevator_Y_Velocity: number) -> (),
|
||||
} & Impl_Static_Props
|
||||
|
||||
type Impl_Static_Props = {
|
||||
RotateRotodialsSensitivity: number,
|
||||
PulleyWheelRotationSensitivity: number
|
||||
}
|
||||
|
||||
type Constructor_Fun = () -> ClassConstructor
|
||||
type Constructor_Return_Props = {}
|
||||
type Constructor_Fun = (TagsConstructor: TagsModule.TagsConstructor) -> ClassConstructor
|
||||
type Constructor_Return_Props = {
|
||||
PulleyWheel: BasePart,
|
||||
Cog2_Row1: BasePart,
|
||||
Cog2_Row2: BasePart,
|
||||
Cog2_Row3: BasePart,
|
||||
Cog2_Row4: BasePart,
|
||||
Relay_Close: Sound,
|
||||
Relay_FullOpen: Sound,
|
||||
Relay_Open: Sound,
|
||||
MagnetCog_Row1: BasePart,
|
||||
MagnetCog_Row2: BasePart,
|
||||
MagnetCog_Row3: BasePart,
|
||||
MagnetCog_Row4: BasePart,
|
||||
Row1_CounterWeight: BasePart,
|
||||
Row1_Flash: PointLight,
|
||||
Row1_Relays: BasePart,
|
||||
Row2_CounterWeight: BasePart,
|
||||
Row2_Flash: PointLight,
|
||||
Row2_Relays: BasePart,
|
||||
Row3_CounterWeight: BasePart,
|
||||
Row3_RelayDown: BasePart,
|
||||
Row4_CounterWeight: BasePart,
|
||||
Row4_Flash: PointLight,
|
||||
Row4_Relays: BasePart,
|
||||
Rotodials: {Instance}
|
||||
}
|
||||
|
||||
local TS = game:GetService("TweenService")
|
||||
|
||||
local MovingObjects = {} :: Impl_Constructor
|
||||
MovingObjects.__index = MovingObjects
|
||||
|
||||
function MovingObjects.constructor()
|
||||
return setmetatable({}, MovingObjects)
|
||||
MovingObjects.RotateRotodialsSensitivity = 40
|
||||
MovingObjects.PulleyWheelRotationSensitivity = 2
|
||||
|
||||
function MovingObjects.constructor(TagsConstructor)
|
||||
local PulleyWheel = TagsConstructor:Request("Haughton_PulleyWheel") :: BasePart
|
||||
|
||||
local Cog2_Row1 = TagsConstructor:Request("Haughton_Cog2_Row1") :: BasePart
|
||||
local Cog2_Row2 = TagsConstructor:Request("Haughton_Cog2_Row2") :: BasePart
|
||||
local Cog2_Row3 = TagsConstructor:Request("Haughton_Cog2_Row3") :: BasePart
|
||||
local Cog2_Row4 = TagsConstructor:Request("Haughton_Cog2_Row4") :: BasePart
|
||||
|
||||
local Haughton_Relay_Close = TagsConstructor:Request("Haughton_Relay_Close") :: Sound
|
||||
local Haughton_Relay_FullOpen = TagsConstructor:Request("Haughton_Relay_FullOpen") :: Sound
|
||||
local Haughton_Relay_Open = TagsConstructor:Request("Haughton_Relay_Open") :: Sound
|
||||
|
||||
local MagnetCog_Row1 = TagsConstructor:Request("Haughton_MagnetCog_Row1") :: BasePart
|
||||
local MagnetCog_Row2 = TagsConstructor:Request("Haughton_MagnetCog_Row2") :: BasePart
|
||||
local MagnetCog_Row3 = TagsConstructor:Request("Haughton_MagnetCog_Row3") :: BasePart
|
||||
local MagnetCog_Row4 = TagsConstructor:Request("Haughton_MagnetCog_Row4") :: BasePart
|
||||
|
||||
local Row1_CounterWeight = TagsConstructor:Request("Haughton_Row1_CounterWeight") :: BasePart
|
||||
local Row1_Flash = TagsConstructor:Request("Haughton_Row1_Flash") :: PointLight
|
||||
local Row1_Relays = TagsConstructor:Request("Haughton_Row1_Relays") :: BasePart
|
||||
local Row2_CounterWeight = TagsConstructor:Request("Haughton_Row2_CounterWeight") :: BasePart
|
||||
local Row2_Flash = TagsConstructor:Request("Haughton_Row2_Flash") :: PointLight
|
||||
local Row2_Relays = TagsConstructor:Request("Haughton_Row2_Relays") :: BasePart
|
||||
local Row3_CounterWeight = TagsConstructor:Request("Haughton_Row3_CounterWeight") :: BasePart
|
||||
local Row3_RelayDown = TagsConstructor:Request("Haughton_Row3_Relay_Down") :: BasePart
|
||||
local Row4_CounterWeight = TagsConstructor:Request("Haughton_Row4_CounterWeight") :: BasePart
|
||||
local Row4_Flash = TagsConstructor:Request("Haughton_Row4_Flash") :: PointLight
|
||||
local Row4_Relays = TagsConstructor:Request("Haughton_Row4_Relays") :: BasePart
|
||||
|
||||
local Rotodials = TagsConstructor:Request("Haughton_Rotodial") :: {Instance}
|
||||
|
||||
return setmetatable({
|
||||
PulleyWheel = PulleyWheel,
|
||||
Cog2_Row1 = Cog2_Row1,
|
||||
Cog2_Row2 = Cog2_Row2,
|
||||
Cog2_Row3 = Cog2_Row3,
|
||||
Cog2_Row4 = Cog2_Row4,
|
||||
Relay_Close = Haughton_Relay_Close,
|
||||
Relay_FullOpen = Haughton_Relay_FullOpen,
|
||||
Relay_Open = Haughton_Relay_Open,
|
||||
MagnetCog_Row1 = MagnetCog_Row1,
|
||||
MagnetCog_Row2 = MagnetCog_Row2,
|
||||
MagnetCog_Row3 = MagnetCog_Row3,
|
||||
MagnetCog_Row4 = MagnetCog_Row4,
|
||||
Row1_CounterWeight = Row1_CounterWeight,
|
||||
Row1_Flash = Row1_Flash,
|
||||
Row1_Relays = Row1_Relays,
|
||||
Row2_CounterWeight = Row2_CounterWeight,
|
||||
Row2_Flash = Row2_Flash,
|
||||
Row2_Relays = Row2_Relays,
|
||||
Row3_CounterWeight = Row3_CounterWeight,
|
||||
Row3_RelayDown = Row3_RelayDown,
|
||||
Row4_CounterWeight = Row4_CounterWeight,
|
||||
Row4_Flash = Row4_Flash,
|
||||
Row4_Relays = Row4_Relays,
|
||||
Rotodials = Rotodials,
|
||||
}, MovingObjects)
|
||||
end
|
||||
|
||||
function MovingObjects:RotateRelayCogs(InwardsDirection, SextetRow, Faulting, MagnetCog, Cog2, CounterWeight, Row_Relays)
|
||||
local CogTweenInfo = TweenInfo.new(InwardsDirection and .25 or (Faulting and 5 or 3), InwardsDirection and Enum.EasingStyle.Quad or Enum.EasingStyle.Elastic)
|
||||
local function RotateRelayCogs(InwardsDirection: boolean, SextetRow: boolean, MagnetCog: BasePart, Cog2: BasePart, CounterWeight: BasePart, Row_Relays: BasePart): Tween
|
||||
local CogTweenInfo = TweenInfo.new(InwardsDirection and .105 or 3, InwardsDirection and Enum.EasingStyle.Quad or Enum.EasingStyle.Elastic)
|
||||
local LinearTween = TweenInfo.new(.105, Enum.EasingStyle.Linear)
|
||||
|
||||
local MagnetCogTween = TS:Create(MagnetCog, CogTweenInfo, {
|
||||
CFrame = MagnetCog.CFrame*CFrame.Angles(math.rad(InwardsDirection and -90 or 90), 0, 0)
|
||||
@@ -32,10 +131,10 @@ function MovingObjects:RotateRelayCogs(InwardsDirection, SextetRow, Faulting, Ma
|
||||
CFrame = Cog2.CFrame*CFrame.Angles(math.rad(InwardsDirection and 90 or -90), 0, 0)
|
||||
})
|
||||
|
||||
local CounterWeightTween = TS:Create(CounterWeight, TweenInfo.new(.105, Enum.EasingStyle.Linear), {
|
||||
Position = InwardsDirection and CounterWeight.Position+Vector3.new(0,.23,0) or CounterWeight.Position-Vector3.new(0,.23,0)
|
||||
local CounterWeightTween = TS:Create(CounterWeight, LinearTween, {
|
||||
Position = CounterWeight.Position+Vector3.new(0,InwardsDirection and .23 or -.23,0)
|
||||
})
|
||||
local RelaysTween = TS:Create(Row_Relays, TweenInfo.new(.105, Enum.EasingStyle.Linear), {
|
||||
local RelaysTween = TS:Create(Row_Relays, LinearTween, {
|
||||
CFrame = Row_Relays.CFrame*CFrame.Angles(0,0,math.rad(SextetRow and (InwardsDirection and 6 or -6) or InwardsDirection and -6 or 6))
|
||||
})
|
||||
|
||||
@@ -47,4 +146,49 @@ function MovingObjects:RotateRelayCogs(InwardsDirection, SextetRow, Faulting, Ma
|
||||
return MagnetCogTween
|
||||
end
|
||||
|
||||
local function ElectricalFlash(Flash: PointLight)
|
||||
Flash.Enabled = true
|
||||
task.delay(.07, function()
|
||||
Flash.Enabled = false
|
||||
end)
|
||||
end
|
||||
|
||||
function MovingObjects:RotateRelayCogs1Async()
|
||||
self.Relay_Close:Play()
|
||||
RotateRelayCogs(true, false, self.MagnetCog_Row3, self.Cog2_Row3, self.Row3_CounterWeight, self.Row3_RelayDown)
|
||||
task.wait(.30)
|
||||
RotateRelayCogs(true, false, self.MagnetCog_Row2, self.Cog2_Row2, self.Row2_CounterWeight, self.Row2_Relays)
|
||||
task.wait(.30)
|
||||
RotateRelayCogs(true, true, self.MagnetCog_Row4, self.Cog2_Row4, self.Row4_CounterWeight, self.Row4_Relays)
|
||||
end
|
||||
|
||||
function MovingObjects:RotateRelayCogs2Async()
|
||||
self.Relay_Open:Play()
|
||||
RotateRelayCogs(false, false, self.MagnetCog_Row2, self.Cog2_Row2, self.Row2_CounterWeight, self.Row2_Relays)
|
||||
ElectricalFlash(self.Row2_Flash)
|
||||
|
||||
RotateRelayCogs(true, true, self.MagnetCog_Row1, self.Cog2_Row1, self.Row1_CounterWeight, self.Row1_Relays)
|
||||
task.wait(.1)
|
||||
RotateRelayCogs(false, true,self.MagnetCog_Row4, self.Cog2_Row4, self.Row4_CounterWeight, self.Row4_Relays)
|
||||
ElectricalFlash(self.Row4_Flash)
|
||||
end
|
||||
|
||||
function MovingObjects:RotateRelayCogs3()
|
||||
RotateRelayCogs(false, true, self.MagnetCog_Row1, self.Cog2_Row1, self.Row1_CounterWeight, self.Row1_Relays)
|
||||
ElectricalFlash(self.Row1_Flash)
|
||||
|
||||
RotateRelayCogs(false, false, self.MagnetCog_Row3, self.Cog2_Row3, self.Row3_CounterWeight, self.Row3_RelayDown)
|
||||
self.Relay_FullOpen:Play()
|
||||
end
|
||||
|
||||
function MovingObjects:RotateRotodials(Elevator_Y_Velocity)
|
||||
for n: number = 1, #self.Rotodials do
|
||||
(self.Rotodials[n] :: BasePart).CFrame*=CFrame.Angles(math.rad(Elevator_Y_Velocity/MovingObjects.RotateRotodialsSensitivity),0,0)
|
||||
end
|
||||
end
|
||||
|
||||
function MovingObjects:RotatePulleyWheel(TravelingUpwards, Elevator_Y_Velocity)
|
||||
self.PulleyWheel.CFrame*=CFrame.Angles(math.rad((TravelingUpwards and -Elevator_Y_Velocity or Elevator_Y_Velocity)/MovingObjects.PulleyWheelRotationSensitivity),0,0)
|
||||
end
|
||||
|
||||
return MovingObjects
|
||||
@@ -6,103 +6,45 @@ local ParentDir = script.Parent
|
||||
local ElevatorsDir = ParentDir.Parent
|
||||
local MainDir = ElevatorsDir.Parent
|
||||
|
||||
local StorageService = game:GetService("ReplicatedStorage")
|
||||
|
||||
local Enums = require(StorageService:WaitForChild("Enums"))
|
||||
local InitElevator = require(ElevatorsDir:WaitForChild("System"))
|
||||
local Config = require(script:WaitForChild("Config"))
|
||||
local Buttons = require(script:WaitForChild("Buttons"))
|
||||
local Leveling = require(script:WaitForChild("Leveling"))
|
||||
local MovingObjects = require(script:WaitForChild("MovingObjects"))
|
||||
local TagsModule = require(MainDir:WaitForChild("Map"):WaitForChild("Load"):WaitForChild("Tags"))
|
||||
|
||||
local function ElectricalFlash(Flash: PointLight)
|
||||
Flash.Enabled = true
|
||||
task.delay(.07, function()
|
||||
Flash.Enabled = false
|
||||
end)
|
||||
end
|
||||
|
||||
return function(TagsConstructor: TagsModule.TagsConstructor, ButtonTags: TagsModule.ElevatorButtons, LanternTags: TagsModule.Lanterns, LandingDoorTags: TagsModule.LandingTags)
|
||||
|
||||
local ElevatorModel = TagsConstructor:Request("Elevator_Haughton") :: Model
|
||||
local ElevatorBoxModel = ElevatorModel:WaitForChild("Mover") :: BasePart
|
||||
|
||||
local MagnetCog_Row3 = TagsConstructor:Request("Haughton_MagnetCog_Row3") :: BasePart
|
||||
local Cog2_Row3 = TagsConstructor:Request("Haughton_Cog2_Row3") :: BasePart
|
||||
local Row3_CounterWeight = TagsConstructor:Request("Haughton_Row3_CounterWeight") :: BasePart
|
||||
local Row3_RelayDown = TagsConstructor:Request("Haughton_Row3_Relay_Down") :: BasePart
|
||||
|
||||
local Haughton_Relay_Close = TagsConstructor:Request("Haughton_Relay_Close") :: Sound
|
||||
local Haughton_Relay_Open = TagsConstructor:Request("Haughton_Relay_Open") :: Sound
|
||||
local Haughton_Relay_FullOpen = TagsConstructor:Request("Haughton_Relay_FullOpen") :: Sound
|
||||
|
||||
local MagnetCog_Row1 = TagsConstructor:Request("Haughton_MagnetCog_Row1") :: BasePart
|
||||
local Cog2_Row1 = TagsConstructor:Request("Haughton_Cog2_Row1") :: BasePart
|
||||
local Row1_CounterWeight = TagsConstructor:Request("Haughton_Row1_CounterWeight") :: BasePart
|
||||
local Row1_Relays = TagsConstructor:Request("Haughton_Row1_Relays") :: BasePart
|
||||
local Row1_Flash = TagsConstructor:Request("Haughton_Row1_Flash") :: PointLight
|
||||
|
||||
local MagnetCog_Row2 = TagsConstructor:Request("Haughton_MagnetCog_Row2") :: BasePart
|
||||
local Cog2_Row2 = TagsConstructor:Request("Haughton_Cog2_Row2") :: BasePart
|
||||
local Row2_CounterWeight = TagsConstructor:Request("Haughton_Row2_CounterWeight") :: BasePart
|
||||
local Row2_Relays = TagsConstructor:Request("Haughton_Row2_Relays") :: BasePart
|
||||
local Row2_Flash = TagsConstructor:Request("Haughton_Row2_Flash") :: PointLight
|
||||
|
||||
local MagnetCog_Row4 = TagsConstructor:Request("Haughton_MagnetCog_Row4") :: BasePart
|
||||
local Cog2_Row4 = TagsConstructor:Request("Haughton_Cog2_Row4") :: BasePart
|
||||
local Row4_CounterWeight = TagsConstructor:Request("Haughton_Row4_CounterWeight") :: BasePart
|
||||
local Row4_Relays = TagsConstructor:Request("Haughton_Row4_Relays") :: BasePart
|
||||
local Row4_Flash = TagsConstructor:Request("Haughton_Row4_Flash") :: PointLight
|
||||
|
||||
--sneaky Machine room stuff hehe
|
||||
local PulleyWheel = TagsConstructor:Request("Haughton_PulleyWheel") :: BasePart
|
||||
|
||||
local Elevator = InitElevator.constructor(ElevatorBoxModel, Config, Leveling)
|
||||
local MovingObjectsConstructor = MovingObjects.constructor()
|
||||
|
||||
task.wait(3)
|
||||
task.spawn(function()
|
||||
Elevator:RequestLevelAsync(2, Enums.ElevatorCallDirection.Down)
|
||||
end)
|
||||
local MovingObjectsConstructor = MovingObjects.constructor(TagsConstructor)
|
||||
local ButtonsConstructor = Buttons.constructor(Config.Name, ButtonTags, Elevator.Attributes.CurrentFloor)
|
||||
|
||||
Elevator.Events.Traveling:Connect(function(_DeltaTime: number, CabPosition: Vector3)
|
||||
local CabVelocity = ElevatorBoxModel:GetVelocityAtPosition(CabPosition)
|
||||
local Pulley_Y_Direction = (Elevator.Attributes.TravelingUpwards.Value and -CabVelocity.Y or CabVelocity.Y)
|
||||
local TravelingUpwards = Elevator.Attributes.TravelingUpwards.Value
|
||||
|
||||
PulleyWheel.CFrame*=CFrame.Angles(math.rad(Pulley_Y_Direction/2),0,0)
|
||||
MovingObjectsConstructor:RotatePulleyWheel(TravelingUpwards, CabVelocity.Y)
|
||||
MovingObjectsConstructor:RotateRotodials(CabVelocity.Y)
|
||||
end)
|
||||
|
||||
Elevator.Events.Progression:Connect(function(previousFloor: number, CurrentFloor: number, NextFloor: number)
|
||||
warn("previousFloor=",previousFloor,"CurrentFloor=", CurrentFloor, "NextFloor=",NextFloor)
|
||||
end)
|
||||
|
||||
Elevator.Events.Leveling:Connect(function()
|
||||
Haughton_Relay_Open:Play()
|
||||
MovingObjectsConstructor:RotateRelayCogs(false, false, false, MagnetCog_Row2, Cog2_Row2, Row2_CounterWeight, Row2_Relays)
|
||||
ElectricalFlash(Row2_Flash)
|
||||
|
||||
MovingObjectsConstructor:RotateRelayCogs(true, true, false, MagnetCog_Row1, Cog2_Row1, Row1_CounterWeight, Row1_Relays)
|
||||
task.wait(.1)
|
||||
MovingObjectsConstructor:RotateRelayCogs(false, true, false, MagnetCog_Row4, Cog2_Row4, Row4_CounterWeight, Row4_Relays)
|
||||
ElectricalFlash(Row4_Flash)
|
||||
MovingObjectsConstructor:RotateRelayCogs2Async()
|
||||
end)
|
||||
|
||||
Elevator.Events.Parked:Connect(function()
|
||||
MovingObjectsConstructor:RotateRelayCogs(false, true, false, MagnetCog_Row1, Cog2_Row1, Row1_CounterWeight, Row1_Relays)
|
||||
ElectricalFlash(Row1_Flash)
|
||||
|
||||
MovingObjectsConstructor:RotateRelayCogs(false, false, false, MagnetCog_Row3, Cog2_Row3, Row3_CounterWeight, Row3_RelayDown)
|
||||
Haughton_Relay_FullOpen:Play()
|
||||
MovingObjectsConstructor:RotateRelayCogs3()
|
||||
end)
|
||||
|
||||
Haughton_Relay_Close:Play()
|
||||
MovingObjectsConstructor:RotateRelayCogs(true, false, false, MagnetCog_Row3, Cog2_Row3, Row3_CounterWeight, Row3_RelayDown)
|
||||
task.wait(.30)
|
||||
MovingObjectsConstructor:RotateRelayCogs(true, false, false, MagnetCog_Row2, Cog2_Row2, Row2_CounterWeight, Row2_Relays).Completed:Once(function()
|
||||
MovingObjectsConstructor:RotateRelayCogs(true, true, true, MagnetCog_Row1, Cog2_Row1, Row1_CounterWeight, Row1_Relays)
|
||||
task.wait(.35)
|
||||
MovingObjectsConstructor:RotateRelayCogs(false, true, true, MagnetCog_Row1, Cog2_Row1, Row1_CounterWeight, Row1_Relays)
|
||||
end)
|
||||
task.wait(.30)
|
||||
MovingObjectsConstructor:RotateRelayCogs(true, true, false, MagnetCog_Row4, Cog2_Row4, Row4_CounterWeight, Row4_Relays)
|
||||
ButtonsConstructor:Hook()
|
||||
|
||||
Elevator:StartTraveling()
|
||||
-- MovingObjectsConstructor:RotateRelayCogs1Async()
|
||||
-- Elevator:StartTraveling()
|
||||
end
|
||||
|
||||
@@ -306,7 +306,7 @@ local function CabTraveling(self: ClassConstructor, deltaTime: number, LEVEL_VEC
|
||||
if ElevatorPosition.Y>=LEVEL_VEC3_Y_WRAP.Y-self.Elevator.Configuration.FloorLevelingDistance then
|
||||
if not Debounce.Leveling then
|
||||
self.Events.__eventInstances__.Leveling:Fire()
|
||||
SmoothVelocity(self, self.Elevator.Configuration.LevelingVelocity, .5)
|
||||
SmoothVelocity(self, self.Elevator.Configuration.LevelingVelocity, 1)
|
||||
Debounce.Leveling = true
|
||||
end
|
||||
|
||||
@@ -338,7 +338,7 @@ local function CabTraveling(self: ClassConstructor, deltaTime: number, LEVEL_VEC
|
||||
if ElevatorPosition.Y<=LEVEL_VEC3_Y_WRAP.Y+self.Elevator.Configuration.FloorLevelingDistance then
|
||||
if not Debounce.Leveling then
|
||||
self.Events.__eventInstances__.Leveling:Fire()
|
||||
SmoothVelocity(self, self.Elevator.Configuration.LevelingVelocity, .5)
|
||||
SmoothVelocity(self, self.Elevator.Configuration.LevelingVelocity, 1)
|
||||
Debounce.Leveling = true
|
||||
end
|
||||
|
||||
@@ -394,7 +394,7 @@ function Elevator:__TravelToFloorAsync(Level_Int, LEVEL_VEC3_Y_WRAP)
|
||||
--Set the elevator's AlignPosition to the floor Y vector
|
||||
self.Elevator.AlignPosition.Position = Vector3.new(self.Elevator.AlignPosition.Position.X, LEVEL_VEC3_Y_WRAP.Y, self.Elevator.AlignPosition.Position.Z)
|
||||
--Set the elevator's velocity
|
||||
SmoothVelocity(self, self.Elevator.Configuration.MaxVelocity, 10)
|
||||
SmoothVelocity(self, self.Elevator.Configuration.MaxVelocity, 3)
|
||||
end
|
||||
|
||||
function Elevator:RequestLevelAsync(RequestedLevel, Direction)
|
||||
|
||||
@@ -7,9 +7,10 @@
|
||||
type HideEditor = (a1: BasePart | Folder, a2: boolean) -> ()
|
||||
type LuaChangeableContainer = Script | LocalScript
|
||||
|
||||
local Players: Players = game:GetService("Players")
|
||||
local CS: CollectionService = game:GetService("CollectionService")
|
||||
local Storage: ReplicatedStorage = game:GetService("ReplicatedStorage")
|
||||
local Players = game:GetService("Players")
|
||||
local CS = game:GetService("CollectionService")
|
||||
local Storage = game:GetService("ReplicatedStorage")
|
||||
local RS = game:GetService("RunService")
|
||||
|
||||
local ServerStorage = Storage:WaitForChild("Server")
|
||||
|
||||
@@ -80,8 +81,10 @@ function StudioEntities.indexAll(enabled: boolean)
|
||||
end
|
||||
|
||||
if Item:IsA("BasePart") then
|
||||
Item.CanTouch = false --Do micro optimizations
|
||||
if not RS:IsStudio() then
|
||||
Item.Locked = true
|
||||
end
|
||||
Item.CanTouch = false --Do micro optimizations
|
||||
|
||||
--Security from exploiters
|
||||
if not Item.Anchored and table.find(CS:GetTags(Item), "ServerGuard_Physics") then
|
||||
|
||||
@@ -29,9 +29,8 @@ type Impl_Static_Props = {
|
||||
DefaultHoldDuration: number
|
||||
}
|
||||
|
||||
type Constructor_Fun = (TagsConstructor: TagsConstructor, ModelButtons: Tags.ElevatorButtons, ElevatorModel: Enums.ElevatorValues) -> ClassConstructor
|
||||
type Constructor_Fun = (ModelButtons: Tags.ElevatorButtons, ElevatorModel: Enums.ElevatorValues) -> ClassConstructor
|
||||
type Constructor_Return_Props = {
|
||||
Tags: TagsConstructor,
|
||||
ModelButtons: Tags.ElevatorButtons,
|
||||
ElevatorModel: Enums.ElevatorValues,
|
||||
Buttons: Tags.ButtonsTree
|
||||
@@ -45,9 +44,8 @@ ButtonsModule.__index = ButtonsModule
|
||||
ButtonsModule.DefaultMaxActivationDistance = 3
|
||||
ButtonsModule.DefaultHoldDuration = .30
|
||||
|
||||
function ButtonsModule.constructor(TagsConstructor, ModelButtons, ElevatorModel)
|
||||
function ButtonsModule.constructor(ModelButtons, ElevatorModel)
|
||||
return setmetatable({
|
||||
Tags = TagsConstructor,
|
||||
ModelButtons = ModelButtons,
|
||||
ElevatorModel = ElevatorModel,
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ type Impl_Constructor = {
|
||||
|
||||
type Impl_Static_Props = {
|
||||
Decoders: {
|
||||
CarTag: (FloorTag: string) -> number?,
|
||||
CarTag: (FloorTag: string) -> (number | string)?,
|
||||
HallTag: (FloorTag: string) -> number?
|
||||
}
|
||||
}
|
||||
@@ -154,8 +154,9 @@ Tags.__index = Tags
|
||||
|
||||
Tags.Decoders = {
|
||||
CarTag = function(FloorTag)
|
||||
local Match = FloorTag:match('%d+$')
|
||||
return Match and tonumber(Match)
|
||||
local Match = FloorTag:match('%w+$')
|
||||
|
||||
return Match and (tonumber(Match) or tostring(Match))
|
||||
end,
|
||||
|
||||
HallTag = function(FloorTag)
|
||||
@@ -369,7 +370,6 @@ function Tags:__Interactables()
|
||||
ptr.ColorDeactivated = LightAddress.ColorDeactivated
|
||||
ptr.ActivatedMaterial = LightAddress.ActivatedMaterial
|
||||
ptr.DeactivatedMaterial = LightAddress.DeactivatedMaterial
|
||||
|
||||
elseif InteractType == Enums.InteractType.Light then
|
||||
if type(Inst) == "table" then
|
||||
ptr.Lights = Inst
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
--!optimize 2
|
||||
--!native
|
||||
--!strict
|
||||
|
||||
local EnumsDir = script.Parent:WaitForChild("Enums")
|
||||
|
||||
local StorageService = game:GetService("ReplicatedStorage")
|
||||
@@ -5,6 +9,11 @@ local StorageService = game:GetService("ReplicatedStorage")
|
||||
local Enums = require(StorageService:WaitForChild("Enums"))
|
||||
local SoundEnums = require(EnumsDir:WaitForChild("Sounds"))
|
||||
|
||||
type ButtonProperties = {
|
||||
Color: Color3,
|
||||
Material: Enum.Material
|
||||
}
|
||||
|
||||
export type ElevatorConfigurationTable = {
|
||||
Name: Enums.ElevatorValues,
|
||||
Responsiveness: number,
|
||||
@@ -23,10 +32,18 @@ export type ElevatorConfigurationTable = {
|
||||
LanternChimeLanding: SoundEnums.ElevatorSoundValues,
|
||||
},
|
||||
Colors: {
|
||||
ButtonActivated: Color3,
|
||||
ButtonDeactivated: Color3,
|
||||
LanternDisplayOn: Color3,
|
||||
LanternDisplayOff: Color3,
|
||||
ButtonActivated: ButtonProperties,
|
||||
ButtonDeactivated: ButtonProperties,
|
||||
LanternIndicator: {
|
||||
On: {
|
||||
Up: ButtonProperties,
|
||||
Down: ButtonProperties
|
||||
},
|
||||
Off: {
|
||||
Up: ButtonProperties,
|
||||
Down: ButtonProperties
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user