mirror of
https://github.com/unixtensor/Roblox-Elevator-Game.git
synced 2025-12-14 06:41:55 +00:00
Elevator doors can now open while the elevator is moving
This commit is contained in:
@@ -10,6 +10,7 @@ local RS = game:GetService("RunService")
|
|||||||
|
|
||||||
local Types = MainDir:WaitForChild("Types")
|
local Types = MainDir:WaitForChild("Types")
|
||||||
|
|
||||||
|
local GCSignal = require(Storage:WaitForChild("GCSignal"))
|
||||||
local DoorEnums = require(Types:WaitForChild("Enums"):WaitForChild("Doors"))
|
local DoorEnums = require(Types:WaitForChild("Enums"):WaitForChild("Doors"))
|
||||||
local ElevatorEnums = require(Types:WaitForChild("Elevator"))
|
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"))
|
||||||
@@ -22,20 +23,26 @@ type Impl_Constructor = {
|
|||||||
--Class functions
|
--Class functions
|
||||||
OpenCabAsync: (self: ClassConstructor) -> boolean,
|
OpenCabAsync: (self: ClassConstructor) -> boolean,
|
||||||
CloseCabAsync: (self: ClassConstructor) -> boolean,
|
CloseCabAsync: (self: ClassConstructor) -> boolean,
|
||||||
OpenAtFloorAsync: (self: ClassConstructor, Floor: number) -> boolean,
|
OpenAtFloor: (self: ClassConstructor, Floor: number) -> boolean,
|
||||||
CloseAtFloorAsync: (self: ClassConstructor, Floor: number) -> boolean,
|
CloseAtFloor: (self: ClassConstructor, Floor: number) -> boolean,
|
||||||
}
|
}
|
||||||
|
|
||||||
type Constructor_Fun = (
|
type Constructor_Fun = (
|
||||||
DoorConfig: ElevatorEnums.DoorsConfig,
|
LevelingFloors: {number},
|
||||||
ElevatorBox: BasePart,
|
ElevatorBox: BasePart,
|
||||||
|
DoorConfig: ElevatorEnums.DoorsConfig,
|
||||||
DoorsTree: Tags.LandingTags
|
DoorsTree: Tags.LandingTags
|
||||||
) -> ClassConstructor
|
) -> ClassConstructor
|
||||||
|
|
||||||
type Attributes = {
|
type Attributes = {
|
||||||
Hall: {
|
Hall: {
|
||||||
|
[number]: {
|
||||||
Open: BoolValue
|
Open: BoolValue
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
Cab: {
|
||||||
|
Open: BoolValue,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Constructor_Return_Props = {
|
type Constructor_Return_Props = {
|
||||||
@@ -45,46 +52,60 @@ type Constructor_Return_Props = {
|
|||||||
Attributes: Attributes,
|
Attributes: Attributes,
|
||||||
|
|
||||||
__Connections: {
|
__Connections: {
|
||||||
DoorAnimationStep: RBXScriptConnection?
|
Cab: RBXScriptConnection?,
|
||||||
|
Landing: RBXScriptConnection?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Signal = GCSignal.constructor
|
||||||
|
|
||||||
|
export type constructor = ClassConstructor
|
||||||
|
|
||||||
local Doors = {} :: Impl_Constructor
|
local Doors = {} :: Impl_Constructor
|
||||||
Doors.__index = Doors
|
Doors.__index = Doors
|
||||||
|
|
||||||
function Doors.constructor(DoorConfig, ElevatorBox, LandingDoorsTree)
|
function Doors.constructor(LevelingFloors, ElevatorBox, DoorConfig, LandingDoorsTree)
|
||||||
local HallOpen = Instance.new("BoolValue") :: BoolValue
|
local CabOpenAttribute = Instance.new("BoolValue") :: BoolValue
|
||||||
HallOpen.Value = true
|
local DoorAttributes = {
|
||||||
|
Hall = {},
|
||||||
|
Cab = {
|
||||||
|
Open = CabOpenAttribute
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for n: number = 1, #LevelingFloors do
|
||||||
|
DoorAttributes.Hall[n] = {
|
||||||
|
Open = Instance.new("BoolValue") :: BoolValue
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
return setmetatable({
|
return setmetatable({
|
||||||
DoorConfig = DoorConfig,
|
DoorConfig = DoorConfig,
|
||||||
ElevatorBox = ElevatorBox,
|
ElevatorBox = ElevatorBox,
|
||||||
DoorsTree = LandingDoorsTree,
|
DoorsTree = LandingDoorsTree,
|
||||||
|
Attributes = DoorAttributes,
|
||||||
Attributes = {
|
|
||||||
Hall = {
|
|
||||||
Open = HallOpen
|
|
||||||
}
|
|
||||||
},
|
|
||||||
__Connections = {}
|
__Connections = {}
|
||||||
}, Doors)
|
}, Doors)
|
||||||
end
|
end
|
||||||
|
|
||||||
type DoorAnimationCallback<T...> = (self: ClassConstructor, Time: number, T...) -> ()
|
type DoorAnimationCallback<T...> = (self: ClassConstructor, Time: number, T...) -> ()
|
||||||
local function DoorAnimationRuntime(self: ClassConstructor, Time: number, Callback: DoorAnimationCallback<()>)
|
local function DoorAnimationRuntime(self: ClassConstructor, Time: number, Type: DoorEnums.DoorLocationValues, Callback: DoorAnimationCallback<()>): Signal
|
||||||
if self.__Connections.DoorAnimationStep and self.__Connections.DoorAnimationStep.Connected then
|
if self.__Connections[Type] and self.__Connections[Type].Connected then
|
||||||
self.__Connections.DoorAnimationStep:Disconnect()
|
self.__Connections[Type]:Disconnect()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local Finished = GCSignal.constructor()
|
||||||
local StartTime = os.clock()
|
local StartTime = os.clock()
|
||||||
self.__Connections.DoorAnimationStep = RS.Stepped:Connect(function(_delta: number, _dt: number)
|
|
||||||
|
self.__Connections[Type] = RS.Stepped:Connect(function(_delta: number, _dt: number)
|
||||||
local AnimationTime = Algebra.LinearElapse(StartTime, Time)
|
local AnimationTime = Algebra.LinearElapse(StartTime, Time)
|
||||||
Callback(self, AnimationTime)
|
Callback(self, AnimationTime)
|
||||||
|
|
||||||
if AnimationTime>=1 then
|
if AnimationTime>=1 then
|
||||||
(self.__Connections.DoorAnimationStep :: RBXScriptConnection):Disconnect()
|
Finished:Fire();
|
||||||
|
(self.__Connections[Type] :: RBXScriptConnection):Disconnect()
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
return Finished
|
||||||
end
|
end
|
||||||
|
|
||||||
--a<T> = ...T
|
--a<T> = ...T
|
||||||
@@ -108,27 +129,29 @@ local DoorAnimations = {
|
|||||||
--Cab doors--
|
--Cab doors--
|
||||||
@native
|
@native
|
||||||
function DoorAnimations.Cab.SingleSpeed(self, AnimationTime, Door1Position, OpenToVec1)
|
function DoorAnimations.Cab.SingleSpeed(self, AnimationTime, Door1Position, OpenToVec1)
|
||||||
|
local CabDoor1 = self.DoorsTree.Cab[1] :: BasePart
|
||||||
|
|
||||||
local ElevatorY = Vector3.new(0, self.ElevatorBox.Position.Y, 0)
|
local ElevatorY = Vector3.new(0, self.ElevatorBox.Position.Y, 0)
|
||||||
local Door1XZ = Vector3.new(Door1Position.X, 0, Door1Position.Z)
|
local Door1XZ = Vector3.new(Door1Position.X, 0, Door1Position.Z)
|
||||||
local Door1Y = Vector3.new(0, Door1Position.Y-self.ElevatorBox.Position.Y, 0)
|
local Door1Y = Vector3.new(0, CabDoor1.Position.Y-self.ElevatorBox.Position.Y, 0)
|
||||||
local OpenToVec1XZ = Vector3.new(OpenToVec1.X, 0, OpenToVec1.Z)
|
local OpenToVec1XZ = Vector3.new(OpenToVec1.X, 0, OpenToVec1.Z)
|
||||||
local CabDoor1 = self.DoorsTree.Cab[1] :: BasePart
|
|
||||||
|
|
||||||
CabDoor1.Position = ElevatorY+Door1Y+Door1XZ:Lerp(Door1XZ+OpenToVec1XZ, Algebra.Easing.OutQuad(AnimationTime))
|
CabDoor1.Position = ElevatorY+Door1Y+Door1XZ:Lerp(Door1XZ+OpenToVec1XZ, Algebra.Easing.OutQuad(AnimationTime))
|
||||||
end
|
end
|
||||||
|
|
||||||
@native
|
@native
|
||||||
function DoorAnimations.Cab.DoubleSpeed(self, AnimationTime, Door1Position, Door2Position, OpenToVec1, OpenToVec2)
|
function DoorAnimations.Cab.DoubleSpeed(self, AnimationTime, Door1Position, Door2Position, OpenToVec1, OpenToVec2)
|
||||||
|
local CabDoor1 = self.DoorsTree.Cab[1] :: BasePart
|
||||||
|
local CabDoor2 = self.DoorsTree.Cab[2] :: BasePart
|
||||||
|
|
||||||
local AlgebraEasing = Algebra.Easing.OutQuad(AnimationTime)
|
local AlgebraEasing = Algebra.Easing.OutQuad(AnimationTime)
|
||||||
local ElevatorY = Vector3.new(0, self.ElevatorBox.Position.Y, 0)
|
local ElevatorY = Vector3.new(0, self.ElevatorBox.Position.Y, 0)
|
||||||
local Door1XZ = Vector3.new(Door1Position.X, 0, Door1Position.Z)
|
local Door1XZ = Vector3.new(Door1Position.X, 0, Door1Position.Z)
|
||||||
local Door2XZ = Vector3.new(Door2Position.X, 0, Door2Position.Z)
|
local Door2XZ = Vector3.new(Door2Position.X, 0, Door2Position.Z)
|
||||||
local Door1Y = Vector3.new(0, Door1Position.Y-self.ElevatorBox.Position.Y, 0)
|
local Door1Y = Vector3.new(0, CabDoor1.Position.Y-self.ElevatorBox.Position.Y, 0)
|
||||||
local Door2Y = Vector3.new(0, Door2Position.Y-self.ElevatorBox.Position.Y, 0)
|
local Door2Y = Vector3.new(0, CabDoor2.Position.Y-self.ElevatorBox.Position.Y, 0)
|
||||||
local OpenToVec1XZ = Vector3.new(OpenToVec1.X, 0, OpenToVec1.Z)
|
local OpenToVec1XZ = Vector3.new(OpenToVec1.X, 0, OpenToVec1.Z)
|
||||||
local OpenToVec2XZ = Vector3.new(OpenToVec2.X, 0, OpenToVec2.Z)
|
local OpenToVec2XZ = Vector3.new(OpenToVec2.X, 0, OpenToVec2.Z)
|
||||||
local CabDoor1 = self.DoorsTree.Cab[1] :: BasePart
|
|
||||||
local CabDoor2 = self.DoorsTree.Cab[2] :: BasePart
|
|
||||||
|
|
||||||
CabDoor1.Position = ElevatorY+Door1Y+Door1XZ:Lerp(Door1XZ+OpenToVec1XZ, AlgebraEasing)
|
CabDoor1.Position = ElevatorY+Door1Y+Door1XZ:Lerp(Door1XZ+OpenToVec1XZ, AlgebraEasing)
|
||||||
CabDoor2.Position = ElevatorY+Door2Y+Door2XZ:Lerp(Door2XZ+OpenToVec2XZ, AlgebraEasing)
|
CabDoor2.Position = ElevatorY+Door2Y+Door2XZ:Lerp(Door2XZ+OpenToVec2XZ, AlgebraEasing)
|
||||||
@@ -136,20 +159,21 @@ end
|
|||||||
|
|
||||||
@native
|
@native
|
||||||
function DoorAnimations.Cab.TripleSpeed(self, AnimationTime, Door1Position, Door2Position, Door3Position, OpenToVec1, OpenToVec2, OpenToVec3)
|
function DoorAnimations.Cab.TripleSpeed(self, AnimationTime, Door1Position, Door2Position, Door3Position, OpenToVec1, OpenToVec2, OpenToVec3)
|
||||||
|
local CabDoor1 = self.DoorsTree.Cab[1] :: BasePart
|
||||||
|
local CabDoor2 = self.DoorsTree.Cab[2] :: BasePart
|
||||||
|
local CabDoor3 = self.DoorsTree.Cab[3] :: BasePart
|
||||||
|
|
||||||
local AlgebraEasing = Algebra.Easing.OutQuad(AnimationTime)
|
local AlgebraEasing = Algebra.Easing.OutQuad(AnimationTime)
|
||||||
local ElevatorY = Vector3.new(0, self.ElevatorBox.Position.Y, 0)
|
local ElevatorY = Vector3.new(0, self.ElevatorBox.Position.Y, 0)
|
||||||
local Door1XZ = Vector3.new(Door1Position.X, 0, Door1Position.Z)
|
local Door1XZ = Vector3.new(Door1Position.X, 0, Door1Position.Z)
|
||||||
local Door2XZ = Vector3.new(Door2Position.X, 0, Door2Position.Z)
|
local Door2XZ = Vector3.new(Door2Position.X, 0, Door2Position.Z)
|
||||||
local Door3XZ = Vector3.new(Door3Position.X, 0, Door3Position.Z)
|
local Door3XZ = Vector3.new(Door3Position.X, 0, Door3Position.Z)
|
||||||
local Door1Y = Vector3.new(0, Door1Position.Y-self.ElevatorBox.Position.Y, 0)
|
local Door1Y = Vector3.new(0, CabDoor1.Position.Y-self.ElevatorBox.Position.Y, 0)
|
||||||
local Door2Y = Vector3.new(0, Door2Position.Y-self.ElevatorBox.Position.Y, 0)
|
local Door2Y = Vector3.new(0, CabDoor1.Position.Y-self.ElevatorBox.Position.Y, 0)
|
||||||
local Door3Y = Vector3.new(0, Door3Position.Y-self.ElevatorBox.Position.Y, 0)
|
local Door3Y = Vector3.new(0, CabDoor1.Position.Y-self.ElevatorBox.Position.Y, 0)
|
||||||
local OpenToVec1XZ = Vector3.new(OpenToVec1.X, 0, OpenToVec1.Z)
|
local OpenToVec1XZ = Vector3.new(OpenToVec1.X, 0, OpenToVec1.Z)
|
||||||
local OpenToVec2XZ = Vector3.new(OpenToVec2.X, 0, OpenToVec2.Z)
|
local OpenToVec2XZ = Vector3.new(OpenToVec2.X, 0, OpenToVec2.Z)
|
||||||
local OpenToVec3XZ = Vector3.new(OpenToVec3.X, 0, OpenToVec3.Z)
|
local OpenToVec3XZ = Vector3.new(OpenToVec3.X, 0, OpenToVec3.Z)
|
||||||
local CabDoor1 = self.DoorsTree.Cab[1] :: BasePart
|
|
||||||
local CabDoor2 = self.DoorsTree.Cab[2] :: BasePart
|
|
||||||
local CabDoor3 = self.DoorsTree.Cab[3] :: BasePart
|
|
||||||
|
|
||||||
CabDoor1.Position = ElevatorY+Door1Y+Door1XZ:Lerp(Door1XZ+OpenToVec1XZ, AlgebraEasing)
|
CabDoor1.Position = ElevatorY+Door1Y+Door1XZ:Lerp(Door1XZ+OpenToVec1XZ, AlgebraEasing)
|
||||||
CabDoor2.Position = ElevatorY+Door2Y+Door2XZ:Lerp(Door2XZ+OpenToVec2XZ, AlgebraEasing)
|
CabDoor2.Position = ElevatorY+Door2Y+Door2XZ:Lerp(Door2XZ+OpenToVec2XZ, AlgebraEasing)
|
||||||
@@ -160,7 +184,7 @@ end
|
|||||||
--Floor doors--
|
--Floor doors--
|
||||||
@native
|
@native
|
||||||
function DoorAnimations.Landing.SingleSpeed(self, Floor, AnimationTime, Door1Position, OpenToVec1)
|
function DoorAnimations.Landing.SingleSpeed(self, Floor, AnimationTime, Door1Position, OpenToVec1)
|
||||||
(self.DoorsTree.Hall[Floor][1] :: BasePart).Position = Door1Position:Lerp(OpenToVec1, Algebra.Easing.OutQuad(AnimationTime))
|
(self.DoorsTree.Hall[Floor][1] :: BasePart).Position = Door1Position:Lerp(Door1Position+OpenToVec1, Algebra.Easing.OutQuad(AnimationTime))
|
||||||
end
|
end
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -171,10 +195,11 @@ local function OpenVecTuple(self: ClassConstructor, Opening: boolean, Type: Door
|
|||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
local DoorsType: {Instance} = Type == DoorEnums.DoorLocation.Cab and self.DoorsTree.Cab or self.DoorsTree.Hall[HallFloor :: number]
|
local DoorsType: {Instance?}? = Type == DoorEnums.DoorLocation.Cab and self.DoorsTree.Cab or self.DoorsTree.Hall[HallFloor :: number]
|
||||||
local ConfType = Type == DoorEnums.DoorLocation.Cab and self.DoorConfig.Cab or self.DoorConfig.Landing
|
local ConfType = Type == DoorEnums.DoorLocation.Cab and self.DoorConfig.Cab or self.DoorConfig.Landing
|
||||||
|
|
||||||
if ConfType.Type == DoorEnums.Door.SingleSpeed then
|
if ConfType.Type == DoorEnums.Door.SingleSpeed then
|
||||||
|
if DoorsType and DoorsType[1] then
|
||||||
local P = (DoorsType[1] :: BasePart).Position
|
local P = (DoorsType[1] :: BasePart).Position
|
||||||
local Direction = Opening and -ConfType.Goal or ConfType.Goal
|
local Direction = Opening and -ConfType.Goal or ConfType.Goal
|
||||||
|
|
||||||
@@ -182,7 +207,9 @@ local function OpenVecTuple(self: ClassConstructor, Opening: boolean, Type: Door
|
|||||||
P,
|
P,
|
||||||
Direction
|
Direction
|
||||||
})
|
})
|
||||||
|
end
|
||||||
elseif ConfType.Type == DoorEnums.Door.DoubleSpeed then
|
elseif ConfType.Type == DoorEnums.Door.DoubleSpeed then
|
||||||
|
if DoorsType and DoorsType[1] and DoorsType[2] then
|
||||||
local P = (DoorsType[1] :: BasePart).Position
|
local P = (DoorsType[1] :: BasePart).Position
|
||||||
local P2 = (DoorsType[2] :: BasePart).Position
|
local P2 = (DoorsType[2] :: BasePart).Position
|
||||||
local Direction = Opening and -ConfType.Goal or ConfType.Goal
|
local Direction = Opening and -ConfType.Goal or ConfType.Goal
|
||||||
@@ -193,8 +220,10 @@ local function OpenVecTuple(self: ClassConstructor, Opening: boolean, Type: Door
|
|||||||
Direction,
|
Direction,
|
||||||
Direction/2
|
Direction/2
|
||||||
})
|
})
|
||||||
|
end
|
||||||
elseif ConfType.Type == DoorEnums.Door.TripleSpeed then
|
elseif ConfType.Type == DoorEnums.Door.TripleSpeed then
|
||||||
--idk man
|
--idk man
|
||||||
|
if DoorsType and DoorsType[1] and DoorsType[2] and DoorsType[3] then
|
||||||
local P = (DoorsType[1] :: BasePart).Position
|
local P = (DoorsType[1] :: BasePart).Position
|
||||||
local P2 = (DoorsType[2] :: BasePart).Position
|
local P2 = (DoorsType[2] :: BasePart).Position
|
||||||
local P3 = (DoorsType[3] :: BasePart).Position
|
local P3 = (DoorsType[3] :: BasePart).Position
|
||||||
@@ -209,6 +238,7 @@ local function OpenVecTuple(self: ClassConstructor, Opening: boolean, Type: Door
|
|||||||
Direction/2,
|
Direction/2,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
end
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -219,14 +249,20 @@ local function ToggleDoors(self: ClassConstructor, Type: DoorEnums.DoorLocationV
|
|||||||
local P1, P2, P3, P4, P5, P6 = OpenVecTuple(self, Opening, Type, Floor)
|
local P1, P2, P3, P4, P5, P6 = OpenVecTuple(self, Opening, Type, Floor)
|
||||||
if P1 then
|
if P1 then
|
||||||
if Type == DoorEnums.DoorLocation.Cab then
|
if Type == DoorEnums.DoorLocation.Cab then
|
||||||
DoorAnimationRuntime(self, Config.Time, function(self, AnimationTime)
|
local FinishedSignal = DoorAnimationRuntime(self, Config.Time, Type, function(self, AnimationTime)
|
||||||
DoorAnimations.Cab[Config.Type](self, AnimationTime, P1, P2, P3, P4, P5, P6)
|
DoorAnimations.Cab[Config.Type](self, AnimationTime, P1, P2, P3, P4, P5, P6)
|
||||||
end)
|
end)
|
||||||
|
FinishedSignal:Once(function(...)
|
||||||
|
self.Attributes.Cab.Open.Value = Opening
|
||||||
|
end)
|
||||||
return true
|
return true
|
||||||
elseif Type == DoorEnums.DoorLocation.Landing then
|
elseif Type == DoorEnums.DoorLocation.Landing then
|
||||||
DoorAnimationRuntime(self, Config.Time, function(self, AnimationTime)
|
local FinishedSignal = DoorAnimationRuntime(self, Config.Time, Type, function(self, AnimationTime)
|
||||||
DoorAnimations.Landing[Config.Type](self, Floor, AnimationTime, P1, P2, P3, P4, P5, P6)
|
DoorAnimations.Landing[Config.Type](self, Floor, AnimationTime, P1, P2, P3, P4, P5, P6)
|
||||||
end)
|
end)
|
||||||
|
FinishedSignal:Once(function(...)
|
||||||
|
self.Attributes.Hall[Floor :: number].Open.Value = Opening
|
||||||
|
end)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
@@ -238,19 +274,35 @@ local function ToggleDoors(self: ClassConstructor, Type: DoorEnums.DoorLocationV
|
|||||||
end
|
end
|
||||||
|
|
||||||
function Doors:OpenCabAsync()
|
function Doors:OpenCabAsync()
|
||||||
|
if self.Attributes.Cab.Open.Value then
|
||||||
|
warn("Elevator doors already open")
|
||||||
|
return false
|
||||||
|
end
|
||||||
return ToggleDoors(self, DoorEnums.DoorLocation.Cab, true)
|
return ToggleDoors(self, DoorEnums.DoorLocation.Cab, true)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Doors:CloseCabAsync()
|
function Doors:CloseCabAsync()
|
||||||
|
if not self.Attributes.Cab.Open.Value then
|
||||||
|
warn("Elevator doors already closed")
|
||||||
|
return false
|
||||||
|
end
|
||||||
return ToggleDoors(self, DoorEnums.DoorLocation.Cab, false)
|
return ToggleDoors(self, DoorEnums.DoorLocation.Cab, false)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Doors:CloseAtFloorAsync(Floor)
|
function Doors:OpenAtFloor(Floor)
|
||||||
return ToggleDoors(self, DoorEnums.DoorLocation.Landing, false, Floor)
|
if self.Attributes.Hall[Floor].Open.Value then
|
||||||
|
warn(`Elevator doors at floor "{Floor}" already open`)
|
||||||
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function Doors:OpenAtFloorAsync(Floor)
|
|
||||||
return ToggleDoors(self, DoorEnums.DoorLocation.Landing, true, Floor)
|
return ToggleDoors(self, DoorEnums.DoorLocation.Landing, true, Floor)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Doors:CloseAtFloor(Floor)
|
||||||
|
if not self.Attributes.Hall[Floor].Open.Value then
|
||||||
|
warn(`Elevator doors at floor "{Floor}" already closed`)
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
return ToggleDoors(self, DoorEnums.DoorLocation.Landing, false, Floor)
|
||||||
|
end
|
||||||
|
|
||||||
return Doors
|
return Doors
|
||||||
@@ -11,6 +11,7 @@ local StorageService = game:GetService("ReplicatedStorage")
|
|||||||
local Enums = require(StorageService:WaitForChild("Enums"))
|
local Enums = require(StorageService:WaitForChild("Enums"))
|
||||||
local InitElevator = require(ElevatorsDir:WaitForChild("System"))
|
local InitElevator = require(ElevatorsDir:WaitForChild("System"))
|
||||||
local Buttons = require(ElevatorDir:WaitForChild("Buttons"))
|
local Buttons = require(ElevatorDir:WaitForChild("Buttons"))
|
||||||
|
local Doors = require(ElevatorDir:WaitForChild("Doors"))
|
||||||
local TagsModule = require(MainDir:WaitForChild("Map"):WaitForChild("Load"):WaitForChild("Tags"))
|
local TagsModule = require(MainDir:WaitForChild("Map"):WaitForChild("Load"):WaitForChild("Tags"))
|
||||||
local ElevatorTypes = require(MainDir:WaitForChild("Types"):WaitForChild("Elevator"))
|
local ElevatorTypes = require(MainDir:WaitForChild("Types"):WaitForChild("Elevator"))
|
||||||
|
|
||||||
@@ -22,21 +23,28 @@ type Impl_Constructor = {
|
|||||||
Events: (self: ClassConstructor) -> ()
|
Events: (self: ClassConstructor) -> ()
|
||||||
}
|
}
|
||||||
|
|
||||||
type Constructor_Fun = (ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable, ElevatorConstructor: InitElevator.constructor, ButtonsConstructor: Buttons.constructor) -> ClassConstructor
|
type Constructor_Fun = (
|
||||||
|
ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable,
|
||||||
|
ElevatorConstructor: InitElevator.constructor,
|
||||||
|
DoorsConstructor: Doors.constructor,
|
||||||
|
ButtonsConstructor: Buttons.constructor
|
||||||
|
) -> ClassConstructor
|
||||||
|
|
||||||
type Constructor_Return_Props = {
|
type Constructor_Return_Props = {
|
||||||
ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable,
|
ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable,
|
||||||
ElevatorConstructor: InitElevator.constructor,
|
ElevatorConstructor: InitElevator.constructor,
|
||||||
|
DoorsConstructor: Doors.constructor,
|
||||||
ButtonsConstructor: Buttons.constructor
|
ButtonsConstructor: Buttons.constructor
|
||||||
}
|
}
|
||||||
|
|
||||||
local ButtonEvents = {} :: Impl_Constructor
|
local ButtonEvents = {} :: Impl_Constructor
|
||||||
ButtonEvents.__index = ButtonEvents
|
ButtonEvents.__index = ButtonEvents
|
||||||
|
|
||||||
function ButtonEvents.constructor(ElevatorConfig, ElevatorConstructor, ButtonsConstructor)
|
function ButtonEvents.constructor(ElevatorConfig, ElevatorConstructor, DoorsConstructor, ButtonsConstructor)
|
||||||
return setmetatable({
|
return setmetatable({
|
||||||
ElevatorConfig = ElevatorConfig,
|
ElevatorConfig = ElevatorConfig,
|
||||||
ElevatorConstructor = ElevatorConstructor,
|
ElevatorConstructor = ElevatorConstructor,
|
||||||
|
DoorsConstructor = DoorsConstructor,
|
||||||
ButtonsConstructor = ButtonsConstructor
|
ButtonsConstructor = ButtonsConstructor
|
||||||
}, ButtonEvents)
|
}, ButtonEvents)
|
||||||
end
|
end
|
||||||
@@ -79,6 +87,9 @@ function ButtonEvents:Events()
|
|||||||
end)
|
end)
|
||||||
self.ButtonsConstructor.Events.FloorButtonActivated:Connect(function(Success: boolean, Floor: number, Properties: TagsModule.ButtonProperties)
|
self.ButtonsConstructor.Events.FloorButtonActivated:Connect(function(Success: boolean, Floor: number, Properties: TagsModule.ButtonProperties)
|
||||||
if Success then
|
if Success then
|
||||||
|
if self.DoorsConstructor:CloseAtFloor(self.ElevatorConstructor.Attributes.CurrentFloor.Value) then
|
||||||
|
self.DoorsConstructor:CloseCabAsync()
|
||||||
|
end
|
||||||
local Direction = ElevatorGoingUpDirection(self.ElevatorConstructor.Attributes.CurrentFloor.Value, Floor) and Enums.ElevatorCallDirection.Up or Enums.ElevatorCallDirection.Down
|
local Direction = ElevatorGoingUpDirection(self.ElevatorConstructor.Attributes.CurrentFloor.Value, Floor) and Enums.ElevatorCallDirection.Up or Enums.ElevatorCallDirection.Down
|
||||||
self.ElevatorConstructor:RequestLevelAsync(Floor, Direction :: Enums.ElevatorCallDirectionValues)
|
self.ElevatorConstructor:RequestLevelAsync(Floor, Direction :: Enums.ElevatorCallDirectionValues)
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ local MainDir = ElevatorsDir.Parent
|
|||||||
|
|
||||||
local ButtonEvents = require(script:WaitForChild("Buttons"))
|
local ButtonEvents = require(script:WaitForChild("Buttons"))
|
||||||
local InitElevator = require(ElevatorsDir:WaitForChild("System"))
|
local InitElevator = require(ElevatorsDir:WaitForChild("System"))
|
||||||
|
local Doors = require(ParentDir:WaitForChild("Doors"))
|
||||||
local Buttons = require(ParentDir:WaitForChild("Buttons"))
|
local Buttons = require(ParentDir:WaitForChild("Buttons"))
|
||||||
local MovingObjects = require(ParentDir:WaitForChild("MovingObjects"))
|
local MovingObjects = require(ParentDir:WaitForChild("MovingObjects"))
|
||||||
local TractionRopes = require(ParentDir:WaitForChild("TractionRopes"))
|
local TractionRopes = require(ParentDir:WaitForChild("TractionRopes"))
|
||||||
@@ -23,6 +24,7 @@ type Impl_Constructor = {
|
|||||||
type Constructor_Fun = (
|
type Constructor_Fun = (
|
||||||
ElevatorConstructor: InitElevator.constructor,
|
ElevatorConstructor: InitElevator.constructor,
|
||||||
ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable,
|
ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable,
|
||||||
|
DoorsConstructor: Doors.constructor,
|
||||||
ButtonsConstructor: Buttons.constructor,
|
ButtonsConstructor: Buttons.constructor,
|
||||||
ElevatorBoxModel: BasePart,
|
ElevatorBoxModel: BasePart,
|
||||||
Leveling: {number},
|
Leveling: {number},
|
||||||
@@ -33,6 +35,7 @@ type Constructor_Fun = (
|
|||||||
type Constructor_Return_Props = {
|
type Constructor_Return_Props = {
|
||||||
ElevatorConstructor: InitElevator.constructor,
|
ElevatorConstructor: InitElevator.constructor,
|
||||||
ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable,
|
ElevatorConfig: ElevatorTypes.ElevatorConfigurationTable,
|
||||||
|
DoorsConstructor: Doors.constructor,
|
||||||
ButtonsConstructor: Buttons.constructor,
|
ButtonsConstructor: Buttons.constructor,
|
||||||
ElevatorBoxModel: BasePart,
|
ElevatorBoxModel: BasePart,
|
||||||
Leveling: {number},
|
Leveling: {number},
|
||||||
@@ -46,6 +49,7 @@ Events.__index = Events
|
|||||||
function Events.constructor(
|
function Events.constructor(
|
||||||
ElevatorConstructor,
|
ElevatorConstructor,
|
||||||
ElevatorConfig,
|
ElevatorConfig,
|
||||||
|
DoorsConstructor,
|
||||||
ButtonsConstructor,
|
ButtonsConstructor,
|
||||||
ElevatorBoxModel,
|
ElevatorBoxModel,
|
||||||
Leveling,
|
Leveling,
|
||||||
@@ -55,6 +59,7 @@ function Events.constructor(
|
|||||||
return setmetatable({
|
return setmetatable({
|
||||||
ElevatorConstructor = ElevatorConstructor,
|
ElevatorConstructor = ElevatorConstructor,
|
||||||
ElevatorConfig = ElevatorConfig,
|
ElevatorConfig = ElevatorConfig,
|
||||||
|
DoorsConstructor = DoorsConstructor,
|
||||||
ButtonsConstructor = ButtonsConstructor,
|
ButtonsConstructor = ButtonsConstructor,
|
||||||
ElevatorBoxModel = ElevatorBoxModel,
|
ElevatorBoxModel = ElevatorBoxModel,
|
||||||
Leveling = Leveling,
|
Leveling = Leveling,
|
||||||
@@ -78,12 +83,14 @@ local function ElevatorEvents(self: ClassConstructor)
|
|||||||
self.ElevatorConstructor.Events.Leveling:Connect(function()
|
self.ElevatorConstructor.Events.Leveling:Connect(function()
|
||||||
self.MovingObjectsConstructor:RotateRelayCogs2Async()
|
self.MovingObjectsConstructor:RotateRelayCogs2Async()
|
||||||
end)
|
end)
|
||||||
-- self.ElevatorConstructor.Events.Leveling3Phase:Connect(function()
|
self.ElevatorConstructor.Events.Leveling3Phase:Connect(function()
|
||||||
|
|
||||||
-- end)
|
end)
|
||||||
self.ElevatorConstructor.Events.ManualTravelRequested:Connect(function()
|
self.ElevatorConstructor.Events.ManualTravelRequested:Connect(function()
|
||||||
self.MovingObjectsConstructor:ControllerStartAsync()
|
self.MovingObjectsConstructor:ControllerStartAsync()
|
||||||
task.wait(1)
|
--temp
|
||||||
|
self.DoorsConstructor.Attributes.Cab.Open:GetPropertyChangedSignal("Value"):Wait()
|
||||||
|
|
||||||
self.MovingObjectsConstructor:RotateRelayCogs1Async().Completed:Wait()
|
self.MovingObjectsConstructor:RotateRelayCogs1Async().Completed:Wait()
|
||||||
self.ElevatorConstructor:StartTraveling()
|
self.ElevatorConstructor:StartTraveling()
|
||||||
end)
|
end)
|
||||||
@@ -91,6 +98,9 @@ local function ElevatorEvents(self: ClassConstructor)
|
|||||||
|
|
||||||
-- end)
|
-- end)
|
||||||
self.ElevatorConstructor.Events.Parked:Connect(function()
|
self.ElevatorConstructor.Events.Parked:Connect(function()
|
||||||
|
if self.DoorsConstructor:OpenAtFloor(self.ElevatorConstructor.Attributes.CurrentFloor.Value) then
|
||||||
|
self.DoorsConstructor:OpenCabAsync()
|
||||||
|
end
|
||||||
self.MovingObjectsConstructor:RotateRelayCogs3()
|
self.MovingObjectsConstructor:RotateRelayCogs3()
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
@@ -98,7 +108,7 @@ end
|
|||||||
function Events:InitButtons()
|
function Events:InitButtons()
|
||||||
ElevatorEvents(self)
|
ElevatorEvents(self)
|
||||||
|
|
||||||
local ButtonEventsConstructor = ButtonEvents.constructor(self.ElevatorConfig, self.ElevatorConstructor, self.ButtonsConstructor)
|
local ButtonEventsConstructor = ButtonEvents.constructor(self.ElevatorConfig, self.ElevatorConstructor, self.DoorsConstructor, self.ButtonsConstructor)
|
||||||
ButtonEventsConstructor:Events()
|
ButtonEventsConstructor:Events()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -29,10 +29,11 @@ return function(TagsConstructor: TagsModule.TagsConstructor, ButtonTags: TagsMod
|
|||||||
ButtonsConstructor:InitForElevator(2, ButtonPromptsDistance)
|
ButtonsConstructor:InitForElevator(2, ButtonPromptsDistance)
|
||||||
|
|
||||||
local TractionRopesConstructor = TractionRopes.constructor(CabRopesObject, PulleyRopesObject)
|
local TractionRopesConstructor = TractionRopes.constructor(CabRopesObject, PulleyRopesObject)
|
||||||
local DoorsConstructor = Doors.constructor(Config.Doors, ElevatorBoxModel, LandingDoorTags)
|
local DoorsConstructor = Doors.constructor(Leveling, ElevatorBoxModel, Config.Doors, LandingDoorTags)
|
||||||
local EventsConstructor = Events.constructor(
|
local EventsConstructor = Events.constructor(
|
||||||
Elevator,
|
Elevator,
|
||||||
Config.Elevator,
|
Config.Elevator,
|
||||||
|
DoorsConstructor,
|
||||||
ButtonsConstructor,
|
ButtonsConstructor,
|
||||||
ElevatorBoxModel,
|
ElevatorBoxModel,
|
||||||
Leveling,
|
Leveling,
|
||||||
@@ -40,9 +41,7 @@ return function(TagsConstructor: TagsModule.TagsConstructor, ButtonTags: TagsMod
|
|||||||
TractionRopesConstructor
|
TractionRopesConstructor
|
||||||
)
|
)
|
||||||
EventsConstructor:InitButtons()
|
EventsConstructor:InitButtons()
|
||||||
|
if DoorsConstructor:OpenAtFloor(Elevator.Attributes.CurrentFloor.Value) then
|
||||||
task.wait(2)
|
|
||||||
DoorsConstructor:OpenCabAsync()
|
DoorsConstructor:OpenCabAsync()
|
||||||
task.wait(5)
|
end
|
||||||
DoorsConstructor:CloseCabAsync()
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user