aboutsummaryrefslogtreecommitdiff
path: root/gamemode/server
diff options
context:
space:
mode:
authorAlexander Pickering <alexandermpickering@gmail.com>2016-08-09 17:53:52 -0400
committerAlexander Pickering <alexandermpickering@gmail.com>2016-08-09 17:53:52 -0400
commitd4f197a35c207c9891d3f4dc5e9708af48c935de (patch)
treeee8fd3960c3a3fb4ecaf0f62b50d251f007ebaf3 /gamemode/server
parent2fe3c4551344870e3784733fce2d95027b5c8382 (diff)
downloadartery-d4f197a35c207c9891d3f4dc5e9708af48c935de.tar.gz
artery-d4f197a35c207c9891d3f4dc5e9708af48c935de.tar.bz2
artery-d4f197a35c207c9891d3f4dc5e9708af48c935de.zip
Added some weapons
Diffstat (limited to 'gamemode/server')
-rw-r--r--gamemode/server/sv_config.lua10
-rw-r--r--gamemode/server/sv_database.lua22
-rw-r--r--gamemode/server/sv_loadplayer.lua20
-rw-r--r--gamemode/server/sv_mapchange.lua111
-rw-r--r--gamemode/server/sv_mapconfig.lua71
-rw-r--r--gamemode/server/sv_pac.lua21
6 files changed, 206 insertions, 49 deletions
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)