You don’t need to store it in the self. It is just unnecessary instances, you can store it in local variables, or remove them at all. For example:
local TweenService = game:GetService("TweenService")
local tweenInfo = TweenInfo.new(0.75, Enum.EasingStyle.Linear)
local Door = {}
Door.__index = Door
function Door.new(server, instance)
local self = setmetatable({}, Door)
self.Server = server
self.Instance = instance
self.Open = false
return self
end
function Door:Init()
-- i have removed these variables, so just using self.Instance.Hinge for example
local hingeCFrame = self.Instance.Hinge.CFrame
local openDoor = TweenService:Create(self.Instance.Hinge, tweenInfo, {CFrame = hingeCFrame * CFrame.Angles(math.rad(90),0,0)})
local closeDoor = TweenService:Create(self.Instance.Hinge, tweenInfo, {CFrame = hingeCFrame})
self.Instance.Prompt.Triggered:Connect(function()
self.Instance.Prompt.Enabled = false
if self.Open == false then
self.Instance.Frame.Open:Play()
openDoor:Play()
openDoor.Completed:Wait()
self.Instance.Prompt.ActionText = "Close"
self.Open = true
elseif self.Open == true then
closeDoor:Play()
closeDoor.Completed:Wait()
self.Instance.Frame.Close:Play()
self.Instance.Prompt.ActionText = "Open"
self.Open = false
end
self.Instance.Prompt.Enabled = true
end)
end
return Door
Also you can define types, for example:
--!strict
local TweenService = game:GetService("TweenService")
local tweenInfo = TweenInfo.new(0.75, Enum.EasingStyle.Linear)
local Door = {}
Door.__index = Door
export type Door = {
Instance: Instance & {
Hinge: HingeConstraint,
Frame: Frame,
Prompt: ProximityPrompt,
}, -- this will add autocomplete when you type self.Instance.
Open: boolean,
Server: any -- idk what it is :>
}
function Door.new(server, instance): Door
local self: Door = setmetatable({}, Door) :: any
self.Server = server
self.Instance = instance
self.Open = false
return self
end
function Door.Init(self: Door) -- this will add type autocompletion on self
local hingeCFrame = instance.Hinge.CFrame
local openDoor = TweenService:Create(self.Instance.Hinge, tweenInfo, {CFrame = hingeCFrame * CFrame.Angles(math.rad(90),0,0)})
local closeDoor = TweenService:Create(self.Instance.Hinge, tweenInfo, {CFrame = hingeCFrame})
self.Prompt.Triggered:Connect(function()
self.Instance.Prompt.Enabled = false
if self.Open == false then
self.Instance.Frame.Open:Play()
openDoor:Play()
openDoor.Completed:Wait()
self.Instance.Prompt.ActionText = "Close"
self.Open = true
elseif self.Open == true then
closeDoor:Play()
closeDoor.Completed:Wait()
self.Instance.Frame.Close:Play()
self.Instance.Prompt.ActionText = "Open"
self.Open = false
end
self.Instance.Prompt.Enabled = true
end)
end
return Door
If you don’t know what is types, check this: Guide to Type-Checking with OOP