145 lines
5.1 KiB
Lua
145 lines
5.1 KiB
Lua
--[[---------------------------------------------------------------------------
|
|
Loading
|
|
---------------------------------------------------------------------------]]
|
|
local teamSpawns = {}
|
|
local jailPos = {}
|
|
local function onDBInitialized()
|
|
local map = MySQLite.SQLStr(string.lower(game.GetMap()))
|
|
MySQLite.query("SELECT * FROM darkrp_position NATURAL JOIN darkrp_jobspawn WHERE map = " .. map .. ";", function(data)
|
|
teamSpawns = data or {}
|
|
end)
|
|
|
|
MySQLite.query([[SELECT * FROM darkrp_position WHERE type = 'J' AND map = ]] .. map .. [[;]], function(data)
|
|
for _, v in ipairs(data or {}) do
|
|
table.insert(jailPos, Vector(v.x, v.y, v.z))
|
|
end
|
|
end)
|
|
end
|
|
hook.Add("DarkRPDBInitialized", "GetPositions", onDBInitialized)
|
|
|
|
|
|
local JailIndex = 1 -- Used to circulate through the jailpos table
|
|
|
|
-- Function for backwards compatibility
|
|
function DarkRP.storeJailPos(ply, addingPos)
|
|
local pos = ply:GetPos()
|
|
|
|
if addingPos then
|
|
DarkRP.addJailPos(pos)
|
|
DarkRP.notify(ply, 0, 4, DarkRP.getPhrase("added_jailpos"))
|
|
else
|
|
DarkRP.setJailPos(pos)
|
|
DarkRP.notify(ply, 0, 4, DarkRP.getPhrase("reset_add_jailpos"))
|
|
end
|
|
end
|
|
|
|
function DarkRP.setJailPos(pos)
|
|
local map = MySQLite.SQLStr(string.lower(game.GetMap()))
|
|
|
|
jailPos = {pos}
|
|
|
|
local remQuery = "DELETE FROM darkrp_position WHERE type = 'J' AND map = %s;"
|
|
local insQuery = "INSERT INTO darkrp_position(map, type, x, y, z) VALUES(%s, 'J', %s, %s, %s);"
|
|
|
|
remQuery = string.format(remQuery, map)
|
|
insQuery = string.format(insQuery, map, pos.x, pos.y, pos.z)
|
|
|
|
MySQLite.begin()
|
|
MySQLite.queueQuery(remQuery)
|
|
MySQLite.queueQuery(insQuery)
|
|
MySQLite.commit()
|
|
|
|
JailIndex = 1
|
|
end
|
|
|
|
function DarkRP.addJailPos(pos)
|
|
local map = MySQLite.SQLStr(string.lower(game.GetMap()))
|
|
|
|
table.insert(jailPos, pos)
|
|
|
|
local insQuery = "INSERT INTO darkrp_position(map, type, x, y, z) VALUES(%s, 'J', %s, %s, %s);"
|
|
insQuery = string.format(insQuery, map, pos.x, pos.y, pos.z)
|
|
|
|
MySQLite.query(insQuery)
|
|
|
|
JailIndex = 1
|
|
end
|
|
|
|
function DarkRP.retrieveJailPos(index)
|
|
if not jailPos then return Vector(0, 0, 0) end
|
|
if index then
|
|
return jailPos[index]
|
|
end
|
|
-- Retrieve the least recently used jail position
|
|
local oldestPos = jailPos[JailIndex]
|
|
JailIndex = JailIndex % #jailPos + 1
|
|
|
|
return oldestPos
|
|
end
|
|
|
|
function DarkRP.jailPosCount()
|
|
return table.Count(jailPos or {})
|
|
end
|
|
|
|
function DarkRP.storeTeamSpawnPos(t, pos)
|
|
local map = string.lower(game.GetMap())
|
|
local teamcmd = RPExtraTeams[t].command
|
|
|
|
|
|
DarkRP.removeTeamSpawnPos(t, function()
|
|
MySQLite.query([[INSERT INTO darkrp_position(map, type, x, y, z) VALUES(]] .. MySQLite.SQLStr(map) .. [[, "T", ]] .. pos[1] .. [[, ]] .. pos[2] .. [[, ]] .. pos[3] .. [[);]]
|
|
, function()
|
|
MySQLite.queryValue([[SELECT MAX(id) FROM darkrp_position WHERE map = ]] .. MySQLite.SQLStr(map) .. [[ AND type = "T";]], function(id)
|
|
if not id then return end
|
|
MySQLite.query([[INSERT INTO darkrp_jobspawn VALUES(]] .. id .. [[, ]] .. MySQLite.SQLStr(teamcmd) .. [[);]])
|
|
table.insert(teamSpawns, {id = id, map = map, x = pos[1], y = pos[2], z = pos[3], teamcmd = teamcmd})
|
|
end)
|
|
end)
|
|
end)
|
|
end
|
|
|
|
function DarkRP.addTeamSpawnPos(t, pos)
|
|
local map = string.lower(game.GetMap())
|
|
local teamcmd = RPExtraTeams[t].command
|
|
|
|
MySQLite.query([[INSERT INTO darkrp_position(map, type, x, y, z) VALUES(]] .. MySQLite.SQLStr(map) .. [[, "T", ]] .. pos[1] .. [[, ]] .. pos[2] .. [[, ]] .. pos[3] .. [[);]]
|
|
, function()
|
|
MySQLite.queryValue([[SELECT MAX(id) FROM darkrp_position WHERE map = ]] .. MySQLite.SQLStr(map) .. [[ AND type = "T";]], function(id)
|
|
if isbool(id) then return end
|
|
MySQLite.query([[INSERT INTO darkrp_jobspawn VALUES(]] .. id .. [[, ]] .. MySQLite.SQLStr(teamcmd) .. [[);]])
|
|
table.insert(teamSpawns, {id = id, map = map, x = pos[1], y = pos[2], z = pos[3], teamcmd = teamcmd})
|
|
end)
|
|
end)
|
|
end
|
|
|
|
function DarkRP.removeTeamSpawnPos(t, callback)
|
|
local map = string.lower(game.GetMap())
|
|
local teamcmd = RPExtraTeams[tonumber(t)].command
|
|
|
|
for k, v in pairs(teamSpawns) do
|
|
if v.teamcmd == teamcmd then
|
|
teamSpawns[k] = nil
|
|
end
|
|
end
|
|
|
|
MySQLite.query([[SELECT darkrp_position.id FROM darkrp_position
|
|
NATURAL JOIN darkrp_jobspawn
|
|
WHERE map = ]] .. MySQLite.SQLStr(map) .. [[
|
|
AND teamcmd = ]] .. MySQLite.SQLStr(teamcmd) .. [[;]], function(data)
|
|
|
|
MySQLite.begin()
|
|
for _, v in ipairs(data or {}) do
|
|
MySQLite.query([[DELETE FROM darkrp_position WHERE id = ]] .. v.id .. [[;]])
|
|
MySQLite.query([[DELETE FROM darkrp_jobspawn WHERE id = ]] .. v.id .. [[;]])
|
|
end
|
|
MySQLite.commit(callback)
|
|
end)
|
|
end
|
|
|
|
function DarkRP.retrieveTeamSpawnPos(t)
|
|
local isTeam = function(tbl) return RPExtraTeams[t].command == tbl.teamcmd end
|
|
local getPos = function(tbl) return Vector(tonumber(tbl.x), tonumber(tbl.y), tonumber(tbl.z)) end
|
|
|
|
return table.ClearKeys(fn.Map(getPos, fn.Filter(isTeam, teamSpawns)))
|
|
end
|