RyanUSNS

SOEvents - Server

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