yahya01Join Date: 2012-12-16 Post Count: 406 |
Theres no error in scripts, it better too look at model and have understanding but here:
FIRST SCRIPT:
print("Teknikk Gen4 V2.1 Multi API")
Floor = script.Parent.Floor
Motor = script.Parent.Motor
Car = script.Parent.Car
IgnoreSensor = false
DoorState = "Closed"
DoorStateRear = "Closed"
DoorSpeed = 0
DoorL = 43
DoorC = 0.05
DoorP = 0
DoorPR = 0
DoorTimer = 5
NudgeTimer = 30
DoorOpenTime = 0
DoorNudge = false
DoorTimerReset = false
DoorTimerResetRear = false
ConfigMode = false
EngineAPI = "B" -- DO NOT CHANGE TO CFRAME UNLESS YOU WANT IT MESSED UP
EngineDynamicSpeed = false
if EngineAPI == "C" then
MotorStartSpeed = 0.15
MotorStopSpeed = 0.1
MotorSpeed = 0.2
LevelOffset = 2.5
elseif EngineAPI == "B" then
BP = Car.Platform.BodyPosition
BV = Car.Platform.BodyVelocity
MotorStartSpeed = 0.05
MotorStopSpeed = 0.05
MotorSpeed = 7 -- Change this to adjust the Movement speed
LevelOffset = 5
end
local MoveDirection = "None"
local TargetFloor = 0
local TotalFloors = 0
local CallQuene = {}
local FireLock = false
local Alarm = false
local Moving = false
local Busy = false
local Locked = false
local Fire = false
local Light = true
local OpenWhenIdle = false
local Chime = true
local FloorPassChime = true
local ClassicLevel = false
local CardLock = true
local DoorSensors = true
local DoorSensorHold = true
local CardNumber = {
[0]=0,
[301]=3,
[302]=3,
[303]=3,
[304]=3,
[305]=3,
[306]=3,
[307]=3,
[401]=4,
[402]=4,
[403]=4,
[404]=4,
[405]=4,
[406]=4,
[407]=4
}
local UnlockedFloor = 9001
local LockedFloors = {}
local LightLock = {"Player1","Heisteknikk"}
local CarCF = {}
local TCar = script.Parent.Car
local TFloors = script.Parent.Floors
local TFloorsG = script.Parent.Floors:GetChildren()
local TCarG = script.Parent.Car:GetChildren()
local TDoorL = script.Parent.Car.DoorLeft:GetChildren()
local TDoorR = script.Parent.Car.DoorRight:GetChildren()
local TDoorLR = script.Parent.Car.DoorLeftRear:GetChildren()
local TDoorRR = script.Parent.Car.DoorRightRear:GetChildren()
for i1=1,#TCarG do
table.insert(CarCF,TCarG[i1])
end
for i2=1,#TDoorL do
table.insert(CarCF,TDoorL[i2])
end
for i3=1,#TDoorR do
table.insert(CarCF,TDoorR[i3])
end
for i4=1,#TDoorLR do
table.insert(CarCF,TDoorL[i4])
end
for i5=1,#TDoorRR do
table.insert(CarCF,TDoorR[i5])
end
local BtnULit = "http://www.roblox.com/asset/?id=146686839"
local BtnLit = "http://www.roblox.com/asset/?id=146686848"
local IndDirUp = "http://www.roblox.com/asset/?id=66704336"
local IndDirDown = "http://www.roblox.com/asset/?id=66704345"
local IndDirULit = "http://www.roblox.com/asset/?id=66704228"
local DirIndLit = "http://www.roblox.com/asset/?id=130007738"
local DirIndULit = "http://www.roblox.com/asset/?id=130007740"
function ProcessCall(xFloor, xDest)
if Busy == false and xFloor ~= xDest then
if xDest > xFloor then
script.Parent.TFloor.Value = xDest
Start("Up",xDest)
end
if xDest < xFloor then
script.Parent.TFloor.Value = xDest
Start("Down",xDest)
end
end
end
function Start(xDirection,xDest)
Busy = true
Car.Platform.Motor.Pitch = 0
Car.Platform.Motor:Play()
if DoorState ~= "Closed" or DoorStateRear ~= "Closed" then
repeat
wait()
print("Door 1: "..DoorState.."; Door 2: "..DoorStateRear)
until DoorState == "Closed" and DoorStateRear == "Closed"
end
Moving = true
if EngineAPI == "B" and EngineDynamicSpeed then
print("Calculating Dynamic Speed...")
local GetDist = (TFloors:FindFirstChild("Floor"..xDest).Level.Position.Y - Car.Platform.Position.Y)
print("Calculated Speed")
print(math.abs(GetDist/50*28))
MotorSpeed = math.abs(GetDist/50*28)
end
if EngineAPI == "B" then
BP.P = 0
BP.D = 0
BV.P = 5000
Car.Platform.Anchored = false
end
coroutine.resume(coroutine.create(function()
for i=0, 0.6, 0.05 do
Car.Platform.Motor.Pitch = i
wait(0.1)
end
end))
if xDirection == "Up" then
script.Parent.Direction.Value = "U"
MoveDirection = "Up"
CallDirection = "Up"
Motor.Value = 0.000001
script.StartMotor.Value = true
if EngineAPI == "C" then
for i = 0.02, MotorSpeed, 0.02 do
Motor.Value = i
wait(MotorStartSpeed)
end
end
if EngineAPI == "B" then
for i = 0, MotorSpeed, 1 do
Motor.Value = i
wait(MotorStartSpeed)
end
end
end
if xDirection == "Down" then
script.Parent.Direction.Value = "D"
MoveDirection = "Down"
CallDirection = "Down"
Motor.Value = -0.000001
script.StartMotor.Value = true
if EngineAPI == "C" then
for i = 0, MotorSpeed, 0.02 do
Motor.Value = -i
wait(MotorStartSpeed)
end
end
if EngineAPI == "B" then
for i = 0, MotorSpeed, 1 do
Motor.Value = -i
wait(MotorStartSpeed)
end
end
end
end
function Stop(TF)
local HaveAStop = false
for i=1, #CallQuene do
if CallQuene[i] == TF then
HaveAStop = true
end
end
if HaveAStop then
script.Parent.Direction.Value = "N"
Btn(TF,0)
if EngineAPI == "C" then
if MoveDirection == "Up" then
for i = MotorSpeed, 0, -0.05 do
Motor.Value = i
wait(MotorStopSpeed)
end
end
if MoveDirection == "Down" then
for i = MotorSpeed, 0, -0.05 do
Motor.Value = -i
wait(MotorStopSpeed)
end
end
end
coroutine.resume(coroutine.create(function()
for i=0.5, 0.1, -0.05 do
Car.Platform.Motor.Pitch = i
wait(0.1)
end
end))
if EngineAPI == "B" then
local FYpos = TFloors:FindFirstChild("Floor"..TF).Level.Position.Y
BP.position = Vector3.new(Car.Platform.BodyPosition.position.X,FYpos,Car.Platform.BodyPosition.position.Z)
BP.P = 10000
BP.D = 4000
BV.P = 0
BV.velocity = Vector3.new(0,0,0)
end
local Dir = MoveDirection
Quene(TF,"Remove")
if Floor.Value == TotalFloors then
MoveDirection = "Down"
end
if Floor.Value == 1 then
MoveDirection = "Up"
end
Moving = false
if ClassicLevel and EngineAPI == "C" then
DoorRun(1)
end
repeat
if EngineAPI == "C" then
for i, v in ipairs(CarCF) do
if v:IsA("Part") or v:IsA("WedgePart") or v:IsA("CornerWedgePart") then
if v:FindFirstChild("Reverse")~=nil then
if Dir == "Up" then
v.CFrame = v.CFrame * CFrame.new(0, -0.01, 0)
else
v.CFrame = v.CFrame * CFrame.new(0, 0.01, 0)
end
else
if Dir == "Up" then
v.CFrame = v.CFrame * CFrame.new(0, 0.01, 0)
else
v.CFrame = v.CFrame * CFrame.new(0, -0.01, 0)
end
end
elseif v:IsA("Model") then
local z = v:GetChildren()
for a, s in ipairs(z) do
if v:IsA("Part") or v:IsA("WedgePart") or v:IsA("CornerWedgePart") then
if v:FindFirstChild("Reverse")~=nil then
if Dir == "Up" then
s.CFrame = s.CFrame * CFrame.new(0, -0.01, 0)
else
s.CFrame = s.CFrame * CFrame.new(0, 0.01, 0)
end
else
if Dir == "Up" then
s.CFrame = s.CFrame * CFrame.new(0, 0.01, 0)
else
s.CFrame = s.CFrame * CFrame.new(0, -0.01, 0)
end
end
end
end
end
end
end
wait()
until math.abs(TFloors:FindFirstChild("Floor"..TF).Level.Position.Y - Car.Platform.Position.Y) < 0.1
Car.Platform.Motor:Stop()
wait(0.5)
Motor.Value = 0
if EngineAPI == "B" then
Car.Platform.Anchored = true
wait(0.5)
end
TargetFloor = 0
script.Parent.TargetFloor.Value = 0
if not ClassicLevel or EngineAPI == "B" then
DoorRun(1)
end
print("Waiting 5 before Reset")
Busy = false
wait(5)
Quene(0,"Check")
--local Number = nil
--repeat Number = math.random(1,4) until Number ~= Floor.Value
--script.Parent.ScriptCall.Value = Number
end
end
function DoorRun(xm)
if Debug then print("DoorRun("..xm..") executed") end
if xm == 1 then
if DoorState == "Closed" then
coroutine.resume(coroutine.create(function() DoorOpen(Floor.Value,false) end))
end
if DoorStateRear == "Closed" then
coroutine.resume(coroutine.create(function() RearDoorOpen(Floor.Value,false) end)) -- REAR DOOR
end
end
if xm == 2 then
if DoorState == "Open" then
coroutine.resume(coroutine.create(function() DoorClose(Floor.Value) end))-- MAIN DOOR
end
if DoorStateRear == "Open" then
coroutine.resume(coroutine.create(function() RearDoorClose(Floor.Value) end)) -- REAR DOOR
end
end
if xm == 3 then
if DoorState == "Closing" then
coroutine.resume(coroutine.create(function() DoorReOpen(Floor.Value,true) end))-- MAIN DOOR
end
if DoorStateRear == "Closing" then
coroutine.resume(coroutine.create(function() RearDoorReOpen(Floor.Value,true) end))-- MAIN DOOR
end
end
end
function DoorOpen(F,ReOpen)
if F ~= Floor.Value and Moving == true then return end -- IF NOT OF FLOOR DO NOT Open
if DoorNudge == true then return end -- NO OPEN ON NUDGE
if DoorState == "Closed" then -- open when closed and reopen if closing
if TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorLeft") == nil then print("No Main Door detected") return end
DoorState = "Opening"
local DoorCarLeft = Car.DoorLeft:GetChildren()
local DoorCarRight = Car.DoorRight:GetChildren()
local DoorFloorLeft = TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorLeft"):GetChildren()
local DoorFloorRight = TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorRight"):GetChildren()
if EngineAPI == "B" then
for C1 = 1, #DoorCarLeft do DoorCarLeft[C1].Anchored = true end
for C2 = 1, #DoorCarRight do DoorCarRight[C2].Anchored = true end
end
for i=DoorP, DoorL do
DoorP = DoorP + 1
for R=1, #DoorFloorRight do
DoorFloorRight[R].CFrame = DoorFloorRight[R].CFrame * CFrame.new(DoorC, 0, 0)
end
for L=1, #DoorFloorLeft do
DoorFloorLeft[L].CFrame = DoorFloorLeft[L].CFrame * CFrame.new(-DoorC, 0, 0)
end
for CR=1, #DoorCarRight do
DoorCarRight[CR].CFrame = DoorCarRight[CR].CFrame * CFrame.new(DoorC, 0, 0)
end
for CL=1, #DoorCarLeft do
DoorCarLeft[CL].CFrame = DoorCarLeft[CL].CFrame * CFrame.new(-DoorC, 0, 0)
end
wait(DoorSpeed)
end
if DoorState == "CancelReopen" then DoorState = "OkReopen" return end
DoorState = "Open"
SetCarDirInd(1)
SetFloorDirInd(1)
if ChimeAfterDoor then coroutine.resume(coroutine.create(function() DoChime() end)) end
-- CREATE DOOR TIMER
coroutine.resume(coroutine.create(function()
local CTime = 0
repeat
wait(1)
CTime = CTime + 1
if DoorTimerReset == true then
print("Timer reset due to sensor touched or Open clicked")
CTime = 0
DoorTimerReset = false
end
until CTime > DoorTimer or DoorState ~= "Open"
if CTime > DoorTimer then
DoorClose(Floor.Value)
elseif DoorState ~= "Open" then
print("Door was closed before timer ended :)")
end
end))
DoorCheck() -- NUDGE TIMER
end
end
function DoorReOpen(F)
if F ~= Floor.Value and Moving == true then return end -- IF NOT OF FLOOR DO NOT Open
if DoorNudge == true then return end -- NO OPEN ON NUDGE
if DoorState == "Closing" and DoorNudge == false then -- open when closed and reopen if closing
if TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorLeft") == nil then print("No Main Door detected") return end
DoorState = "CancelReopen"
repeat wait() until DoorState == "OkReopen"
wait(0.2)
DoorState = "Opening"
local DoorCarLeft = Car.DoorLeft:GetChildren()
local DoorCarRight = Car.DoorRight:GetChildren()
local DoorFloorLeft = TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorLeft"):GetChildren()
local DoorFloorRight = TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorRight"):GetChildren()
if EngineAPI == "B" then
for C1 = 1, #DoorCarLeft do DoorCarLeft[C1].Anchored = true end
for C2 = 1, #DoorCarRight do DoorCarRight[C2].Anchored = true end
end
for i=DoorP, DoorL do
DoorP = DoorP + 1
for R=1, #DoorFloorRight do
DoorFloorRight[R].CFrame = DoorFloorRight[R].CFrame * CFrame.new(DoorC, 0, 0)
end
for L=1, #DoorFloorLeft do
DoorFloorLeft[L].CFrame = DoorFloorLeft[L].CFrame * CFrame.new(-DoorC, 0, 0)
end
for CR=1, #DoorCarRight do
DoorCarRight[CR].CFrame = DoorCarRight[CR].CFrame * CFrame.new(DoorC, 0, 0)
end
for CL=1, #DoorCarLeft do
DoorCarLeft[CL].CFrame = DoorCarLeft[CL].CFrame * CFrame.new(-DoorC, 0, 0)
end
wait(DoorSpeed)
end
if DoorState == "CancelReopen" then DoorState = "OkReopen" print("Grr, need to reopen...") return end
DoorState = "Open"
SetCarDirInd(1)
SetFloorDirInd(1)
if ChimeAfterDoor then coroutine.resume(coroutine.create(function() DoChime() end)) end
-- CREATE DOOR TIMER
coroutine.resume(coroutine.create(function()
local CTime = 0
repeat
wait(1)
CTime = CTime + 1
if DoorTimerReset == true or DoorHold == true then
print("Timer reset due to sensor touched or Open clicked")
CTime = 0
DoorTimerReset = false
end
until CTime > DoorTimer or DoorState ~= "Open"
if CTime > DoorTimer then
DoorClose(Floor.Value)
elseif DoorState ~= "Open" then
print("Door was closed before timer ended :)")
end
end))
DoorCheck() -- NUDGE TIMER
end
end
function DoorClose(F,Nudge)
if DoorHold == true then return end
if F ~= Floor.Value and Moving == true then return end -- IF NOT OF FLOOR DO NOT Open
if Floor.Value == 1 and FireLock then return end
if DoorState == "Open" or DoorState ~= "Closed" and DoorState == "Opening" and Nudge == true then
if TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorLeft") == nil then print("No Main Door detected") return end
if Nudge == true then
DoorNudge = true
coroutine.resume(coroutine.create(function()
while DoorState ~= "Closed" do
Car.Platform.Chime:Play()
wait(0.3)
end
end))
end
repeat wait() until DoorState == "Open"
SetCarDirInd(0)
SetFloorDirInd(0)
DoorState = "Closing"
local DoorCarLeft = Car.DoorLeft:GetChildren()
local DoorCarRight = Car.DoorRight:GetChildren()
local DoorFloorLeft = TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorLeft"):GetChildren()
local DoorFloorRight = TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorRight"):GetChildren()
for i=0, DoorL do
if DoorState == "CancelReopen" then DoorState = "OkReopen" return end
DoorP = DoorP - 1
for R=1, #DoorFloorRight do
DoorFloorRight[R].CFrame = DoorFloorRight[R].CFrame * CFrame.new(-DoorC, 0, 0)
end
for L=1, #DoorFloorLeft do
DoorFloorLeft[L].CFrame = DoorFloorLeft[L].CFrame * CFrame.new(DoorC, 0, 0)
end
for CR=1, #DoorCarRight do
DoorCarRight[CR].CFrame = DoorCarRight[CR].CFrame * CFrame.new(-DoorC, 0, 0)
end
for CL=1, #DoorCarLeft do
DoorCarLeft[CL].CFrame = DoorCarLeft[CL].CFrame * CFrame.new(DoorC, 0, 0)
end
if Nudge == true then
wait(0.1)
else
wait(DoorSpeed)
end
end
if DoorState == "CancelReopen" then DoorState = "OkReopen" return end
if DoorState == "Closing" then
if Nudge == true then DoorNudge = false end
if EngineAPI == "B" then
for C1 = 1, #DoorCarLeft do DoorCarLeft[C1].Anchored = false end
for C2 = 1, #DoorCarRight do DoorCarRight[C2].Anchored = false end
end
DoorState = "Closed"
Quene(0,"Check")
end
end
end
function RearDoorOpen(F,ReOpen)
if F ~= Floor.Value and Moving == true then return end -- IF NOT OF FLOOR DO NOT Open
if DoorNudge == true then return end -- NO OPEN ON NUDGE
if DoorStateRear == "Closed" then -- open when closed and reopen if closing
if TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorLeftRear") == nil then print("No Rear Door detected") return end
DoorStateRear = "Opening"
local DoorCarLeftRear = Car.DoorLeftRear:GetChildren()
local DoorCarRightRear = Car.DoorRightRear:GetChildren()
local DoorFloorLeftRear = TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorLeftRear"):GetChildren()
local DoorFloorRightRear = TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorRightRear"):GetChildren()
if EngineAPI == "B" then
for C1 = 1, #DoorCarLeftRear do DoorCarLeftRear[C1].Anchored = true end
for C2 = 1, #DoorCarRightRear do DoorCarRightRear[C2].Anchored = true end
end
for i=DoorPR, DoorL do
DoorPR = DoorPR + 1
for R=1, #DoorFloorRightRear do
DoorFloorRightRear[R].CFrame = DoorFloorRightRear[R].CFrame * CFrame.new(DoorC, 0, 0)
end
for L=1, #DoorFloorLeftRear do
DoorFloorLeftRear[L].CFrame = DoorFloorLeftRear[L].CFrame * CFrame.new(-DoorC, 0, 0)
end
for CR=1, #DoorCarRightRear do
DoorCarRightRear[CR].CFrame = DoorCarRightRear[CR].CFrame * CFrame.new(DoorC, 0, 0)
end
for CL=1, #DoorCarLeftRear do
DoorCarLeftRear[CL].CFrame = DoorCarLeftRear[CL].CFrame * CFrame.new(-DoorC, 0, 0)
end
wait(DoorSpeed)
end
if DoorStateRear == "CancelReopen" then DoorStateRear = "OkReopen" return end
DoorStateRear = "Open"
SetCarDirInd(1,true)
SetFloorDirInd(1)
if ChimeAfterDoor then coroutine.resume(coroutine.create(function() DoChime() end)) end
-- CREATE DOOR TIMER
coroutine.resume(coroutine.create(function()
local CTimeRear = 0
repeat
wait(1)
CTimeRear = CTimeRear + 1
if DoorTimerRearReset == true then
print("Timer reset due to sensor touched or Open clicked")
CTimeRear = 0
DoorTimerRearReset = false
end
until CTimeRear > DoorTimer or DoorStateRear ~= "Open"
if CTimeRear > DoorTimer then
RearDoorClose(Floor.Value)
elseif DoorStateRear ~= "Open" then
print("Door was closed before timer ended :)")
end
end))
DoorCheck() -- NUDGE TIMER
end
end
function RearDoorReOpen(F)
if F ~= Floor.Value and Moving == true then return end -- IF NOT OF FLOOR DO NOT Open
if DoorNudge == true then return end -- NO OPEN ON NUDGE
if DoorStateRear == "Closing" and DoorNudge == false then -- open when closed and reopen if closing
if TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorLeftRear") == nil then print("No Rear Door detected") return end
DoorStateRear = "CancelReopen"
repeat wait() until DoorStateRear == "OkReopen"
wait(0.2)
DoorStateRear = "Opening"
local DoorCarLeftRear = Car.DoorLeftRear:GetChildren()
local DoorCarRightRear = Car.DoorRightRear:GetChildren()
local DoorFloorLeftRear = TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorLeftRear"):GetChildren()
local DoorFloorRightRear = TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorRightRear"):GetChildren()
if EngineAPI == "B" then
for C1 = 1, #DoorCarLeftRear do DoorCarLeftRear[C1].Anchored = true end
for C2 = 1, #DoorCarRightRear do DoorCarRightRear[C2].Anchored = true end
end
for i=DoorPR, DoorL do
DoorPR = DoorPR + 1
for R=1, #DoorFloorRightRear do
DoorFloorRightRear[R].CFrame = DoorFloorRightRear[R].CFrame * CFrame.new(DoorC, 0, 0)
end
for L=1, #DoorFloorLeftRear do
DoorFloorLeftRear[L].CFrame = DoorFloorLeftRear[L].CFrame * CFrame.new(-DoorC, 0, 0)
end
for CR=1, #DoorCarRightRear do
DoorCarRightRear[CR].CFrame = DoorCarRightRear[CR].CFrame * CFrame.new(DoorC, 0, 0)
end
for CL=1, #DoorCarLeftRear do
DoorCarLeftRear[CL].CFrame = DoorCarLeftRear[CL].CFrame * CFrame.new(-DoorC, 0, 0)
end
wait(DoorSpeed)
end
if DoorStateRear == "CancelReopen" then DoorStateRear = "OkReopen" print("Grr, need to reopen...") return end
DoorStateRear = "Open"
SetCarDirInd(1,true)
SetFloorDirInd(1)
if ChimeAfterDoor then coroutine.resume(coroutine.create(function() DoChime() end)) end
-- CREATE DOOR TIMER
coroutine.resume(coroutine.create(function()
local CTimeRear = 0
repeat
wait(1)
CTimeRear = CTimeRear + 1
if DoorTimerResetRear == true or DoorHold == true then
print("Timer reset due to sensor touched or Open clicked")
CTimeRear = 0
DoorTimerResetRear = false
end
until CTimeRear > DoorTimer or DoorStateRear ~= "Open"
if CTimeRear > DoorTimer then
RearDoorClose(Floor.Value)
elseif DoorStateRear ~= "Open" then
print("Door was closed before timer ended :)")
end
end))
DoorCheck() -- NUDGE TIMER
end
end
function RearDoorClose(F,Nudge)
if DoorHold == true then return end
if F ~= Floor.Value and Moving == true then return end -- IF NOT OF FLOOR DO NOT Open
if Floor.Value == 1 and FireLock then return end
if DoorStateRear == "Open" or DoorStateRear ~= "Closed" and DoorStateRear == "Opening" and Nudge == true then
if TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorLeftRear") == nil then print("No Rear Door detected") return end
if Nudge == true then
DoorNudge = true
coroutine.resume(coroutine.create(function()
while DoorStateRear ~= "Closed" do
Car.Platform.Chime:Play()
wait(0.3)
end
end))
end
repeat wait() until DoorStateRear == "Open"
SetCarDirInd(0,true)
SetFloorDirInd(0)
DoorStateRear = "Closing"
local DoorCarLeftRear = Car.DoorLeftRear:GetChildren()
local DoorCarRightRear = Car.DoorRightRear:GetChildren()
local DoorFloorLeftRear = TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorLeftRear"):GetChildren()
local DoorFloorRightRear = TFloors:FindFirstChild("Floor"..F):FindFirstChild("DoorRightRear"):GetChildren()
for i=0, DoorL do
if DoorStateRear == "CancelReopen" then DoorStateRear = "OkReopen" return end
DoorPR = DoorPR - 1
for R=1, #DoorFloorRightRear do
DoorFloorRightRear[R].CFrame = DoorFloorRightRear[R].CFrame * CFrame.new(-DoorC, 0, 0)
end
for L=1, #DoorFloorLeftRear do
DoorFloorLeftRear[L].CFrame = DoorFloorLeftRear[L].CFrame * CFrame.new(DoorC, 0, 0)
end
for CR=1, #DoorCarRightRear do
DoorCarRightRear[CR].CFrame = DoorCarRightRear[CR].CFrame * CFrame.new(-DoorC, 0, 0)
end
for CL=1, #DoorCarLeftRear do
DoorCarLeftRear[CL].CFrame = DoorCarLeftRear[CL].CFrame * CFrame.new(DoorC, 0, 0)
end
if Nudge == true then
wait(0.1)
else
wait(DoorSpeed)
end
end
if DoorStateRear == "CancelReopen" then DoorStateRear = "OkReopen" return end
if DoorStateRear == "Closing" then
if Nudge == true then DoorNudge = false end
if EngineAPI == "B" then
for C1 = 1, #DoorCarLeftRear do DoorCarLeftRear[C1].Anchored = false end
for C2 = 1, #DoorCarRightRear do DoorCarRightRear[C2].Anchored = false end
end
DoorStateRear = "Closed"
Quene(0,"Check")
end
end
end
Running = false
function DoorCheck()
if Running then return end
if FireLock then return end
if DoorOpenTime == 0 then
coroutine.resume(coroutine.create (function()
Running = true
while DoorOpenTime ~= NudgeTimer do
if DoorState == "Closed" or FireLock or DoorHold then break end
DoorOpenTime = DoorOpenTime + 1
print("Nudge timer: "..DoorOpenTime)
wait(1)
end
if DoorState ~= "Closed" or DoorStateRear ~= "Closed" then
coroutine.resume(coroutine.create(function()
repeat wait() until DoorState == "Open" or DoorState == "Closed"
if DoorState == "Closed" then
return -- No takk
elseif DoorState == "Open" then
DoorClose(Floor.Value,true)
end
end))
DoorOpenTime = 0
Running = false
end
DoorOpenTime = 0
Running = false
end))
end
end
if DoorSensors then
Car.DoorSensor.Touched:connect(function (Player)
if Player == nil then return end
if Player.Parent == nil then return end
if Player.Parent:FindFirstChild("Humanoid") then
coroutine.resume(coroutine.create(function() if not Moving and DoorState == "Closing" then DoorTimerReset= true DoorRun(3) end end))
end
end)
if Car:FindFirstChild("DoorSensorRear") then
Car.DoorSensorRear.Touched:connect(function (Player)
if Player == nil then return end
if Player.Parent == nil then return end
if Player.Parent:FindFirstChild("Humanoid") then
coroutine.resume(coroutine.create(function() if not Moving and DoorStateRear == "Closing" then DoorTimerResetRear = true DoorRun(3) end end))
end
end)
end
end
function Btn(xFloor,xMode,Type)
local xCar = TCar:FindFirstChild("BTF"..xFloor)
local xCall = TFloors:FindFirstChild("Floor"..xFloor):FindFirstChild("CallButton")
local xCall2 = TFloors:FindFirstChild("Floor"..xFloor):FindFirstChild("CallButtonRear")
--local xDual = script.Parent.Parent.Parent.HallButtons:FindFirstChild("b"..xFloor)
if xMode == 1 then
if xCar ~= nil and Type == "Car" then
xCar.Texture.Texture = BtnLit
end
if xCall ~= nil and Type == "Call" then
xCall.Texture.Texture = BtnLit
end
if xCall2 ~= nil and Type == "Call" then
xCall2.Texture.Texture = BtnLit
end
end
if xMode == 0 then
if xCar ~= nil then
xCar.Texture.Texture = BtnULit
end
if xCall ~= nil then
xCall.Texture.Texture = BtnULit
end
if xCall2 ~= nil then
xCall2.Texture.Texture = BtnULit
end
if xDual ~= nil then
xDual.Texture.Texture = BtnULit
end
end
end
local Chime = TCar.Platform.Chime
function SetCarDirInd(F,Rear)
if Rear == true then
if TCar:FindFirstChild("DoorIndUpRear") and TCar:FindFirstChild("DoorIndDownRear") then
if F == 1 then
if MoveDirection == "Up" then
TCar.DoorIndUpRear.Decal.Texture = DirIndLit
Chime.Pitch = 1
Chime:Play()
elseif MoveDirection == "Down" then
TCar.DoorIndDownRear.Decal.Texture = DirIndLit
Chime.Pitch = 1
Chime:Play()
wait(0.8)
Chime.Pitch = 0.8
Chime:Play()
elseif Floor.Value == TotalFloors then
TCar.DoorIndDownRear.Decal.Texture = DirIndLit
Chime.Pitch = 1
Chime:Play()
wait(0.8)
Chime.Pitch = 0.8
Chime:Play()
elseif Floor.Value == 1 then
TCar.DoorIndUpRear.Decal.Texture = DirIndLit
Chime.Pitch = 1
Chime:Play()
else
TCar.DoorIndUpRear.Decal.Texture = DirIndLit
TCar.DoorIndDownRear.Decal.Texture = DirIndLit
Chime.Pitch = 1
Chime:Play()
end
end
if F == 0 then
TCar.DoorIndUpRear.Decal.Texture = DirIndULit
TCar.DoorIndDownRear.Decal.Texture = DirIndULit
end
end
else
if TCar:FindFirstChild("DoorIndUp") and TCar:FindFirstChild("DoorIndDown") then
if F == 1 then
if MoveDirection == "Up" then
TCar.DoorIndUp.Decal.Texture = DirIndLit
Chime.Pitch = 1
Chime:Play()
elseif MoveDirection == "Down" then
TCar.DoorIndDown.Decal.Texture = DirIndLit
Chime.Pitch = 1
Chime:Play()
wait(0.8)
Chime.Pitch = 0.8
Chime:Play()
elseif Floor.Value == TotalFloors then
TCar.DoorIndDown.Decal.Texture = DirIndLit
Chime.Pitch = 1
Chime:Play()
wait(0.8)
Chime.Pitch = 0.8
Chime:Play()
elseif Floor.Value == 1 then
TCar.DoorIndUp.Decal.Texture = DirIndLit
Chime.Pitch = 1
Chime:Play()
else
TCar.DoorIndUp.Decal.Texture = DirIndLit
TCar.DoorIndDown.Decal.Texture = DirIndLit
Chime.Pitch = 1
Chime:Play()
end
end
if F == 0 then
TCar.DoorIndUp.Decal.Texture = DirIndULit
TCar.DoorIndDown.Decal.Texture = DirIndULit
end
end
end
end
function SetFloorDirInd(F)
if F == 1 then
if MoveDirection == "Up" or Floor.Value == 1 then
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp1") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp1").Decal.Texture = DirIndLit
end
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp2") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp2").Decal.Texture = DirIndLit
end
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp1Rear") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp1Rear").Decal.Texture = DirIndLit
end
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp2Rear") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp2Rear").Decal.Texture = DirIndLit
end
elseif MoveDirection == "Down" or Floor.Value == TotalFloors then
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown1") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown1").Decal.Texture = DirIndLit
end
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown2") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown2").Decal.Texture = DirIndLit
end
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown1Rear") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown1Rear").Decal.Texture = DirIndLit
end
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown2Rear") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown2Rear").Decal.Texture = DirIndLit
end
else
end
end
if F == 0 then
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp1") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp1").Decal.Texture = DirIndULit
end
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp2") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp2").Decal.Texture = DirIndULit
end
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown1") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown1").Decal.Texture = DirIndULit
end
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown2") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown2").Decal.Texture = DirIndULit
end
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp1Rear") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp1Rear").Decal.Texture = DirIndULit
end
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp2Rear") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndUp2Rear").Decal.Texture = DirIndULit
end
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown1Rear") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown1Rear").Decal.Texture = DirIndULit
end
if TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown2Rear") then
TFloors:FindFirstChild("Floor"..Floor.Value):FindFirstChild("DirIndDown2Rear").Decal.Texture = DirIndULit
end
end
end
function Quene(xFloor,Mode,isCall)
if Mode == "Check" then
for i = 1, #CallQuene do
if CallQuene[i] ~= nil then
ProcessCall(Floor.Value, CallQuene[i])
end
end
end
if Mode == "Add" then
if Fire then return end
Btn(xFloor,1,isCall)
local IgnoreCall = false
local IsCalled = false
if isCall == "Car" then
if CardLock then
for i = 1, #LockedFloors do
if LockedFloors[i] == xFloor then
if UnlockedFloor == LockedFloors[i] or UnlockedFloor == 0 then
print("Ignoring lock")
else
print("Floor Locked...")
IgnoreCall = true
end
end
end
end
end
for i = 1, #CallQuene do
if CallQuene[i] == xFloor then
print("Call exist, Not adding floor: "..CallQuene[i])
IgnoreCall = true
IsCalled = true
end
end
if xFloor == Floor.Value and not Busy and not Moving then
DoorRun(1)
wait(0.2)
Btn(xFloor,0)
end
if not IgnoreCall and xFloor ~= Floor.Value and not Locked or not IgnoreCall and xFloor ~= Floor.Value and xFloor == 1 then
table.insert(CallQuene,xFloor)
print("Floor added, Value: "..xFloor)
Btn(xFloor,1,isCall)
if not Busy then Quene(0,"Check") end
else
if xFloor == Floor.Value and not Locked or IgnoreCall and IsCalled == false then
wait(0.2)
Btn(xFloor,0)
end
if Locked then
wait(0.2)
Btn(xFloor,0)
end
end
end
if Mode == "Remove" then
for i = 1, #CallQuene do
if CallQuene[i] == xFloor then
print("Removed: "..CallQuene[i])
table.remove(CallQuene,i)
end
end
Btn(xFloor,"Off")
end
end
function DoAlarm()
if not Alarm then
Alarm = true
TCar.Platform.Alarm.SoundId = "http://www.roblox.com/asset/?id=157771891"
TCar.Platform.Alarm.Looped = true
TCar.Platform.Alarm.Pitch = 2
wait(0.5)
TCar.Platform.Alarm:Play()
wait(5)
TCar.Platform.Alarm.Looped = false
TCar.Platform.Alarm:Stop()
TCar.Platform.Alarm.SoundId = "http://www.roblox.com/asset/?id=12721064"
TCar.Platform.Alarm.Looped = false
wait(1)
TCar.Platform.Alarm:Play()
TCar.Platform.Alarm.Pitch = 1
wait(3)
TCar.Platform.Alarm.SoundId = "http://www.roblox.com/asset/?id=12721071"
TCar.Platform.Alarm.Looped = false
TCar.Platform.Alarm.Pitch = 1
for i=1,3 do
TCar.Platform.Alarm:Play()
wait(2)
end
--[[
TCar.Platform.Alarm.SoundId = "http://www.roblox.com/asset/?id=142628192"
TCar.Platform.Alarm.Looped = false
TCar.Platform.Alarm.Pitch = 1
wait(0.5)
TCar.Platform.Alarm:Play()
wait(25)
TCar.Platform.Alarm.SoundId = "http://www.roblox.com/asset/?id=130772180"
TCar.Platform.Alarm.Looped = false
TCar.Platform.Alarm.Pitch = 1
wait(0.5)
TCar.Platform.Alarm:Play()
wait(1)
]]--
TCar.Platform.Alarm.SoundId = "http://www.roblox.com/asset/?id=138254180"
TCar.Platform.Alarm.Looped = false
TCar.Platform.Alarm.Pitch = 1
wait(0.5)
TCar.Platform.Alarm:Play()
wait(3)
TCar.Platform.Alarm.SoundId = "http://www.roblox.com/asset/?id=138187085"
TCar.Platform.Alarm.Looped = false
TCar.Platform.Alarm.Pitch = 1
wait(0.5)
TCar.Platform.Alarm:Play()
wait(1)
Alarm = false
end
end
x = script.Parent.Floors:GetChildren()
cs = Car:GetChildren()
if TCar:FindFirstChild("CardReader") ~= nil then
TCar:FindFirstChild("CardReader").Touched:connect(function (Card)
local Accepted = false
if Card.Parent.Name ~= "ConfigKey" and Card.Parent:FindFirstChild("CardNumber") ~= nil and CardLock then
for i,l in pairs(CardNumber) do
if Card.Parent.CardNumber.Value == i then
TCar.CardReader.BrickColor = BrickColor.new("Bright green")
UnlockedFloor = l
--CardLock = false
wait(5)
UnlockedFloor = 99999
--CardLock = true
TCar.CardReader.BrickColor = BrickColor.new("New Yeller")
Accepted = true
end
wait()
end
if not Accepted then
TCar.CardReader.BrickColor = BrickColor.new("Really red")
wait(1)
TCar.CardReader.BrickColor = BrickColor.new("New Yeller")
end
end
end)
end
for i = 1, #TCarG do
if TCarG[i].Name:sub(1,2) == "BT" then
TCarG[i].ClickDetector.MouseClick:connect(function() TCar.Platform.Beep:Play() end)
end
if TCarG[i].Name:sub(1,3) == "BTF" then
TCarG[i].ClickDetector.MouseClick:connect(function() if ConfigMode then DoCfg(tonumber(TCarG[i].Name:sub(4))) end end)
end
if TCarG[i].Name:sub(1,4) == "BTDO" then
local BO = false
TCarG[i].ClickDetector.MouseClick:connect(function()
if not ConfigMode then
if not BO then
Bo = true
TCarG[i].Texture.Texture = BtnLit
if not Moving and DoorState == "Closed" or DoorStateRear == "Closed" then DoorRun(1)
end
if DoorState == "Closing" or DoorStateRear == "Closing" then DoorRun(3) end
wait(0.2)
TCarG[i].Texture.Texture = BtnULit
Bo = false
end
end
end)
end
if TCarG[i].Name:sub(1,4) == "BTDC" then
local BC = false
TCarG[i].ClickDetector.MouseClick:connect(function()
if not ConfigMode then
if not BC then
BC = true
TCarG[i].Texture.Texture = BtnLit
DoorRun(2)
wait(0.2)
TCarG[i].Texture.Texture = BtnULit
BC = false
end
end
end)
end
if TCarG[i].Name:sub(1,3) == "BTF" then
TCarG[i].ClickDetector.MouseClick:connect(function()
if not ConfigMode then
Quene(tonumber(TCarG[i].Name:sub(4)),"Add","Car")
end end)
end
if TCarG[i].Name:sub(1,4) == "BTAL" then
TCarG[i].ClickDetector.MouseClick:connect(function() if not ConfigMode then DoAlarm() end end)
end
end
for i = 1, #TFloorsG do
TotalFloors = TotalFloors + 1
if TFloorsG[i]:FindFirstChild("CallButton") then
TFloorsG[i].CallButton.ClickDetector.MouseClick:connect(function() if not ConfigMode then Quene(tonumber(TFloorsG[i].Name:sub(6)),"Add","Call") end end)
TFloorsG[i].CallButton.Texture.Texture = BtnULit
end
if TFloorsG[i]:FindFirstChild("CallButtonRear") then
TFloorsG[i].CallButtonRear.ClickDetector.MouseClick:connect(function() if not ConfigMode then Quene(tonumber(TFloorsG[i].Name:sub(6)),"Add","Call") end end)
TFloorsG[i].CallButtonRear.Texture.Texture = BtnULit
end
end
script.Parent.ScriptCall.Changed:connect(function ()
if script.Parent.ScriptCall.Value ~= 0 then
Quene(script.Parent.ScriptCall.Value,"Add",true)
script.Parent.ScriptCall.Value = 0
end
end)
script.Parent.FireMode.Changed:connect(function ()
if script.Parent.FireMode.Value == true then
FireLock = true
Locked = true
wait(1)
Quene(1,"Add","Call")
else
Fire = false
FireLock = false
Locked = false
DoorRun(2)
end
end)
Floor.Changed:connect(function()
if FloorPassChime then
Car.Platform.FloorPassChime:Play()
end
end)
print("Floor served: "..TotalFloors)
local Motor = script.Parent.Motor
local Running = false
Motor.Changed:connect(function()
if EngineAPI == "C" then
if not Running then
Running = true
if Motor.Value ~= 0 then
repeat
for i, v in ipairs(CarCF) do
if v:IsA("Part") or v:IsA("WedgePart") or v:IsA("CornerWedgePart") then
if v:FindFirstChild("Reverse")~=nil then
v.CFrame = v.CFrame * CFrame.new(0, -Motor.Value, 0)
else
v.CFrame = v.CFrame * CFrame.new(0, Motor.Value, 0)
end
elseif v:IsA("Model") then
local z = v:GetChildren()
for a, s in ipairs(z) do
if v:IsA("Part") or v:IsA("WedgePart") or v:IsA("CornerWedgePart") then
if v:FindFirstChild("Reverse")~=nil then
s.CFrame = s.CFrame * CFrame.new(0, -Motor.Value, 0)
else
s.CFrame = s.CFrame * CFrame.new(0, Motor.Value, 0)
end
end
end
end
end
wait()
until Motor.Value == 0
end
Running = false
end
end
if EngineAPI == "B" then
BV.velocity = Vector3.new(0,Motor.Value,0)
end
end)
local Landing = false
Motor.Changed:connect(function()
if not Landing then
Landing = true
while Motor.Value ~= 0 do
for i = 1, #TFloorsG do
if math.abs(TFloorsG[i].Level.Position.Y - Car.Platform.Position.Y) < LevelOffset then
if Floor.Value ~= tonumber(TFloorsG[i].Name:sub(6,7)) then
Floor.Value = tonumber(TFloorsG[i].Name:sub(6,7))
Stop(tonumber(TFloorsG[i].Name:sub(6,7)))
end
end
end
wait()
end
Landing = false
end
end)
if EngineAPI == "C" then
for i,l in pairs(CarCF) do
if l:IsA("Part") or l:IsA("WedgePart") or l:IsA("CornerWedgePart") then
if l.Name ~= "Seat" then
l.Anchored = true
end
end
end
end
if EngineAPI == "B" then
BP.position = Car.Platform.Position
for i,l in pairs(CarCF) do
if l:IsA("Part") or l:IsA("WedgePart") or l:IsA("CornerWedgePart") then
l.Anchored = false
end
end
Car.Platform.Anchored = true
end
ButtonTextures = {
["DO"]=144878365,
["DC"]=144878349,
["AL"]=144878970,
["S0"]=144877405,
["S1"]=144877410,
["S2"]=144877413,
["S3"]=144877418,
["S4"]=144877421,
["S5"]=144877426,
["S6"]=144877430,
["S7"]=144877436,
["S8"]=144877442,
["S9"]=144877449,
["L1"]=146946090,
["L2"]=146946097,
["L3"]=146946110,
["L4"]=146946116,
["L5"]=146946126,
["L6"]=146946135,
["L7"]=146946148,
["L8"]=146946189,
["L9"]=146946196,
["R0"]=146947263,
["R1"]=146947269,
["R2"]=146947282,
["R3"]=146947294,
["R4"]=146947304,
["R5"]=146947310,
["R6"]=146947315,
["R7"]=146947323,
["R8"]=146947333,
["R9"]=146947343
}
ButtonTextures1 = {
[0]=144877405,
[1]=144877410,
[2]=144877413,
[3]=144877418,
[4]=144877421,
[5]=144877426,
[6]=144877430,
[7]=144877436,
[8]=144877442,
[9]=144877449
}
for i = 1, #TCarG do
if TCarG[i].Name:sub(1,4) == "BTAL" then
TCarG[i].FloorNumberL.Texture = "http://www.roblox.com/asset/?id=0"
TCarG[i].FloorNumberR.Texture = "http://www.roblox.com/asset/?id=" .. ButtonTextures["AL"]
end
if TCarG[i].Name:sub(1,4) == "BTDO" then
TCarG[i].FloorNumberL.Texture = "http://www.roblox.com/asset/?id=0"
TCarG[i].FloorNumberR.Texture = "http://www.roblox.com/asset/?id=" .. ButtonTextures["DO"]
end
if TCarG[i].Name:sub(1,4) == "BTDC" then
TCarG[i].FloorNumberL.Texture = "http://www.roblox.com/asset/?id=0"
TCarG[i].FloorNumberR.Texture = "http://www.roblox.com/asset/?id=" .. ButtonTextures["DC"]
end
if TCarG[i].Name:sub(1,3) == "BTF" then
if tonumber(TCarG[i].Name:sub(4)) < 10 then
TCarG[i].FloorNumberL.Texture = "http://www.roblox.com/asset/?id=0"
TCarG[i].FloorNumberR.Texture = "http://www.roblox.com/asset/?id=" .. ButtonTextures["S"..TCarG[i].Name:sub(4)]
end
if tonumber(TCarG[i].Name:sub(4)) > 9 then
TCarG[i].FloorNumberL.Texture = "http://www.roblox.com/asset/?id=" .. ButtonTextures["L"..TCarG[i].Name:sub(4,4)]
TCarG[i].FloorNumberR.Texture = "http://www.roblox.com/asset/?id=" .. ButtonTextures["R"..TCarG[i].Name:sub(5,5)]
end
end
if TCarG[i].Name:sub(1,2) == "BT" then
if TCarG[i]:FindFirstChild("Texture") then
TCarG[i].Texture.Texture = BtnULit
end
end
end
|