RyanUSNS

Fix ServerSide SOevent

Apr 20th, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 20.26 KB | None | 0 0
  1. ------------------------------------------------------------------------------------
  2. --  PROJECT:     Community of Integrity and Transparency 2.0
  3. --  RIGHTS:   All rights reserved by developers
  4. --  FILE:       CITsoEvents/soevents.slua
  5. --  PURPOSE:     State official events - Server side
  6. --  DEVELOPERS:  Ryan#USNS
  7. ------------------------------------------------------------------------------------
  8. local t = function(...) return exports.CITt:t(...) or arg[2] end
  9.  
  10. local eventStatus, object, dMarker, pMarker, dBlip, pBlip, timer, updateTimer
  11. local hit = {}
  12. local trailer = {}
  13. local events = {}
  14. local truckerVehicles = {[403]=true, [515]=true, [514]=true}
  15. local deliveryVehicles = {[482]=true, [413]=true, [440]=true, [414]=true, [499]=true, [456]=true}
  16. local delivering = {}
  17. local refundsCache = {}
  18.  
  19. function showPanel(plr, cmd, info)
  20.     if (info == "info") then
  21.         local civs = getTeamFromName("Civilian Workers")
  22.         if (getPlayerTeam(plr) ~= civs) then
  23.             outputChatBox(t(plr, "You need be a civilian to see State Official event information."), plr, 255, 0, 0)
  24.             return false
  25.         end
  26.         if (not eventStatus) then
  27.             outputChatBox(t(plr, "Nobody is hosting civilian event right now."), plr, 255, 0, 0)
  28.             return false
  29.         end
  30.         outputChatBox(t(plr, "Hosted by: %s", events[1]), plr, 255, 167, 0)
  31.         outputChatBox(t(plr, "Event type: %s", events[2]), plr, 255, 167, 0)
  32.         outputChatBox(t(plr, "Detail: %s", events[5]), plr, 255, 167, 0)
  33.         outputChatBox(t(plr, "Location: %s", events[4]..", "..events[3]), plr, 255, 167, 0)
  34.         return true
  35.     end
  36.     local acc = getAccountName(getPlayerAccount(plr))
  37.     if (not exports.CITstateOfficial:checkSOPermission(acc)) then
  38.         return false
  39.     end
  40.     if (getElementData(plr, "o") ~= "State Official") then
  41.         outputChatBox(t(plr, "You need to be on duty state official to open events GUI."), plr, 0, 255, 0)
  42.         return false
  43.     end
  44.     triggerClientEvent(plr, "CITsoEvents.toggleWindow", plr)
  45. end
  46. addCommandHandler("soevent", showPanel)
  47.  
  48. function cancelOutput()
  49.     local civs = getTeamFromName("Civilian Workers")
  50.     local civilians = getPlayersInTeam(civs)
  51.     for k, plr2 in pairs(civilians) do
  52.         outputChatBox(t(plr2, "State official event timed out, nobody won the event!"), plr2, 255, 167, 0)
  53.     end
  54.     removeMarkers(events[2])
  55. end
  56.  
  57. function startingEvent(name)
  58.     setElementVisibleTo(dMarker, root, false)
  59.     setElementVisibleTo(dBlip, root, false)
  60.     setElementVisibleTo(pMarker, root, false)
  61.     setElementVisibleTo(pBlip, root, false)
  62.     local players = getPlayersInTeam(getTeamFromName("Civilian Workers"))
  63.     for i, plr in ipairs(players) do
  64.         setElementVisibleTo(pMarker, plr, true)
  65.         setElementVisibleTo(pBlip, plr, true)
  66.     end
  67.     for k, plr2 in pairs(players) do
  68.         outputChatBox(t(plr2, "State Official %s is hosting an event. Type '/soevent info' for more information!", name), plr2, 255, 167, 0)
  69.     end
  70. end
  71.  
  72. function startMission(mission, detail, reward, t2, px, py, pz, pb, dx, dy, dz, db)
  73.     local t2 = tonumber(t2) or 1
  74.     local acc = getAccountName(getPlayerAccount(client))
  75.     if (eventStatus) then
  76.         outputChatBox(t(client, "An event is already in progress."), client, 255, 0, 0)
  77.         return false
  78.     end
  79.     if (mission == "Mystery Box") then
  80.         pMarker = createMarker(px, py, pz-1, 'cylinder', 2, 255, 167, 0, 0)
  81.         object = createObject(2912, px, py, pz-1, 0,0,0)
  82.         setElementFrozen(object, true)
  83.         events = {getPlayerName(client), mission, getZoneName(px, py, pz, true), getZoneName(px, py, pz), detail, reward, getAccountName(getPlayerAccount(client))}
  84.         removeEventHandler("onMarkerHit", pMarker, hitBag)
  85.         removeEventHandler("onPlayerQuit", root, quitHandler)
  86.         addEventHandler("onMarkerHit", pMarker, hitBag)
  87.         addEventHandler("onPlayerQuit", root, quitHandler)
  88.         outputChatBox(t(client, "You created an Event: %s", mission), client, 0, 255, 0)
  89.         local civs = getTeamFromName("Civilian Workers")
  90.         local civilians = getPlayersInTeam(civs)
  91.         for k, plr2 in pairs(civilians) do
  92.             outputChatBox(t(plr2, "State Official %s is hosting an event. Type '/soevent info' for more information!", getPlayerName(client)), plr2, 255, 167, 0)
  93.         end
  94.         exports.CITstateOfficial:addToSOAccLogs(acc, "Hosted Civilian event; "..mission)
  95.         eventStatus = true
  96.         timer = setTimer(cancelOutput, t2 * 60 * 1000, 0)
  97.         return true
  98.     end
  99.     pMarker = createMarker(px, py, pz - 1.5, "cylinder", 4, 255, 167, 0, 255)
  100.     pBlip = createBlipAttachedTo(pMarker, pb)
  101.     dMarker = createMarker(dx, dy, dz - 1.5, "cylinder", 4, 255, 167, 0, 255)
  102.     dBlip = createBlipAttachedTo(dMarker, db)
  103.     events = {getPlayerName(client), mission, getZoneName(px, py, pz, true), getZoneName(px, py, pz), detail, reward, getAccountName(getPlayerAccount(client))}
  104.     removeEventHandler("onMarkerHit", pMarker, pickupStuff)
  105.     removeEventHandler("onMarkerHit", dMarker, deliveryStuff)
  106.     removeEventHandler("onPlayerQuit", root, quitHandler)
  107.     removeEventHandler("onVehicleExit", root, exitVehicle)
  108.     removeEventHandler("onVehicleEnter", root, enterVehicle)
  109.     removeEventHandler("CITsoEvents.showMarker", root, showMarker)
  110.     addEventHandler("onMarkerHit", pMarker, pickupStuff)
  111.     addEventHandler("onMarkerHit", dMarker, deliveryStuff)
  112.     addEventHandler("onPlayerQuit", root, quitHandler)
  113.     addEventHandler("onVehicleExit", root, exitVehicle)
  114.     addEventHandler("onVehicleEnter", root, enterVehicle)
  115.     addEventHandler("CITsoEvents.showMarker", root, showMarker)
  116.     if (mission == "Delivery Clothes") then
  117.         removeEventHandler("onTrailerDetach", root, reattachTrailerDC)
  118.         addEventHandler("onTrailerDetach", root, reattachTrailerDC)
  119.     end
  120.     outputChatBox(t(client, "You created an event: %s", mission), client, 0, 255, 0)
  121.     startingEvent(getPlayerName(client))
  122.     exports.CITstateOfficial:addToSOAccLogs(acc, "Hosted Civilian event; "..mission)
  123.     eventStatus = true
  124.     timer = setTimer(cancelOutput, t2 * 60 * 1000, 0)
  125. end
  126. addEvent("CITsoEvents.startMission", true)
  127. addEventHandler("CITsoEvents.startMission", resourceRoot, startMission)
  128.  
  129. function hitBag(plr)
  130.     if (getElementType(plr) ~= "player") then
  131.         return false
  132.     end
  133.     local civs = getTeamFromName("Civilian Workers")
  134.     local soPlr = getAccountPlayer(getAccount(events[7]))
  135.     if (getPlayerTeam(plr) ~= civs or isPedInVehicle(plr) or plr == soPlr)then
  136.         return false
  137.     end
  138.     local money = tonumber(events[6])
  139.     exports.CITmoney:GPM(plr, tonumber(events[6]), "Won at SO Event "..events[2], false)
  140.     if (not soPlr) then
  141.         exports.CITaccounts:exportModifyCash(events[7], 0 - money)
  142.         exports.CITlogs:logSomething("Remove "..money.." from "..tostring(events[7]), "soevents", events[7])
  143.     else
  144.         exports.CITmoney:TPM(soPlr, money, "Gave SO event prize "..events[2])
  145.     end
  146.     if (not refundsCache[events[7]]) then
  147.         refundsCache[events[7]] = {}
  148.     end
  149.     table.insert(refundsCache[events[7]], {events[2], money})
  150.     outputChatBox(t(plr, "You found $%s from mystery box.", tostring(events[6])), plr, 0, 255, 0)
  151.     local civs = getTeamFromName("Civilian Workers")
  152.     local civilians = getPlayersInTeam(civs)
  153.     for k, plr2 in pairs(civilians) do
  154.         outputChatBox(getPlayerName(plr).." "..t(plr2, "found the mystery box placed by %s and got $%s", events[1], money), plr2, 255, 167, 0)
  155.     end
  156.     exports.CITstateOfficial:addToSOAccLogs(events[7], getPlayerName(plr).." has picked up mystery box and got $"..money)
  157.     removeMarkers(events[2])
  158. end
  159.  
  160. -- Delivery Clothes and Delivery Glassers.
  161. function pickupStuff(hitElement)
  162.     if (not hitElement or getElementType(hitElement) ~= "vehicle") then
  163.         return false
  164.     end
  165.     local driver = getVehicleController(hitElement)
  166.     if (not driver) then
  167.         return false
  168.     end
  169.     local civs = getTeamFromName("Civilian Workers")
  170.     if (getPlayerTeam(driver) ~= civs or (not hit[driver] and not isElementVisibleTo(dMarker, driver) and isElementWithinMarker(driver, dMarker)) or (hit[driver] and isElementWithinMarker(driver, pMarker)))then
  171.         return false
  172.     end
  173.     if (getElementSpeed(hitElement, 2) > 40) then
  174.         outputChatBox(t(driver, "You are driving too fast. Slow down to under 64 kph (40 mph)."), driver, 255, 0, 0)
  175.         return false
  176.     end
  177.     if (events[2] == "Delivery Clothes") then  
  178.         if (getElementModel(hitElement) == 435) then
  179.             return false
  180.         end
  181.         if (not truckerVehicles[getElementModel(hitElement)]) then
  182.             outputChatBox(t(driver, "You need a Trucker job vehicle!"), driver, 255, 0, 0)
  183.             return false
  184.         end
  185.         if (getVehicleTowedByVehicle(hitElement)) then
  186.             outputChatBox(t(driver, "You already have the trailer. If it is bugged, respawn the vehicle."), driver, 255, 0, 0)
  187.             return false
  188.         end
  189.         delivering[driver] = true
  190.         triggerClientEvent(driver, "CITsoEvents.addProgressBar", driver)
  191.         local x, y, z = getElementPosition(pMarker)
  192.         local rx, ry, rz = getElementRotation(hitElement)
  193.         trailer[hitElement] = createVehicle(435, x, y, z, rx, ry, rz)
  194.         attachTrailerToVehicle(hitElement, trailer[hitElement])
  195.         fixVehicle(hitElement)
  196.         hit[driver] = true
  197.         setElementVisibleTo(pMarker, driver, false)
  198.         setElementVisibleTo(pBlip, driver, false)
  199.         setElementVisibleTo(dMarker, driver, true)
  200.         setElementFrozen(hitElement, true)
  201.         setElementData(hitElement, "vehCancelExit", true)
  202.         setTimer(setElementFrozenDelay, 10000, 1, hitElement, false)
  203.         outputChatBox(t(driver, "Now deliver the stuff to next location marked in your map."), driver, 255, 167, 0)
  204.         return true
  205.     end
  206.     if (not deliveryVehicles[getElementModel(hitElement)])then
  207.         outputChatBox(t(driver, "You need a Delivery Man vehicle!"), driver, 255, 0, 0)
  208.         return false
  209.     end
  210.     delivering[driver] = true
  211.     triggerClientEvent(driver, "CITsoEvents.addProgressBar", driver)
  212.     hit[driver] = true
  213.     fixVehicle(hitElement)
  214.     setElementVisibleTo(pMarker, driver, false)
  215.     setElementVisibleTo(pBlip, driver, false)
  216.     setElementVisibleTo(dMarker, driver, true)
  217.     setElementVisibleTo(dBlip, driver, true)
  218.     setElementFrozen(hitElement, true)
  219.     setElementData(hitElement, "vehCancelExit", true)
  220.     setTimer(setElementFrozenDelay, 10000, 1, hitElement, false)
  221.     outputChatBox(t(driver, "Now deliver the stuff to next location marked in your map."), driver, 255, 167, 0)
  222. end
  223.  
  224. function setElementFrozenDelay(element, bool)
  225.     if (isElement(element)) then
  226.         setElementFrozen(element, bool)
  227.         setElementData(element, "vehCancelExit", bool)
  228.     end
  229. end
  230.  
  231. function deliveryStuff(hitElement) 
  232.     if (not hitElement or getElementType(hitElement) ~= "vehicle") then
  233.         return false
  234.     end
  235.     local driver = getVehicleController(hitElement)
  236.     if (not driver) then
  237.         return false
  238.     end
  239.     local civs = getTeamFromName("Civilian Workers")
  240.     if (getPlayerTeam(driver) ~= civs or not isElementVisibleTo(dMarker, driver))then
  241.         return false
  242.     end
  243.     if (getElementSpeed(hitElement, 2) > 40) then
  244.         outputChatBox(t(driver, "You are driving too fast. Slow down to under 64 kph (40 mph)."), driver, 255, 0, 0)
  245.         return false
  246.     end
  247.     if (getElementHealth(hitElement) / 10 < 95) then
  248.         outputChatBox(t(driver, "You need to fix your vehicle. It is below 95%%"), driver, 255, 0, 0)
  249.         outputChatBox(t(driver, "Go to first marker!"), driver, 255, 0, 0)
  250.         setElementVisibleTo(dMarker, driver, false)
  251.         setElementVisibleTo(dBlip, driver, false)
  252.         setElementVisibleTo(pMarker, driver, true)
  253.         setElementVisibleTo(pBlip, driver, true)
  254.         hit[driver] = false
  255.         if (trailer[hitElement]) then
  256.             destroyElement(trailer[hitElement])
  257.         end
  258.         delivering[driver] = nil
  259.         return true
  260.     end
  261.     local money = tonumber(events[6])
  262.     local soPlr = getAccountPlayer(getAccount(events[7]))
  263.     if (not soPlr) then
  264.         exports.CITaccounts:exportModifyCash(events[7], 0 - money)
  265.         exports.CITlogs:logSomething("Remove "..money.." from "..tostring(events[7]), "soevents", events[7])
  266.     else
  267.         exports.CITmoney:TPM(soPlr, money, "Gave event prize "..events[2])
  268.     end
  269.     if (not refundsCache[events[7]]) then
  270.         refundsCache[events[7]] = {}
  271.     end
  272.     if (money >= 50000) then
  273.         table.insert(refundsCache[events[7]], {events[2], money})
  274.     end
  275.     exports.CITmoney:GPM(driver, money, "Won at SO Event "..events[2], false)
  276.     exports.CITstateOfficial:addToSOAccLogs(events[7], getPlayerName(driver).." has delivered cargo at SO event and got $"..money)
  277.     local civs = getTeamFromName("Civilian Workers")
  278.     local civilians = getPlayersInTeam(civs)
  279.     delivering[driver] = nil
  280.     if (events[2] == "Delivery Clothes") then
  281.         outputChatBox(t(driver, "You delivered clothes successfully and won $%s", events[6]), driver, 0, 255, 0)
  282.         for k, plr2 in pairs(civilians) do
  283.             outputChatBox(getPlayerName(driver).." "..t(plr2, "delivered the clothes to Pull & Bear shop in State Official event and won $%s", money), plr2, 255, 167, 0)
  284.         end
  285.         removeMarkers(events[2])
  286.         return true
  287.     end
  288.     outputChatBox(t(driver, "You delivered glasses successfully and won $%s", money), driver, 0, 255, 0)
  289.     for k, plr2 in pairs(civilians) do
  290.         outputChatBox(getPlayerName(driver).." "..t(plr2, "delivered the glasses to IKEA shop in State Official event and won $%s", money), plr2, 255, 167, 0)
  291.     end
  292.     removeMarkers(events[2])
  293. end
  294.  
  295. function removeMarkers(typeEvent)
  296.     if (not pMarker) then
  297.         return false
  298.     end
  299.     if (timer) then
  300.         killTimer(timer)
  301.         timer = nil
  302.     end
  303.     eventStatus = false
  304.     if (typeEvent == "Mystery Box") then
  305.         removeEventHandler("onMarkerHit", pMarker, hitBag)
  306.         destroyElement(pMarker)
  307.         destroyElement(object)
  308.         events = {}
  309.         object = nil
  310.         pMarker = nil
  311.         return true
  312.     end
  313.     if (not dMarker) then
  314.         return false
  315.     end
  316.     if (typeEvent == "Delivery Clothes") then
  317.         removeEventHandler("onTrailerDetach", root, reattachTrailerDC)
  318.         for i, trail in pairs(trailer) do
  319.             if (isElement(trail)) then
  320.                 destroyElement(trail)
  321.             end
  322.         end
  323.     end
  324.     removeEventHandler("onMarkerHit", pMarker, pickupStuff)
  325.     removeEventHandler("onMarkerHit", dMarker, deliveryStuff)
  326.     removeEventHandler("onPlayerQuit", root, quitHandler)
  327.     removeEventHandler("onVehicleExit", root, exitVehicle)
  328.     removeEventHandler("onVehicleEnter", root, enterVehicle)
  329.     removeEventHandler("CITsoEvents.showMarker", root, showMarker)
  330. --  triggerClientEvent(root, "CITsoEvents.killProgressBar", root)
  331.     destroyElement(pMarker)
  332.     destroyElement(pBlip)
  333.     destroyElement(dMarker)
  334.     destroyElement(dBlip)
  335.     pMarker = nil
  336.     pBlip = nil
  337.     dMarker = nil
  338.     dBlip = nil
  339.     hit = {}
  340.     events = {}
  341.     trailer = {}
  342.     delivering = {}
  343. end
  344.  
  345. function showMarker()
  346.     if (#events == 0) then
  347.         return false
  348.     end
  349.     if (not pMarker or events[2] == "Mystery Box") then
  350.         return false
  351.     end
  352.     local text = "Deliver the glasses to IKEA!"
  353.     if (events[2] == "Delivery Clothes") then
  354.         text = "Deliver the clothes to Pull & Bear shop!"
  355.     end
  356.     setElementVisibleTo(dBlip, client, true)
  357.     outputChatBox(t(client, text), client, 0, 255, 0)
  358. end
  359. addEvent("CITsoEvents.showMarker", true)
  360.  
  361. -- For every mission
  362. function reattachTrailerDC(theTruck)
  363.     if (trailer[theTruck]) then
  364.         attachTrailerToVehicle(theTruck, trailer[theTruck])
  365.     end
  366. end
  367.  
  368. function quitHandler()
  369.     if (not events[1]) then
  370.         return false
  371.     end
  372.     if (trailer[getPedOccupiedVehicle(source)]) then
  373.         destroyElement(trailer[getPedOccupiedVehicle(source)])
  374.     end
  375.     local soPlr = getAccountPlayer(getAccount(events[7]))
  376.     if (getElementType(source) ~= "player" or not pMarker or typeEvent == "Mystery Box" or not soPlr) then
  377.         return false
  378.     end
  379.     if (source == soPlr) then
  380.         local text = "Event auto cancelled, "..getPlayerName(soPlr).." disconnected."
  381.         local civs = getTeamFromName("Civilian Workers")
  382.         local civilians = getPlayersInTeam(civs)
  383.         for k, plr2 in pairs(civilians) do
  384.             outputChatBox(t(plr2, "Event auto cancelled, %s disconnected.", getPlayerName(soPlr)), plr2, 255, 167, 0)
  385.         end
  386.         exports.CITstateOfficial:addToSOAccLogs(getAccount(events[7]), text)
  387.         removeMarkers(events[2])
  388.         return true
  389.     end
  390.     hit[source] = false
  391. end
  392.  
  393. function exitVehicle(plr)
  394.     local civs = getTeamFromName("Civilian Workers")
  395.     if (events[2] == "Mystery Box" or getPlayerTeam(plr) ~= civs or not delivering[plr] or not getElementData(plr, vehCancelExit)) then
  396.         return false
  397.     end
  398.     setElementFrozenDelay(source, false)
  399.     triggerClientEvent(plr, "CITsoEvents.killProgressBar", plr)
  400.     outputChatBox("Re-enter at your vehicle and re-do the mission.", plr, 255, 167, 0)
  401. end
  402.  
  403. function enterVehicle(plr)
  404.     local civs = getTeamFromName("Civilian Workers")
  405.     if (events[2] == "Mystery Box" or getPlayerTeam(plr) ~= civs or not delivering[plr] or not truckerVehicles[getElementModel(source)] and not deliveryVehicles[getElementModel(source)]) then
  406.         return false
  407.     end
  408.     hit[plr] = false
  409.     delivering[plr] = nil
  410.     setElementVisibleTo(dMarker, plr, false)
  411.     setElementVisibleTo(dBlip, plr, false)
  412.     setElementVisibleTo(pMarker, plr, true)
  413.     setElementVisibleTo(pBlip, plr, true)
  414.     if (trailer[source]) then
  415.         destroyElement(trailer[source])
  416.     end
  417.     outputChatBox(t(plr, "You lost the cargo. Go to first marker again."), plr, 255, 0, 0)
  418. end
  419.  
  420. function plrTeamChanged(newTeam)
  421.     if (not pMarker) then
  422.         return false
  423.     end
  424.     if (getTeamName(newTeam) == "Civilian Workers") then
  425.         outputChatBox(t(source, "State Official %s is hosting an event. Type '/soevent info' for more information!", events[1]), source, 255, 167, 0)
  426.         setElementVisibleTo(pMarker, source, true)
  427.         if (pBlip) then
  428.             setElementVisibleTo(pBlip, source, true)
  429.         end
  430.         if (delivering[source]) then
  431.             hit[source] = false
  432.             delivering[source] = nil
  433.             if (dMarker and isElementWithinMarker(driver, pMarker)) then
  434.                 triggerClientEvent(driver, "CITsoEvents.killProgressBar", driver)
  435.             end
  436.         end
  437.         return true
  438.     end
  439.     if (pMarker and isElementVisibleTo(pMarker, source)) then
  440.         setElementVisibleTo(pMarker, source, false)
  441.     end
  442.     if (pBlip and isElementVisibleTo(pBlip, source)) then
  443.         setElementVisibleTo(pBlip, source, false)
  444.     end
  445.     if (dMarker and isElementVisibleTo(dMarker, source)) then
  446.         setElementVisibleTo(dMarker, source, false)
  447.     end
  448.     if (dBlip and isElementVisibleTo(dBlip, source)) then
  449.         setElementVisibleTo(dBlip, source, false)
  450.     end
  451. end
  452. addEventHandler("onPlayerChangeTeam", root, plrTeamChanged)
  453.  
  454. function stopEvent()
  455.     if (not eventStatus or not pMarker) then
  456.         return false
  457.     end
  458.     local acc = getAccountName(getPlayerAccount(client))
  459.     local access = exports.CITstateOfficial:checkSOPermission(acc)
  460.     if (not access) then
  461.         return false
  462.     end
  463.     if (events[7] ~= acc and access:upper() == "SO") then
  464.         outputChatBox(t(client, "Only HSO/AHSO can stop civilian events."), client, 0, 255, 0)
  465.         return false
  466.     end
  467.     local text = getPlayerName(client).." has cancelled the State Officials event, "..events[2]
  468.     local civs = getTeamFromName("Civilian Workers")
  469.     local civilians = getPlayersInTeam(civs)
  470.     for k, plr2 in pairs(civilians) do
  471.         outputChatBox(getPlayerName(client).." "..t(plr2, "has cancelled the State Officials event, %s", events[2]), plr2, 255, 167, 0)
  472.     end
  473.     exports.CITstateOfficial:addToSOAccLogs(acc, text)
  474.     removeMarkers(events[2])
  475. end
  476. addEvent("CITsoEvents.stopEvent", true)
  477. addEventHandler("CITsoEvents.stopEvent", resourceRoot, stopEvent)
  478.  
  479. function giveRefund(plr, cmd, so) -- Denos: Allow refunds to SOs just like CEMs ~ Ryan#SK
  480.     local acc = getAccountName(getPlayerAccount(plr))
  481.     local access = exports.CITstateOfficial:checkSOPermission(acc)
  482.     if (tostring(access):lower() ~= "hso" or not so) then
  483.         return false
  484.     end
  485.     local refunds = refundsCache[so]
  486.     if (not refunds) then
  487.         outputChatBox(t(plr, "SO Refund ERROR: Could not find provided account in refunds cache."), plr, 200, 0, 0)
  488.         return false
  489.     end
  490.     local soPlr = getAccountPlayer(getAccount(so))
  491.     if (not soPlr) then
  492.         outputChatBox(t(plr, "SO Refund ERROR: %s is offline, could not process refund.", so), plr, 200, 0, 0)
  493.         return false
  494.     end
  495.     local refund = 0
  496.     for k, dat in ipairs(refunds) do
  497.         local msg = getPlayerName(plr).." refunding $"..dat[2].." to "..getPlayerName(soPlr).." for SO event: "..dat[1]
  498.         outputChatBox(msg, plr, 255, 167, 0)
  499.         outputChatBox(msg, soPlr, 255, 167, 0)
  500.         refund = refund + dat[2]
  501.     end
  502.     exports.CITmoney:GPM(soPlr, refund, "CITsoEvents refund", false)
  503.     exports.CITstateOfficial:addToSOAccLogs(acc, getPlayerName(plr).." has refunded $"..refund.." to "..getPlayerName(soPlr))
  504.     exports.CITstateOfficial:addToSOAccLogs(so, getPlayerName(plr).." has refunded $"..refund.." to "..getPlayerName(soPlr))
  505.     refundsCache[so] = nil
  506.     outputChatBox(#refundsCache.." "..t(plr, "refunds remaining in cache."), plr, 255, 167, 0)
  507. end
  508. addCommandHandler("sorefund", giveRefund)
  509.  
  510. -- MTA exports
  511. function getElementSpeed(theElement, unit)
  512.     local unit = unit == nil and 0 or ((not tonumber(unit)) and unit or tonumber(unit))
  513.     local mult = (unit == 0 or unit == "m/s") and 50 or ((unit == 1 or unit == "km/h") and 180 or 111.84681456)
  514.     return (Vector3(getElementVelocity(theElement)) * mult).length
  515. end
Advertisement
Add Comment
Please, Sign In to add comment