First Gamemode Inventory System not working.

I have recently started to dive into garrysmod gamemode creation following Goature’s tutorials, I have got up to the inventory and stats episode, the basic idea is that it will collect short steam id’s and create a database of folders with txt files in them containing the data such as money and xp, but for whatever reason I can’t get it to create the file, or in my suspicion the code doesn’t want to run the function.

The exact errors are, when connecting: http://imgur.com/a3i2hOo

and when disconnecting: http://imgur.com/RaeujYD

here is the code:

database.lua(server file):


local ply = FindMetaTable("Player")
util.AddNetworkString("database")

function ply:ShortSteamID()
	local id = self:SteamID()
	local id = tostring(id)
	local id = string.Replace(id, "STEAM_0:0:", "") -- removes the Steam_ part of the id
	local id = string.Replace(id, "STEAM_0:1:", "") -- removes the Steam_ part of the id
	return id -- gives back the id we want
end

-- Nice print Messages about Database
local oldPrint = print
local function print(s)
	oldPrint("database.Lua: " .. tostring(s))
end

function ply:databaseDefault()
	self:databaseSetValue("money", 100)
	self:databaseSetValue("xp", 0)
	-- self:databaseSetValue("hunger", 0)
	local i = {}
	i["soda1"] = {amount = 10}
	i["soda2"] = {amount = 10}
	self:databaseSetValue("inventory", i)
end

function ply:databaseNetworkedData()
	local money = self:databaseGetValue("money")
	local xp = self:databaseGetValue("xp")
	self:SetNWInt("money", money)
	self:SetNWInt("xp", xp)

	self:KillSilent()
	self:Spawn()
end

function ply:databaseFolders()
	return "server/example/players/" .. self:ShortSteamID() .. "/"
end

function ply:databasePath()
	return self:databaseFolders() .. "database.txt"
end

function ply:databaseSet(tab)
	self.database = tab
end

function ply:databaseGet()
	return self.database
end

function ply:databaseCheck()
	self.database = {}
	local f = self:databaseExists()
	if f then
		self:databaseRead()
	else
		self:databaseCreate()
	end
	self:databaseSend()
	self:databaseNetworkedData()
end

function ply:databaseSend()
	net.Start("database")
		net.WriteTable(self:databaseGet())
	net.Send(self)
end

function ply:databaseExists()
	local f = file.Exists(self:databasePath(), "DATA")
	return f
end

function ply:databaseRead()
	local str = file.Read(self:databasePath(), "DATA")
	self:databaseSet(util.KeyValuesToTable(str))
end

function ply:databaseSave()
	local str = util.TableToKeyValues(self:database)
	local f = file.Write(self:databasePath(), str)
	self:databaseSend()
end

function ply:databaseCreate()
	self:databaseDefault()
	local b = file.CreateDir(self:databaseFolders())
	print("Made directory!")
	self:databaseSave()
end

function ply:databasePlayerDisconnect()
	self:databaseSave()
end

function ply:databaseSetValue(name, v)
	if not v then return end

	if type(v) == "table" then
		if name == "inventory" then
			for k,b in pairs(v) do
				if b.amount <= 0 then
					v[k] = nil
				end
			end
		end
	end
	local d = self:databaseGet()
	d[name] = v

	self:databaseSave()
end

function ply:databaseGetValue(name)
	local d = self.databaseGet()
	return d[name]
end

the Client side database code(cl_database.lua):


local database = {}

local function databaseReceive(tab)
	database = tab
end
net.Receive("database", function(len)
	local tab = net.ReadTable()
	databaseReceive(tab)
end)

function databaseTable()
	return database
end

function databaseGetValue(name)
	local d = databaseTable()
	return d[name]
end

and finally the init.lua:


AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")
AddCSLuaFile("database/cl_database.lua")

include("shared.lua")
include("player.lua")
include("database/database.lua")

-- function GM:PlayerConnect( name, ip )

-- end

function GM:PlayerInitialSpawn( ply )
	PrintMessage(HUD_PRINTTALK, "player: " .. ply:Nick() .. " has joined the game")

	ply:SetGamemodeTeam( 0 ) -- Refers to player.lua
end

function GM:PlayerSpawn( ply )
	ply:SetModel("models/player/group01/male_07.mdl") -- sets the model when they spawn
	ply:GiveGamemodeWeapons() -- should give them weapons but is not working, code in player.lua
	




	-- [[ To fix the invisible hands in firstPerson ]] --
	local oldhands = ply:GetHands()
  	if ( IsValid( oldhands ) ) then oldhands:Remove() end

  	local hands = ents.Create( "gmod_hands" )
  	if ( IsValid( hands ) ) then
    	ply:SetHands( hands )
    	hands:SetOwner( ply )

    	-- Which hands should we use?
    	local cl_playermodel = ply:GetInfo( "cl_playermodel" )
    	local info = player_manager.TranslatePlayerHands( cl_playermodel )
    	if ( info ) then
      		hands:SetModel( info.model )
      		hands:SetSkin( info.skin )
      		hands:SetBodyGroups( info.body )
    	end

    	-- Attach them to the viewmodel
    	local vm = ply:GetViewModel( 0 )
    	hands:AttachToViewmodel( vm )

    	vm:DeleteOnRemove( hands )
    	ply:DeleteOnRemove( hands )

   		hands:Spawn()
 	end
 	-- [[ Fixed ]] --
end

function GM:PlayerAuthed( ply, steamID, uniqueID )
	ply:databaseCheck()
end

function GM:PlayerDisconnected(ply)
	ply:databasePlayerDisconnect()
end

As you can see the init.lua includes the database file but doesnt want to access its functions for some reason, also the database files are located in a folder called database.

any help appreciated.