After I posted a topic about my games door script not working on doors that were created way after the server started A developer gave me a solution Thats not even a full solution It works because I tested it with print() but now I don’t know what to do next
Code:
local Collection: CollectionService = game:GetService("CollectionService")
local TweenService: TweenService = game:GetService("TweenService")
local DoorModels: {Instance} = Collection:GetTagged("Door")
local Doortweeninfo: TweenInfo = TweenInfo.new(0.4, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0)
for _: number, DoorModel: Instance in pairs(DoorModels) do
local Open: Tween = TweenService:Create(DoorModel.DoorPart, Doortweeninfo, {CFrame = DoorModel.DoorFrame2.CFrame})
local Close: Tween = TweenService:Create(DoorModel.DoorPart, Doortweeninfo, {CFrame = DoorModel.DoorFrame1.CFrame})
local OpenState: boolean = false
DoorModel.Click.MouseClick:Connect(function(): ()
OpenState = not OpenState
if OpenState then
Open:Play()
DoorModel.door_open:Play()
else
Close:Play()
DoorModel.door_close:Play()
end
end)
end
local function DoorAdded(model)
print("it works!")
end
Collection:GetInstanceAddedSignal("Door"):Connect(DoorAdded)
for i, model in pairs(Collection:GetTagged("Door")) do
DoorAdded(model)
end
local Collection: CollectionService = game:GetService("CollectionService")
local TweenService: TweenService = game:GetService("TweenService")
local DoorModels: {Instance} = Collection:GetTagged("Door")
local Doortweeninfo: TweenInfo = TweenInfo.new(0.4, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0)
local function connectDoors()
for _: number, DoorModel: Instance in pairs(DoorModels) do
local Open: Tween = TweenService:Create(DoorModel.DoorPart, Doortweeninfo, {CFrame = DoorModel.DoorFrame2.CFrame})
local Close: Tween = TweenService:Create(DoorModel.DoorPart, Doortweeninfo, {CFrame = DoorModel.DoorFrame1.CFrame})
local OpenState: boolean = false
DoorModel.Click.MouseClick:Connect(function(): ()
OpenState = not OpenState
if OpenState then
Open:Play()
DoorModel.door_open:Play()
else
Close:Play()
DoorModel.door_close:Play()
end
end)
end
end
Collection:GetInstanceAddedSignal("Door"):Connect(DoorAdded)
for i, model in pairs(Collection:GetTagged("Door")) do
connectDoors()
end
connectDoors()
This is probably what the guy who helped you was going for but you should probably change OpenState to an attribute of the door so it doesn’t get reset whenever connectDoors() is called
Complete version revised from after that dev who trying to help you
local CollectionService = game:GetService("CollectionService")
local TweenService = game:GetService("TweenService")
local DoorModels = CollectionService:GetTagged("Door")
local Doortweeninfo = TweenInfo.new(0.4, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0)
local function setupDoor(DoorModel)
local Open = TweenService:Create(DoorModel.DoorPart, Doortweeninfo, {CFrame = DoorModel.DoorFrame2.CFrame})
local Close = TweenService:Create(DoorModel.DoorPart, Doortweeninfo, {CFrame = DoorModel.DoorFrame1.CFrame})
local OpenState = false
DoorModel.Click.MouseClick:Connect(function()
OpenState = not OpenState
if OpenState then
Open:Play()
DoorModel.door_open:Play()
else
Close:Play()
DoorModel.door_close:Play()
end
end)
end
local function DoorAdded(DoorModel)
print("Door added!")
setupDoor(DoorModel)
end
-- Connect existing doors
for _, model in pairs(DoorModels) do
setupDoor(model)
end
-- Connect new doors
CollectionService:GetInstanceAddedSignal("Door"):Connect(DoorAdded)
I normally make door state machines have 4 states: Closed, Opening, Opened, Closing. I do this so that I can more easily decide for each door if I want opening and/or closing to be interruptable. Either way, you really should be saving references to the currently-playing Tweens (when there is one), and stopping it before starting a new tween playing. Your current code looks like I could spam-click the door and start a bunch of competing tweens all playing on it.