Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ------------------------------------------------------------------------------------
- -- PROJECT: Community of Integrity and Transparency 2.0
- -- RIGHTS: All rights reserved by developers
- -- FILE: CITsoEvents/soevents.slua
- -- PURPOSE: State official events - Server side
- -- DEVELOPERS: Ryan#USNS
- ------------------------------------------------------------------------------------
- local t = function(...) return exports.CITt:t(...) or arg[2] end
- local eventStatus, object, dMarker, pMarker, dBlip, pBlip, timer, updateTimer
- local hit = {}
- local trailer = {}
- local events = {}
- local truckerVehicles = {[403]=true, [515]=true, [514]=true}
- local deliveryVehicles = {[482]=true, [413]=true, [440]=true, [414]=true, [499]=true, [456]=true}
- local delivering = {}
- local refundsCache = {}
- function showPanel(plr, cmd, info)
- if (info == "info") then
- local civs = getTeamFromName("Civilian Workers")
- if (getPlayerTeam(plr) ~= civs) then
- outputChatBox(t(plr, "You need be a civilian to see State Official event information."), plr, 255, 0, 0)
- return false
- end
- if (not eventStatus) then
- outputChatBox(t(plr, "Nobody is hosting civilian event right now."), plr, 255, 0, 0)
- return false
- end
- outputChatBox(t(plr, "Hosted by: %s", events[1]), plr, 255, 167, 0)
- outputChatBox(t(plr, "Event type: %s", events[2]), plr, 255, 167, 0)
- outputChatBox(t(plr, "Detail: %s", events[5]), plr, 255, 167, 0)
- outputChatBox(t(plr, "Location: %s", events[4]..", "..events[3]), plr, 255, 167, 0)
- return true
- end
- local acc = getAccountName(getPlayerAccount(plr))
- if (not exports.CITstateOfficial:checkSOPermission(acc)) then
- return false
- end
- if (getElementData(plr, "o") ~= "State Official") then
- outputChatBox(t(plr, "You need to be on duty state official to open events GUI."), plr, 0, 255, 0)
- return false
- end
- triggerClientEvent(plr, "CITsoEvents.toggleWindow", plr)
- end
- addCommandHandler("soevent", showPanel)
- function cancelOutput()
- local civs = getTeamFromName("Civilian Workers")
- local civilians = getPlayersInTeam(civs)
- for k, plr2 in pairs(civilians) do
- outputChatBox(t(plr2, "State official event timed out, nobody won the event!"), plr2, 255, 167, 0)
- end
- removeMarkers(events[2])
- end
- function startingEvent(name)
- setElementVisibleTo(dMarker, root, false)
- setElementVisibleTo(dBlip, root, false)
- setElementVisibleTo(pMarker, root, false)
- setElementVisibleTo(pBlip, root, false)
- local players = getPlayersInTeam(getTeamFromName("Civilian Workers"))
- for i, plr in ipairs(players) do
- setElementVisibleTo(pMarker, plr, true)
- setElementVisibleTo(pBlip, plr, true)
- end
- for k, plr2 in pairs(players) do
- outputChatBox(t(plr2, "State Official %s is hosting an event. Type '/soevent info' for more information!", name), plr2, 255, 167, 0)
- end
- end
- function startMission(mission, detail, reward, t2, px, py, pz, pb, dx, dy, dz, db)
- local t2 = tonumber(t2) or 1
- local acc = getAccountName(getPlayerAccount(client))
- if (eventStatus) then
- outputChatBox(t(client, "An event is already in progress."), client, 255, 0, 0)
- return false
- end
- if (mission == "Mystery Box") then
- pMarker = createMarker(px, py, pz-1, 'cylinder', 2, 255, 167, 0, 0)
- object = createObject(2912, px, py, pz-1, 0,0,0)
- setElementFrozen(object, true)
- events = {getPlayerName(client), mission, getZoneName(px, py, pz, true), getZoneName(px, py, pz), detail, reward, getAccountName(getPlayerAccount(client))}
- removeEventHandler("onMarkerHit", pMarker, hitBag)
- removeEventHandler("onPlayerQuit", root, quitHandler)
- addEventHandler("onMarkerHit", pMarker, hitBag)
- addEventHandler("onPlayerQuit", root, quitHandler)
- outputChatBox(t(client, "You created an Event: %s", mission), client, 0, 255, 0)
- local civs = getTeamFromName("Civilian Workers")
- local civilians = getPlayersInTeam(civs)
- for k, plr2 in pairs(civilians) do
- outputChatBox(t(plr2, "State Official %s is hosting an event. Type '/soevent info' for more information!", getPlayerName(client)), plr2, 255, 167, 0)
- end
- exports.CITstateOfficial:addToSOAccLogs(acc, "Hosted Civilian event; "..mission)
- eventStatus = true
- timer = setTimer(cancelOutput, t2 * 60 * 1000, 0)
- return true
- end
- pMarker = createMarker(px, py, pz - 1.5, "cylinder", 4, 255, 167, 0, 255)
- pBlip = createBlipAttachedTo(pMarker, pb)
- dMarker = createMarker(dx, dy, dz - 1.5, "cylinder", 4, 255, 167, 0, 255)
- dBlip = createBlipAttachedTo(dMarker, db)
- events = {getPlayerName(client), mission, getZoneName(px, py, pz, true), getZoneName(px, py, pz), detail, reward, getAccountName(getPlayerAccount(client))}
- removeEventHandler("onMarkerHit", pMarker, pickupStuff)
- removeEventHandler("onMarkerHit", dMarker, deliveryStuff)
- removeEventHandler("onPlayerQuit", root, quitHandler)
- removeEventHandler("onVehicleExit", root, exitVehicle)
- removeEventHandler("onVehicleEnter", root, enterVehicle)
- removeEventHandler("CITsoEvents.showMarker", root, showMarker)
- addEventHandler("onMarkerHit", pMarker, pickupStuff)
- addEventHandler("onMarkerHit", dMarker, deliveryStuff)
- addEventHandler("onPlayerQuit", root, quitHandler)
- addEventHandler("onVehicleExit", root, exitVehicle)
- addEventHandler("onVehicleEnter", root, enterVehicle)
- addEventHandler("CITsoEvents.showMarker", root, showMarker)
- if (mission == "Delivery Clothes") then
- removeEventHandler("onTrailerDetach", root, reattachTrailerDC)
- addEventHandler("onTrailerDetach", root, reattachTrailerDC)
- end
- outputChatBox(t(client, "You created an event: %s", mission), client, 0, 255, 0)
- startingEvent(getPlayerName(client))
- exports.CITstateOfficial:addToSOAccLogs(acc, "Hosted Civilian event; "..mission)
- eventStatus = true
- timer = setTimer(cancelOutput, t2 * 60 * 1000, 0)
- end
- addEvent("CITsoEvents.startMission", true)
- addEventHandler("CITsoEvents.startMission", resourceRoot, startMission)
- function hitBag(plr)
- if (getElementType(plr) ~= "player") then
- return false
- end
- local civs = getTeamFromName("Civilian Workers")
- local soPlr = getAccountPlayer(getAccount(events[7]))
- if (getPlayerTeam(plr) ~= civs or isPedInVehicle(plr) or plr == soPlr)then
- return false
- end
- local money = tonumber(events[6])
- exports.CITmoney:GPM(plr, tonumber(events[6]), "Won at SO Event "..events[2], false)
- if (not soPlr) then
- exports.CITaccounts:exportModifyCash(events[7], 0 - money)
- exports.CITlogs:logSomething("Remove "..money.." from "..tostring(events[7]), "soevents", events[7])
- else
- exports.CITmoney:TPM(soPlr, money, "Gave SO event prize "..events[2])
- end
- if (not refundsCache[events[7]]) then
- refundsCache[events[7]] = {}
- end
- table.insert(refundsCache[events[7]], {events[2], money})
- outputChatBox(t(plr, "You found $%s from mystery box.", tostring(events[6])), plr, 0, 255, 0)
- local civs = getTeamFromName("Civilian Workers")
- local civilians = getPlayersInTeam(civs)
- for k, plr2 in pairs(civilians) do
- outputChatBox(getPlayerName(plr).." "..t(plr2, "found the mystery box placed by %s and got $%s", events[1], money), plr2, 255, 167, 0)
- end
- exports.CITstateOfficial:addToSOAccLogs(events[7], getPlayerName(plr).." has picked up mystery box and got $"..money)
- removeMarkers(events[2])
- end
- -- Delivery Clothes and Delivery Glassers.
- function pickupStuff(hitElement)
- if (not hitElement or getElementType(hitElement) ~= "vehicle") then
- return false
- end
- local driver = getVehicleController(hitElement)
- if (not driver) then
- return false
- end
- local civs = getTeamFromName("Civilian Workers")
- 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
- return false
- end
- if (getElementSpeed(hitElement, 2) > 40) then
- outputChatBox(t(driver, "You are driving too fast. Slow down to under 64 kph (40 mph)."), driver, 255, 0, 0)
- return false
- end
- if (events[2] == "Delivery Clothes") then
- if (getElementModel(hitElement) == 435) then
- return false
- end
- if (not truckerVehicles[getElementModel(hitElement)]) then
- outputChatBox(t(driver, "You need a Trucker job vehicle!"), driver, 255, 0, 0)
- return false
- end
- if (getVehicleTowedByVehicle(hitElement)) then
- outputChatBox(t(driver, "You already have the trailer. If it is bugged, respawn the vehicle."), driver, 255, 0, 0)
- return false
- end
- delivering[driver] = true
- triggerClientEvent(driver, "CITsoEvents.addProgressBar", driver)
- local x, y, z = getElementPosition(pMarker)
- local rx, ry, rz = getElementRotation(hitElement)
- trailer[hitElement] = createVehicle(435, x, y, z, rx, ry, rz)
- attachTrailerToVehicle(hitElement, trailer[hitElement])
- fixVehicle(hitElement)
- hit[driver] = true
- setElementVisibleTo(pMarker, driver, false)
- setElementVisibleTo(pBlip, driver, false)
- setElementVisibleTo(dMarker, driver, true)
- setElementFrozen(hitElement, true)
- setElementData(hitElement, "vehCancelExit", true)
- setTimer(setElementFrozenDelay, 10000, 1, hitElement, false)
- outputChatBox(t(driver, "Now deliver the stuff to next location marked in your map."), driver, 255, 167, 0)
- return true
- end
- if (not deliveryVehicles[getElementModel(hitElement)])then
- outputChatBox(t(driver, "You need a Delivery Man vehicle!"), driver, 255, 0, 0)
- return false
- end
- delivering[driver] = true
- triggerClientEvent(driver, "CITsoEvents.addProgressBar", driver)
- hit[driver] = true
- fixVehicle(hitElement)
- setElementVisibleTo(pMarker, driver, false)
- setElementVisibleTo(pBlip, driver, false)
- setElementVisibleTo(dMarker, driver, true)
- setElementVisibleTo(dBlip, driver, true)
- setElementFrozen(hitElement, true)
- setElementData(hitElement, "vehCancelExit", true)
- setTimer(setElementFrozenDelay, 10000, 1, hitElement, false)
- outputChatBox(t(driver, "Now deliver the stuff to next location marked in your map."), driver, 255, 167, 0)
- end
- function setElementFrozenDelay(element, bool)
- if (isElement(element)) then
- setElementFrozen(element, bool)
- setElementData(element, "vehCancelExit", bool)
- end
- end
- function deliveryStuff(hitElement)
- if (not hitElement or getElementType(hitElement) ~= "vehicle") then
- return false
- end
- local driver = getVehicleController(hitElement)
- if (not driver) then
- return false
- end
- local civs = getTeamFromName("Civilian Workers")
- if (getPlayerTeam(driver) ~= civs or not isElementVisibleTo(dMarker, driver))then
- return false
- end
- if (getElementSpeed(hitElement, 2) > 40) then
- outputChatBox(t(driver, "You are driving too fast. Slow down to under 64 kph (40 mph)."), driver, 255, 0, 0)
- return false
- end
- if (getElementHealth(hitElement) / 10 < 95) then
- outputChatBox(t(driver, "You need to fix your vehicle. It is below 95%%"), driver, 255, 0, 0)
- outputChatBox(t(driver, "Go to first marker!"), driver, 255, 0, 0)
- setElementVisibleTo(dMarker, driver, false)
- setElementVisibleTo(dBlip, driver, false)
- setElementVisibleTo(pMarker, driver, true)
- setElementVisibleTo(pBlip, driver, true)
- hit[driver] = false
- if (trailer[hitElement]) then
- destroyElement(trailer[hitElement])
- end
- delivering[driver] = nil
- return true
- end
- local money = tonumber(events[6])
- local soPlr = getAccountPlayer(getAccount(events[7]))
- if (not soPlr) then
- exports.CITaccounts:exportModifyCash(events[7], 0 - money)
- exports.CITlogs:logSomething("Remove "..money.." from "..tostring(events[7]), "soevents", events[7])
- else
- exports.CITmoney:TPM(soPlr, money, "Gave event prize "..events[2])
- end
- if (not refundsCache[events[7]]) then
- refundsCache[events[7]] = {}
- end
- if (money >= 50000) then
- table.insert(refundsCache[events[7]], {events[2], money})
- end
- exports.CITmoney:GPM(driver, money, "Won at SO Event "..events[2], false)
- exports.CITstateOfficial:addToSOAccLogs(events[7], getPlayerName(driver).." has delivered cargo at SO event and got $"..money)
- local civs = getTeamFromName("Civilian Workers")
- local civilians = getPlayersInTeam(civs)
- delivering[driver] = nil
- if (events[2] == "Delivery Clothes") then
- outputChatBox(t(driver, "You delivered clothes successfully and won $%s", events[6]), driver, 0, 255, 0)
- for k, plr2 in pairs(civilians) do
- outputChatBox(getPlayerName(driver).." "..t(plr2, "delivered the clothes to Pull & Bear shop in State Official event and won $%s", money), plr2, 255, 167, 0)
- end
- removeMarkers(events[2])
- return true
- end
- outputChatBox(t(driver, "You delivered glasses successfully and won $%s", money), driver, 0, 255, 0)
- for k, plr2 in pairs(civilians) do
- outputChatBox(getPlayerName(driver).." "..t(plr2, "delivered the glasses to IKEA shop in State Official event and won $%s", money), plr2, 255, 167, 0)
- end
- removeMarkers(events[2])
- end
- function removeMarkers(typeEvent)
- if (not pMarker) then
- return false
- end
- if (timer) then
- killTimer(timer)
- timer = nil
- end
- eventStatus = false
- if (typeEvent == "Mystery Box") then
- removeEventHandler("onMarkerHit", pMarker, hitBag)
- destroyElement(pMarker)
- destroyElement(object)
- events = {}
- object = nil
- pMarker = nil
- return true
- end
- if (not dMarker) then
- return false
- end
- if (typeEvent == "Delivery Clothes") then
- removeEventHandler("onTrailerDetach", root, reattachTrailerDC)
- for i, trail in pairs(trailer) do
- if (isElement(trail)) then
- destroyElement(trail)
- end
- end
- end
- removeEventHandler("onMarkerHit", pMarker, pickupStuff)
- removeEventHandler("onMarkerHit", dMarker, deliveryStuff)
- removeEventHandler("onPlayerQuit", root, quitHandler)
- removeEventHandler("onVehicleExit", root, exitVehicle)
- removeEventHandler("onVehicleEnter", root, enterVehicle)
- removeEventHandler("CITsoEvents.showMarker", root, showMarker)
- -- triggerClientEvent(root, "CITsoEvents.killProgressBar", root)
- destroyElement(pMarker)
- destroyElement(pBlip)
- destroyElement(dMarker)
- destroyElement(dBlip)
- pMarker = nil
- pBlip = nil
- dMarker = nil
- dBlip = nil
- hit = {}
- events = {}
- trailer = {}
- delivering = {}
- end
- function showMarker()
- if (#events == 0) then
- return false
- end
- if (not pMarker or events[2] == "Mystery Box") then
- return false
- end
- local text = "Deliver the glasses to IKEA!"
- if (events[2] == "Delivery Clothes") then
- text = "Deliver the clothes to Pull & Bear shop!"
- end
- setElementVisibleTo(dBlip, client, true)
- outputChatBox(t(client, text), client, 0, 255, 0)
- end
- addEvent("CITsoEvents.showMarker", true)
- -- For every mission
- function reattachTrailerDC(theTruck)
- if (trailer[theTruck]) then
- attachTrailerToVehicle(theTruck, trailer[theTruck])
- end
- end
- function quitHandler()
- if (not events[1]) then
- return false
- end
- if (trailer[getPedOccupiedVehicle(source)]) then
- destroyElement(trailer[getPedOccupiedVehicle(source)])
- end
- local soPlr = getAccountPlayer(getAccount(events[7]))
- if (getElementType(source) ~= "player" or not pMarker or typeEvent == "Mystery Box" or not soPlr) then
- return false
- end
- if (source == soPlr) then
- local text = "Event auto cancelled, "..getPlayerName(soPlr).." disconnected."
- local civs = getTeamFromName("Civilian Workers")
- local civilians = getPlayersInTeam(civs)
- for k, plr2 in pairs(civilians) do
- outputChatBox(t(plr2, "Event auto cancelled, %s disconnected.", getPlayerName(soPlr)), plr2, 255, 167, 0)
- end
- exports.CITstateOfficial:addToSOAccLogs(getAccount(events[7]), text)
- removeMarkers(events[2])
- return true
- end
- hit[source] = false
- end
- function exitVehicle(plr)
- local civs = getTeamFromName("Civilian Workers")
- if (events[2] == "Mystery Box" or getPlayerTeam(plr) ~= civs or not delivering[plr] or not getElementData(plr, vehCancelExit)) then
- return false
- end
- setElementFrozenDelay(source, false)
- triggerClientEvent(plr, "CITsoEvents.killProgressBar", plr)
- outputChatBox("Re-enter at your vehicle and re-do the mission.", plr, 255, 167, 0)
- end
- function enterVehicle(plr)
- local civs = getTeamFromName("Civilian Workers")
- if (events[2] == "Mystery Box" or getPlayerTeam(plr) ~= civs or not delivering[plr] or not truckerVehicles[getElementModel(source)] and not deliveryVehicles[getElementModel(source)]) then
- return false
- end
- hit[plr] = false
- delivering[plr] = nil
- setElementVisibleTo(dMarker, plr, false)
- setElementVisibleTo(dBlip, plr, false)
- setElementVisibleTo(pMarker, plr, true)
- setElementVisibleTo(pBlip, plr, true)
- if (trailer[source]) then
- destroyElement(trailer[source])
- end
- outputChatBox(t(plr, "You lost the cargo. Go to first marker again."), plr, 255, 0, 0)
- end
- function plrTeamChanged(newTeam)
- if (not pMarker) then
- return false
- end
- if (getTeamName(newTeam) == "Civilian Workers") then
- outputChatBox(t(source, "State Official %s is hosting an event. Type '/soevent info' for more information!", events[1]), source, 255, 167, 0)
- setElementVisibleTo(pMarker, source, true)
- if (pBlip) then
- setElementVisibleTo(pBlip, source, true)
- end
- if (delivering[source]) then
- hit[source] = false
- delivering[source] = nil
- if (dMarker and isElementWithinMarker(driver, pMarker)) then
- triggerClientEvent(driver, "CITsoEvents.killProgressBar", driver)
- end
- end
- return true
- end
- if (pMarker and isElementVisibleTo(pMarker, source)) then
- setElementVisibleTo(pMarker, source, false)
- end
- if (pBlip and isElementVisibleTo(pBlip, source)) then
- setElementVisibleTo(pBlip, source, false)
- end
- if (dMarker and isElementVisibleTo(dMarker, source)) then
- setElementVisibleTo(dMarker, source, false)
- end
- if (dBlip and isElementVisibleTo(dBlip, source)) then
- setElementVisibleTo(dBlip, source, false)
- end
- end
- addEventHandler("onPlayerChangeTeam", root, plrTeamChanged)
- function stopEvent()
- if (not eventStatus or not pMarker) then
- return false
- end
- local acc = getAccountName(getPlayerAccount(client))
- local access = exports.CITstateOfficial:checkSOPermission(acc)
- if (not access) then
- return false
- end
- if (events[7] ~= acc and access:upper() == "SO") then
- outputChatBox(t(client, "Only HSO/AHSO can stop civilian events."), client, 0, 255, 0)
- return false
- end
- local text = getPlayerName(client).." has cancelled the State Officials event, "..events[2]
- local civs = getTeamFromName("Civilian Workers")
- local civilians = getPlayersInTeam(civs)
- for k, plr2 in pairs(civilians) do
- outputChatBox(getPlayerName(client).." "..t(plr2, "has cancelled the State Officials event, %s", events[2]), plr2, 255, 167, 0)
- end
- exports.CITstateOfficial:addToSOAccLogs(acc, text)
- removeMarkers(events[2])
- end
- addEvent("CITsoEvents.stopEvent", true)
- addEventHandler("CITsoEvents.stopEvent", resourceRoot, stopEvent)
- function giveRefund(plr, cmd, so) -- Denos: Allow refunds to SOs just like CEMs ~ Ryan#SK
- local acc = getAccountName(getPlayerAccount(plr))
- local access = exports.CITstateOfficial:checkSOPermission(acc)
- if (tostring(access):lower() ~= "hso" or not so) then
- return false
- end
- local refunds = refundsCache[so]
- if (not refunds) then
- outputChatBox(t(plr, "SO Refund ERROR: Could not find provided account in refunds cache."), plr, 200, 0, 0)
- return false
- end
- local soPlr = getAccountPlayer(getAccount(so))
- if (not soPlr) then
- outputChatBox(t(plr, "SO Refund ERROR: %s is offline, could not process refund.", so), plr, 200, 0, 0)
- return false
- end
- local refund = 0
- for k, dat in ipairs(refunds) do
- local msg = getPlayerName(plr).." refunding $"..dat[2].." to "..getPlayerName(soPlr).." for SO event: "..dat[1]
- outputChatBox(msg, plr, 255, 167, 0)
- outputChatBox(msg, soPlr, 255, 167, 0)
- refund = refund + dat[2]
- end
- exports.CITmoney:GPM(soPlr, refund, "CITsoEvents refund", false)
- exports.CITstateOfficial:addToSOAccLogs(acc, getPlayerName(plr).." has refunded $"..refund.." to "..getPlayerName(soPlr))
- exports.CITstateOfficial:addToSOAccLogs(so, getPlayerName(plr).." has refunded $"..refund.." to "..getPlayerName(soPlr))
- refundsCache[so] = nil
- outputChatBox(#refundsCache.." "..t(plr, "refunds remaining in cache."), plr, 255, 167, 0)
- end
- addCommandHandler("sorefund", giveRefund)
- -- MTA exports
- function getElementSpeed(theElement, unit)
- local unit = unit == nil and 0 or ((not tonumber(unit)) and unit or tonumber(unit))
- local mult = (unit == 0 or unit == "m/s") and 50 or ((unit == 1 or unit == "km/h") and 180 or 111.84681456)
- return (Vector3(getElementVelocity(theElement)) * mult).length
- end
Advertisement
Add Comment
Please, Sign In to add comment