Files
2026-03-15 14:54:49 +03:00

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