101 lines
3.6 KiB
Lua
101 lines
3.6 KiB
Lua
-- Create a table for the preferred playermodels
|
|
--
|
|
-- Note: in DarkRP before 2024-09, there was a different table called
|
|
-- `darkp_playermodels` (note the misspelling of "darkp"). This table was
|
|
-- missing the server column, meaning that preferred job models would persist
|
|
-- across multiple servers. To make preferred job models store per server, this
|
|
-- new table (without the spelling mistake) was created.
|
|
--
|
|
-- See the original issue to create the player model preference feature:
|
|
-- https://github.com/FPtje/DarkRP/issues/979 and the subsequent refactor at
|
|
-- https://github.com/FPtje/DarkRP/pull/3266
|
|
sql.Query([[CREATE TABLE IF NOT EXISTS darkrp_playermodels(
|
|
server TEXT NOT NULL,
|
|
jobcmd TEXT NOT NULL,
|
|
model TEXT NOT NULL,
|
|
PRIMARY KEY (server, jobcmd)
|
|
);]])
|
|
|
|
|
|
local preferredModels = {}
|
|
|
|
|
|
--[[---------------------------------------------------------------------------
|
|
Interface functions
|
|
---------------------------------------------------------------------------]]
|
|
function DarkRP.setPreferredJobModel(teamNr, model)
|
|
local job = RPExtraTeams[teamNr]
|
|
if not job then return end
|
|
preferredModels[job.command] = model
|
|
sql.Query(string.format([[REPLACE INTO darkrp_playermodels(server, jobcmd, model) VALUES(%s, %s, %s);]], sql.SQLStr(game.GetIPAddress()), sql.SQLStr(job.command), sql.SQLStr(model)))
|
|
|
|
net.Start("DarkRP_preferredjobmodel")
|
|
net.WriteUInt(teamNr, 8)
|
|
net.WriteString(model)
|
|
net.SendToServer()
|
|
end
|
|
|
|
function DarkRP.getPreferredJobModel(teamNr)
|
|
local job = RPExtraTeams[teamNr]
|
|
if not job then return end
|
|
return preferredModels[job.command]
|
|
end
|
|
|
|
--[[---------------------------------------------------------------------------
|
|
Load the preferred models
|
|
---------------------------------------------------------------------------]]
|
|
local function sendModels()
|
|
net.Start("DarkRP_preferredjobmodels")
|
|
for _, job in pairs(RPExtraTeams) do
|
|
if not preferredModels[job.command] then net.WriteBit(false) continue end
|
|
|
|
net.WriteBit(true)
|
|
net.WriteString(preferredModels[job.command])
|
|
end
|
|
net.SendToServer()
|
|
end
|
|
|
|
local function jobHasModel(job, model)
|
|
return istable(job.model) and table.HasValue(job.model, model) or job.model == model
|
|
end
|
|
|
|
local function setPreferredModels(models)
|
|
for _, v in ipairs(models) do
|
|
local job = DarkRP.getJobByCommand(v.jobcmd)
|
|
if job == nil or not jobHasModel(job, v.model) then continue end
|
|
|
|
preferredModels[v.jobcmd] = v.model
|
|
end
|
|
end
|
|
|
|
-- The old table, darkp_playermodels, acts as a global mapping of preferred
|
|
-- models for jobs.
|
|
local function setModelsFromOldTable()
|
|
local oldTableExists = tobool(sql.QueryValue([[SELECT 1 FROM sqlite_master WHERE type='table' AND name='darkp_playermodels']]))
|
|
if not oldTableExists then return end
|
|
|
|
local models = sql.Query([[SELECT jobcmd, model FROM darkp_playermodels;]])
|
|
|
|
if not models then return end
|
|
setPreferredModels(models)
|
|
end
|
|
|
|
-- The newer table is server specific.
|
|
local function setModelsFromNewTable()
|
|
local models = sql.Query(string.format([[SELECT jobcmd, model FROM darkrp_playermodels WHERE server = %s;]], sql.SQLStr(game.GetIPAddress())))
|
|
|
|
if not models then return end
|
|
setPreferredModels(models)
|
|
end
|
|
|
|
timer.Simple(0, function()
|
|
-- Run after the jobs have loaded, to make sure the jobs can be looked up.
|
|
|
|
-- Set models from the old table, before overriding them with data from the
|
|
-- new table. That way, server specific preferences always have precedence.
|
|
setModelsFromOldTable()
|
|
setModelsFromNewTable()
|
|
|
|
sendModels()
|
|
end)
|