I'm currently writing some OOP code for doors. For some reason, the newly created door objects return nil when they call a function of the LevelDoor class. The functions and constructor are both stored within a module script whilst a function is being called from a serverscript. I've tried calling another function and nil is returned all the same. It appears the functions aren’t being inherited. How can this be resolved and what’s causing the issue?
Error
ServerScriptService.ServerModules.LevelDoorLib Test:16: attempt to call a nil value
Module Script
local LevelDoor = {} LevelDoor._index = LevelDoor -- Services local Players = game:GetService("Players") -- Main function LevelDoor.new(door) local NewLevelDoor = {} --[ Properties NewLevelDoor.Door = door.Head NewLevelDoor.Config = require(door.LevelDoorConfig) NewLevelDoor.AreaName = NewLevelDoor.Config.AreaName or "Realm" NewLevelDoor.RequiredLevel = NewLevelDoor.Config.RequiredLevel or 0 NewLevelDoor.GUI = door.BillboardGui.TextLabel NewLevelDoor.TeleportPositionOnAccessDenied = NewLevelDoor.Config.TeleportPositionOnAccessDenied or workspace:WaitForChild("ToSpawn").CFrame + Vector3.new(0, 2.75, 0) NewLevelDoor.OpenedTransparency = NewLevelDoor.Config.OpenedTransparency or 0.3 NewLevelDoor.ClosedTransparency = NewLevelDoor.Config.ClosedTransparency or 0.6 NewLevelDoor.TimeOpen = NewLevelDoor.Config.TimeOpen or 0.5 --[ States NewLevelDoor.Cooldown = false NewLevelDoor.GUI.Text = NewLevelDoor.AreaName .." | Level ".. NewLevelDoor.RequiredLevel return setmetatable(NewLevelDoor, LevelDoor) end function LevelDoor:OnTouch(hit) local PassPlayerCheck, Player = self:IsAPlayer(hit) print(PassPlayerCheck, Player) if PassPlayerCheck and not self.Cooldown then self.Cooldown = true local PassLevelCheck = self:PassesRequiredLevel(Player) print(PassLevelCheck) if PassLevelCheck then self:Use() elseif not PassLevelCheck then local Character = Player.Character or Player.CharacterAdded:Wait() Character.PrimaryPart.CFrame = self.TeleportPositionOnAccessDenied end self.Cooldown = false end end return LevelDoor
Serverscript
-- Services local ServerScriptService = game:GetService("ServerScriptService") -- Modules local LevelDoorLib = require(ServerScriptService.ServerModules.LevelDoorLib) -- Declarations local NewLevelDoor = LevelDoorLib.new(workspace.LevelDoorHolder.LevelDoor2) local LevelDoor2 = workspace.LevelDoorHolder.LevelDoor2.Head -- Main print(LevelDoorLib) print(NewLevelDoor) LevelDoor2.Touched:Connect(function(hit) NewLevelDoor:OnTouch(hit) end)
The reason the functions weren’t inherited was I mistyped "__index” as ”_index”.