Proximity prompt and work on elevator

This commit is contained in:
2024-03-10 21:41:10 -04:00
parent 3e28667b13
commit df86e6efb6
15 changed files with 327 additions and 177 deletions

View File

@@ -2,36 +2,62 @@
--!native
--!strict
local Doors = {
Closed = true,
Sensors = true,
Door1Stopped_X = Vector3.xAxis*2.9,
Door2Stopped_X = Vector3.xAxis*5.8,
ElevatorDoorTime = 5,
ElevatorDoorStyle = Enum.EasingStyle.Quad,
__DontLeakMemory = nil
}
Doors.__index = Doors
local RS = game:GetService("RunService")
local Storage = game:GetService("ReplicatedStorage")
local RS: RunService = game:GetService("RunService")
local Storage: ReplicatedStorage = game:GetService("ReplicatedStorage")
local Tween = require(Storage:WaitForChild("Tween"))
local Tags = require(Storage:WaitForChild("Tags"))
local Floor10_Door1 = Tags.ElevatorDoor_1960_Floor10_1
local Floor10_Door2 = Tags.ElevatorDoor_1960_Floor10_2
type DoorSensors = {
[string]: Instance
[string]: BasePart
}
type CustomTween = Tween.TweenClass
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
type Impl_Constructor = {
__index: Impl_Constructor,
constructor: Constructor_Fun,
--Class functions
DetectSensorHit: (self: ClassConstructor, DoorTween1: Tween, DoorTween2: Tween) -> RBXScriptConnection,
Opening: (self: ClassConstructor, opening: boolean?) -> ()
} & Impl_Static_Props
type Constructor_Fun = (ElevatorBox: BasePart, ElevatorDoor1: BasePart, ElevatorDoor2: BasePart, ElevatorDoorSensor: Folder) -> ClassConstructor
type Impl_Static_Props = {
Closed: boolean,
Sensors: boolean,
Door1Stopped_X: Vector3,
Door2Stopped_X: Vector3,
ElevatorDoorTime: number,
ElevatorDoorStyle: Enum.EasingStyle,
__DontLeakMemory: RBXScriptConnection?
}
type Constructor_Return_Props = {
DoorTween1: CustomTween,
DoorTween2: CustomTween,
DoorSensor: DoorSensors,
ElevatorBox: BasePart,
ElevatorDoor1: BasePart,
ElevatorDoor2: BasePart,
DoorClosingClick: Sound
}
function Doors.constructor(ElevatorBox: BasePart, ElevatorDoor1: BasePart, ElevatorDoor2: BasePart, ElevatorDoorSensor: Folder)
local Doors = {} :: Impl_Constructor
Doors.__index = Doors
Doors.Closed = true
Doors.Sensors = true
Doors.Door1Stopped_X = Vector3.xAxis*2.9
Doors.Door2Stopped_X = Vector3.xAxis*5.8
Doors.ElevatorDoorTime = 5
Doors.ElevatorDoorStyle = Enum.EasingStyle.Quad
Doors.__DontLeakMemory = nil
function Doors.constructor(ElevatorBox, ElevatorDoor1, ElevatorDoor2, ElevatorDoorSensor)
local DoorTween1 = Tween.constructor(nil, ElevatorDoor1)
local DoorTween2 = Tween.constructor(nil, ElevatorDoor2)
local DoorSensor: DoorSensors = {
Start = ElevatorDoorSensor:WaitForChild("Start"),
End = ElevatorDoorSensor:WaitForChild("End")
Start = ElevatorDoorSensor:WaitForChild("Start") :: BasePart,
End = ElevatorDoorSensor:WaitForChild("End") :: BasePart
}
local DoorClosingClick = Instance.new("Sound") :: Sound
@@ -40,12 +66,12 @@ function Doors.constructor(ElevatorBox: BasePart, ElevatorDoor1: BasePart, Eleva
DoorClosingClick.Parent = ElevatorDoor2
return setmetatable({
DoorTween1 = DoorTween1,
DoorTween2 = DoorTween2,
DoorSensor = DoorSensor,
ElevatorBox = ElevatorBox,
ElevatorDoor1 = ElevatorDoor1,
ElevatorDoor2 = ElevatorDoor2,
DoorTween1 = DoorTween1,
DoorTween2 = DoorTween2,
DoorSensor = DoorSensor,
ElevatorBox = ElevatorBox,
ElevatorDoor1 = ElevatorDoor1,
ElevatorDoor2 = ElevatorDoor2,
DoorClosingClick = DoorClosingClick
}, Doors)
end
@@ -81,7 +107,7 @@ local function DoorsAnimationFloor(floor: number, opening: boolean?, activated_v
return Door1Tween_Floor, Door2Tween_Floor
end
local function DoorsAnimation(self, opening: boolean?, activated_via_censor: boolean?)
local function DoorsAnimation(self: ClassConstructor, opening: boolean?, activated_via_censor: boolean?)
self.ElevatorBox.Anchored = true
local ElevatorDoor1_P: Vector3 = self.ElevatorDoor1.Position
@@ -101,14 +127,14 @@ local function DoorsAnimation(self, opening: boolean?, activated_via_censor: boo
end
end
local Door1Tween: Tween = self.DoorTween1:Start(nil, {
local Door1Tween = self.DoorTween1:Start(nil, {
Position = opening and init_closed_door1 or init_opened_door1
}, TweenInfo.new(
TweenTime,
activated_via_censor and Enum.EasingStyle.Linear or Doors.ElevatorDoorStyle,
Enum.EasingDirection.InOut
))
local Door2Tween: Tween = self.DoorTween2:Start(nil, {
local Door2Tween = self.DoorTween2:Start(nil, {
Position = opening and init_closed_door2 or init_opened_door2
}, TweenInfo.new(
TweenTime,
@@ -145,15 +171,12 @@ for n: number = 1, #workspace_items do
end
end
type this = any --yeah,
type PossibleStepConnection = any
function Doors:DetectSensorHit(DoorTween1, DoorTween2): RBXScriptSignal
local Step: PossibleStepConnection = nil
function Doors:DetectSensorHit(DoorTween1, DoorTween2)
local Step = nil
if Doors.Sensors and Doors.Closed then
raycastParams.FilterDescendantsInstances = {self.ElevatorBox, table.unpack(RayIgnoring)}
Step = (RS :: RunService).Stepped:Connect(function(_delta, _dt)
Step = RS.Heartbeat:ConnectParallel(function(_dt)
local DoorSensor = workspace:Raycast(self.DoorSensor.Start.Position, self.DoorSensor.End.Position, raycastParams)
if DoorSensor and DoorSensor.Instance and DoorSensor.Instance:IsA("BasePart") then
@@ -161,7 +184,7 @@ function Doors:DetectSensorHit(DoorTween1, DoorTween2): RBXScriptSignal
DoorTween1:Pause()
DoorTween2:Pause()
task.wait(1) --elevators irl have this delay
DoorsAnimation((self :: this), true, true)
DoorsAnimation(self, true, true)
-- DoorTween1:Destroy()
-- DoorTween2:Destroy()
end
@@ -170,7 +193,7 @@ function Doors:DetectSensorHit(DoorTween1, DoorTween2): RBXScriptSignal
return Step
end
function Doors:Opening(opening: boolean?)
function Doors:Opening(opening)
--short circuiting central
if opening then
if Doors.Closed then

View File

@@ -0,0 +1,18 @@
--!optimize 2
--!native
--!strict
local Leveling: {[number]: number} = {
[1] = 13.031,
[2] = 0,
[3] = 0,
[4] = 0,
[5] = 0,
[6] = 0,
[7] = 0,
[8] = 0,
[9] = 0,
[10] = 239.245
}
return Leveling

View File

@@ -0,0 +1,87 @@
--!optimize 2
--!native
--!strict
local Elevators = script.Parent
local RS: ReplicatedStorage = game:GetService("ReplicatedStorage")
local TagsModule = require(RS:WaitForChild("Tags"))
local Leveling = require(script:WaitForChild("Leveling"))
local Doors = require(script:WaitForChild("Doors"))
local ElevatorMover = require(Elevators:WaitForChild("Mover"))
type Tags = TagsModule.ExportedTags
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
type Impl_Constructor = {
__index: Impl_Constructor,
constructor: Constructor_Fun,
--Class functions
MoveFloors: (self: ClassConstructor, Level: number) -> (),
GoToLevel: (self: ClassConstructor, RequestedLevel: number) -> ()
}
type Constructor_Fun = (Tags: Tags) -> ClassConstructor
type Constructor_Return_Props = {
ElevatorBox_1960: BasePart,
ElevatorBox: BasePart,
ElevatorDoor1: BasePart,
ElevatorDoor2: BasePart,
ElevatorDoorSensor: Folder,
ProximityButtons: {Instance},
BoxAttachment: Attachment,
BoxAlignPosition: AlignPosition,
BoxAlignOrientation: AlignOrientation,
ElevatorDoors: BasePart,
}
local Otis1960 = {} :: Impl_Constructor
Otis1960.__index = Otis1960
local function PromptButtons(self: Constructor_Return_Props)
for i: number = 1, #self.ProximityButtons do
local Button = self.ProximityButtons[i]
local Attachment = Instance.new("Attachment") :: Attachment
Attachment.Parent = Button
local Prompt = Instance.new("ProximityPrompt") :: ProximityPrompt
Prompt.MaxActivationDistance = 3
Prompt.Parent = Attachment
print(`Created a ProximityPrompt @ "{Button:GetFullName()}"`)
end
end
function Otis1960.constructor(Tags)
local self = {} :: Constructor_Return_Props
self.ElevatorBox_1960 = Tags.ElevatorMover_1960 :: BasePart
self.ElevatorBox = Tags.ElevatorMover_1960 :: BasePart
self.ElevatorDoor1 = Tags.ElevatorDoor_1960_1 :: BasePart
self.ElevatorDoor2 = Tags.ElevatorDoor_1960_2 :: BasePart
self.ElevatorDoorSensor = Tags.ElevatorDoor_Sensor_1960 :: Folder
self.ProximityButtons = Tags.ProximityElevatorButton :: {Instance}
self.BoxAttachment, self.BoxAlignPosition, self.BoxAlignOrientation = ElevatorMover(self.ElevatorBox_1960, self.ElevatorBox_1960.Position)
self.ElevatorDoors = Doors.constructor(self.ElevatorBox, self.ElevatorDoor1, self.ElevatorDoor2, self.ElevatorDoorSensor)
PromptButtons(self)
print("Otis1960 initialized and ready")
return setmetatable(self, Otis1960)
end
function Otis1960:MoveFloors(Level)
local ElevatorBoxCurrentPos = self.ElevatorBox.Position
--Its gonna use raycasting inside of the shaft to detect when its near and when to stop
self.BoxAlignPosition.Position = Vector3.new(ElevatorBoxCurrentPos.X, Level, ElevatorBoxCurrentPos.Z)
end
function Otis1960:GoToLevel(RequestedLevel)
local level: number = Leveling[RequestedLevel]
if level then
self:MoveFloors(level)
end
end
return Otis1960

View File

@@ -1,54 +0,0 @@
--!optimize 2
--!native
--!strict
local Otis1960_main = {}
Otis1960_main.__index = Otis1960_main
local Elevator = script.Parent
local Elevators = Elevator.Parent
local RS = game:GetService("ReplicatedStorage")
local TagsModule = require(RS:WaitForChild("Tags"))
local Leveling = require(Elevators:WaitForChild("Leveling"))
local Doors = require(Elevator:WaitForChild("Doors"))
local ElevatorMover = require(Elevators:WaitForChild("Mover"))
local Tags = TagsModule.constructor().Exports
local ElevatorBox_1960 = Tags.ElevatorMover_1960
local ElevatorBox = Tags.ElevatorMover_1960 :: BasePart
local ElevatorDoor1 = Tags.ElevatorDoor_1960_1 :: BasePart
local ElevatorDoor2 = Tags.ElevatorDoor_1960_2 :: BasePart
local ElevatorDoorSensor = Tags.ElevatorDoor_Sensor_1960 :: Folder
local ElevatorBoxStartPos = ElevatorBox_1960.Position
local _BoxAttachment, BoxAlignPosition, _BoxAlignOrientation = ElevatorMover(ElevatorBox_1960, ElevatorBoxStartPos)
local ElevatorDoors = Doors.constructor(ElevatorBox, ElevatorDoor1, ElevatorDoor2, ElevatorDoorSensor)
local function MoveFloors(level: number)
local ElevatorBoxCurrentPos = ElevatorBox.Position
--Its gonna use raycasting inside of the shaft to detect when its near and when to stop
BoxAlignPosition.Position = Vector3.new(ElevatorBoxCurrentPos.X, level, ElevatorBoxCurrentPos.Z)
end
local function GoTo_Level(requested_level: number)
local level: number = Leveling[requested_level]
if level then
MoveFloors(level)
end
end
print("[DEBUG]: Tags:",Tags)
-- while true do
-- task.wait(2)
-- ElevatorDoors:Opening(true)
-- task.wait(2)
-- ElevatorDoors:Opening(false)
-- end
return Otis1960_main