--One-type setup stuff print("Hello from database.lua!!") require("mysqloo") local createplayerquery local createplayerprepare = [[ INSERT INTO playerdata (`SteamID`, `PlayerName`,`Inventory`, `Skills`,`Quests`,`WorldPosition`,`World`) VALUES(?, ?, ?, ?, ?, ?, ?)]] local createtablequery = [[ create table if not exists playerdata(SteamID bigint primary key, PlayerName text, Inventory json, Skills json, Quests json, WorldPosition text, World text)]] local function connectToDatabase() if ART.database ~= nil then return end ART.database = mysqloo.connect( ART.config.dbhost, ART.config.dbuser, ART.config.dbpass, ART.config.dbname, ART.config.dbport ) local db = ART.database function db:onConnected() print("Database connected successfully") local q = self:query("SELECT 5+5") function q:onSuccess(data) print("Query successful") PrintTable(data) end function q:onError(err, sql) print("Query errored!") print("Query",sql) error(err) end q:start() end function db:onConnectionFailed( err ) print( "Connection to database failed!" ) print( "Error:",err ) end print("Connecting to db") db:connect() end connectToDatabase() local function checkDatabase() local db = ART.database print("Checking if playerdata table exists") local q = db:query(createtablequery) function q:onSuccess(data) print("Got data:") PrintTable(data) end function q:onError(err,sql) print("Query error:") print("Query",sql) print("Error",err) end q:start() print("Tried to query, something should be printed soon!") end checkDatabase() local function loadQueries() local db = ART.database --print("Loading queries") createplayerquery = db:prepare(createplayerprepare) --print("starting inventory:") --print(ART.defaults.starting_inventory) createplayerquery:setString(3,ART.defaults.starting_inventory) createplayerquery:setString(4,ART.defaults.starting_skills) createplayerquery:setString(5,ART.defaults.starting_quests) createplayerquery:setString(6,ART.defaults.starting_position) createplayerquery:setString(7,ART.defaults.starting_world) function createplayerquery:onSuccess(data) print("Created player entry successfully!") end function createplayerquery:onError(err) print("An error occured while createing a player entry: " .. err) end ART.DatabaseConnected = true end loadQueries() function ART.loadPlayerData(ply) assert(ART.DatabaseConnected,"Player joined while setup was not complete!") print("Attempting to load player data") local steamid = ply:SteamID64() local db = ART.database local q = db:query([[ select Inventory, Skills, Quests, WorldPosition, World from playerdata where SteamID="]] .. steamid .. "\"") function q:onSuccess(data) if #data == 0 then --Player does not have an entry, make one! print("Player does not have entry!") if ART.config.server_world ~= ART.defaults.starting_world then print("You didn't connect to the starting world, you are on:") print(ART.config.server_world) print("The starting world is") print(ART.defaults.starting_world) local ccmd = "connect " .. ART.defaults.starting_world print("Running concommand:" .. ccmd) --ply:ConCommand(ccmd) else print("New player without entry in database, and he's connected to the right place!") createplayerquery:setString(1,steamid) createplayerquery:setString(2,ply:Nick()) createplayerquery:start() ply:ConCommand("retry") -- reconnect to the server to load player data normally end else assert(#data == 1, "Two players with the same steamID? Something's gone horribly wrong!") print("Loaded player data,") --PrintTable(data) local world = data[1].World local inv = data[1].Inventory local worldpos = data[1].WorldPosition print("World:" .. world) PrintTable(data) if world ~= ART.config.server_world then print("Joined the wrong world, redirecting!") print("You are on :" .. ART.config.server_world .. " which is not " .. world) local ccmd = "connect " .. world --ply:ConCommand(ccmd) return end --Otherwise, we're in the right world, load our data ply:LoadInventory(inv) ply.Skills = util.JSONToTable(data[1].Skills) ply.Quests = util.JSONToTable(data[1].Quests) local postbl = string.Explode(" ", worldpos) local posvec = Vector(postbl[1],postbl[2],postbl[3]) print("Setting player pos to:") print(posvec) ply:SetPos(posvec) end end function q:onError(err,sql) print("Query error:") print("Query",sql) print("Error",err) end q:start() end --A randomly assigned model based on a player's UniqueID, so it should always stay the same. --[[ hook.Add("PlayerInitialSpawn","ArteryPlayerInit",function(ply) local modelnum = ply:UniqueID() % (#models) print("Setting player model") ply:SetModel(models[modelnum]) print("Loading data") ART.loadPlayerData(ply) end) ]]