RyanUSNS

SOEvent_ServerSide

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