Accueil › Documentation › Installation · origen_masterjob
Nous te recommandons d’envoyer les fichiers du script sans passer par FileZilla, car le transfert peut corrompre les scripts. Utilise WinSCP ou d’autres programmes fiables.
Tu dois modifier le code source de ton framework pour que origen_masterjob puisse intercepter les changements de métier et la logique des paies.
Remplace la fonction self.Functions.SetJob par la suivante :
function self.Functions.SetJob(job, grade, fromMJ)
local job = job:lower()
local grade = tostring(grade) or '0'
if QBCore.Shared.Jobs[job] ~= nil then
if not fromMJ and GetResourceState('origen_masterjob') == 'started' then
local BusN = exports["origen_masterjob"]:GetBusiness(self.PlayerData.job.name)
if BusN then
BusN.Functions.RemovePlayer(self.PlayerData.citizenid, true)
TriggerClientEvent("origen_masterjob:client:OnBusinessUpdate", self.PlayerData.source, false)
end
end
self.PlayerData.job.name = job
self.PlayerData.job.label = QBCore.Shared.Jobs[job].label
self.PlayerData.job.onduty = QBCore.Shared.Jobs[job].defaultDuty
if QBCore.Shared.Jobs[job].grades[grade] then
local jobgrade = QBCore.Shared.Jobs[job].grades[grade]
self.PlayerData.job.grade = {}
self.PlayerData.job.grade.name = jobgrade.name
self.PlayerData.job.grade.level = tonumber(grade)
self.PlayerData.job.payment = jobgrade.payment ~= nil and jobgrade.payment or 30
self.PlayerData.job.isboss = jobgrade.isboss ~= nil and jobgrade.isboss or false
else
return false
end
self.Functions.UpdatePlayerData()
TriggerClientEvent("QBCore:Client:OnJobUpdate", self.PlayerData.source, self.PlayerData.job)
return true
elseif GetResourceState('origen_masterjob') == 'started' then
local BusN = exports["origen_masterjob"]:GetBusiness(job)
if BusN then
local jobgrade = BusN.Functions.GetGrade(grade)
if not jobgrade then
return false
end
local oldBusN = exports["origen_masterjob"]:GetBusiness(self.PlayerData.job.name)
if oldBusN then
BusN.Functions.RemovePlayer(self.PlayerData.citizenid, true)
TriggerClientEvent("origen_masterjob:client:OnBusinessUpdate", self.PlayerData.source, false)
end
self.PlayerData.job.name = job
self.PlayerData.job.label = BusN.Data.label
self.PlayerData.job.onduty = false
self.PlayerData.job.grade = {}
self.PlayerData.job.grade.name = jobgrade.label or "Sin grado"
self.PlayerData.job.grade.level = tonumber(grade)
self.PlayerData.job.payment = jobgrade.pay or 30
self.PlayerData.job.isboss = jobgrade.boss or false
self.Functions.UpdatePlayerData()
TriggerClientEvent("QBCore:Client:OnJobUpdate", self.PlayerData.source, self.PlayerData.job)
if not fromMJ then
BusN.Functions.AddPlayer(self.PlayerData.citizenid, self.PlayerData.charinfo.firstname .. " " .. self.PlayerData.charinfo.lastname, tostring(grade), true)
end
return true
end
end
return false
endMets ForceJobDefaultDutyAtLogin à false :
QBShared.ForceJobDefaultDutyAtLogin = falseAjoute la vérification suivante dans la fonction PaycheckInterval. Entoure la logique de paie existante d’une garde qui ignore les métiers partagés inexistants (pour que les métiers gérés par masterjob ne provoquent pas d’erreurs) :
function PaycheckInterval()
if next(QBCore.Players) then
for _, Player in pairs(QBCore.Players) do
if Player then
if QBShared.Jobs[Player.PlayerData.job.name] then -- Add this check
local payment = QBShared.Jobs[Player.PlayerData.job.name]['grades'][tostring(Player.PlayerData.job.grade.level)].payment
if not payment then payment = Player.PlayerData.job.payment end
if Player.PlayerData.job and payment > 0 and (QBShared.Jobs[Player.PlayerData.job.name].offDutyPay or Player.PlayerData.job.onduty) then
if QBCore.Config.Money.PayCheckSociety then
local account = exports['qb-management']:GetAccount(Player.PlayerData.job.name)
if account ~= 0 then
if account < payment then
TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, Lang:t('error.company_too_poor'), 'error')
else
Player.Functions.AddMoney('bank', payment, 'paycheck')
exports['qb-management']:RemoveMoney(Player.PlayerData.job.name, payment)
TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, Lang:t('info.received_paycheck', {value = payment}))
end
else
Player.Functions.AddMoney('bank', payment, 'paycheck')
TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, Lang:t('info.received_paycheck', {value = payment}))
end
else
Player.Functions.AddMoney('bank', payment, 'paycheck')
TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, Lang:t('info.received_paycheck', {value = payment}))
end
end
end -- Add this check
end
end
end
SetTimeout(QBCore.Config.Money.PayCheckTimeOut * (60 * 1000), PaycheckInterval)
endAjoute l’objet tablet de l’entreprise :
['business_cad'] = {["name"] = "business_cad", ["label"] = "Business tablet", ["weight"] = 0, ["type"] = "item", ["image"] = "tablet.png", ["unique"] = true, ["useable"] = true, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = "Your personal tablet with all the information of the San Andreas business"},Remplace la fonction self.setJob par la suivante :
function self.setJob(newJob, grade)
grade = tostring(grade)
local lastJob = json.decode(json.encode(self.job))
if ESX.DoesJobExist(newJob, grade) then
if not fromMJ and GetResourceState('origen_masterjob'):find('start') then
local BusN = exports["origen_masterjob"]:GetBusiness(self.job.name)
if BusN then
BusN.Functions.RemovePlayer(self.identifier, true)
TriggerClientEvent("origen_masterjob:client:OnBusinessUpdate", self.source, false)
end
end
local jobObject, gradeObject = ESX.Jobs[newJob], ESX.Jobs[newJob].grades[grade]
self.job.id = jobObject.id
self.job.name = jobObject.name
self.job.label = jobObject.label
self.job.grade = tonumber(grade)
self.job.grade_name = gradeObject.name
self.job.grade_label = gradeObject.label
self.job.grade_salary = gradeObject.salary
if gradeObject.skin_male then
self.job.skin_male = json.decode(gradeObject.skin_male)
else
self.job.skin_male = {}
end
if gradeObject.skin_female then
self.job.skin_female = json.decode(gradeObject.skin_female)
else
self.job.skin_female = {}
end
TriggerEvent('esx:setJob', self.source, self.job, lastJob)
self.triggerEvent('esx:setJob', self.job, lastJob)
Player(self.source).state:set("job", self.job, true)
elseif GetResourceState('origen_masterjob'):find('start') then
local BusN = exports["origen_masterjob"]:GetBusiness(newJob)
if BusN then
local jobgrade = BusN.Functions.GetGrade(grade)
if not jobgrade then
print(('[es_extended] [^3WARNING^7] Ignoring invalid ^5.setJob()^7 usage for ID: ^5%s^7, Job: ^5%s^7'):format(self.source, newJob))
end
local oldBusN = exports["origen_masterjob"]:GetBusiness(self.job.name)
if oldBusN then
oldBusN.Functions.RemovePlayer(self.identifier, true)
TriggerClientEvent("origen_masterjob:client:OnBusinessUpdate", self.source, false)
end
self.job.name = newJob
self.job.label = BusN.Data.label
self.job.grade = tonumber(grade)
self.job.grade_name = jobgrade.boss and "boss" or jobgrade.label:lower():gsub(" ", "_")
self.job.grade_label = jobgrade.label or "Sin grado"
self.job.grade_salary = jobgrade.pay or 30
self.job.isBusiness = true
self.job.skin_male = {}
self.job.skin_female = {}
TriggerEvent('esx:setJob', self.source, self.job, lastJob)
self.triggerEvent('esx:setJob', self.job, lastJob)
Player(self.source).state:set("job", self.job, true)
if not fromMJ then
BusN.Functions.AddPlayer(self.identifier, self.get("firstName") .. " " .. self.get("lastName"), tostring(grade), true)
end
else
print(('[es_extended] [^3WARNING^7] Ignoring invalid ^5.setJob()^7 usage for ID: ^5%s^7, Job: ^5%s^7'):format(self.source, newJob))
end
else
print(('[es_extended] [^3WARNING^7] Ignoring invalid ^5.setJob()^7 usage for ID: ^5%s^7, Job: ^5%s^7'):format(self.source, newJob))
end
endCommente ou supprime les lignes suivantes :
if not ESX.DoesJobExist(job, grade) then
print(("[^3WARNING^7] Ignoring invalid job for ^5%s^7 [job: ^5%s^7, grade: ^5%s^7]"):format(identifier, job, grade))
job, grade = "unemployed", "0"
end
local jobObject, gradeObject = ESX.Jobs[job], ESX.Jobs[job].grades[grade]Remplace-les par les suivantes :
if ESX.DoesJobExist(job, grade) then
jobObject, gradeObject = ESX.Jobs[job], ESX.Jobs[job].grades[grade]
elseif GetResourceState('origen_masterjob'):find('start') then
local BusN = exports["origen_masterjob"]:GetBusiness(job)
if BusN then
local jobgrade = BusN.Functions.GetGrade(grade)
if jobgrade then
jobObject = {
id = BusN.Data.id,
name = job,
label = BusN.Data.label,
}
gradeObject = {
name = jobgrade.boss and "boss" or jobgrade.label:lower():gsub(" ", "_"),
label = jobgrade.label or "Sin grado",
salary = jobgrade.pay or 30
}
else
print(('[^3WARNING^7] Ignoring invalid job for ^5%s^7 [job: ^5%s^7, grade: ^5%s^7]'):format(identifier, job, grade))
end
else
print(('[^3WARNING^7] Ignoring invalid job for ^5%s^7 [job: ^5%s^7, grade: ^5%s^7]'):format(identifier, job, grade))
end
else
print(('[^3WARNING^7] Ignoring invalid job for ^5%s^7 [job: ^5%s^7, grade: ^5%s^7]'):format(identifier, job, grade))
job, grade = 'unemployed', '0'
jobObject, gradeObject = ESX.Jobs[job], ESX.Jobs[job].grades[grade]
endAjoute la vérification suivante avant la logique de versement du salaire pour ignorer les paies des entreprises gérées par masterjob :
if xPlayer.job.isBusiness then
salary = 0
endAjoute les exports suivants à la fin de pma-voice/client/init/main.lua :
exports("toggleVoice", toggleVoice)
exports("playerTargets", playerTargets)Exécute les instructions SQL suivantes pour créer les tables nécessaires.
CREATE TABLE IF NOT EXISTS `origen_masterjob` (
`id` varchar(50) NOT NULL DEFAULT 'ERROR',
`label` varchar(255) NOT NULL DEFAULT 'ERROR',
`type` varchar(50) NOT NULL DEFAULT 'shop',
`level` int(11) NOT NULL DEFAULT 0,
`experience` int(11) NOT NULL DEFAULT 0,
`money` int(11) NOT NULL DEFAULT 0,
`open` int(1) NOT NULL DEFAULT 0,
`skills` longtext NOT NULL DEFAULT '{}',
`grades` longtext NOT NULL DEFAULT '[]',
`players` longtext NOT NULL DEFAULT '[]',
`npcs` longtext NOT NULL DEFAULT '[]',
`markers` longtext NOT NULL DEFAULT '[]',
`items` longtext NOT NULL DEFAULT '[]',
`missions` longtext NOT NULL DEFAULT '[]',
`vehicles` longtext NOT NULL DEFAULT '[]',
`metadata` longtext NOT NULL DEFAULT '[]',
`stats` longtext NOT NULL DEFAULT '[]',
`allowed_items` longtext NOT NULL DEFAULT '[]',
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `origen_masterjob_bills` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`citizenid` varchar(50) NOT NULL,
`title` varchar(255) DEFAULT '',
`concepts` text DEFAULT '[]',
`price` int(11) DEFAULT 0,
`job` varchar(50) DEFAULT '',
`author` varchar(255) DEFAULT '',
`payed` int(1) DEFAULT 0,
`date` timestamp DEFAULT current_timestamp(),
`months` int(11) DEFAULT 0,
`reportid` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `origen_masterjob_documents` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`businessid` varchar(255) NOT NULL DEFAULT '',
`title` varchar(255) DEFAULT '',
`description` text DEFAULT '',
`author` varchar(255) NOT NULL DEFAULT '',
`date` timestamp DEFAULT current_timestamp(),
`images` text DEFAULT '[]',
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `origen_masterjob_garage` (
`id` varchar(50) NOT NULL DEFAULT 'ERROR',
`garage` varchar(50) DEFAULT NULL,
`plate` varchar(50) NOT NULL DEFAULT 'ERROR',
`mods` longtext DEFAULT NULL,
`state` int(1) DEFAULT 0,
`citizenid` varchar(50) DEFAULT NULL,
`model` varchar(50) DEFAULT NULL,
PRIMARY KEY (`plate`)
);
CREATE TABLE IF NOT EXISTS `origen_masterjob_notes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`documentid` varchar(50) NOT NULL,
`title` varchar(255) DEFAULT '',
`description` text DEFAULT '',
`author` varchar(255) DEFAULT '',
`date` timestamp DEFAULT current_timestamp(),
`fixed` int(1) DEFAULT 0,
PRIMARY KEY (`id`)
);origen_masterjob_garage n’est utilisée que lorsque la fonctionnalité de garage d’entreprise est activée dans la configuration.
Obligatoire uniquement lorsque Config.fixQS est à true dans les environnements ESX. Cette table stocke les métadonnées de chaque joueur lorsque le système de métadonnées natif d’ESX n’est pas utilisé.
CREATE TABLE IF NOT EXISTS `origen_metadata` (
`id` varchar(55) NOT NULL,
`data` longtext DEFAULT '',
PRIMARY KEY (`id`)
);ensure origen_masterjobAssure-toi que origen_masterjob démarre APRÈS ton framework (qb-core ou es_extended) et APRÈS oxmysql.