From d4f197a35c207c9891d3f4dc5e9708af48c935de Mon Sep 17 00:00:00 2001 From: Alexander Pickering Date: Tue, 9 Aug 2016 17:53:52 -0400 Subject: Added some weapons --- gamemode/server/sv_config.lua | 10 ++-- gamemode/server/sv_database.lua | 22 ++++---- gamemode/server/sv_loadplayer.lua | 20 +++++-- gamemode/server/sv_mapchange.lua | 111 ++++++++++++++++++++++++++++++++++++++ gamemode/server/sv_mapconfig.lua | 71 +++++++++++++++++++----- gamemode/server/sv_pac.lua | 21 +------- 6 files changed, 206 insertions(+), 49 deletions(-) create mode 100644 gamemode/server/sv_mapchange.lua (limited to 'gamemode/server') diff --git a/gamemode/server/sv_config.lua b/gamemode/server/sv_config.lua index e4d43ab..918f196 100644 --- a/gamemode/server/sv_config.lua +++ b/gamemode/server/sv_config.lua @@ -4,16 +4,18 @@ ART.defaults = {} ART.defaults.starting_inventory = '{"Backpacks":[[[[false,false,false,false,false],[false,false,false,false,false],[false,false,false,false,false],[false,false,false,false,false],[false,false,false,false,false]],[5,5],"Rucksack"]],"Equiped":{"Gloves":false,"Left":false,"Head":false,"Legs":false,"Right":false,"Body":false,"Boots":false}}' +ART.defaults.starting_skills = "[]" +ART.defaults.starting_quests = "[]" -ART.defaults.starting_position = "185.690247 310.664398 515.031250" -ART.defaults.starting_world = "0.0.0.0:0" +ART.defaults.starting_position = "185 310 524" +ART.defaults.starting_world = "0.0.0.0:27015" ART.config = {} ART.config.server_world = game.GetIPAddress() local mysqlconfig = file.Read("artery/mysql.txt") for _,line in pairs(string.Explode("\n",mysqlconfig,false)) do - print(line) + --print(line) local key, value = unpack(string.Explode("=",line,false)) - print("setting",key,"to",value) + --print("setting",key,"to",value) ART.config[key] = value end diff --git a/gamemode/server/sv_database.lua b/gamemode/server/sv_database.lua index 59b685f..357d868 100644 --- a/gamemode/server/sv_database.lua +++ b/gamemode/server/sv_database.lua @@ -4,9 +4,9 @@ require("mysqloo") local createplayerquery local createplayerprepare = [[ -INSERT INTO playerdata (`SteamID`, `PlayerName`,`Inventory`,`WorldPosition`,`World`) VALUES(?, ?, ?, ?, ?)]] +INSERT INTO playerdata (`SteamID`, `PlayerName`,`Inventory`, `Skills`,`Quests`,`WorldPosition`,`World`) VALUES(?, ?, ?, ?, ?, ?, ?)]] local createtablequery = [[ -create table if not exists playerdata(SteamID text, PlayerName text, Inventory json, WorldPosition text, World text)]] +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 @@ -65,13 +65,15 @@ checkDatabase() local function loadQueries() local db = ART.database - print("Loading queries") + --print("Loading queries") createplayerquery = db:prepare(createplayerprepare) - print("starting inventory:") - print(ART.defaults.starting_inventory) + --print("starting inventory:") + --print(ART.defaults.starting_inventory) createplayerquery:setString(3,ART.defaults.starting_inventory) - createplayerquery:setString(4,ART.defaults.starting_position) - createplayerquery:setString(5,ART.defaults.starting_world) + 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 @@ -86,10 +88,10 @@ loadQueries() function ART.loadPlayerData(ply) assert(ART.DatabaseConnected,"Player joined while setup was not complete!") print("Attempting to load player data") - local steamid = ply:SteamID() + local steamid = ply:SteamID64() local db = ART.database local q = db:query([[ -select Inventory, WorldPosition, World from playerdata where SteamID="]] .. steamid .. "\"") +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!") @@ -126,6 +128,8 @@ select Inventory, WorldPosition, World from playerdata where SteamID="]] .. stea 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:") diff --git a/gamemode/server/sv_loadplayer.lua b/gamemode/server/sv_loadplayer.lua index 397c6cb..cfbc265 100644 --- a/gamemode/server/sv_loadplayer.lua +++ b/gamemode/server/sv_loadplayer.lua @@ -1,13 +1,25 @@ local models = {} -for k=1,9 do - models[#models+1] = "models/player/Group01/male_0" .. k .. ".mdl" - models[#models+1] = "models/player/Group02/Male_0" .. k .. ".mdl" +for k = 1,9 do + models[#models + 1] = "models/player/Group01/male_0" .. k .. ".mdl" + models[#models + 1] = "models/player/Group02/Male_0" .. k .. ".mdl" +end + +local function delayplayerload(ply) + if ply:Alive() then + ART.loadPlayerData(ply) + else + timer.Simple(1,function() + delayplayerload(ply) + end) + end end hook.Add("PlayerInitialSpawn","ArteryPlayerLoad",function(pl) local modelnum = pl:UniqueID() % (#models) - ART.loadPlayerData(pl) + timer.Simple(5,function() + delayplayerload(pl) + end) pl:SetModel(models[modelnum]) --pl:Give("weapon_pistol") pl:Give("hands") diff --git a/gamemode/server/sv_mapchange.lua b/gamemode/server/sv_mapchange.lua new file mode 100644 index 0000000..032a1bb --- /dev/null +++ b/gamemode/server/sv_mapchange.lua @@ -0,0 +1,111 @@ +--[[ + A script to move the player to a different map +]] +local mapname = game.GetMap() +local mapareasstr = file.Read("artery/maps/" .. mapname .. "/mapareas.txt") + +hook.Add("InitPostEntity", "LoadMapChangePoints", function() + local transfers = string.Explode("\r?\n\r?\n",mapareasstr,true) + local dontupdatedisconnect = {} + for k,v in pairs(transfers) do + local parts = string.Explode("\r?\n",v,true) + local vectortxt = string.Explode(" ",parts[1],false) + local svec = Vector(vectortxt[1],vectortxt[2],vectortxt[3]) + local name = parts[2] + local server = parts[3] + local model = parts[4] + local tvt = string.Explode(" ",parts[5],false) + + local sch = ents.Create("art_serverchanger") + sch.Model = model + sch.Pos = svec + sch.OnHit = function(self, coldata,collider) + print("Coldata") + PrintTable(coldata) + print("collider",collider) + if coldata.HitEntity:IsPlayer() then + dontupdatedisconnect[coldata.HitEntity] = true + local db = ART.database + local qc = table.concat({[[ + UPDATE artery.playerdata SET WorldPosition="]], + tvt[1]," ", + tvt[2]," ", + tvt[3]," ", + [[" WHERE SteamID="]], + coldata.HitEntity:SteamID64(), + '"'}) + print("Running query:",qc) + local q = db:query(qc) + function q:onSuccess(data) + print("Got data from update:") + PrintTable(data) + coldata.HitEntity:ConCommand("connect " .. server) + end + function q:onError(err,sql) + print("Query error:") + print("Query",sql) + print("Error",err) + end + q:start() + end + end + sch:Spawn() + print("Loading mapchange area",svec) + end +end) + +hook.Add("PlayerDisconnected","SavePlayerData",function(ply) + local qc + if dontupdatedisconnect[ply] then + dontupdatedisconnect[ply] = nil + qc = table.concat({ + [[UPDATE artery.playerdata SET + Inventory="]], + util.TableToJSON(ply.Inventory), + [[", + Skills="]], + util.TableToJSON(ply.Skills), + [[", + Quests="]], + util.TableToJSON(ply.Quests), + [[" + WHERE SteamID = "]], + ply:SteamID64(), + [[";]] + }) + else + local pp = ply:GetPos() + qc = table.concat({ + [[UPDATE artery.playerdata SET + Inventory="]], + util.TableToJSON(ply.Inventory), + [[", + Skills="]], + util.TableToJSON(ply.Skills), + [[", + Quests="]], + util.TableToJSON(ply.Quests), + [[", + WorldPosition="]], + pp[1]," ",pp[2]," ",pp[3], + [[", + World="]], + game.GetIPAddress(), + [[" + WHERE SteamID = "]], + ply:SteamID64(), + [[";]] + }) + end + local q = ART.database:query(qc) + function q:onSuccess(data) + print("Saveing player data successful") + PrintTable(data) + end + function q:onError(err, sql) + print("Saveing player data errored!") + print("Query",sql) + error(err) + end + q:start() +end) diff --git a/gamemode/server/sv_mapconfig.lua b/gamemode/server/sv_mapconfig.lua index 67a20ae..b9a93b8 100644 --- a/gamemode/server/sv_mapconfig.lua +++ b/gamemode/server/sv_mapconfig.lua @@ -1,19 +1,66 @@ --Loads map config form a file -local chests = file.Read("artery/maps/" .. game.GetMap() .. "/chests.txt") -local npcs = file.Read("artery/maps/" .. game.GetMap() .. "/npcs.txt") +function ART.CreateTownie(tbl) + local npcent = ents.Create("npc_townie") + for k,v in pairs(tbl) do + npcent[k] = v + end + npcent:Spawn() +end + +function ART.CreateNavNode(tbl) + local nodeent = ents.Create("info_townienode") + assert(tbl ~= nil, "Tried to create a nil navnode") + for k,v in pairs(tbl) do + nodeent[k] = v + end + nodeent:Spawn() +end -if chests == nil then return end -if npcs == nil then return end +local removeents = { + "npc_townie", +-- "art_chest", + "info_townienode", +} -for _,line in pairs(string.Explode("\n",chests,false)) do - local chest = util.JSONToTable(line) - local chestent = ents.Create("art_chest") - for k,v in pairs(chest.data) do - chestent[k] = v +for k,v in pairs(removeents) do + local eot = ents.FindByClass(v) + for i,j in pairs(eot) do + j:Remove() end - for k,v in pairs(chest.procedures) do - chestent[k](unpack(v)) +end + +local mapfields = { + "navnodes", + "npcs", +-- "chests", +} + +local function loadMap() + for k,v in ipairs(mapfields) do + local mapname = game.GetMap() + local fpath = string.format("artery/maps/%s/%s/*", mapname, v) + local files,dirs = file.Find(fpath,"DATA") + for i,j in pairs(files) do + if string.GetExtensionFromFilename(j) ~= "lua" then continue end + local itempath = string.format("artery/maps/%s/%s/%s", mapname, v, j) + local itemtxt = file.Read(itempath, "DATA") + assert(itemtxt ~= nil, "Found a file, but it looks like it can't be compiled:" .. itempath) + CompileString(itemtxt,itempath)() + end end - chestent:Spawn() end + +hook.Add( "InitPostEntity", "artery_spawnmapnpcs", function() + loadMap() +end ) + +concommand.Add("artery_reloadmap", function() + for k,v in pairs(removeents) do + local eot = ents.FindByClass(v) + for i,j in pairs(eot) do + j:Remove() + end + end + loadMap() +end) diff --git a/gamemode/server/sv_pac.lua b/gamemode/server/sv_pac.lua index 27b2ed9..fc436f4 100644 --- a/gamemode/server/sv_pac.lua +++ b/gamemode/server/sv_pac.lua @@ -5,24 +5,5 @@ hook.Add("PrePACConfigApply", "donators only", function(ply, outfit_data) end) hook.Add( "PrePACEditorOpen", "RestrictToSuperadmin", function( ply ) - if not ply:IsSuperAdmin( ) then - return false - end + return ply:IsSuperAdmin(), "This is accessable only to superadmins" end ) - -util.AddNetworkString("requestpac") -util.AddNetworkString("responsepac") - ---be able to stream pac data to clients on-demand -net.Receive("requestpac",function(ln,ply) - local name = net.ReadString() - local pdata = file.Read(string.format("artery/pac/%s.txt",name)) --make sure to have the .txt, so dot-dot-slash attacks can't read the mysql file. - net.Start("responsepac") - net.WriteString(pdata) - net.Send(ply) -end) - -hook.Add("PlayerInitialSpawn", "AllowPacThings",function(ply) - --pac.SetupENT(ply, false) - PrintTable(pac) -end) -- cgit v1.2.3-70-g09d2