RyanUSNS

SOEvent Update v3.0 - Server

Apr 5th, 2018
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 35.36 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, timerBusDriver
  11. local hit, trailer, events, winnerTable, refundsCache, limitPlr, limitSO, savePosPlr, badPlrTimer, markTrailer = {}, {}, {}, {}, {}, {}, {}, {}, {}, {}
  12. local countLimit = 0
  13. local allowVeh = {
  14.     ["Delivery Clothes"] = {[403]=true, [515]=true, [514]=true},
  15.     ["Delivery Glasses"] = {[482]=true, [413]=true, [440]=true, [414]=true, [499]=true, [456]=true},
  16.     ["Delivery Fish"] = "Boat"
  17.     ["From Danger to Safety"] = {[431]=true, [437]=true},
  18.     ["Sick Person"] = {[416]=true, [458]=true},
  19. }
  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 startMission(mission, detail, reward, t2, px, py, pz, pb, dx, dy, dz, db)
  72.     local t2 = tonumber(t2) or 1
  73.     local acc = getAccountName(getPlayerAccount(client))
  74.     if (eventStatus) then
  75.         outputChatBox(t(client, "An event is already in progress."), client, 255, 0, 0)
  76.         return false
  77.     end
  78.     if (not tonumber(limitSO[1])) then
  79.         limitSO[1] = 0
  80.     end
  81.     if (not tonumber(limitSO[acc])) then
  82.         limitSO[acc] = 0
  83.     end
  84.     if (tonumber(limitSO[1]) + reward > 400000 or tonumber(limitSO[acc]) + reward > 100000) then
  85.         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)
  86.         return false
  87.     end
  88.     if (mission == "Mystery Box") then
  89.         pMarker = createMarker(px, py, pz, 'cylinder', 2, 255, 167, 0, 0)
  90.         object = createObject(2912, px, py, pz + 1.5, 0,0,0)
  91.         setElementFrozen(object, true)
  92.         events = {getPlayerName(client), mission, exports.CITmapMisc:getZoneName2(px, py, pz, true), exports.CITmapMisc:getZoneName2(px, py, pz), detail, reward, acc}
  93.         removeEventHandler("onMarkerHit", pMarker, hitBag)
  94.         removeEventHandler("onPlayerQuit", root, quitHandler)
  95.         addEventHandler("onMarkerHit", pMarker, hitBag)
  96.         addEventHandler("onPlayerQuit", root, quitHandler)
  97.         outputChatBox(t(client, "You created an Event: %s", mission), client, 0, 255, 0)
  98.         local civs = getTeamFromName("Civilian Workers")
  99.         local civilians = getPlayersInTeam(civs)
  100.         for k, plr2 in pairs(civilians) do
  101.             outputChatBox(t(plr2, "State Official %s is hosting an event. Type '/soevent info' for more information!", getPlayerName(client)), plr2, 255, 167, 0)
  102.         end
  103.         exports.CITstateOfficial:addToSOAccLogs(acc, "Hosted Civilian event; "..mission)
  104.         exports.CITlogs:logSomething("Hosted Civilian event; "..mission, "soevents", acc)
  105.         eventStatus = true
  106.         timer = setTimer(cancelOutput, t2 * 60 * 1000, 0)
  107.         return true
  108.     end
  109.     if (mission == "Awesome Bag") then
  110.         pMarker = createMarker(px, py, pz, "cylinder", 2, 255, 167, 0, 255, resourceRoot)
  111.         dMarker = createMarker(dx, dy, dz, "cylinder", 2, 255, 167, 0, 255, resourceRoot)
  112.         dBlip = createBlipAttachedTo(dMarker, db, 2, 255, 255, 255, 255, 0, 3000, resourceRoot)
  113.         events = {getPlayerName(client), mission, exports.CITmapMisc:getZoneName2(px, py, pz, true), exports.CITmapMisc:getZoneName2(px, py, pz), detail, reward, acc}
  114.         removeEventHandler("onMarkerHit", pMarker, hitSB)
  115.         removeEventHandler("onMarkerHit", dMarker, deliverySB)
  116.         removeEventHandler("onPlayerQuit", root, quitHandler)
  117.         removeEventHandler("onPlayerWasted", root, onPlrDies)
  118.         removeEventHandler("CITsoEvents.showMarker", root, showMarker)
  119.         addEventHandler("onMarkerHit", pMarker, hitSB)
  120.         addEventHandler("onMarkerHit", dMarker, deliverySB)
  121.         addEventHandler("onPlayerQuit", root, quitHandler)
  122.         addEventHandler("onPlayerWasted", root, onPlrDies)
  123.         addEventHandler("CITsoEvents.showMarker", root, showMarker)
  124.         outputChatBox(t(client, "You created an Event: %s", mission), client, 0, 255, 0)
  125.         local civs = getTeamFromName("Civilian Workers")
  126.         local civilians = getPlayersInTeam(civs)
  127.         for k, plr2 in ipairs(civilians) do
  128.             setElementVisibleTo(pMarker, plr2, true)
  129.             outputChatBox("State Official "..name.." is hosting an event. Type '/soevent info' for more information!", plr2, 255, 167, 0)
  130.         end
  131.         exports.CITstateOfficial:addToSOAccLogs(acc, "Hosted Civilian event; "..mission)
  132.         exports.CITlogs:logSomething("Hosted Civilian event; "..mission, "soevents", acc)
  133.         eventStatus = true
  134.         timer = setTimer(cancelOutput, t2 * 60 * 1000, 0)
  135.         return true
  136.     end
  137.     pMarker = createMarker(px, py, pz, "cylinder", 4, 255, 167, 0, 255, resourceRoot)
  138.     pBlip = createBlipAttachedTo(pMarker, pb, 2, 255, 255, 255, 255, 0, 3000, resourceRoot)
  139.     dMarker = createMarker(dx, dy, dz, "cylinder", 4, 255, 167, 0, 255, resourceRoot)
  140.     dBlip = createBlipAttachedTo(dMarker, db, 2, 255, 255, 255, 255, 0, 3000, resourceRoot)
  141.     events = {getPlayerName(client), mission, exports.CITmapMisc:getZoneName2(px, py, pz, true), exports.CITmapMisc:getZoneName2(px, py, pz), detail, reward, acc}
  142.     removeEventHandler("onMarkerHit", pMarker, pickupStuff)
  143.     removeEventHandler("onMarkerHit", dMarker, deliveryStuff)
  144.     removeEventHandler("onPlayerQuit", root, quitHandler)
  145.     removeEventHandler("onVehicleExit", root, exitVehicle)
  146.     removeEventHandler("onElementDestroy", root, destroyVehicle)
  147.     removeEventHandler("onVehicleExplode", root, destroyVehicle)
  148.     removeEventHandler("onPlayerWasted", root, onPlrDies)
  149.     removeEventHandler("CITsoEvents.showMarker", root, showMarker)
  150.     addEventHandler("onMarkerHit", pMarker, pickupStuff)
  151.     addEventHandler("onMarkerHit", dMarker, deliveryStuff)
  152.     addEventHandler("onPlayerQuit", root, quitHandler)
  153.     addEventHandler("onVehicleExit", root, exitVehicle)
  154.     addEventHandler("onElementDestroy", root, destroyVehicle)
  155.     addEventHandler("onVehicleExplode", root, destroyVehicle)
  156.     addEventHandler("onPlayerWasted", root, onPlrDies)
  157.     addEventHandler("CITsoEvents.showMarker", root, showMarker)
  158.     --[[if (mission == "Delivery Clothes") then
  159.         removeEventHandler("onTrailerDetach", root, reattachTrailerDC)
  160.         addEventHandler("onTrailerDetach", root, reattachTrailerDC)
  161.     end]]--
  162.     outputChatBox(t(client, "You created an event: %s", mission), client, 0, 255, 0)
  163.     local players = getPlayersInTeam(getTeamFromName("Civilian Workers"))
  164.     for k, plr2 in ipairs(players) do
  165.         setElementVisibleTo(pMarker, plr2, true)
  166.         setElementVisibleTo(pBlip, plr2, true)
  167.         outputChatBox("State Official "..name.." is hosting an event. Type '/soevent info' for more information!", plr2, 255, 167, 0)
  168.     end
  169.     exports.CITstateOfficial:addToSOAccLogs(acc, "Hosted Civilian event; "..mission)
  170.     exports.CITlogs:logSomething("Hosted Civilian event; "..mission, "soevents", acc)
  171.     eventStatus = true
  172.     timer = setTimer(cancelOutput, t2 * 60 * 1000, 0)
  173. end
  174. addEvent("CITsoEvents.startMission", true)
  175. addEventHandler("CITsoEvents.startMission", resourceRoot, startMission)
  176.  
  177. --Bag Event
  178. function hitBag(plr)
  179.     if (getElementType(plr) ~= "player") then
  180.         return false
  181.     end
  182.     local civs = getTeamFromName("Civilian Workers")
  183.     local soPlr = getAccountPlayer(getAccount(events[7]))
  184.     if (getPlayerTeam(plr) ~= civs or isPedInVehicle(plr) or plr == soPlr)then
  185.         return false
  186.     end
  187.     local serial = getPlayerSerial(plr)
  188.     local acc = getAccountName(getPlayerAccount(plr))
  189.     if (limitPlr[acc] or limitPlr[serial]) then
  190.         outputChatBox(t(plr, "You cannot participate this event. Try within 30 minutes"), plr, 255, 0, 0)
  191.         return false
  192.     end
  193.     local money = tonumber(events[6])
  194.     exports.CITmoney:GPM(plr, tonumber(events[6]), "Won at SO Event "..events[2], false)
  195.     if (not soPlr) then
  196.         exports.CITaccounts:exportModifyCash(events[7], 0 - money)
  197.         exports.CITlogs:logSomething("Remove "..money.." from "..tostring(events[7]), "soevents", events[7])
  198.     else
  199.         exports.CITmoney:TPM(soPlr, money, "Gave SO event prize "..events[2])
  200.     end
  201.     if (not refundsCache[events[7]]) then
  202.         refundsCache[events[7]] = {}
  203.     end
  204.     table.insert(refundsCache[events[7]], {events[2], money})
  205.     outputChatBox(t(plr, "You found $%s from mystery box.", tostring(events[6])), plr, 0, 255, 0)
  206.     local civs = getTeamFromName("Civilian Workers")
  207.     local civilians = getPlayersInTeam(civs)
  208.     for k, plr2 in pairs(civilians) do
  209.         outputChatBox(getPlayerName(plr).." "..t(plr2, "found the mystery box placed by %s and got $%s", events[1], money), plr2, 255, 167, 0)
  210.     end
  211.     exports.CITstateOfficial:addToSOAccLogs(events[7], getPlayerName(plr).." has picked up mystery box and got $"..money)
  212.     exports.CITlogs:logSomething(getPlayerName(plr).." has picked up mystery box and got $"..money, "soevents", events[7], plr)
  213.     removeMarkers(events[2], money, acc, serial)
  214. end
  215.  
  216. -- Awesome Bag (Briefcase)
  217. function hitSB(plr)
  218.     if (not plr or getElementType(plr) ~= "player" or isPedInVehicle(plr)) then
  219.         return false
  220.     end
  221.     local civs = getTeamFromName("Civilian Workers")
  222.     local soPlr = getAccountPlayer(getAccount(events[7]))
  223.     if (getPlayerTeam(plr) ~= civs or (not hit[plr] and not isElementVisibleTo(dMarker, plr) and isElementWithinMarker(plr, dMarker)) or (hit[plr] and isElementWithinPickup(plr, pMarker)) or plr = soPlr) then
  224.         return false
  225.     end
  226.     local serial = getPlayerSerial(plr)
  227.     local acc = getAccountName(getPlayerAccount(plr))
  228.     if (limitPlr[acc] or limitPlr[serial]) then
  229.         outputChatBox(t(plr, "You cannot participate this event. Try within 30 minutes"), plr, 255, 0, 0)
  230.         return false
  231.     end
  232.     triggerClientEvent(plr, "CITsoEvents.addProgressBar", plr)
  233.     hit[plr] = true
  234.     setElementVisibleTo(pMarker, plr, false)
  235.     setElementVisibleTo(dMarker, plr, true)
  236.     setElementFrozen(plr, true)
  237.     setTimer(setElementFrozenDelay, 10000, 1, plr, false)
  238.     outputChatBox("Now deliver the stuff to next location marked in your map.", plr, 255, 167, 0)
  239.     removeEventHandler("onPlayerVehicleEnter", plr, enterVehicle)
  240.     addEventHandler("onPlayerVehicleEnter", plr, enterVehicle)
  241. end
  242.  
  243. function deliverySB(plr)
  244.     if (not plr or getElementType(plr) ~= "player" or isPedInVehicle(plr)) then
  245.         return false
  246.     end
  247.     local civs = getTeamFromName("Civilian Workers")
  248.     if (getPlayerTeam(plr) ~= civs or not isElementVisibleTo(dMarker, plr))then
  249.         return false
  250.     end
  251.     local money = tonumber(events[6])
  252.     exports.CITmoney:GPM(plr, tonumber(events[6]), "Won at SO Event "..events[2], false)
  253.     if (not soPlr) then
  254.         exports.CITaccounts:exportModifyCash(events[7], 0 - money)
  255.         exports.CITlogs:logSomething("Remove "..money.." from "..tostring(events[7]), "soevents", events[7])
  256.     else
  257.         exports.CITmoney:TPM(soPlr, money, "Gave SO event prize "..events[2])
  258.     end
  259.     if (not refundsCache[events[7]]) then
  260.         refundsCache[events[7]] = {}
  261.     end
  262.     table.insert(refundsCache[events[7]], {events[2], money})
  263.     outputChatBox("You deliveried a lost bag and you got $"..money..".", plr, 0, 255, 0)
  264.     local civilians = getPlayersInTeam(civs)
  265.     for k, plr2 in pairs(civilians) do
  266.         outputChatBox(getPlayerName(plr).." found the lost bag and deliveried to "..events[1].." and got $"..money, plr2, 255, 167, 0)
  267.     end
  268.     exports.CITstateOfficial:addToSOAccLogs(events[7], getPlayerName(plr).." has picked up mystery box and got $"..money)
  269.     removeMarkers(events[2], money, plr, serial)
  270. end
  271.  
  272. function enterVehicle()
  273.     removePedFromVehicle(source)
  274.     outputChatBox("You are not allowed to enter on vehicle while you are in event!", source, 255, 0, 0)
  275. end
  276.  
  277. function checkBadPlrs(plr)
  278.     local x, y, z = getElementPosition(plr)
  279.     if (doesPedHaveJetPack(plr) or (savePosPlr[plr] and getDistanceBetweenPoints2D(x, y, savePosPlr[plr][1], savePosPlr[plr][2]) > 20)) then
  280.         outputChatBox(t(plr, "You are trying to cheat. The bag will be destroyed."), plr, 255, 0, 0)
  281.         killTimer(badPlrTimer[plr])
  282.         badPlrTimer[plr] = nil
  283.         hit[plr] = nil
  284.         setElementVisibleTo(pMarker, plr, true)
  285.         setElementVisibleTo(dMarker, plr, false)
  286.         setElementVisibleTo(dBlip, plr, false)
  287.         removeEventHandler("onPlayerVehicleEnter", plr, enterVehicle)
  288.         return true
  289.     end
  290.     savePosPlr[plr] = {x, y, z}
  291. end
  292.  
  293. -- Delivery Clothes, Delivery Glassers, Delivery Fish and From Danger to Safety
  294. function pickupStuff(hitElement)
  295.     if (not hitElement or getElementType(hitElement) ~= "vehicle" or not dMarker) then
  296.         return false
  297.     end
  298.     local driver = getVehicleController(hitElement)
  299.     if (not driver) then
  300.         return false
  301.     end
  302.     local civs = getTeamFromName("Civilian Workers")
  303.     local soPlr = getAccountPlayer(getAccount(events[7]))
  304.     if (soPlr == driver or getPlayerTeam(driver) ~= civs or (not hit[driver] and not isElementVisibleTo(dMarker, driver) and isElementWithinMarker(driver, dMarker)) or (hit[driver] and isElementWithinMarker(driver, pMarker)))then
  305.         return false
  306.     end
  307.     if (getElementSpeed(hitElement, 2) > 40) then
  308.         outputChatBox(t(driver, "You are driving too fast. Slow down to under 64 kph (40 mph)."), driver, 255, 0, 0)
  309.         return false
  310.     end
  311.     local serial = getPlayerSerial(driver)
  312.     local acc = getAccountName(getPlayerAccount(driver))
  313.     if (limitPlr[acc] or limitPlr[serial]) then
  314.         outputChatBox(t(driver, "You cannot participate this event. Try within 30 minutes"), driver, 255, 0, 0)
  315.         return false
  316.     end
  317.     if (events[2] == "Delivery Clothes") then  
  318.         if (getElementModel(hitElement) == 435) then
  319.             return false
  320.         end
  321.         if (not truckerVehicles[getElementModel(hitElement)]) then
  322.             outputChatBox(t(driver, "You need a Trucker job vehicle!"), driver, 255, 0, 0)
  323.             return false
  324.         end
  325.         if (getVehicleTowedByVehicle(hitElement)) then
  326.             outputChatBox(t(driver, "You already have the trailer. If it is bugged, respawn the vehicle."), driver, 255, 0, 0)
  327.             return false
  328.         end
  329.         triggerClientEvent(driver, "CITsoEvents.addProgressBar", driver)
  330.         local x, y, z = getElementPosition(pMarker)
  331.         local rx, ry, rz = getElementRotation(hitElement)
  332.         trailer[hitElement] = createVehicle(435, x, y, z, rx, ry, rz)
  333.         attachTrailerToVehicle(hitElement, trailer[hitElement])
  334.         fixVehicle(hitElement)
  335.         hit[driver] = true
  336.         setElementVisibleTo(pMarker, driver, false)
  337.         setElementVisibleTo(pBlip, driver, false)
  338.         setElementVisibleTo(dMarker, driver, true)
  339.         setElementFrozen(hitElement, true)
  340.         setTimer(setElementFrozenDelay, 10000, 1, hitElement, false)
  341.         outputChatBox(t(driver, "Now deliver the stuff to next location marked in your map."), driver, 255, 167, 0)
  342.         return true
  343.     end
  344.     if (typeEvent == "Delivery Fish") then
  345.         if (getVehicleType(hitElement) ~= allowVeh[typeEvent]) then
  346.             outputChatBox(t(driver, "You need a boat!"), driver, 255, 0, 0)
  347.             return false
  348.         end
  349.         triggerClientEvent(driver, "CITsoEvents.addProgressBar", driver)
  350.         hit[driver] = true
  351.         fixVehicle(hitElement)
  352.         setElementVisibleTo(pMarker, driver, false)
  353.         setElementVisibleTo(pBlip, driver, false)
  354.         setElementVisibleTo(dMarker, driver, true)
  355.         setElementFrozen(hitElement, true)
  356.         setTimer(setElementFrozenDelay, 10000, 1, hitElement, false)
  357.         outputChatBox(t(driver, "Now deliver the stuff to next location marked in your map."), driver, 255, 167, 0)
  358.         return true
  359.     end
  360.     if (typeEvent == "From Danger to Safety") then
  361.         if (not allowVeh[typeEvent][getElementModel(hitElement)]) then
  362.             outputChatBox(t(driver, "You need a Bus Driver job vehicle!"), driver, 255, 0, 0)
  363.             return false
  364.         end
  365.         if (winnerTable[driver]) then
  366.             outputChatBox(t(driver, "You already finished the event. Wait for few seconds for get the winner!"), driver, 255, 0, 0)
  367.             return false
  368.         end
  369.         triggerClientEvent(driver, "CITsoEvents.addProgressBar", driver)
  370.         hit[driver] = true
  371.         fixVehicle(hitElement)
  372.         setElementVisibleTo(pMarker, driver, false)
  373.         setElementVisibleTo(pBlip, driver, false)
  374.         setElementVisibleTo(dMarker, driver, true)
  375.         setElementFrozen(hitElement, true)
  376.         setTimer(setElementFrozenDelay, 10000, 1, hitElement, false)
  377.         outputChatBox(t(driver, "Now deliver the stuff to next location marked in your map."), driver, 255, 167, 0)
  378.         return true
  379.     end
  380.     if (not deliveryVehicles[getElementModel(hitElement)])then
  381.         outputChatBox(t(driver, "You need a Delivery Man vehicle!"), driver, 255, 0, 0)
  382.         return false
  383.     end
  384.     triggerClientEvent(driver, "CITsoEvents.addProgressBar", driver)
  385.     hit[driver] = true
  386.     fixVehicle(hitElement)
  387.     setElementVisibleTo(pMarker, driver, false)
  388.     setElementVisibleTo(pBlip, driver, false)
  389.     setElementVisibleTo(dMarker, driver, true)
  390.     setElementFrozen(hitElement, true)
  391.     setTimer(setElementFrozenDelay, 10000, 1, hitElement, false)
  392.     outputChatBox(t(driver, "Now deliver the stuff to next location marked in your map."), driver, 255, 167, 0)
  393. end
  394.  
  395. function setElementFrozenDelay(element, bool)
  396.     if (isElement(element)) then
  397.         setElementFrozen(element, bool)
  398.     end
  399. end
  400.  
  401. function deliveryStuff(hitElement) 
  402.     if (not hitElement or getElementType(hitElement) ~= "vehicle") then
  403.         return false
  404.     end
  405.     local driver = getVehicleController(hitElement)
  406.     if (not driver) then
  407.         return false
  408.     end
  409.     local civs = getTeamFromName("Civilian Workers")
  410.     if (getPlayerTeam(driver) ~= civs or not isElementVisibleTo(dMarker, driver))then
  411.         return false
  412.     end
  413.     if (getElementSpeed(hitElement, 2) > 40) then
  414.         outputChatBox(t(driver, "You are driving too fast. Slow down to under 64 kph (40 mph)."), driver, 255, 0, 0)
  415.         return false
  416.     end
  417.     local serial = getPlayerSerial(driver)
  418.     local acc = getAccountName(getPlayerAccount(driver))
  419.     if (limitPlr[acc] or limitPlr[serial]) then
  420.         outputChatBox(t(driver, "You cannot participate this event. Try within 30 minutes"), driver, 255, 0, 0)
  421.         return false
  422.     end
  423.     if (getElementHealth(hitElement) / 10 < 95) then
  424.         outputChatBox(t(driver, "You need to fix your vehicle. It is below 95%%"), driver, 255, 0, 0)
  425.         outputChatBox(t(driver, "Go to first marker!"), driver, 255, 0, 0)
  426.         setElementVisibleTo(dMarker, driver, false)
  427.         setElementVisibleTo(dBlip, driver, false)
  428.         setElementVisibleTo(pMarker, driver, true)
  429.         setElementVisibleTo(pBlip, driver, true)
  430.         hit[driver] = false
  431.         if (trailer[hitElement]) then
  432.             destroyElement(trailer[hitElement])
  433.         end
  434.         trailer[hitElement] = nil
  435.         return true
  436.     end
  437.     if (events[2] == "From Danger to Safety") then
  438.         if (not timerBusDriver) then
  439.             timerBusDriver = setTimer(getWinners, 90000, 1)
  440.         end
  441.         local accPlr = getAccountName(getPlayerAccount(driver))
  442.         if (not winnerTable[accPlr]) then
  443.             winnerTable[accPlr] = {0, getPlayerSerial(driver)}
  444.         end
  445.         winnerTable[accPlr][1] = getElementHealth(hitElement) / 10
  446.         setElementVisibleTo(dMarker, driver, false)
  447.         setElementVisibleTo(dBlip, driver, false)
  448.         outputChatBox(t(driver, "Wait few seconds. You are in winner Table."), driver, 0, 255, 0)
  449.         return true
  450.     end
  451.     local money = tonumber(events[6])
  452.     if (not money) then
  453.         outputChatBox("deliveryStuff: money is nil", driver)
  454.         return false
  455.     end
  456.     local soPlr = getAccountPlayer(getAccount(events[7]))
  457.     if (not soPlr) then
  458.         exports.CITaccounts:exportModifyCash(events[7], 0 - money)
  459.         exports.CITlogs:logSomething("Remove "..money.." from "..tostring(events[7]), "soevents", events[7])
  460.     else
  461.         exports.CITmoney:TPM(soPlr, money, "Gave event prize "..events[2])
  462.     end
  463.     if (not refundsCache[events[7]]) then
  464.         refundsCache[events[7]] = {}
  465.     end
  466.     table.insert(refundsCache[events[7]], {events[2], money})
  467.     exports.CITmoney:GPM(driver, money, "Won at SO Event "..events[2], false)
  468.     exports.CITstateOfficial:addToSOAccLogs(events[7], getPlayerName(driver).." has delivered cargo at SO event and got $"..money)
  469.     exports.CITlogs:logSomething(getPlayerName(driver).." has delivered cargo at SO event and got $"..money, "soevents", events[7], driver)
  470.     local civs = getTeamFromName("Civilian Workers")
  471.     local civilians = getPlayersInTeam(civs)
  472.     if (events[2] == "Delivery Clothes") then
  473.         outputChatBox(t(driver, "You delivered clothes successfully and won $%s", events[6]), driver, 0, 255, 0)
  474.         for k, plr2 in pairs(civilians) do
  475.             outputChatBox(getPlayerName(driver).." "..t(plr2, "delivered the clothes to Pull & Bear shop in State Official event and won $%s", money), plr2, 255, 167, 0)
  476.         end
  477.         removeMarkers(events[2], money, acc, serial)
  478.         return true
  479.     end
  480.     if (events[2] == "Delivery Fish") then
  481.         outputChatBox(t(driver, "You delivered fish successfully and won $%s", events[6]), driver, 0, 255, 0)
  482.         for k, plr2 in pairs(civilians) do
  483.             outputChatBox(getPlayerName(driver).." "..t(plr2, "delivered the fish to fish market in State Official event and won $%s", money), plr2, 255, 167, 0)
  484.         end
  485.         removeMarkers(events[2], money, driver, serial)
  486.         return true
  487.     end
  488.     outputChatBox(t(driver, "You delivered glasses successfully and won $%s", money), driver, 0, 255, 0)
  489.     for k, plr2 in pairs(civilians) do
  490.         outputChatBox(getPlayerName(driver).." "..t(plr2, "delivered the glasses to IKEA shop in State Official event and won $%s", money), plr2, 255, 167, 0)
  491.     end
  492.     removeMarkers(events[2], money, acc, serial)
  493. end
  494.  
  495. function getWinners()
  496.     local sortTable = {}
  497.     for acc, val in pairs(winnerTable) do
  498.         sortTable[#sortTable + 1] = {acc, val[1], val[2]}
  499.     end
  500.     table.sort(sortTable, sortMyTable)
  501.     local winnerAcc = sortTable[1][1]
  502.     local winnerSerial = sortTable[1][3]
  503.     local winnerPlr = getAccountPlayer(getAccount(winnerAcc))
  504.     local soPlr = getAccountPlayer(getAccount(events[7]))
  505.     local lastName = exports.CITaccounts:getLastUsedName(winnerAcc)
  506.     local money = tonumber(events[6])
  507.     if (not money) then
  508.         outputChatBox("deliveryStuff: money is nil", driver)
  509.         return false
  510.     end
  511.     if (not soPlr) then
  512.         exports.CITaccounts:exportModifyCash(events[7], 0 - money)
  513.         exports.CITlogs:logSomething("Remove "..money.." from "..tostring(events[7]), "soevents", events[7])
  514.     else
  515.         exports.CITmoney:TPM(soPlr, money, "Gave event prize "..events[2])
  516.     end
  517.     if (not refundsCache[events[7]]) then
  518.         refundsCache[events[7]] = {}
  519.     end
  520.     table.insert(refundsCache[events[7]], {events[2], money})
  521.     if (not winnerPlr) then
  522.         exports.CITaccounts:exportModifyCash(events[7], money)
  523.         exports.CITlogs:logSomething("Added "..money.." from "..tostring(events[7]), "soevents", winnerAcc)
  524.     else
  525.         exports.CITmoney:GPM(winnerPlr, money, "Won at SO Event "..events[2], false)
  526.     end
  527.     exports.CITstateOfficial:addToSOAccLogs(events[7], lastName[1].." has delivered cargo at SO event and got $"..money)
  528.     if (winnerPlr) then
  529.         outputChatBox(t(winnerPlr, "You delivered people from dangerous to safe zone and won $%s", events[6]), winnerPlr, 0, 255, 0)
  530.     end
  531.     local civilians = getPlayersInTeam(getTeamFromName("Civilian Workers"))
  532.     for k, plr2 in pairs(civilians) do
  533.         outputChatBox(lastName[1].."  "..t(plr2, "delivered people from dangerous to safe zone in State Official event and won $%s", money), plr2, 255, 167, 0)
  534.     end
  535.     removeMarkers(events[2], money, winnerAcc, winnerSerial)
  536. end
  537.  
  538. function sortMyTable(a, b)
  539.     return a[2] > b[2]
  540. end
  541.  
  542. -- For every mission
  543. function removeMarkers(typeEvent, cash, acc, serial)
  544.     if (not pMarker) then
  545.         return false
  546.     end
  547.     if (timer) then
  548.         killTimer(timer)
  549.         timer = nil
  550.     end
  551.     eventStatus = false
  552.     if (cash and acc and serial and events[7]) then
  553.         limitSO[1] = limitSO[1] + cash
  554.         limitSO[events[7]] = (limitSO[events[7]] or 0) + cash
  555.         limitPlr[acc] = true
  556.         limitPlr[serial] = true
  557.     end
  558.     if (typeEvent == "Mystery Box") then
  559.         removeEventHandler("onMarkerHit", pMarker, hitBag)
  560.         destroyElement(pMarker)
  561.         destroyElement(object)
  562.         events = {}
  563.         object = nil
  564.         pMarker = nil
  565.         return true
  566.     end
  567.     if (not dMarker) then
  568.         return false
  569.     end
  570.     if (typeEvent == "Delivery Clothes") then
  571.         --removeEventHandler("onTrailerDetach", root, reattachTrailerDC)
  572.         for i, trail in pairs(trailer) do
  573.             if (isElement(trail)) then
  574.                 destroyElement(trail)
  575.             end
  576.             trailer[i] = nil
  577.         end
  578.         markTrailer = {}
  579.     end
  580.     if (typeEvent == "Awesome Bag") then
  581.         removeEventHandler("onPickupHit", pMarker, hitSB)
  582.         removeEventHandler("onMarkerHit", dMarker, deliverySB)
  583.         removeEventHandler("onPlayerQuit", root, quitHandler)
  584.         removeEventHandler("onPlayerWasted", root, onPlrDies)
  585.         destroyElement(pMarker)
  586.         destroyElement(dMarker)
  587.         destroyElement(dBlip)
  588.         for civ, bool in pairs(hit) do
  589.             if (civ) then
  590.                 if (badPlrTimer[civ]) then
  591.                     killTimer(badPlrTimer[civ])
  592.                 end
  593.                 removeEventHandler("onPlayerVehicleEnter", civ, enterVehicle)
  594.             end
  595.         end
  596.         badPlrTimer = {}
  597.         savePosPlr = {}
  598.         hit = {}
  599.         events = {}
  600.         pMarker = nil
  601.         dMarker = nil
  602.         dBlip = nil
  603.         return true
  604.     end
  605.     removeEventHandler("onMarkerHit", pMarker, pickupStuff)
  606.     removeEventHandler("onMarkerHit", dMarker, deliveryStuff)
  607.     removeEventHandler("onPlayerQuit", root, quitHandler)
  608.     removeEventHandler("onVehicleExit", root, exitVehicle)
  609.     removeEventHandler("onElementDestroy", root, destroyVehicle)
  610.     removeEventHandler("onVehicleExplode", root, destroyVehicle)
  611.     removeEventHandler("CITsoEvents.showMarker", root, showMarker)
  612. --  triggerClientEvent(root, "CITsoEvents.killProgressBar", root)
  613.     removeEventHandler("onPlayerWasted", root, onPlrDies)
  614.     destroyElement(pMarker)
  615.     destroyElement(pBlip)
  616.     destroyElement(dMarker)
  617.     destroyElement(dBlip)
  618.     pMarker = nil
  619.     pBlip = nil
  620.     dMarker = nil
  621.     dBlip = nil
  622.     hit = {}
  623.     events = {}
  624.     trailer = {}
  625. end
  626.  
  627. function showMarker()
  628.     if (#events == 0) then
  629.         return false
  630.     end
  631.     if (not pMarker or events[2] == "Mystery Box") then
  632.         return false
  633.     end
  634.     local text = "Deliver the glasses to IKEA!"
  635.     if (events[2] == "Delivery Clothes") then
  636.         text = "Deliver the clothes to Pull & Bear shop!"
  637.     end
  638.     if (events[2] == "Delivery Fish") then
  639.         text = "Deliver the fish to fish market!"
  640.     end
  641.     if (events[2] == "From Danger to Safety") then
  642.         text = "Deliver people to safe zone!"
  643.     end
  644.     if (events[2] == "Awesome Bag") then
  645.         text = "Deliver bag to Civilian HQ"
  646.         badPlrTimer[client] = setTimer(checkBadPlrs, 1000, 0, client)
  647.     end
  648.     setElementVisibleTo(dBlip, client, true)
  649.     outputChatBox(t(client, texy), client, 0, 255, 0)
  650. end
  651. addEvent("CITsoEvents.showMarker", true)
  652.  
  653. --[[function reattachTrailerDC(theTruck)
  654.     if (trailer[theTruck]) then
  655.         attachTrailerToVehicle(theTruck, trailer[theTruck])
  656.     end
  657. end]]--
  658.  
  659. function onAttachTrailerDC(theTruck)
  660.     local driver = getVehicleController(theTruck)
  661.     if (markTrailer[driver]) then
  662.         destroyElement(markTrailer[driver])
  663.         markTrailer[driver] = nil
  664.         setElementVisibleTo(dMarker, driver, true)
  665.         setElementVisibleTo(dBlip, driver, true)
  666.         outputChatBox(t(driver, "You already got the trailer. Now delivery it!"), driver, 0, 255, 0)
  667.     end
  668. end
  669.  
  670.  
  671. function quitHandler()
  672.     if (not events[1]) then
  673.         return false
  674.     end
  675.     local veh = getPedOccupiedVehicle(source)
  676.     if (trailer[veh]) then
  677.         destroyElement(trailer[veh])
  678.         trailer[veh] = nil
  679.     end
  680.     local soPlr = getAccountPlayer(getAccount(events[7]))
  681.     if (getElementType(source) ~= "player" or not pMarker or not soPlr) then
  682.         return false
  683.     end
  684.     if (source == soPlr) then
  685.         local text = "Event auto cancelled, "..getPlayerName(soPlr).." disconnected."
  686.         local civs = getTeamFromName("Civilian Workers")
  687.         local civilians = getPlayersInTeam(civs)
  688.         for k, plr2 in pairs(civilians) do
  689.             outputChatBox(t(plr2, "Event auto cancelled, %s disconnected.", getPlayerName(soPlr)), plr2, 255, 167, 0)
  690.         end
  691.         exports.CITstateOfficial:addToSOAccLogs(getAccount(events[7]), text)
  692.         exports.CITlogs:logSomething(text, "soevents", events[7])
  693.         removeMarkers(events[2])
  694.         return true
  695.     end
  696.     hit[source] = false
  697. end
  698.  
  699. function exitVehicle(plr)
  700.     local civs = getTeamFromName("Civilian Workers")
  701.     if (events[2] == "Mystery Box" or events[2] == "Awesome Bag" or getPlayerTeam(plr) ~= civs or not hit[plr]) then
  702.         return false
  703.     end
  704.     setElementVisibleTo(dMarker, plr, false)
  705.     setElementVisibleTo(dBlip, plr, false)
  706.     setElementVisibleTo(pMarker, plr, true)
  707.     setElementVisibleTo(pBlip, plr, true)
  708.     hit[plr] = false
  709.     outputChatBox(t(plr, "You lost the cargo. Go to first marker again."), plr, 255, 0, 0)
  710.     if (trailer[source]) then
  711.         destroyElement(trailer[source])
  712.         trailer[source] = nil
  713.     end
  714. end
  715.  
  716. function destroyVehicle()
  717.     if (getElementType(source) ~= "vehicle") then
  718.         return false
  719.     end
  720.     local driver = getVehicleController(source)
  721.     local civs = getTeamFromName("Civilian Workers")
  722.     if (not driver or not events[2] or events[2] == "Mystery Box" or events[2] == "Awesome Bag" or not hit[driver] or getPlayerTeam(driver) ~= civs) then
  723.         return false
  724.     end
  725.     hit[driver] = false
  726.     setElementVisibleTo(dMarker, driver, false)
  727.     setElementVisibleTo(dBlip, driver, false)
  728.     setElementVisibleTo(pMarker, driver, true)
  729.     setElementVisibleTo(pBlip, driver, true)
  730.     if (trailer[source]) then
  731.         destroyElement(trailer[source])
  732.         trailer[source] = nil
  733.     end
  734.     outputChatBox(t(driver, "You lost the cargo. Go to first marker again."), driver, 255, 0, 0)
  735.     if (dMarker and isElementWithinMarker(driver, pMarker)) then
  736.         triggerClientEvent(driver, "CITsoEvents.killProgressBar", driver)
  737.     end
  738. end
  739.  
  740. function onPlrDies()
  741.     local civs = getTeamFromName("Civilian Workers")
  742.     if (events[2] == "Mystery Box" or getPlayerTeam(source) ~= civs or not hit[source]) then
  743.         return false
  744.     end
  745.     if (events[2] == "Awesome Bag") then
  746.         hit[source] = false
  747.         setElementVisibleTo(dMarker, source, false)
  748.         setElementVisibleTo(dBlip, source, false)
  749.         setElementVisibleTo(pMarker, source, true)
  750.         outputChatBox(t(source, "You lost the Bag. Go to first marker again."), source, 255, 0, 0)
  751.         return true
  752.     end
  753.     local veh = getPedOccupiedVehicle(source)
  754.     hit[source] = false
  755.     setElementVisibleTo(dMarker, source, false)
  756.     setElementVisibleTo(dBlip, source, false)
  757.     setElementVisibleTo(pMarker, source, true)
  758.     setElementVisibleTo(pBlip, source, true)
  759.     if (trailer[veh]) then
  760.         destroyElement(trailer[veh])
  761.         trailer[source] = nil
  762.     end
  763.     outputChatBox(t(source, "You lost the cargo. Go to first marker again."), source, 255, 0, 0)
  764. end
  765.  
  766. function plrTeamChanged(newTeam)
  767.     if (not pMarker) then
  768.         return false
  769.     end
  770.     if (getTeamName(newTeam) == "Civilian Workers") then
  771.         outputChatBox(t(source, "State Official %s is hosting an event. Type '/soevent info' for more information!", events[1]), source, 255, 167, 0)
  772.         if (events[2] ~= "Mystery Box") then
  773.             setElementVisibleTo(pMarker, source, true)
  774.         end
  775.         if (pBlip) then
  776.             setElementVisibleTo(pBlip, source, true)
  777.         end
  778.         if (hit[source]) then
  779.             hit[source] = false
  780.             if (dMarker and isElementWithinMarker(driver, pMarker)) then
  781.                 triggerClientEvent(driver, "CITsoEvents.killProgressBar", driver)
  782.             end
  783.         end
  784.     end
  785.     if (pMarker and isElementVisibleTo(pMarker, source)) then
  786.         setElementVisibleTo(pMarker, source, false)
  787.     end
  788.     if (pBlip and isElementVisibleTo(pBlip, source)) then
  789.         setElementVisibleTo(pBlip, source, false)
  790.     end
  791.     if (dMarker and isElementVisibleTo(dMarker, source)) then
  792.         setElementVisibleTo(dMarker, source, false)
  793.     end
  794.     if (dBlip and isElementVisibleTo(dBlip, source)) then
  795.         setElementVisibleTo(dBlip, source, false)
  796.     end
  797. end
  798. addEventHandler("onPlayerChangeTeam", root, plrTeamChanged)
  799.  
  800. function stopEvent()
  801.     if (not eventStatus or not pMarker) then
  802.         return false
  803.     end
  804.     local acc = getAccountName(getPlayerAccount(client))
  805.     local access = exports.CITstateOfficial:checkSOPermission(acc)
  806.     if (not access) then
  807.         return false
  808.     end
  809.     if (events[7] ~= acc and access:upper() == "SO") then
  810.         outputChatBox(t(client, "Only HSO/AHSO can stop civilian events."), client, 0, 255, 0)
  811.         return false
  812.     end
  813.     local text = getPlayerName(client).." has cancelled the State Officials event, "..events[2]
  814.     local civs = getTeamFromName("Civilian Workers")
  815.     local civilians = getPlayersInTeam(civs)
  816.     for k, plr2 in pairs(civilians) do
  817.         outputChatBox(getPlayerName(client).." "..t(plr2, "has cancelled the State Officials event, %s", events[2]), plr2, 255, 167, 0)
  818.     end
  819.     exports.CITstateOfficial:addToSOAccLogs(acc, text)
  820.     exports.CITlogs:logSomething(text, "soevents", events[7])
  821.     removeMarkers(events[2])
  822. end
  823. addEvent("CITsoEvents.stopEvent", true)
  824. addEventHandler("CITsoEvents.stopEvent", resourceRoot, stopEvent)
  825.  
  826. function refreshLimit()
  827.     countLimit = countLimit + 1
  828.     if (countLimit == 2 and tonumber(limitSO[1])) then
  829.         countLimit = 0
  830.         limitSO = {}
  831.         limitSO[1] = 0
  832.     end
  833.     limitPlr = {}
  834. end
  835. setTimer(refreshLimit, 1800000, 0)
  836.  
  837. function giveRefund(plr, cmd, so) -- Denos: Allow refunds to SOs just like CEMs ~ Ryan#SK
  838.     local acc = getAccountName(getPlayerAccount(plr))
  839.     local access = exports.CITstateOfficial:checkSOPermission(acc)
  840.     if (tostring(access):lower() ~= "hso" or not so) then
  841.         return false
  842.     end
  843.     local refunds = refundsCache[so]
  844.     if (not refunds) then
  845.         outputChatBox(t(plr, "SO Refund ERROR: Could not find provided account in refunds cache."), plr, 200, 0, 0)
  846.         return false
  847.     end
  848.     local soPlr = getAccountPlayer(getAccount(so))
  849.     local lastName = exports.CITaccounts:getLastUsedName(so)
  850.     local refund = 0
  851.     for k, dat in ipairs(refunds) do
  852.         local msg = getPlayerName(plr).." refunding $"..dat[2].." to "..lastName[1].." for SO event: "..dat[1]
  853.         outputChatBox(msg, plr, 255, 167, 0)
  854.         refund = refund + dat[2]
  855.     end
  856.     if (soPlr) then
  857.         exports.CITmoney:GPM(soPlr, refund, "CITsoEvents refund", false)
  858.     else
  859.         exports.CITaccounts:exportModifyCash(so, refund)
  860.         exports.CITlogs:logSomething("Added "..refund.." from State Official events by "..getPlayerName(plr), "soevents", so)
  861.     end
  862.     exports.CITstateOfficial:addToSOAccLogs(so, getPlayerName(plr).." has refunded $"..refund.." to "..lastName[1])
  863.     exports.CITstateOfficial:addToSOAccLogs(acc, getPlayerName(plr).." has refunded $"..refund.." to "..lastName[1])
  864.     exports.CITlogs:logSomething(getPlayerName(plr).." has refunded $"..refund.." to "..lastName[1], "soevents", acc, so)
  865.     refundsCache[so] = nil
  866.     outputChatBox(#refundsCache.." ".. "refunds remaining in cache.", plr, 255, 167, 0)
  867. end
  868. addCommandHandler("sorefund", giveRefund)
  869.  
  870. -- MTA exports
  871. function getElementSpeed(theElement, unit)
  872.     local unit = unit == nil and 0 or ((not tonumber(unit)) and unit or tonumber(unit))
  873.     local mult = (unit == 0 or unit == "m/s") and 50 or ((unit == 1 or unit == "km/h") and 180 or 111.84681456)
  874.     return (Vector3(getElementVelocity(theElement)) * mult).length
  875. end
Advertisement
Add Comment
Please, Sign In to add comment