Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 17.54 KB | None | 0 0
  1. ------------------------------------------------------------------------------------
  2. --  SCRIPT:     Community, Integrity, Transparency
  3. --  FILE:       CITtrainDriver/train.lua
  4. --  PURPOSE:    Train driver job client
  5. --  DEVELOPERS: SVN Team
  6. ------------------------------------------------------------------------------------
  7.  
  8. local isTransportingPassengers = false
  9. local isLoadingPassengers = false
  10. local dangerousItemBonus = false
  11. local hasPassenger = false
  12. local hasResources = false
  13. local derailedTimer, exitTimer
  14. local passengersOnBoard = 0
  15. local seatLimit = 30
  16. local stationID = 1
  17. local elements = {}
  18. local timers = {}
  19.  
  20. local resourceElements = {
  21.     ["vehicles"] = {},
  22.     ["objects"] = {},
  23.     ["objects2"]  = {},
  24.     ["warningCol"] = {},
  25.     ["speedCol"] = {},
  26.     ["radar"] = {}
  27. }
  28.  
  29. local allowedTrains = {
  30.     [449] = true, -- Tram
  31.     [537] = true, -- Freight
  32.     [538] = true, -- Brown Streak
  33. }
  34.  
  35. local trainStations = {
  36.     {1766.27, -1954.07, 13.22}, -- Unity Station
  37.     {2864.93, 1257.44, 10.49}, -- Linden Station
  38.     {1460.00, 2632.23, 10.49}, -- Yellow Bell Station
  39.     {-1942.73, 172.08, 25.41}, -- San Fierro Station
  40.     {798.89, -1351.97, -1.93}, -- Market Station
  41. }
  42.  
  43. local t = function(...)
  44.     if (not getElementData(root, "f")) then
  45.         return (arg and arg[1]) or "ERROR"
  46.     end
  47.     return exports.CITt:t(...) or (arg and arg[1]) or "ERROR"
  48. end
  49.  
  50. local resourceTable = {
  51.     "Electronics",
  52.     "Chemicals",
  53.     "Oil",
  54.     "Gold",
  55. }
  56.  
  57. function getNearestStationToPlayer()
  58.     local x, y, z = getElementPosition(localPlayer)
  59.     local nearStation, nearDistance = 1, 100000
  60.     for ind, station in pairs(trainStations) do
  61.         local stationDist = getDistanceBetweenPoints2D(x, y, station[1], station[2])
  62.         if (station and stationDist < nearDistance) then
  63.             nearStation, nearDistance = ind, stationDist
  64.         end
  65.     end
  66.     return nearStation
  67. end
  68.  
  69. function beginMission()
  70.     local veh, seat = getPedOccupiedVehicle(localPlayer), getPedOccupiedVehicleSeat(localPlayer)
  71.     if (not veh or seat ~= 0 or not allowedTrains[getElementModel(veh)]) then
  72.         return false
  73.     end
  74.     if (train == veh and exitTimer) then
  75.         killTimer(exitTimer)
  76.         exitTimer = nil
  77.     end
  78.     if (isJobActive or getElementData(localPlayer, "o") ~= "Train Driver" or exports.CITteams:isPlayerInTeams(localPlayer, "Unoccupied")) then
  79.         return false
  80.     end
  81.     train = veh
  82.     setTrainDerailable(train, true)
  83.     setCrowdedAreas()
  84.     derailedTimer = setTimer(checkIfDerailed, 3000, 0)
  85.     initializeFuelStuff()
  86.     addEventHandler("onClientPlayerResign", localPlayer, cancelMission)
  87.     addEventHandler("onClientPlayerWasted", localPlayer, cancelMission)
  88.     addEventHandler("onClientPlayerVehicleExit", localPlayer, driverLeftTrain)
  89.     addEventHandler("onClientElementDestroy", train, function()
  90.         train = nil
  91.         cancelMission()
  92.     end)
  93.     if (getElementModel(veh) == 538 or getElementModel(veh) == 449) then
  94.         stationID = getNearestStationToPlayer()
  95.         startPassengersMission()
  96.         isTransportingPassengers = true
  97.     else
  98.         startResourcesMission()
  99.         isTransportingPassengers = false
  100.     end
  101. end
  102. addEventHandler("onClientPlayerVehicleEnter", localPlayer, beginMission)
  103. addEventHandler("onClientResourceStart", resourceRoot, beginMission)
  104.  
  105. function startResourcesMission()
  106.     stationID = getNearestStationToPlayer()
  107.     local x, y, z = trainStations[stationID][1], trainStations[stationID][2], trainStations[stationID][3]
  108.     elements["stationMarker"] = createMarker(x, y, z, "checkpoint", 2, 255, 255, 0, 255)
  109.     addEventHandler("onClientMarkerHit", elements["stationMarker"], loadResources)
  110.     elements["stationBlip"] = createBlipAttachedTo(elements["stationMarker"], 41)
  111.     local playerX, playerY, playerZ = getElementPosition(localPlayer)
  112.     local zone = exports.CITmapMisc:getZoneName2(x, y, z)
  113.     exports.CIThelp:dm(t("TRAIN DRIVER: Make your way to %s to start loading resources!", zone), 255, 125, 0)
  114.     dangerousItemBonus = false
  115.     hasResources = false
  116.     isJobActive = true
  117. end
  118.  
  119. function startPassengersMission()
  120.     local x, y, z = trainStations[stationID][1], trainStations[stationID][2], trainStations[stationID][3]
  121.     elements["stationMarker"] = createMarker(x, y, z, "checkpoint", 2, 255, 255, 0, 255)
  122.     addEventHandler("onClientMarkerHit", elements["stationMarker"], enteredTrainStation)
  123.     elements["stationBlip"] = createBlipAttachedTo(elements["stationMarker"], 41)
  124.     local playerX, playerY, playerZ = getElementPosition(localPlayer)
  125.     local zone = exports.CITmapMisc:getZoneName2(x, y, z)
  126.     exports.CIThelp:dm(t("TRAIN DRIVER: Make your way to %s to board / unboard passengers!", zone), 255, 125, 0)
  127.     distToStation = getDistanceBetweenPoints2D(x, y, playerX, playerY)
  128.     isTransportingPassengers = true
  129.     hasPassenger = false
  130.     isJobActive = true
  131. end
  132.  
  133. function loadResources(player, matchDim)
  134.     if (not matchDim or player ~= localPlayer or not isJobActive or hasResources) then
  135.         return false
  136.     end
  137.     local veh = getPedOccupiedVehicle(localPlayer)
  138.     if (not veh or getElementModel(veh) ~= 537 or getVehicleController(veh) ~= localPlayer) then
  139.         return false
  140.     end
  141.     local speedX, speedY, speedZ = getElementVelocity(veh)
  142.     local actualSpeed = (speedX ^ 2 + speedY ^ 2 + speedZ ^ 2) ^ (0.5)
  143.     local finalSpeed = actualSpeed * 180
  144.     if (finalSpeed > 30) then
  145.         exports.CIThelp:dm("The train is currently going too fast. Slow down to under 30 KPH to start loading resources.", 255, 0, 0, true)
  146.         return false
  147.     end
  148.     setTrainSpeed(veh, 0)
  149.     setElementData(localPlayer, "nc", true)
  150.     setTimer(setElementData, 10000, 1, localPlayer, "nc", false)
  151.     local trailers = math.random(1, 5)
  152.     local x, y, z = getElementPosition(localPlayer)
  153.     for i = 1, trailers do
  154.         resourceElements['vehicles'][i] = createVehicle(569, x + 3, y  + 3,z)
  155.         resourceElements['objects'][i] = createObject(2934, x + 3, y + 3, z)
  156.         resourceElements['objects2'][i] = createObject(2934, x + 3,y + 3, z)
  157.     end
  158.     for k,v in pairs(resourceElements['vehicles']) do
  159.         attachTrailerToVehicle(getPedOccupiedVehicle(localPlayer), resourceElements['vehicles'][k])
  160.         if (k < trailers) then
  161.             attachTrailerToVehicle(resourceElements['vehicles'][k], resourceElements['vehicles'][k + 1])
  162.         end
  163.         attachElements(resourceElements['objects'][k], resourceElements['vehicles'][k], 0, 5, 0.4)
  164.         attachElements(resourceElements['objects2'][k], resourceElements['vehicles'][k], 0, - 5, 0.4)
  165.     end
  166.     goodsType = resourceTable[math.random(#resourceTable)]
  167.     exports.CITradar:loadingBar("trainResourceLoader", "timed", "Loading "..goodsType, 50, 100, 255, 255, 255, 255, 10000, 10000)
  168.     loadTimer = setTimer(loadingFinished, 10000, 1, localPlayer, veh)
  169.     hasResources = false
  170.     isLoading = true
  171. end
  172.  
  173. function loadingFinished(player, veh)
  174.     if (player ~= localPlayer or not veh or getElementModel(veh) ~= 537 or getVehicleController(veh) ~= localPlayer or not isJobActive) then
  175.         exports.CIThelp:dm("You failed to continue the mission due to leaving your train while resources were getting loaded.", 255, 0, 0, true)
  176.         cancelMission()
  177.         return false
  178.     end
  179.     resetMissionAssets()
  180.     local resourceStation = math.random(#trainStations)
  181.     if (stationID ~= #trainStations) then
  182.         local attempts = 0
  183.         while (resourceStation <= stationID and attempts < 10) do
  184.             attempts = attempts + 1
  185.             resourceStation = math.random(#trainStations)
  186.         end
  187.     else
  188.         resourceStation = 1
  189.     end
  190.     local x, y, z = getElementPosition(localPlayer)
  191.     local delX, delY, delZ = trainStations[resourceStation][1], trainStations[resourceStation][2], trainStations[resourceStation][3]
  192.     local zone = exports.CITmapMisc:getZoneName2(delX, delY, delZ)
  193.     elements["delMarker"] = createMarker(delX, delY, delZ - 1, "cylinder", 5, 255, 0, 255, 175)
  194.     addEventHandler("onClientMarkerHit", elements["delMarker"], deliveredResources)
  195.     elements["delBlip"] = createBlipAttachedTo(elements["delMarker"], 51)
  196.     exports.CIThelp:dm(t("Loading finished! Your train has been loaded with %s. Make your way to %s to deliver the goods!", goodsType, zone), 0, 255, 0)
  197.     local chance = math.random()
  198.     --if (exports.CITperks:doesPlayerHavePerk("Dangerous Items Permit")) then
  199.     if (exports.CDperks:doesPlayerHavePerk("Dangerous Items Permit")) then
  200.         if (chance <= 0.05) then
  201.             exports.CIThelp:dm(t("PERK BONUS: Because you have the 'Dangerous Items Permit' perk your next delivery will pay more resources!"), 0, 255, 0, true)
  202.             dangerousItemBonus = true
  203.         end
  204.     end
  205.     distToStation = getDistanceBetweenPoints2D(x, y, delX, delY)
  206.     hasResources = true
  207.     isLoading = false
  208. end
  209.  
  210. function deliveredResources(player, matchDim)
  211.     if (not matchDim or player ~= localPlayer or not isJobActive) then
  212.         return false
  213.     end
  214.     local veh = getPedOccupiedVehicle(localPlayer)
  215.     if (not veh or not allowedTrains[getElementModel(veh)] or getVehicleController(veh) ~= localPlayer) then
  216.         return false
  217.     end
  218.     local speedX, speedY, speedZ = getElementVelocity(veh)
  219.     local actualSpeed = (speedX ^ 2 + speedY ^ 2 + speedZ ^ 2) ^ (0.5)
  220.     local finalSpeed = actualSpeed * 180
  221.     if (finalSpeed > 30) then
  222.         exports.CIThelp:dm("The train is currently going too fast. Slow down to under 30 kmph and enter the marker again.", 255, 0, 0, true)
  223.         return false
  224.     end
  225.     --if (exports.CITperks:doesPlayerHavePerk("Dangerous Items Permit") and dangerousItemBonus) then
  226.     local giveBonus = exports.CDperks:doesPlayerHavePerk("Dangerous Items Permit") and dangerousItemBonus
  227.     triggerServerEvent("CITtraindriver.receivePayment", resourceRoot, "resources", distToStation, goodsType, giveBonus)
  228.     setElementVelocity(veh, 0, 0, 0)
  229.     setElementData(localPlayer, "nc", true)
  230.     setTimer(setElementData, 5000, 1, localPlayer, "nc", false)
  231.     resetMissionAssets()
  232.     for k, v in pairs(resourceElements['vehicles']) do
  233.         destroyElement(v)
  234.     end
  235.     for k, v in pairs(resourceElements['objects']) do
  236.         destroyElement(v)
  237.     end
  238.     for k, v in pairs(resourceElements['objects2']) do
  239.         destroyElement(v)
  240.     end  
  241.     resourceElements['vehicles'] = {}
  242.     resourceElements['objects'] = {}
  243.     resourceElements['objects2'] = {}
  244.     dangerousItemBonus = false
  245.     hasResources = false
  246.     startResourcesMission()
  247. end
  248.  
  249. function enteredTrainStation(player, matchDim)
  250.     if (not matchDim or player ~= localPlayer or not isJobActive) then
  251.         return false
  252.     end
  253.     local veh = getPedOccupiedVehicle(localPlayer)
  254.     if (not veh or not allowedTrains[getElementModel(veh)] or getVehicleController(veh) ~= localPlayer) then
  255.         return false
  256.     end
  257.     local speedX, speedY, speedZ = getElementVelocity(veh)
  258.     local actualSpeed = math.sqrt(speedX ^ 2 + speedY ^ 2 + speedZ ^ 2)
  259.     local finalSpeed = actualSpeed * 180
  260.     if (finalSpeed > 30) then
  261.         exports.CIThelp:dm("The train is currently going too fast. Slow down to under 30 kmph and enter the marker again.", 255, 0, 0, true)
  262.         return false
  263.     end
  264.     setTrainSpeed(veh, 0)
  265.     local hours, mins = getTime()
  266.     if (hours >= 12 and hours <= 14) then
  267.         passengerLimit = 30
  268.     else
  269.         passengerLimit = 15
  270.     end
  271.     randomPassengersToPick = math.random(1, passengerLimit)
  272.     randomPassengersToDrop = math.random(0, passengersOnBoard)
  273.     iprint(randomPassengersToDrop)
  274.     iprint(randomPassengersToPick)
  275.     stationID = stationID + 1
  276.     if (stationID >= #trainStations) then
  277.         stationID = 1
  278.     end
  279.     if (passengersOnBoard > 0) and (randomPassengersToDrop > 0) then
  280.         triggerServerEvent("CITtraindriver.receivePayment", resourceRoot, "passenger", distToStation, randomPassengersToDrop)
  281.         if ((passengersOnBoard + randomPassengersToPick) - randomPassengersToDrop > seatLimit) then
  282.             passengersOnBoard = seatLimit
  283.         else
  284.             passengersOnBoard = (passengersOnBoard + randomPassengersToPick) - randomPassengersToDrop
  285.         end
  286.     else
  287.         if (passengersOnBoard + randomPassengersToPick > seatLimit) then
  288.             passengersOnBoard = seatLimit
  289.         else
  290.             passengersOnBoard = passengersOnBoard + randomPassengersToPick
  291.         end
  292.     end
  293.     setElementData(localPlayer, "nc", true)
  294.     setTimer(setElementData, 10000, 1, localPlayer, "nc", false)
  295.     exports.CITradar:loadingBar("trainPassengerShow", "timed", "Loading passengers..", 50, 100, 255, 255, 255, 255, 10000, 10000)
  296.     iprint(passengersOnBoard)
  297.     isLoadingPassengers = true
  298.     setTimer(function() isLoadingPassengers = false end, 10000, 1)
  299.     resetMissionAssets()
  300.     setTimer(startPassengersMission, 10000, 1)
  301. end
  302.  
  303. function cancelMission()
  304.     resetMainAssets()
  305.     resetMissionAssets()
  306.     resetFuel()
  307.     destroyCrowdedAreas()
  308.     isJobActive = false
  309.     hasPassenger = false
  310.     hasResources = false
  311.     train = nil
  312.     passengersOnBoard = 0
  313.     stationID = 1
  314. end
  315. addEvent("onClientPlayerResign", true)
  316. addEvent("onClientPlayerEndShift", true)
  317. addEventHandler("onClientPlayerEndShift", localPlayer, cancelMission)
  318.  
  319. function resetMissionAssets()
  320.     -- Killing all timers
  321.     for tName, timer in pairs(timers) do
  322.         killTimer(timer)
  323.     end
  324.     -- Destroying all elements
  325.     for eName, e in pairs(elements) do
  326.         destroyElement(e)
  327.     end
  328.     -- Resetting variables
  329.     timers = {}
  330.     elements = {}
  331. end
  332.  
  333. function resetMainAssets()
  334.     if (derailedTimer) then
  335.         killTimer(derailedTimer)
  336.         derailedTimer = nil
  337.     end
  338.     if (exitTimer) then
  339.         killTimer(exitTimer)
  340.         exitTimer = nil
  341.     end
  342.     if (train) then
  343.         removeEventHandler("onClientElementDestroy", train, cancelMission)
  344.     end
  345.     removeEventHandler("onClientPlayerResign", localPlayer, cancelMission)
  346.     removeEventHandler("onClientPlayerWasted", localPlayer, cancelMission)
  347.     removeEventHandler("onClientPlayerVehicleExit", localPlayer, driverLeftTrain)
  348.     exports.CITradar:loadingBar("trainResourceLoader", "")
  349.     exports.CITradar:loadingBar("trainPassengerShow", "")
  350.     exports.CIThelp:modTextBar("trainSpeedLimitBar", "")
  351. end
  352.  
  353. function checkIfDerailed()
  354.     local rX, rY, rZ = getElementRotation(train)
  355.     if (rY ~= 0) then
  356.         cancelMission()
  357.         exports.CIThelp:dm("You failed the mission for going over the accepted speed limit and getting your train derailed.", 255, 0, 0, true)
  358.     end
  359. end
  360.  
  361. function driverLeftTrain(veh, seat)
  362.     if (veh ~= train) then
  363.         return false
  364.     end
  365.     exports.CIThelp:dm("You have 20 seconds to get back to your vehicle else you will fail the mission.", 255, 0, 0, true)
  366.     exitTimer = setTimer(checkLeaving, 20000, 1)
  367. end
  368.  
  369. function checkLeaving()
  370.     exitTimer = nil
  371.     if (train and getVehicleController(train) == localPlayer) then
  372.         return false
  373.     end
  374.     cancelMission()
  375. end
  376.  
  377. function setCrowdedAreas()
  378.     resourceElements["warningCol"][createColRectangle(2185, -1912, 800, 800)] = true -- LS
  379.     resourceElements["warningCol"][createColRectangle(-1856, 270, 800, 800)] = true -- SF
  380.     resourceElements["warningCol"][createColRectangle(1051, 2523, 800, 800)] = true -- LV
  381.     resourceElements["speedCol"][createColRectangle(2068, -1723, 400, 400)] = true -- LS
  382.     resourceElements["speedCol"][createColRectangle(-1725, 497, 400, 400)] = true -- SF
  383.     resourceElements["speedCol"][createColRectangle(1249, 2515, 400, 400)] = true -- LV
  384.     resourceElements["radar"][createRadarArea(2068, -1723, 400, 400, 255, 50, 50, 150)] = true -- LS
  385.     resourceElements["radar"][createRadarArea(-1725, 497, 400, 400, 255, 50, 50, 150)] = true -- SF
  386.     resourceElements["radar"][createRadarArea(1249, 2515, 400, 400, 255, 50, 50, 150)] = true -- LV
  387.     removeEventHandler("onClientElementColShapeHit", localPlayer, playerHitColshape)
  388.     removeEventHandler("onClientElementColShapeLeave", localPlayer, playerLeftColshape)
  389.     addEventHandler("onClientElementColShapeHit", localPlayer, playerHitColshape)
  390.     addEventHandler("onClientElementColShapeLeave", localPlayer, playerLeftColshape)
  391.     triggerEvent("mtacompatradar", root)
  392. end
  393.  
  394. function destroyCrowdedAreas()
  395.     for i, v in pairs(resourceElements["warningCol"]) do
  396.         destroyElement(i)
  397.     end
  398.     resourceElements["warningCol"] = {}
  399.     for i, v in pairs(resourceElements["speedCol"]) do
  400.         destroyElement(i)
  401.     end
  402.     resourceElements["speedCol"] = {}
  403.     for i, v in pairs(resourceElements["radar"]) do
  404.         destroyElement(i)
  405.     end
  406.     resourceElements["radar"] = {}
  407.     triggerEvent("mtacompatradar", root)
  408. end
  409.  
  410. function getCrowdedSpeedLimit()
  411.     local speed = 50
  412.     --if (exports.CITperks:doesPlayerHavePerk("Mechanic Specialist")) then
  413.     if (exports.CDperks:doesPlayerHavePerk("Mechanic Specialist")) then
  414.         speed = speed + (0.2 * speed)
  415.     end
  416.     return speed
  417. end
  418.  
  419. function playerHitColshape(colshape, dim)
  420.     if (not isJobActive) then
  421.         return false
  422.     end
  423.     if (resourceElements["warningCol"][colshape]) then
  424.         local crowdedLimit = getCrowdedSpeedLimit()
  425.         setTrainSpeedLimit(crowdedLimit)
  426.         exports.CIThelp:dm(t("You are approaching a crowded area! You must slow down to %skm/h or you will be fined!", crowdedLimit), 255, 255, 0, true)
  427.     elseif (resourceElements["speedCol"][colshape]) then
  428.         timers["speedTimer"] = setTimer(checkSpeed, 1000, 0)
  429.     end
  430. end
  431.  
  432. function checkSpeed()
  433.     if (not train) then
  434.         return false
  435.     end
  436.     local kph = math.abs(getTrainSpeed(train) * 160)
  437.     if (kph > getCrowdedSpeedLimit()) then
  438.         triggerServerEvent("CITtraindriver.finePlayer", resourceRoot)
  439.         killTimer(timers["speedTimer"])
  440.         timers["speedTimer"] = nil
  441.         setTrainSpeedLimit(0)
  442.     end
  443. end
  444.  
  445. function playerLeftColshape(colshape, dim)
  446.     if (not resourceElements["speedCol"][colshape]) then
  447.         return false
  448.     end
  449.     if (timers["speedTimer"]) then
  450.         killTimer(timers["speedTimer"])
  451.         timers["speedTimer"] = nil
  452.     end
  453.     exports.CIThelp:dm("You left the crowded area, you can start going like crazy again!", 255, 255, 0, true)
  454.     setTrainSpeedLimit(0)
  455. end
  456.  
  457. -------------------------------------------
  458. -- SPEED LIMIT system to handle modTextBar
  459. -------------------------------------------
  460.  
  461. local playerSpeedLimit = 0
  462.  
  463. function setTrainSpeedLimit(speed)
  464.     if (playerSpeedLimit == 0 or playerSpeedLimit > speed) then
  465.         playerSpeedLimit = speed
  466.     end
  467.     if (speed == 0) then
  468.         exports.CIThelp:modTextBar("trainSpeedLimitBar", "")
  469.         return true
  470.     end
  471.     exports.CIThelp:modTextBar("trainSpeedLimitBar", "Speed Limit: "..playerSpeedLimit.." km/h", 255, 255, 0, 255, 10000)
  472. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement