the code is a class for an interactable object, it contains generic functionality that an interactable class should have. However, I worry that it isn’t very expandable, i.e. I don’t have a clear idea whether or not I can produce more classes like items and levers. Help cleaning up the code would be very much appreciated!
also note that when I say generic, I mean it’s a base class function.
local Interactables = {}
Interactables.__index = Interactables
-- generic methods
function Interactables:Generic_BindToInput(input: Enum.KeyCode, length: deprecated)
self.Input = input
self.InputLength = length
self._Events.OnStatusChanged:Fire()
return true;
end
function Interactables:Generic_SetModel(model: model)
self.Model = model
self.ModelHierachy = model:GetChildren()
self._Events.OnStatusChanged:Fire()
return true;
end
function Interactables:Pop()
warn("Imploding an interactable instance/n")
self._Events = {}
self._Data = {}
self._Constants = {}
self = {}
self = nil
return true, "popped"
end
--Manipulation
function Interactables:FireEvent(nothing)
warn("Function Deprecated")
self._Events.OnInteract:Fire()
return true;
end
function Interactables:Generic_FireEvent(event)
local tableofgenericevents = {
["StatusChanged"]= self._Events.OnStatusChanged;
["OnInteract"]= self._Events.OnInteract
}
tableofgenericevents[event]:Fire()
return true;
end
-- initialization
function Interactables.Init(Model,input)
local returntable = setmetatable({
_Events = {
OnInteract = Instance.new("BindableEvent");
OnStatusChanged = Instance.new("BindableEvent")
};
_Data = {
Model = Model or nil;
InputLength = 0;
Input = input or nil
};
}, Interactables)
return returntable
end
return Interactables
using the module script above, i created a simple DOOR class to show what it does
local interactClass = require(script.Parent)
local module = {}
module.__index = interactClass.Init()
module.__Metatable = warn("Cannot Change Value In Metatable 'Door'")
function module.new(model, input)
local self = setmetatable({
_Data = {
doorOpen = false;
Model = model;
InputLength = 0;
Input = input
};
_Constants = {
hinge = model.Hinge;
closeCFrame = hinge.CFrame * CFrame.Angles(0, 0, 0);
OpenCFrame = hinge.CFrame * CFrame.Angles(model:GetAttribute("Angle"), math.rad(0), 0);
}
}, module)
game:GetService("ServerStorage").Bindables.Door.Event.Event:Connect(function(door)
if door == self._Data.Model then
self:FireEvent()
end
end)
self._Events.OnInteract.Event:Connect(function()
local door = self._Data.Model.door
local TweenService = game:GetService("TweenService")
local hinge = door.Hinge
local prompt = door.Door.ProximityPrompt
local tweenInfo = TweenInfo.new(1)
local tweenOpen = TweenService:Create(hinge, tweenInfo, self._Constants.OpenCFrame)
local tweenClose = TweenService:Create(hinge, tweenInfo, self._Constants.closeCFrame)
if prompt.ActionText == "Close" then
self._Data.doorOpen = false
door.Sounds.DoorClose:Play()
tweenClose:Play()
prompt.ActionText = "Open"
else
self._Data.doorOpen = true
door.Sounds.DoorOpen:Play()
tweenOpen:Play()
prompt.ActionText = "Close"
end
end)
end
return module