RyanUSNS

SO script fixed

Dec 27th, 2016
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 20.64 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("onElementDestroy", root, destroyVehicle)
  109.     removeEventHandler("onVehicleExplode", root, destroyVehicle)
  110.     removeEventHandler("CITsoEvents.showMarker", root, showMarker)
  111.     addEventHandler("onMarkerHit", pMarker, pickupStuff)
  112.     addEventHandler("onMarkerHit", dMarker, deliveryStuff)
  113.     addEventHandler("onPlayerQuit", root, quitHandler)
  114.     addEventHandler("onVehicleExit", root, exitVehicle)
  115.     addEventHandler("onElementDestroy", root, destroyVehicle)
  116.     addEventHandler("onVehicleExplode", root, destroyVehicle)
  117.     addEventHandler("CITsoEvents.showMarker", root, showMarker)
  118.     if (mission == "Delivery Clothes") then
  119.         removeEventHandler("onTrailerDetach", root, reattachTrailerDC)
  120.         addEventHandler("onTrailerDetach", root, reattachTrailerDC)
  121.     end
  122.     outputChatBox(t(client, "You created an event: %s", mission), client, 0, 255, 0)
  123.     startingEvent(getPlayerName(client))
  124.     exports.CITstateOfficial:addToSOAccLogs(acc, "Hosted Civilian event; "..mission)
  125.     eventStatus = true
  126.     timer = setTimer(cancelOutput, t2 * 60 * 1000, 0)
  127. end
  128. addEvent("CITsoEvents.startMission", true)
  129. addEventHandler("CITsoEvents.startMission", resourceRoot, startMission)
  130.  
  131. function hitBag(plr)
  132.     if (getElementType(plr) ~= "player") then
  133.         return false
  134.     end
  135.     local civs = getTeamFromName("Civilian Workers")
  136.     local soPlr = getAccountPlayer(getAccount(events[7]))
  137.     if (getPlayerTeam(plr) ~= civs or isPedInVehicle(plr) or plr == soPlr)then
  138.         return false
  139.     end
  140.     local money = tonumber(events[6])
  141.     exports.CITmoney:GPM(plr, tonumber(events[6]), "Won at SO Event "..events[2], false)
  142.     if (not soPlr) then
  143.         exports.CITaccounts:exportModifyCash(events[7], 0 - money)
  144.         exports.CITlogs:logSomething("Remove "..money.." from "..tostring(events[7]), "soevents", events[7])
  145.     else
  146.         exports.CITmoney:TPM(soPlr, money, "Gave SO event prize "..events[2])
  147.     end
  148.     if (not refundsCache[events[7]]) then
  149.         refundsCache[events[7]] = {}
  150.     end
  151.     table.insert(refundsCache[events[7]], {events[2], money})
  152.     outputChatBox(t(plr, "You found $%s from mystery box.", tostring(events[6])), plr, 0, 255, 0)
  153.     local civs = getTeamFromName("Civilian Workers")
  154.     local civilians = getPlayersInTeam(civs)
  155.     for k, plr2 in pairs(civilians) do
  156.         outputChatBox(getPlayerName(plr).." "..t(plr2, "found the mystery box placed by %s and got $%s", events[1], money), plr2, 255, 167, 0)
  157.     end
  158.     exports.CITstateOfficial:addToSOAccLogs(events[7], getPlayerName(plr).." has picked up mystery box and got $"..money)
  159.     removeMarkers(events[2])
  160. end
  161.  
  162. -- Delivery Clothes and Delivery Glassers.
  163. function pickupStuff(hitElement)
  164.     if (not hitElement or getElementType(hitElement) ~= "vehicle") then
  165.         return false
  166.     end
  167.     local driver = getVehicleController(hitElement)
  168.     if (not driver) then
  169.         return false
  170.     end
  171.     local civs = getTeamFromName("Civilian Workers")
  172.     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
  173.         return false
  174.     end
  175.     if (getElementSpeed(hitElement, 2) > 40) then
  176.         outputChatBox(t(driver, "You are driving too fast. Slow down to under 64 kph (40 mph)."), driver, 255, 0, 0)
  177.         return false
  178.     end
  179.     if (events[2] == "Delivery Clothes") then  
  180.         if (getElementModel(hitElement) == 435) then
  181.             return false
  182.         end
  183.         if (not truckerVehicles[getElementModel(hitElement)]) then
  184.             outputChatBox(t(driver, "You need a Trucker job vehicle!"), driver, 255, 0, 0)
  185.             return false
  186.         end
  187.         if (getVehicleTowedByVehicle(hitElement)) then
  188.             outputChatBox(t(driver, "You already have the trailer. If it is bugged, respawn the vehicle."), driver, 255, 0, 0)
  189.             return false
  190.         end
  191.         delivering[driver] = true
  192.         triggerClientEvent(driver, "CITsoEvents.addProgressBar", driver)
  193.         local x, y, z = getElementPosition(pMarker)
  194.         local rx, ry, rz = getElementRotation(hitElement)
  195.         trailer[hitElement] = createVehicle(435, x, y, z, rx, ry, rz)
  196.         attachTrailerToVehicle(hitElement, trailer[hitElement])
  197.         fixVehicle(hitElement)
  198.         hit[driver] = true
  199.         setElementVisibleTo(pMarker, driver, false)
  200.         setElementVisibleTo(pBlip, driver, false)
  201.         setElementVisibleTo(dMarker, driver, true)
  202.         setElementFrozen(hitElement, true)
  203.         setTimer(setElementFrozenDelay, 10000, 1, hitElement, false)
  204.         outputChatBox(t(driver, "Now deliver the stuff to next location marked in your map."), driver, 255, 167, 0)
  205.         return true
  206.     end
  207.     if (not deliveryVehicles[getElementModel(hitElement)])then
  208.         outputChatBox(t(driver, "You need a Delivery Man vehicle!"), driver, 255, 0, 0)
  209.         return false
  210.     end
  211.     delivering[driver] = true
  212.     triggerClientEvent(driver, "CITsoEvents.addProgressBar", driver)
  213.     hit[driver] = true
  214.     fixVehicle(hitElement)
  215.     setElementVisibleTo(pMarker, driver, false)
  216.     setElementVisibleTo(pBlip, driver, false)
  217.     setElementVisibleTo(dMarker, driver, true)
  218.     setElementVisibleTo(dBlip, driver, true)
  219.     setElementFrozen(hitElement, 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.     end
  228. end
  229.  
  230. function deliveryStuff(hitElement) 
  231.     if (not hitElement or getElementType(hitElement) ~= "vehicle") then
  232.         return false
  233.     end
  234.     local driver = getVehicleController(hitElement)
  235.     if (not driver) then
  236.         return false
  237.     end
  238.     local civs = getTeamFromName("Civilian Workers")
  239.     if (getPlayerTeam(driver) ~= civs or not isElementVisibleTo(dMarker, driver))then
  240.         return false
  241.     end
  242.     if (getElementSpeed(hitElement, 2) > 40) then
  243.         outputChatBox(t(driver, "You are driving too fast. Slow down to under 64 kph (40 mph)."), driver, 255, 0, 0)
  244.         return false
  245.     end
  246.     if (getElementHealth(hitElement) / 10 < 95) then
  247.         outputChatBox(t(driver, "You need to fix your vehicle. It is below 95%%"), driver, 255, 0, 0)
  248.         outputChatBox(t(driver, "Go to first marker!"), driver, 255, 0, 0)
  249.         setElementVisibleTo(dMarker, driver, false)
  250.         setElementVisibleTo(dBlip, driver, false)
  251.         setElementVisibleTo(pMarker, driver, true)
  252.         setElementVisibleTo(pBlip, driver, true)
  253.         hit[driver] = false
  254.         if (trailer[hitElement]) then
  255.             destroyElement(trailer[hitElement])
  256.         end
  257.         delivering[driver] = nil
  258.         return true
  259.     end
  260.     local money = tonumber(events[6])
  261.     local soPlr = getAccountPlayer(getAccount(events[7]))
  262.     if (not soPlr) then
  263.         exports.CITaccounts:exportModifyCash(events[7], 0 - money)
  264.         exports.CITlogs:logSomething("Remove "..money.." from "..tostring(events[7]), "soevents", events[7])
  265.     else
  266.         exports.CITmoney:TPM(soPlr, money, "Gave event prize "..events[2])
  267.     end
  268.     if (not refundsCache[events[7]]) then
  269.         refundsCache[events[7]] = {}
  270.     end
  271.     if (money >= 50000) then
  272.         table.insert(refundsCache[events[7]], {events[2], money})
  273.     end
  274.     exports.CITmoney:GPM(driver, money, "Won at SO Event "..events[2], false)
  275.     exports.CITstateOfficial:addToSOAccLogs(events[7], getPlayerName(driver).." has delivered cargo at SO event and got $"..money)
  276.     local civs = getTeamFromName("Civilian Workers")
  277.     local civilians = getPlayersInTeam(civs)
  278.     delivering[driver] = nil
  279.     if (events[2] == "Delivery Clothes") then
  280.         outputChatBox(t(driver, "You delivered clothes successfully and won $%s", events[6]), driver, 0, 255, 0)
  281.         for k, plr2 in pairs(civilians) do
  282.             outputChatBox(getPlayerName(driver).." "..t(plr2, "delivered the clothes to Pull & Bear shop in State Official event and won $%s", money), plr2, 255, 167, 0)
  283.         end
  284.         removeMarkers(events[2])
  285.         return true
  286.     end
  287.     outputChatBox(t(driver, "You delivered glasses successfully and won $%s", money), driver, 0, 255, 0)
  288.     for k, plr2 in pairs(civilians) do
  289.         outputChatBox(getPlayerName(driver).." "..t(plr2, "delivered the glasses to IKEA shop in State Official event and won $%s", money), plr2, 255, 167, 0)
  290.     end
  291.     removeMarkers(events[2])
  292. end
  293.  
  294. function removeMarkers(typeEvent)
  295.     if (not pMarker) then
  296.         return false
  297.     end
  298.     if (timer) then
  299.         killTimer(timer)
  300.         timer = nil
  301.     end
  302.     eventStatus = false
  303.     if (typeEvent == "Mystery Box") then
  304.         removeEventHandler("onMarkerHit", pMarker, hitBag)
  305.         destroyElement(pMarker)
  306.         destroyElement(object)
  307.         events = {}
  308.         object = nil
  309.         pMarker = nil
  310.         return true
  311.     end
  312.     if (not dMarker) then
  313.         return false
  314.     end
  315.     if (typeEvent == "Delivery Clothes") then
  316.         removeEventHandler("onTrailerDetach", root, reattachTrailerDC)
  317.         for i, trail in pairs(trailer) do
  318.             if (isElement(trail)) then
  319.                 destroyElement(trail)
  320.             end
  321.         end
  322.     end
  323.     removeEventHandler("onMarkerHit", pMarker, pickupStuff)
  324.     removeEventHandler("onMarkerHit", dMarker, deliveryStuff)
  325.     removeEventHandler("onPlayerQuit", root, quitHandler)
  326.     removeEventHandler("onVehicleExit", root, exitVehicle)
  327.     removeEventHandler("onElementDestroy", root, destroyVehicle)
  328.     removeEventHandler("onVehicleExplode", root, destroyVehicle)
  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]) then
  396.         return false
  397.     end
  398.     setElementVisibleTo(dMarker, plr, false)
  399.     setElementVisibleTo(dBlip, plr, false)
  400.     setElementVisibleTo(pMarker, plr, true)
  401.     setElementVisibleTo(pBlip, plr, true)
  402.     hit[plr] = false
  403.     delivering[plr] = nil
  404.     outputChatBox(t(plr, "You lost the cargo. Go to first marker again."), plr, 255, 0, 0)
  405.     if (trailer[source]) then
  406.         destroyElement(trailer[source])
  407.     end
  408. end
  409.  
  410. function destroyVehicle()
  411.     if (getElementType(source) ~= "vehicle") then
  412.         return false
  413.     end
  414.     local driver = getVehicleController(source)
  415.     local civs = getTeamFromName("Civilian Workers")
  416.     if (not driver or not events[2] or events[2] == "Mystery Box" or not delivering[driver] or getPlayerTeam(driver) ~= civs) then
  417.         return false
  418.     end
  419.     hit[driver] = false
  420.     delivering[driver] = nil
  421.     setElementVisibleTo(dMarker, driver, false)
  422.     setElementVisibleTo(dBlip, driver, false)
  423.     setElementVisibleTo(pMarker, driver, true)
  424.     setElementVisibleTo(pBlip, driver, true)
  425.     if (trailer[source]) then
  426.         destroyElement(trailer[source])
  427.     end
  428.     outputChatBox(t(driver, "You lost the cargo. Go to first marker again."), driver, 255, 0, 0)
  429.     if (dMarker and isElementWithinMarker(driver, pMarker)) then
  430.         triggerClientEvent(driver, "CITsoEvents.killProgressBar", driver)
  431.     end
  432. end
  433.  
  434. function plrTeamChanged(newTeam)
  435.     if (not pMarker) then
  436.         return false
  437.     end
  438.     if (getTeamName(newTeam) == "Civilian Workers") then
  439.         outputChatBox(t(source, "State Official %s is hosting an event. Type '/soevent info' for more information!", events[1]), source, 255, 167, 0)
  440.         setElementVisibleTo(pMarker, source, true)
  441.         if (pBlip) then
  442.             setElementVisibleTo(pBlip, source, true)
  443.         end
  444.         if (delivering[source]) then
  445.             hit[source] = false
  446.             delivering[source] = nil
  447.             if (dMarker and isElementWithinMarker(driver, pMarker)) then
  448.                 triggerClientEvent(driver, "CITsoEvents.killProgressBar", driver)
  449.             end
  450.         end
  451.         return true
  452.     end
  453.     if (pMarker and isElementVisibleTo(pMarker, source)) then
  454.         setElementVisibleTo(pMarker, source, false)
  455.     end
  456.     if (pBlip and isElementVisibleTo(pBlip, source)) then
  457.         setElementVisibleTo(pBlip, source, false)
  458.     end
  459.     if (dMarker and isElementVisibleTo(dMarker, source)) then
  460.         setElementVisibleTo(dMarker, source, false)
  461.     end
  462.     if (dBlip and isElementVisibleTo(dBlip, source)) then
  463.         setElementVisibleTo(dBlip, source, false)
  464.     end
  465. end
  466. addEventHandler("onPlayerChangeTeam", root, plrTeamChanged)
  467.  
  468. function stopEvent()
  469.     if (not eventStatus or not pMarker) then
  470.         return false
  471.     end
  472.     local acc = getAccountName(getPlayerAccount(client))
  473.     local access = exports.CITstateOfficial:checkSOPermission(acc)
  474.     if (not access) then
  475.         return false
  476.     end
  477.     if (events[7] ~= acc and access:upper() == "SO") then
  478.         outputChatBox(t(client, "Only HSO/AHSO can stop civilian events."), client, 0, 255, 0)
  479.         return false
  480.     end
  481.     local text = getPlayerName(client).." has cancelled the State Officials event, "..events[2]
  482.     local civs = getTeamFromName("Civilian Workers")
  483.     local civilians = getPlayersInTeam(civs)
  484.     for k, plr2 in pairs(civilians) do
  485.         outputChatBox(getPlayerName(client).." "..t(plr2, "has cancelled the State Officials event, %s", events[2]), plr2, 255, 167, 0)
  486.     end
  487.     exports.CITstateOfficial:addToSOAccLogs(acc, text)
  488.     removeMarkers(events[2])
  489. end
  490. addEvent("CITsoEvents.stopEvent", true)
  491. addEventHandler("CITsoEvents.stopEvent", resourceRoot, stopEvent)
  492.  
  493. function giveRefund(plr, cmd, so) -- Denos: Allow refunds to SOs just like CEMs ~ Ryan#SK
  494.     local acc = getAccountName(getPlayerAccount(plr))
  495.     local access = exports.CITstateOfficial:checkSOPermission(acc)
  496.     if (tostring(access):lower() ~= "hso" or not so) then
  497.         return false
  498.     end
  499.     local refunds = refundsCache[so]
  500.     if (not refunds) then
  501.         outputChatBox(t(plr, "SO Refund ERROR: Could not find provided account in refunds cache."), plr, 200, 0, 0)
  502.         return false
  503.     end
  504.     local soPlr = getAccountPlayer(getAccount(so))
  505.     if (not soPlr) then
  506.         outputChatBox(t(plr, "SO Refund ERROR: %s is offline, could not process refund.", so), plr, 200, 0, 0)
  507.         return false
  508.     end
  509.     local refund = 0
  510.     for k, dat in ipairs(refunds) do
  511.         local msg = getPlayerName(plr).." refunding $"..dat[2].." to "..getPlayerName(soPlr).." for SO event: "..dat[1]
  512.         outputChatBox(msg, plr, 255, 167, 0)
  513.         outputChatBox(msg, soPlr, 255, 167, 0)
  514.         refund = refund + dat[2]
  515.     end
  516.     exports.CITmoney:GPM(soPlr, refund, "CITsoEvents refund", false)
  517.     exports.CITstateOfficial:addToSOAccLogs(acc, getPlayerName(plr).." has refunded $"..refund.." to "..getPlayerName(soPlr))
  518.     exports.CITstateOfficial:addToSOAccLogs(so, getPlayerName(plr).." has refunded $"..refund.." to "..getPlayerName(soPlr))
  519.     refundsCache[so] = nil
  520.     outputChatBox(#refundsCache.." "..t(plr, "refunds remaining in cache."), plr, 255, 167, 0)
  521. end
  522. addCommandHandler("sorefund", giveRefund)
  523.  
  524. -- MTA exports
  525. function getElementSpeed(theElement, unit)
  526.     local unit = unit == nil and 0 or ((not tonumber(unit)) and unit or tonumber(unit))
  527.     local mult = (unit == 0 or unit == "m/s") and 50 or ((unit == 1 or unit == "km/h") and 180 or 111.84681456)
  528.     return (Vector3(getElementVelocity(theElement)) * mult).length
  529. end
Advertisement
Add Comment
Please, Sign In to add comment