Optimisation de PayRent

Petite modif pour optimiser le PayRent qui faisait crash pas mal de serveur dû au nombre de joueurs importants... 
Pour vous expliquer le changement, voici ce qu'il faisait auparavant :
1) Selection de tout les utilisateur en DB
2) Sauvegarde dans 2 tableaux de l'argent de CHAQUE users enregistré en DB
3) Selection de tout les utilisateurs qui ont un appart en location
4) On fait le tour de tout les joueurs en ligne,
==> Si en ligne, alors on débite
==> Si horsligne, on stock dans le tableau 2 (newMoney) le nouveau montant de son compte en banque
5) On donne l'argent à l'agent immobilier
6) On fait le tour des 2 tableaux, si prevMoney est différent de newMoney alors on change en DB...
==> Pour rappel... prevMoney et newMoney possède tout les deux TOUT les users de la DB... donc je vous laisse imaginer le travail machine

Et donc, on en vient a mon code, voici son fonctionnement :
1) Selection de tout les utilisateurs qui ont un appart en location 
2) On recherche si le joueur est en ligne
==> Si oui alors on débite
==> Si non alors on change son compte en banque
3) On paie l'agent immobilier
--FIN--
This commit is contained in:
Cr4zZyBipBiip
2018-04-04 16:51:52 +02:00
committed by GitHub
parent 6423f60137
commit 1e4ba52851
+32 -62
View File
@@ -547,74 +547,44 @@ end)
function PayRent(d, h, m)
MySQL.Async.fetchAll(
'SELECT * FROM users',
{},
function(_users)
'SELECT * FROM owned_properties WHERE rented = 1',
{
local prevMoney = {}
local newMoney = {}
}, function (result)
local xPlayers = ESX.GetPlayers()
for i=1, #_users, 1 do
prevMoney[_users[i].identifier] = _users[i].money
newMoney[_users[i].identifier] = _users[i].money
for i=1, #result, 1 do
local foundPlayer = false
local xPlayer = nil
for j=1, #xPlayers, 1 do
local xPlayer2 = ESX.GetPlayerFromId(xPlayers[j])
if xPlayer2.identifier == result[i].owner then
foundPlayer = true
xPlayer = xPlayer2
end
end
MySQL.Async.fetchAll(
'SELECT * FROM owned_properties WHERE rented = 1',
{},
function(result)
local xPlayers = ESX.GetPlayers()
for i=1, #result, 1 do
local foundPlayer = false
local xPlayer = nil
for j=1, #xPlayers, 1 do
local xPlayer2 = ESX.GetPlayerFromId(xPlayers[j])
if xPlayer2.identifier == result[i].owner then
foundPlayer = true
xPlayer = xPlayer2
end
end
if foundPlayer then
xPlayer.removeMoney(result[i].price)
TriggerClientEvent('esx:showNotification', xPlayer.source, _U('paid_rent') .. result[i].price)
else
newMoney[result[i].owner] = newMoney[result[i].owner] - result[i].price
end
TriggerEvent('esx_addonaccount:getSharedAccount', 'society_realestateagent', function(account)
account.addMoney(result[i].price)
end)
end
for k,v in pairs(prevMoney) do
if v ~= newMoney[k] then
MySQL.Async.execute(
'UPDATE users SET money = @money WHERE identifier = @identifier',
{
['@money'] = newMoney[k],
['@identifier'] = k
}
)
end
end
end
)
if foundPlayer then
xPlayer.removeMoney(result[i].price)
TriggerClientEvent('esx:showNotification', xPlayer.source, _U('paid_rent') .. result[i].price)
else
MySQL.Sync.execute(
'UPDATE users SET money = money - @money WHERE identifier = @identifier',
{
['@money'] = result[i].price,
['@identifier'] = result[i].owner
})
end
TriggerEvent('esx_addonaccount:getSharedAccount', 'society_realestateagent', function(account)
account.addMoney(result[i].price)
end)
end
)
end)
end