Crazy door system

This commit is contained in:
2024-08-30 02:09:41 -04:00
parent 412901a60e
commit 399f9a8799
6 changed files with 183 additions and 93 deletions

View File

@@ -11,23 +11,24 @@ local StorageService = game:GetService("ReplicatedStorage")
local Types = MainDir:WaitForChild("Types") local Types = MainDir:WaitForChild("Types")
local Enums = require(StorageService:WaitForChild("Enums")) local Enums = require(StorageService:WaitForChild("Enums"))
local ElevatorTypes = require(Types:WaitForChild("Elevator")) local ElevatorTypes = require(Types:WaitForChild("Elevator"))
local DoorEnums = require(Types:WaitForChild("Enums"):WaitForChild("Doors"))
--local SoundEnums = require(Types:WaitForChild("Enums"):WaitForChild("Sounds")) --local SoundEnums = require(Types:WaitForChild("Enums"):WaitForChild("Sounds"))
local HaughtonConfiguration = {} :: ElevatorTypes.ElevatorConfigurationTable local ElevatorConfig = {} :: ElevatorTypes.ElevatorConfigurationTable
HaughtonConfiguration.Name = Enums.Elevator.Haughton ElevatorConfig.Name = Enums.Elevator.Haughton
HaughtonConfiguration.FloorLevelingDistance = 6 ElevatorConfig.FloorLevelingDistance = 6
HaughtonConfiguration.FloorLeveling3PhaseDistance = 1.5 ElevatorConfig.FloorLeveling3PhaseDistance = 1.5
HaughtonConfiguration.LevelingVelocity = .5 ElevatorConfig.LevelingVelocity = .5
HaughtonConfiguration.Phase3LevelingVelocity = .5 ElevatorConfig.Phase3LevelingVelocity = .5
HaughtonConfiguration.ParkedDistance = 0.2 ElevatorConfig.ParkedDistance = 0.2
HaughtonConfiguration.Responsiveness = 5 ElevatorConfig.Responsiveness = 5
HaughtonConfiguration.MaxVelocity = 7 ElevatorConfig.MaxVelocity = 7
HaughtonConfiguration.Functions = { ElevatorConfig.Functions = {
ManualTravelStart = true ManualTravelStart = true
} }
HaughtonConfiguration.Colors = { ElevatorConfig.Colors = {
ButtonActivated = { ButtonActivated = {
Color = Color3.fromRGB(162,106,76), Color = Color3.fromRGB(162,106,76),
Material = Enum.Material.Neon Material = Enum.Material.Neon
@@ -60,4 +61,20 @@ HaughtonConfiguration.Colors = {
} }
} }
return HaughtonConfiguration local DoorsConfig: ElevatorTypes.DoorsConfig = {
Cab = {
Type = DoorEnums.Door.DoubleSpeed,
Time = 4,
Goal = Vector3.new(4.027,0,0)
},
Landing = {
Type = DoorEnums.Door.SingleSpeed,
Time = 4,
Goal = Vector3.new(4.15,0,0)
}
}
return {
Elevator = ElevatorConfig,
Doors = DoorsConfig
}

View File

@@ -9,7 +9,10 @@ local MainDir = ElevatorsDir.Parent
local Storage = game:GetService("ReplicatedStorage") local Storage = game:GetService("ReplicatedStorage")
local RS = game:GetService("RunService") local RS = game:GetService("RunService")
local DoorEnums = require(MainDir:WaitForChild("Types"):WaitForChild("Enums"):WaitForChild("Doors")) local Types = MainDir:WaitForChild("Types")
local DoorEnums = require(Types:WaitForChild("Enums"):WaitForChild("Doors"))
local ElevatorEnums = require(Types:WaitForChild("Elevator"))
local Tags = require(MainDir:WaitForChild("Map"):WaitForChild("Load"):WaitForChild("Tags")) local Tags = require(MainDir:WaitForChild("Map"):WaitForChild("Load"):WaitForChild("Tags"))
local Algebra = require(Storage:WaitForChild("Algebra")) local Algebra = require(Storage:WaitForChild("Algebra"))
@@ -20,22 +23,18 @@ type Impl_Constructor = {
--Class functions --Class functions
OpenCabAsync: (self: ClassConstructor, ObjectSpaceDistance: Vector3) -> (), OpenCabAsync: (self: ClassConstructor, ObjectSpaceDistance: Vector3) -> (),
CloseCabAsync: (self: ClassConstructor, ObjectSpaceDistance: Vector3) -> (), CloseCabAsync: (self: ClassConstructor, ObjectSpaceDistance: Vector3) -> (),
OpenFloorAsync: (self: ClassConstructor, Floor: number, ObjectSpaceDistance: Vector3) -> (), OpenAtFloorAsync: (self: ClassConstructor, Floor: number) -> (),
CloseFloorAsync: (self: ClassConstructor, Floor: number, ObjectSpaceDistance: Vector3) -> (), CloseAtFloorAsync: (self: ClassConstructor, Floor: number) -> (),
} }
type LandingDoorsTree = {
[number]: {BasePart}
}
type CabDoorsTree = { type CabDoorsTree = {
[number]: {BasePart} [number]: {BasePart}
} }
type Constructor_Fun = ( type Constructor_Fun = (
DoorConfig: ElevatorEnums.DoorsConfig,
ElevatorBox: BasePart, ElevatorBox: BasePart,
CabDoorsType: DoorEnums.DoorEnumValues,
CabDoorsTree: {BasePart}, CabDoorsTree: {BasePart},
LandingDoorsType: DoorEnums.DoorEnumValues,
LandingDoorsTree: Tags.LandingTags LandingDoorsTree: Tags.LandingTags
) -> ClassConstructor ) -> ClassConstructor
@@ -45,124 +44,170 @@ type Attributes = {
} }
} }
type Events = {
}
type Constructor_Return_Props = { type Constructor_Return_Props = {
DoorConfig: ElevatorEnums.DoorsConfig,
ElevatorBox: BasePart, ElevatorBox: BasePart,
CabDoorsType: DoorEnums.DoorEnumValues,
CabDoorsTree: {BasePart}, CabDoorsTree: {BasePart},
LandingDoorsType: DoorEnums.DoorEnumValues,
LandingDoorsTree: Tags.LandingTags, LandingDoorsTree: Tags.LandingTags,
Attributes: Attributes Attributes: Attributes,
__Connections: {
DoorAnimationStep: RBXScriptConnection?
}
} }
local Doors = {} :: Impl_Constructor local Doors = {} :: Impl_Constructor
Doors.__index = Doors Doors.__index = Doors
function Doors.constructor(ElevatorBox, CabDoorsType, CabDoorsTree, LandingDoorsType, LandingDoorsTree) function Doors.constructor(DoorConfig, ElevatorBox, CabDoorsTree, LandingDoorsTree)
local HallOpen = Instance.new("BoolValue") :: BoolValue local HallOpen = Instance.new("BoolValue") :: BoolValue
HallOpen.Value = true HallOpen.Value = true
return setmetatable({ return setmetatable({
DoorConfig = DoorConfig,
ElevatorBox = ElevatorBox, ElevatorBox = ElevatorBox,
CabDoorsType = CabDoorsType,
CabDoorsTree = CabDoorsTree, CabDoorsTree = CabDoorsTree,
LandingDoorsType = LandingDoorsType,
LandingDoorsTree = LandingDoorsTree, LandingDoorsTree = LandingDoorsTree,
Attributes = { Attributes = {
Hall = { Hall = {
Open = HallOpen Open = HallOpen
} }
} },
__Connections = {}
}, Doors) }, Doors)
end end
type DoorAnimationCallback<T...> = (self: ClassConstructor, Alpha: number, Time: number, T...) -> () type DoorAnimationCallback<T...> = (self: ClassConstructor, Time: number, T...) -> ()
local function DoorAnimationAsync(self: ClassConstructor, Time: number, Callback: DoorAnimationCallback<()>) local function DoorAnimationRuntime(self: ClassConstructor, Time: number, Callback: DoorAnimationCallback<()>)
local Alpha = 0 if self.__Connections.DoorAnimationStep and self.__Connections.DoorAnimationStep.Connected then
local StartTime = os.clock() self.__Connections.DoorAnimationStep:Disconnect()
end
while RS.Stepped:Wait() do local StartTime = os.clock()
Alpha+=1e-3 self.__Connections.DoorAnimationStep = RS.Stepped:Connect(function(_delta: number, _dt: number)
local AnimationTime = Algebra.LinearElapse(StartTime, Time) local AnimationTime = Algebra.LinearElapse(StartTime, Time)
Callback(self, Alpha, AnimationTime) Callback(self, AnimationTime)
if AnimationTime>=1 then if AnimationTime>=1 then
break (self.__Connections.DoorAnimationStep :: RBXScriptConnection):Disconnect()
end
end end
end)
end end
--a<T> = ...T
type DoorAnimationsMap = { type DoorAnimationsMap = {
Cab: { Cab: {
[DoorEnums.DoorEnumValues]: DoorAnimationCallback<Vector3, Vector3?, Vector3?> SingleSpeed: DoorAnimationCallback<Vector3, Vector3, Vector3>,
DoubleSpeed: DoorAnimationCallback<Vector3, Vector3, Vector3, Vector3>,
TripleSpeed: DoorAnimationCallback<Vector3, Vector3, Vector3, Vector3, Vector3, Vector3>,
}, },
Floor: { Floor: {
[DoorEnums.DoorEnumValues]: DoorAnimationCallback<number, Vector3, Vector3> SingleSpeed: DoorAnimationCallback<number, Vector3, Vector3>,
DoubleSpeed: DoorAnimationCallback<number, Vector3, Vector3, Vector3>,
TripleSpeed: DoorAnimationCallback<number, Vector3, Vector3, Vector3, Vector3>,
} }
} }
local DoorAnimations: DoorAnimationsMap = { local DoorAnimations = {
Cab = {}, Cab = {},
Floor = {} Floor = {}
} } :: DoorAnimationsMap
DoorAnimations.Cab[DoorEnums.Door.SingleSpeed] = function(self, Alpha, AnimationTime, OpenFromVec1) --Cab doors--
function DoorAnimations.Cab.SingleSpeed(self, AnimationTime, Door1Position, OpenToVec1)
local ElevatorY = Vector3.new(0, self.ElevatorBox.Position.Y, 0) local ElevatorY = Vector3.new(0, self.ElevatorBox.Position.Y, 0)
local ElevatorDoor1_Goal = Vector3.new(OpenFromVec1.X, 0, OpenFromVec1.Z) local ElevatorDoor1_Goal = Vector3.new(OpenToVec1.X, 0, OpenToVec1.Z)
self.CabDoorsTree[1].Position = ElevatorY+self.CabDoorsTree[1].Position:Lerp(OpenFromVec1+ElevatorDoor1_Goal, Algebra.Easing.InOutQuart(AnimationTime)) self.CabDoorsTree[1].Position = ElevatorY+self.CabDoorsTree[1].Position:Lerp(OpenToVec1+ElevatorDoor1_Goal, Algebra.Easing.InOutQuart(AnimationTime))
end end
DoorAnimations.Cab[DoorEnums.Door.DoubleSpeed] = function(self, Alpha, AnimationTime, OpenFromVec1, OpenFromVec2) function DoorAnimations.Cab.DoubleSpeed(self, AnimationTime, Door1Position, Door2Position, OpenToVec1, OpenToVec2)
end end
DoorAnimations.Cab[DoorEnums.Door.TripleSpeed] = function(self, Alpha, AnimationTime, OpenFromVec1, OpenFromVec2, OpenFromVec3) function DoorAnimations.Cab.TripleSpeed(self, AnimationTime, Door1Position, Door2Position, Door3Position, OpenToVec1, OpenToVec2, OpenToVec3)
end end
----
DoorAnimations.Floor[DoorEnums.Door.SingleSpeed] = function(self, Alpha, AnimationTime, Floor, DoorPosition, OpenFromVec1) --Floor doors--
(self.LandingDoorsTree[Floor][1] :: BasePart).Position = DoorPosition:Lerp(OpenFromVec1, Algebra.Easing.OutQuad(AnimationTime)) function DoorAnimations.Floor.SingleSpeed(self, Floor, AnimationTime, Door1Position, OpenToVec1)
(self.LandingDoorsTree[Floor][1] :: BasePart).Position = Door1Position:Lerp(OpenToVec1, Algebra.Easing.OutQuad(AnimationTime))
end
---
--Goofy ahh function
local function OpenVecTuple(self: ClassConstructor, FloorWithDoors: Tags.LandingDoors, Opening: boolean, Type: DoorEnums.DoorEnumValues): ...Vector3?
if Type == DoorEnums.Door.SingleSpeed then
local P = (FloorWithDoors[1] :: BasePart).Position
return table.unpack({
P,
P+(Opening and -self.DoorConfig.Cab.Goal or self.DoorConfig.Cab.Goal)
})
elseif Type == DoorEnums.Door.DoubleSpeed then
local P = (FloorWithDoors[1] :: BasePart).Position
local P2 = (FloorWithDoors[2] :: BasePart).Position
return table.unpack({
P,
P2,
P+(Opening and -self.DoorConfig.Cab.Goal or self.DoorConfig.Cab.Goal),
(P2+(Opening and -self.DoorConfig.Cab.Goal or self.DoorConfig.Cab.Goal))/2
})
elseif Type == DoorEnums.Door.TripleSpeed then
--idk man
local P = (FloorWithDoors[1] :: BasePart).Position
local P2 = (FloorWithDoors[2] :: BasePart).Position
local P3 = (FloorWithDoors[3] :: BasePart).Position
return table.unpack({
P,
P2,
P3,
P+(Opening and -self.DoorConfig.Cab.Goal or self.DoorConfig.Cab.Goal),
(P2+(Opening and -self.DoorConfig.Cab.Goal or self.DoorConfig.Cab.Goal))/1.5,
(P3+(Opening and -self.DoorConfig.Cab.Goal or self.DoorConfig.Cab.Goal))/2,
})
end
return nil
end end
function Doors:OpenCabAsync(ObjectSpaceDistance) function Doors:OpenCabAsync(ObjectSpaceDistance)
local OpenFromVecTuple = self.CabDoorsTree[1].Position+ObjectSpaceDistance -- local OpenFromVecTuple = self.CabDoorsTree[1].Position+ObjectSpaceDistance
DoorAnimationAsync(self, 4, function(self, Alpha, Time) -- --local Open = OpenVecTuple(self, DoorEnums.DoorLocation.Cab)
DoorAnimations.Cab[self.CabDoorsType](self, Alpha, Time, OpenFromVecTuple)
end) -- DoorAnimationRuntime(self, self.DoorConfig.Cab.Time, function(self, AnimationTime)
-- DoorAnimations.Cab[self.DoorConfig.Cab.Type](self, AnimationTime, OpenFromVecTuple)
-- end)
end end
function Doors:CloseCabAsync(ObjectSpaceDistance) function Doors:CloseCabAsync(ObjectSpaceDistance)
local CloseFromVecTuple = self.CabDoorsTree[1].Position-ObjectSpaceDistance
DoorAnimationAsync(self, 4, function(self, Alpha, Time)
DoorAnimations.Cab[self.CabDoorsType](self, Alpha, Time, CloseFromVecTuple)
end)
end end
function Doors:CloseFloorAsync(Floor, ObjectSpaceDistance) --this module is built off my insanity
--this needs to be made custom for self.CabDoorsType local function ToggleFloorDoors(self: ClassConstructor, Floor: number, Opening: boolean)
local DoorFloor = self.LandingDoorsTree[Floor] local FloorWithDoors = self.LandingDoorsTree[Floor]
assert(DoorFloor) if FloorWithDoors then
local Door = DoorFloor[1] local OpenFromVecTuple = OpenVecTuple(self, FloorWithDoors, Opening, self.DoorConfig.Landing.Type)
assert(Door) assert(OpenFromVecTuple)
local DoorPosition = (Door :: BasePart).Position
local OpenFromVecTuple = DoorPosition+ObjectSpaceDistance DoorAnimationRuntime(self, self.DoorConfig.Landing.Time, function(self, AnimationTime)
DoorAnimationAsync(self, 4, function(self, Alpha, Time) DoorAnimations.Floor[self.DoorConfig.Landing.Type](self, Floor, AnimationTime, OpenFromVecTuple)
DoorAnimations.Floor[self.CabDoorsType](self, Alpha, Time, Floor, DoorPosition, OpenFromVecTuple)
end) end)
self.Attributes.Hall.Open.Value = false else
warn(`Could not open the door at floor: {Floor}, it does not exist in the landing doors tree.`)
end
end end
function Doors:OpenFloorAsync(Floor, ObjectSpaceDistance) function Doors:CloseAtFloorAsync(Floor)
--this needs to be made custom for self.CabDoorsType ToggleFloorDoors(self, Floor, false)
local DoorFloor = self.LandingDoorsTree[Floor] end
assert(DoorFloor)
local Door = DoorFloor[1] function Doors:OpenAtFloorAsync(Floor)
assert(Door) ToggleFloorDoors(self, Floor, true)
local DoorPosition = (Door :: BasePart).Position
local OpenFromVecTuple = DoorPosition-ObjectSpaceDistance
DoorAnimationAsync(self, 4, function(self, Alpha, Time)
DoorAnimations.Floor[self.CabDoorsType](self, Alpha, Time, Floor, DoorPosition, OpenFromVecTuple)
end)
self.Attributes.Hall.Open.Value = true
end end

View File

@@ -3,7 +3,6 @@
--!strict --!strict
local ButtonPromptsDistance = Vector3.new(-.05,0,0) local ButtonPromptsDistance = Vector3.new(-.05,0,0)
local HallDoorOffset = Vector3.new(4.15,0,0)
local ParentDir = script.Parent local ParentDir = script.Parent
local ElevatorsDir = ParentDir.Parent local ElevatorsDir = ParentDir.Parent
@@ -29,16 +28,16 @@ return function(TagsConstructor: TagsModule.TagsConstructor, ButtonTags: TagsMod
--TEMP --TEMP
local CabDoorsTree = {} :: {BasePart} local CabDoorsTree = {} :: {BasePart}
local Elevator = InitElevator.constructor(ElevatorBoxModel, Config, Leveling) local Elevator = InitElevator.constructor(ElevatorBoxModel, Config.Elevator, Leveling)
local MovingObjectsConstructor = MovingObjects.constructor(TagsConstructor) local MovingObjectsConstructor = MovingObjects.constructor(TagsConstructor)
local ButtonsConstructor = Buttons.constructor(Config.Name, ButtonTags, Elevator.Attributes.CurrentFloor) local ButtonsConstructor = Buttons.constructor(Config.Elevator.Name, ButtonTags, Elevator.Attributes.CurrentFloor)
ButtonsConstructor:InitForElevator(2, ButtonPromptsDistance) ButtonsConstructor:InitForElevator(2, ButtonPromptsDistance)
local TractionRopesConstructor = TractionRopes.constructor(CabRopesObject, PulleyRopesObject) local TractionRopesConstructor = TractionRopes.constructor(CabRopesObject, PulleyRopesObject)
local DoorsConstructor = Doors.constructor(ElevatorBoxModel, DoorEnums.Door.SingleSpeed, CabDoorsTree, DoorEnums.Door.SingleSpeed, LandingDoorTags) local DoorsConstructor = Doors.constructor(Config.Doors, ElevatorBoxModel, CabDoorsTree, LandingDoorTags)
local EventsConstructor = Events.constructor( local EventsConstructor = Events.constructor(
Elevator, Elevator,
Config, Config.Elevator,
ButtonsConstructor, ButtonsConstructor,
ElevatorBoxModel, ElevatorBoxModel,
Leveling, Leveling,
@@ -47,4 +46,6 @@ return function(TagsConstructor: TagsModule.TagsConstructor, ButtonTags: TagsMod
) )
EventsConstructor:InitButtons() EventsConstructor:InitButtons()
task.wait(2)
DoorsConstructor:CloseAtFloorAsync(1)
end end

View File

@@ -139,8 +139,10 @@ export type ExportedTags = {
[string]: TagProduct [string]: TagProduct
} }
export type LandingDoors = {Instance}
export type LandingTags = { export type LandingTags = {
[number]: {Instance} [number]: LandingDoors
} }
export type DoorTags = { export type DoorTags = {

View File

@@ -2,10 +2,13 @@
--!native --!native
--!strict --!strict
local EnumsDir = script.Parent:WaitForChild("Enums") local ParentDir = script.Parent
local EnumsDir = ParentDir:WaitForChild("Enums")
local StorageService = game:GetService("ReplicatedStorage") local StorageService = game:GetService("ReplicatedStorage")
local DoorEnums = require(EnumsDir:WaitForChild("Doors"))
local Enums = require(StorageService:WaitForChild("Enums")) local Enums = require(StorageService:WaitForChild("Enums"))
local SoundEnums = require(EnumsDir:WaitForChild("Sounds")) local SoundEnums = require(EnumsDir:WaitForChild("Sounds"))
@@ -49,4 +52,17 @@ export type ElevatorConfigurationTable = {
Colors: Colors, Colors: Colors,
} }
export type DoorsConfig = {
Cab: {
Type: DoorEnums.DoorEnumValues,
Time: number,
Goal: Vector3
},
Landing: {
Type: DoorEnums.DoorEnumValues,
Time: number,
Goal: Vector3
}
}
return nil return nil

View File

@@ -15,4 +15,13 @@ DoorEnums.Door = {
TripleSpeed = "TripleSpeed" :: TripleSpeed TripleSpeed = "TripleSpeed" :: TripleSpeed
} }
export type DoorLocationEnums = typeof(DoorEnums.Door)
export type Cab = "Cab"
export type Landing = "Landing"
export type DoorLocationValues = Cab | Landing
DoorEnums.DoorLocation = {
Cab = "Cab" :: Cab,
Landing = "Landing" :: Landing
}
return DoorEnums return DoorEnums