Initial commit
This commit is contained in:
100
gamemodes/darkrp/gamemode/modules/base/cl_jobmodels.lua
Normal file
100
gamemodes/darkrp/gamemode/modules/base/cl_jobmodels.lua
Normal file
@@ -0,0 +1,100 @@
|
||||
-- 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)
|
||||
Reference in New Issue
Block a user