Advertisement
Guest User

Untitled

a guest
May 1st, 2020
916
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.68 KB | None | 0 0
  1. ESX = nil
  2. local categories, vehicles = {}, {}
  3.  
  4. TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
  5.  
  6. TriggerEvent('esx_phone:registerNumber', 'cardealer', _U('dealer_customers'), false, false)
  7. TriggerEvent('esx_society:registerSociety', 'cardealer', _U('car_dealer'), 'society_cardealer', 'society_cardealer', 'society_cardealer', {type = 'private'})
  8.  
  9. Citizen.CreateThread(function()
  10. local char = Config.PlateLetters
  11. char = char + Config.PlateNumbers
  12. if Config.PlateUseSpace then char = char + 1 end
  13.  
  14. if char > 8 then
  15. print(('[esx_vehicleshop] [^3WARNING^7] Plate character count reached, %s/8 characters!'):format(char))
  16. end
  17. end)
  18.  
  19. function RemoveOwnedVehicle(plate)
  20. MySQL.Async.execute('DELETE FROM owned_vehicles WHERE plate = @plate', {
  21. ['@plate'] = plate
  22. })
  23. end
  24.  
  25. MySQL.ready(function()
  26. MySQL.Async.fetchAll('SELECT * FROM vehicle_categories', {}, function(_categories)
  27. categories = _categories
  28.  
  29. MySQL.Async.fetchAll('SELECT * FROM vehicles', {}, function(_vehicles)
  30. vehicles = _vehicles
  31.  
  32. for k,v in ipairs(vehicles) do
  33. for k2,v2 in ipairs(categories) do
  34. if v2.name == v.category then
  35. vehicles[k].categoryLabel = v2.label
  36. break
  37. end
  38. end
  39. end
  40.  
  41. -- send information after db has loaded, making sure everyone gets vehicle information
  42. TriggerClientEvent('esx_vehicleshop:sendCategories', -1, categories)
  43. TriggerClientEvent('esx_vehicleshop:sendVehicles', -1, vehicles)
  44. end)
  45. end)
  46. end)
  47.  
  48. function getVehicleLabelFromModel(model)
  49. for k,v in ipairs(vehicles) do
  50. if v.model == model then
  51. return v.name
  52. end
  53. end
  54.  
  55. return
  56. end
  57.  
  58. RegisterNetEvent('esx_vehicleshop:setVehicleOwnedPlayerId')
  59. AddEventHandler('esx_vehicleshop:setVehicleOwnedPlayerId', function(playerId, vehicleProps, model, label)
  60. local xPlayer, xTarget = ESX.GetPlayerFromId(source), ESX.GetPlayerFromId(playerId)
  61.  
  62. if xPlayer.job.name == 'cardealer' and xTarget then
  63. MySQL.Async.fetchAll('SELECT id FROM cardealer_vehicles WHERE vehicle = @vehicle LIMIT 1', {
  64. ['@vehicle'] = model
  65. }, function(result)
  66. if result[1] then
  67. local id = result[1].id
  68.  
  69. MySQL.Async.execute('DELETE FROM cardealer_vehicles WHERE id = @id', {
  70. ['@id'] = id
  71. }, function(rowsChanged)
  72. if rowsChanged == 1 then
  73. MySQL.Async.execute('INSERT INTO owned_vehicles (owner, plate, vehicle) VALUES (@owner, @plate, @vehicle)', {
  74. ['@owner'] = xTarget.identifier,
  75. ['@plate'] = vehicleProps.plate,
  76. ['@vehicle'] = json.encode(vehicleProps)
  77. }, function(rowsChanged)
  78. xPlayer.showNotification(_U('vehicle_set_owned', vehicleProps.plate, xTarget.getName()))
  79. xTarget.showNotification(_U('vehicle_belongs', vehicleProps.plate))
  80. end)
  81.  
  82. local dateNow = os.date('%Y-%m-%d %H:%M')
  83.  
  84. MySQL.Async.execute('INSERT INTO vehicle_sold (client, model, plate, soldby, date) VALUES (@client, @model, @plate, @soldby, @date)', {
  85. ['@client'] = xTarget.getName(),
  86. ['@model'] = label,
  87. ['@plate'] = vehicleProps.plate,
  88. ['@soldby'] = xPlayer.getName(),
  89. ['@date'] = dateNow
  90. })
  91. end
  92. end)
  93. end
  94. end)
  95. end
  96. end)
  97.  
  98. ESX.RegisterServerCallback('esx_vehicleshop:getSoldVehicles', function(source, cb)
  99. MySQL.Async.fetchAll('SELECT client, model, plate, soldby, date FROM vehicle_sold', {}, function(result)
  100. cb(result)
  101. end)
  102. end)
  103.  
  104. RegisterNetEvent('esx_vehicleshop:rentVehicle')
  105. AddEventHandler('esx_vehicleshop:rentVehicle', function(vehicle, plate, rentPrice, playerId)
  106. local xPlayer, xTarget = ESX.GetPlayerFromId(source), ESX.GetPlayerFromId(playerId)
  107.  
  108. if xPlayer.job.name == 'cardealer' and xTarget then
  109. MySQL.Async.fetchAll('SELECT id, price FROM cardealer_vehicles WHERE vehicle = @vehicle LIMIT 1', {
  110. ['@vehicle'] = vehicle
  111. }, function(result)
  112. if result[1] then
  113. local price = result[1].price
  114.  
  115. MySQL.Async.execute('DELETE FROM cardealer_vehicles WHERE id = @id', {
  116. ['@id'] = result[1].id
  117. }, function(rowsChanged)
  118. if rowsChanged == 1 then
  119. MySQL.Async.execute('INSERT INTO rented_vehicles (vehicle, plate, player_name, base_price, rent_price, owner) VALUES (@vehicle, @plate, @player_name, @base_price, @rent_price, @owner)', {
  120. ['@vehicle'] = vehicle,
  121. ['@plate'] = plate,
  122. ['@player_name'] = xTarget.getName(),
  123. ['@base_price'] = price,
  124. ['@rent_price'] = rentPrice,
  125. ['@owner'] = xTarget.identifier
  126. }, function(rowsChanged2)
  127. xPlayer.showNotification(_U('vehicle_set_rented', plate, xTarget.getName()))
  128. end)
  129. end
  130. end)
  131. end
  132. end)
  133. end
  134. end)
  135.  
  136. RegisterNetEvent('esx_vehicleshop:getStockItem')
  137. AddEventHandler('esx_vehicleshop:getStockItem', function(itemName, count)
  138. local _source = source
  139. local xPlayer = ESX.GetPlayerFromId(_source)
  140.  
  141. TriggerEvent('esx_addoninventory:getSharedInventory', 'society_cardealer', function(inventory)
  142. local item = inventory.getItem(itemName)
  143.  
  144. -- is there enough in the society?
  145. if count > 0 and item.count >= count then
  146.  
  147. -- can the player carry the said amount of x item?
  148. if xPlayer.canCarryItem(itemName, count) then
  149. inventory.removeItem(itemName, count)
  150. xPlayer.addInventoryItem(itemName, count)
  151. xPlayer.showNotification(_U('have_withdrawn', count, item.label))
  152. else
  153. xPlayer.showNotification(_U('player_cannot_hold'))
  154. end
  155. else
  156. xPlayer.showNotification(_U('not_enough_in_society'))
  157. end
  158. end)
  159. end)
  160.  
  161. RegisterNetEvent('esx_vehicleshop:putStockItems')
  162. AddEventHandler('esx_vehicleshop:putStockItems', function(itemName, count)
  163. local _source = source
  164. local xPlayer = ESX.GetPlayerFromId(_source)
  165.  
  166. TriggerEvent('esx_addoninventory:getSharedInventory', 'society_cardealer', function(inventory)
  167. local item = inventory.getItem(itemName)
  168.  
  169. if item.count >= 0 then
  170. xPlayer.removeInventoryItem(itemName, count)
  171. inventory.addItem(itemName, count)
  172. xPlayer.showNotification(_U('have_deposited', count, item.label))
  173. else
  174. xPlayer.showNotification(_U('invalid_amount'))
  175. end
  176. end)
  177. end)
  178.  
  179. ESX.RegisterServerCallback('esx_vehicleshop:getCategories', function(source, cb)
  180. cb(categories)
  181. end)
  182.  
  183. ESX.RegisterServerCallback('esx_vehicleshop:getVehicles', function(source, cb)
  184. cb(vehicles)
  185. end)
  186.  
  187. ESX.RegisterServerCallback('esx_vehicleshop:buyVehicle', function(source, cb, model, plate)
  188. local xPlayer = ESX.GetPlayerFromId(source)
  189. local modelPrice
  190.  
  191. for k,v in ipairs(vehicles) do
  192. if model == v.model then
  193. modelPrice = v.price
  194. break
  195. end
  196. end
  197.  
  198. if modelPrice and xPlayer.getMoney() >= modelPrice then
  199. xPlayer.removeMoney(modelPrice)
  200.  
  201. MySQL.Async.execute('INSERT INTO owned_vehicles (owner, plate, vehicle) VALUES (@owner, @plate, @vehicle)', {
  202. ['@owner'] = xPlayer.identifier,
  203. ['@plate'] = plate,
  204. ['@vehicle'] = json.encode({model = GetHashKey(model), plate = plate})
  205. }, function(rowsChanged)
  206. xPlayer.showNotification(_U('vehicle_belongs', plate))
  207. cb(true)
  208. end)
  209. else
  210. cb(false)
  211. end
  212. end)
  213.  
  214. ESX.RegisterServerCallback('esx_vehicleshop:getCommercialVehicles', function(source, cb)
  215. MySQL.Async.fetchAll('SELECT price, vehicle FROM cardealer_vehicles ORDER BY vehicle ASC', {}, function(result)
  216. cb(result)
  217. end)
  218. end)
  219.  
  220. ESX.RegisterServerCallback('esx_vehicleshop:buyCarDealerVehicle', function(source, cb, model)
  221. local xPlayer = ESX.GetPlayerFromId(source)
  222.  
  223. if xPlayer.job.name == 'cardealer' then
  224. local modelPrice
  225.  
  226. for k,v in ipairs(vehicles) do
  227. if model == v.model then
  228. modelPrice = v.price
  229. break
  230. end
  231. end
  232.  
  233. if modelPrice then
  234. TriggerEvent('esx_addonaccount:getSharedAccount', 'society_cardealer', function(account)
  235. if account.money >= modelPrice then
  236. account.removeMoney(modelPrice)
  237.  
  238. MySQL.Async.execute('INSERT INTO cardealer_vehicles (vehicle, price) VALUES (@vehicle, @price)', {
  239. ['@vehicle'] = model,
  240. ['@price'] = modelPrice
  241. }, function(rowsChanged)
  242. cb(true)
  243. end)
  244. else
  245. cb(false)
  246. end
  247. end)
  248. end
  249. end
  250. end)
  251.  
  252. RegisterNetEvent('esx_vehicleshop:returnProvider')
  253. AddEventHandler('esx_vehicleshop:returnProvider', function(vehicleModel)
  254. local xPlayer = ESX.GetPlayerFromId(source)
  255.  
  256. if xPlayer.job.name == 'cardealer' then
  257. MySQL.Async.fetchAll('SELECT id, price FROM cardealer_vehicles WHERE vehicle = @vehicle LIMIT 1', {
  258. ['@vehicle'] = vehicleModel
  259. }, function(result)
  260. if result[1] then
  261. local id = result[1].id
  262.  
  263. MySQL.Async.execute('DELETE FROM cardealer_vehicles WHERE id = @id', {
  264. ['@id'] = id
  265. }, function(rowsChanged)
  266. if rowsChanged == 1 then
  267. TriggerEvent('esx_addonaccount:getSharedAccount', 'society_cardealer', function(account)
  268. local price = ESX.Math.Round(result[1].price * 0.75)
  269. local vehicleLabel = getVehicleLabelFromModel(vehicleModel)
  270.  
  271. account.addMoney(price)
  272. xPlayer.showNotification(_U('vehicle_sold_for', vehicleLabel, ESX.Math.GroupDigits(price)))
  273. end)
  274. end
  275. end)
  276. else
  277. print(('[esx_vehicleshop] [^3WARNING^7] %s attempted selling an invalid vehicle!'):format(xPlayer.identifier))
  278. end
  279. end)
  280. end
  281. end)
  282.  
  283. ESX.RegisterServerCallback('esx_vehicleshop:getRentedVehicles', function(source, cb)
  284. MySQL.Async.fetchAll('SELECT * FROM rented_vehicles ORDER BY player_name ASC', {}, function(result)
  285. local vehicles = {}
  286.  
  287. for i=1, #result, 1 do
  288. table.insert(vehicles, {
  289. name = result[i].vehicle,
  290. plate = result[i].plate,
  291. playerName = result[i].player_name
  292. })
  293. end
  294.  
  295. cb(vehicles)
  296. end)
  297. end)
  298.  
  299. ESX.RegisterServerCallback('esx_vehicleshop:giveBackVehicle', function(source, cb, plate)
  300. MySQL.Async.fetchAll('SELECT base_price, vehicle FROM rented_vehicles WHERE plate = @plate', {
  301. ['@plate'] = plate
  302. }, function(result)
  303. if result[1] then
  304. local vehicle = result[1].vehicle
  305. local basePrice = result[1].base_price
  306.  
  307. MySQL.Async.execute('DELETE FROM rented_vehicles WHERE plate = @plate', {
  308. ['@plate'] = plate
  309. }, function(rowsChanged)
  310. MySQL.Async.execute('INSERT INTO cardealer_vehicles (vehicle, price) VALUES (@vehicle, @price)', {
  311. ['@vehicle'] = vehicle,
  312. ['@price'] = basePrice
  313. })
  314.  
  315. RemoveOwnedVehicle(plate)
  316. cb(true)
  317. end)
  318. else
  319. cb(false)
  320. end
  321. end)
  322. end)
  323.  
  324. ESX.RegisterServerCallback('esx_vehicleshop:resellVehicle', function(source, cb, plate, model)
  325. local xPlayer, resellPrice = ESX.GetPlayerFromId(source)
  326. -- calculate the resell price
  327. for i=1, #vehicles, 1 do
  328. if GetHashKey(vehicles[i].model) == model then
  329. resellPrice = ESX.Math.Round(vehicles[i].price / 100 * Config.ResellPercentage)
  330. break
  331. end
  332. end
  333.  
  334. if not resellPrice then
  335. print(('[esx_vehicleshop] [^3WARNING^7] %s attempted to sell an unknown vehicle!'):format(xPlayer.identifier))
  336. cb(false)
  337. else
  338. MySQL.Async.fetchAll('SELECT * FROM rented_vehicles WHERE plate = @plate', {
  339. ['@plate'] = plate
  340. }, function(result)
  341. if result[1] then -- is it a rented vehicle?
  342. cb(false) -- it is, don't let the player sell it since he doesn't own it
  343. else
  344. MySQL.Async.fetchAll('SELECT * FROM owned_vehicles WHERE owner = @owner AND @plate = plate', {
  345. ['@owner'] = xPlayer.identifier,
  346. ['@plate'] = plate
  347. }, function(result)
  348. if result[1] then -- does the owner match?
  349. local vehicle = json.decode(result[1].vehicle)
  350.  
  351. if vehicle.model == model then
  352. if vehicle.plate == plate then
  353. xPlayer.addMoney(resellPrice)
  354. RemoveOwnedVehicle(plate)
  355. cb(true)
  356. else
  357. print(('[esx_vehicleshop] [^3WARNING^7] %s attempted to sell an vehicle with plate mismatch!'):format(xPlayer.identifier))
  358. cb(false)
  359. end
  360. else
  361. print(('[esx_vehicleshop] [^3WARNING^7] %s attempted to sell an vehicle with model mismatch!'):format(xPlayer.identifier))
  362. cb(false)
  363. end
  364. end
  365. end)
  366. end
  367. end)
  368. end
  369. end)
  370.  
  371. ESX.RegisterServerCallback('esx_vehicleshop:getStockItems', function(source, cb)
  372. TriggerEvent('esx_addoninventory:getSharedInventory', 'society_cardealer', function(inventory)
  373. cb(inventory.items)
  374. end)
  375. end)
  376.  
  377. ESX.RegisterServerCallback('esx_vehicleshop:getPlayerInventory', function(source, cb)
  378. local xPlayer = ESX.GetPlayerFromId(source)
  379. local items = xPlayer.inventory
  380.  
  381. cb({items = items})
  382. end)
  383.  
  384. ESX.RegisterServerCallback('esx_vehicleshop:isPlateTaken', function(source, cb, plate)
  385. MySQL.Async.fetchAll('SELECT 1 FROM owned_vehicles WHERE plate = @plate', {
  386. ['@plate'] = plate
  387. }, function(result)
  388. cb(result[1] ~= nil)
  389. end)
  390. end)
  391.  
  392. ESX.RegisterServerCallback('esx_vehicleshop:retrieveJobVehicles', function(source, cb, type)
  393. local xPlayer = ESX.GetPlayerFromId(source)
  394.  
  395. MySQL.Async.fetchAll('SELECT * FROM owned_vehicles WHERE owner = @owner AND type = @type AND job = @job', {
  396. ['@owner'] = xPlayer.identifier,
  397. ['@type'] = type,
  398. ['@job'] = xPlayer.job.name
  399. }, function(result)
  400. cb(result)
  401. end)
  402. end)
  403.  
  404. RegisterNetEvent('esx_vehicleshop:setJobVehicleState')
  405. AddEventHandler('esx_vehicleshop:setJobVehicleState', function(plate, state)
  406. local xPlayer = ESX.GetPlayerFromId(source)
  407.  
  408. MySQL.Async.execute('UPDATE owned_vehicles SET `stored` = @stored WHERE plate = @plate AND job = @job', {
  409. ['@stored'] = state,
  410. ['@plate'] = plate,
  411. ['@job'] = xPlayer.job.name
  412. }, function(rowsChanged)
  413. if rowsChanged == 0 then
  414. print(('[esx_vehicleshop] [^3WARNING^7] %s exploited the garage!'):format(xPlayer.identifier))
  415. end
  416. end)
  417. end)
  418.  
  419. function PayRent(d, h, m)
  420. local tasks, timeStart = {}, os.clock()
  421. print('[esx_vehicleshop] [^2INFO^7] Paying rent cron job started')
  422.  
  423. MySQL.Async.fetchAll('SELECT owner, rent_price FROM rented_vehicles', {}, function(result)
  424. for i=1, #result, 1 do
  425. table.insert(tasks, function(cb)
  426. local xPlayer = ESX.GetPlayerFromIdentifier(result[i].owner)
  427.  
  428. if xPlayer then -- message player if connected
  429. xPlayer.removeAccountMoney('bank', result[i].rent_price)
  430. xPlayer.showNotification(_U('paid_rental', ESX.Math.GroupDigits(result[i].rent_price)))
  431. else -- pay rent by updating SQL
  432. MySQL.Sync.execute('UPDATE users SET bank = bank - @bank WHERE identifier = @identifier', {
  433. ['@bank'] = result[i].rent_price,
  434. ['@identifier'] = result[i].owner
  435. })
  436. end
  437.  
  438. TriggerEvent('esx_addonaccount:getSharedAccount', 'society_cardealer', function(account)
  439. account.addMoney(result[i].rent_price)
  440. end)
  441.  
  442. cb()
  443. end)
  444. end
  445.  
  446. Async.parallelLimit(tasks, 5, function(results) end)
  447.  
  448. local elapsedTime = os.clock() - timeStart
  449. print(('[esx_vehicleshop] [^2INFO^7] Paying rent cron job took %s seconds'):format(elapsedTime))
  450. end)
  451. end
  452.  
  453. TriggerEvent('cron:runAt', 22, 00, PayRent)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement