Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ------------------------------------------------------------------------------------
- -- SCRIPT: Community, Integrity, Transparency
- -- FILE: CITtrainDriver/train.lua
- -- PURPOSE: Train driver job client
- -- DEVELOPERS: SVN Team
- ------------------------------------------------------------------------------------
- local isTransportingPassengers = false
- local isLoadingPassengers = false
- local dangerousItemBonus = false
- local hasPassenger = false
- local hasResources = false
- local derailedTimer, exitTimer
- local passengersOnBoard = 0
- local seatLimit = 30
- local stationID = 1
- local elements = {}
- local timers = {}
- local resourceElements = {
- ["vehicles"] = {},
- ["objects"] = {},
- ["objects2"] = {},
- ["warningCol"] = {},
- ["speedCol"] = {},
- ["radar"] = {}
- }
- local allowedTrains = {
- [449] = true, -- Tram
- [537] = true, -- Freight
- [538] = true, -- Brown Streak
- }
- local trainStations = {
- {1766.27, -1954.07, 13.22}, -- Unity Station
- {2864.93, 1257.44, 10.49}, -- Linden Station
- {1460.00, 2632.23, 10.49}, -- Yellow Bell Station
- {-1942.73, 172.08, 25.41}, -- San Fierro Station
- {798.89, -1351.97, -1.93}, -- Market Station
- }
- local t = function(...)
- if (not getElementData(root, "f")) then
- return (arg and arg[1]) or "ERROR"
- end
- return exports.CITt:t(...) or (arg and arg[1]) or "ERROR"
- end
- local resourceTable = {
- "Electronics",
- "Chemicals",
- "Oil",
- "Gold",
- }
- function getNearestStationToPlayer()
- local x, y, z = getElementPosition(localPlayer)
- local nearStation, nearDistance = 1, 100000
- for ind, station in pairs(trainStations) do
- local stationDist = getDistanceBetweenPoints2D(x, y, station[1], station[2])
- if (station and stationDist < nearDistance) then
- nearStation, nearDistance = ind, stationDist
- end
- end
- return nearStation
- end
- function beginMission()
- local veh, seat = getPedOccupiedVehicle(localPlayer), getPedOccupiedVehicleSeat(localPlayer)
- if (not veh or seat ~= 0 or not allowedTrains[getElementModel(veh)]) then
- return false
- end
- if (train == veh and exitTimer) then
- killTimer(exitTimer)
- exitTimer = nil
- end
- if (isJobActive or getElementData(localPlayer, "o") ~= "Train Driver" or exports.CITteams:isPlayerInTeams(localPlayer, "Unoccupied")) then
- return false
- end
- train = veh
- setTrainDerailable(train, true)
- setCrowdedAreas()
- derailedTimer = setTimer(checkIfDerailed, 3000, 0)
- initializeFuelStuff()
- addEventHandler("onClientPlayerResign", localPlayer, cancelMission)
- addEventHandler("onClientPlayerWasted", localPlayer, cancelMission)
- addEventHandler("onClientPlayerVehicleExit", localPlayer, driverLeftTrain)
- addEventHandler("onClientElementDestroy", train, function()
- train = nil
- cancelMission()
- end)
- if (getElementModel(veh) == 538 or getElementModel(veh) == 449) then
- stationID = getNearestStationToPlayer()
- startPassengersMission()
- isTransportingPassengers = true
- else
- startResourcesMission()
- isTransportingPassengers = false
- end
- end
- addEventHandler("onClientPlayerVehicleEnter", localPlayer, beginMission)
- addEventHandler("onClientResourceStart", resourceRoot, beginMission)
- function startResourcesMission()
- stationID = getNearestStationToPlayer()
- local x, y, z = trainStations[stationID][1], trainStations[stationID][2], trainStations[stationID][3]
- elements["stationMarker"] = createMarker(x, y, z, "checkpoint", 2, 255, 255, 0, 255)
- addEventHandler("onClientMarkerHit", elements["stationMarker"], loadResources)
- elements["stationBlip"] = createBlipAttachedTo(elements["stationMarker"], 41)
- local playerX, playerY, playerZ = getElementPosition(localPlayer)
- local zone = exports.CITmapMisc:getZoneName2(x, y, z)
- exports.CIThelp:dm(t("TRAIN DRIVER: Make your way to %s to start loading resources!", zone), 255, 125, 0)
- dangerousItemBonus = false
- hasResources = false
- isJobActive = true
- end
- function startPassengersMission()
- local x, y, z = trainStations[stationID][1], trainStations[stationID][2], trainStations[stationID][3]
- elements["stationMarker"] = createMarker(x, y, z, "checkpoint", 2, 255, 255, 0, 255)
- addEventHandler("onClientMarkerHit", elements["stationMarker"], enteredTrainStation)
- elements["stationBlip"] = createBlipAttachedTo(elements["stationMarker"], 41)
- local playerX, playerY, playerZ = getElementPosition(localPlayer)
- local zone = exports.CITmapMisc:getZoneName2(x, y, z)
- exports.CIThelp:dm(t("TRAIN DRIVER: Make your way to %s to board / unboard passengers!", zone), 255, 125, 0)
- distToStation = getDistanceBetweenPoints2D(x, y, playerX, playerY)
- isTransportingPassengers = true
- hasPassenger = false
- isJobActive = true
- end
- function loadResources(player, matchDim)
- if (not matchDim or player ~= localPlayer or not isJobActive or hasResources) then
- return false
- end
- local veh = getPedOccupiedVehicle(localPlayer)
- if (not veh or getElementModel(veh) ~= 537 or getVehicleController(veh) ~= localPlayer) then
- return false
- end
- local speedX, speedY, speedZ = getElementVelocity(veh)
- local actualSpeed = (speedX ^ 2 + speedY ^ 2 + speedZ ^ 2) ^ (0.5)
- local finalSpeed = actualSpeed * 180
- if (finalSpeed > 30) then
- exports.CIThelp:dm("The train is currently going too fast. Slow down to under 30 KPH to start loading resources.", 255, 0, 0, true)
- return false
- end
- setTrainSpeed(veh, 0)
- setElementData(localPlayer, "nc", true)
- setTimer(setElementData, 10000, 1, localPlayer, "nc", false)
- local trailers = math.random(1, 5)
- local x, y, z = getElementPosition(localPlayer)
- for i = 1, trailers do
- resourceElements['vehicles'][i] = createVehicle(569, x + 3, y + 3,z)
- resourceElements['objects'][i] = createObject(2934, x + 3, y + 3, z)
- resourceElements['objects2'][i] = createObject(2934, x + 3,y + 3, z)
- end
- for k,v in pairs(resourceElements['vehicles']) do
- attachTrailerToVehicle(getPedOccupiedVehicle(localPlayer), resourceElements['vehicles'][k])
- if (k < trailers) then
- attachTrailerToVehicle(resourceElements['vehicles'][k], resourceElements['vehicles'][k + 1])
- end
- attachElements(resourceElements['objects'][k], resourceElements['vehicles'][k], 0, 5, 0.4)
- attachElements(resourceElements['objects2'][k], resourceElements['vehicles'][k], 0, - 5, 0.4)
- end
- goodsType = resourceTable[math.random(#resourceTable)]
- exports.CITradar:loadingBar("trainResourceLoader", "timed", "Loading "..goodsType, 50, 100, 255, 255, 255, 255, 10000, 10000)
- loadTimer = setTimer(loadingFinished, 10000, 1, localPlayer, veh)
- hasResources = false
- isLoading = true
- end
- function loadingFinished(player, veh)
- if (player ~= localPlayer or not veh or getElementModel(veh) ~= 537 or getVehicleController(veh) ~= localPlayer or not isJobActive) then
- exports.CIThelp:dm("You failed to continue the mission due to leaving your train while resources were getting loaded.", 255, 0, 0, true)
- cancelMission()
- return false
- end
- resetMissionAssets()
- local resourceStation = math.random(#trainStations)
- if (stationID ~= #trainStations) then
- local attempts = 0
- while (resourceStation <= stationID and attempts < 10) do
- attempts = attempts + 1
- resourceStation = math.random(#trainStations)
- end
- else
- resourceStation = 1
- end
- local x, y, z = getElementPosition(localPlayer)
- local delX, delY, delZ = trainStations[resourceStation][1], trainStations[resourceStation][2], trainStations[resourceStation][3]
- local zone = exports.CITmapMisc:getZoneName2(delX, delY, delZ)
- elements["delMarker"] = createMarker(delX, delY, delZ - 1, "cylinder", 5, 255, 0, 255, 175)
- addEventHandler("onClientMarkerHit", elements["delMarker"], deliveredResources)
- elements["delBlip"] = createBlipAttachedTo(elements["delMarker"], 51)
- 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)
- local chance = math.random()
- --if (exports.CITperks:doesPlayerHavePerk("Dangerous Items Permit")) then
- if (exports.CDperks:doesPlayerHavePerk("Dangerous Items Permit")) then
- if (chance <= 0.05) then
- 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)
- dangerousItemBonus = true
- end
- end
- distToStation = getDistanceBetweenPoints2D(x, y, delX, delY)
- hasResources = true
- isLoading = false
- end
- function deliveredResources(player, matchDim)
- if (not matchDim or player ~= localPlayer or not isJobActive) then
- return false
- end
- local veh = getPedOccupiedVehicle(localPlayer)
- if (not veh or not allowedTrains[getElementModel(veh)] or getVehicleController(veh) ~= localPlayer) then
- return false
- end
- local speedX, speedY, speedZ = getElementVelocity(veh)
- local actualSpeed = (speedX ^ 2 + speedY ^ 2 + speedZ ^ 2) ^ (0.5)
- local finalSpeed = actualSpeed * 180
- if (finalSpeed > 30) then
- 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)
- return false
- end
- --if (exports.CITperks:doesPlayerHavePerk("Dangerous Items Permit") and dangerousItemBonus) then
- local giveBonus = exports.CDperks:doesPlayerHavePerk("Dangerous Items Permit") and dangerousItemBonus
- triggerServerEvent("CITtraindriver.receivePayment", resourceRoot, "resources", distToStation, goodsType, giveBonus)
- setElementVelocity(veh, 0, 0, 0)
- setElementData(localPlayer, "nc", true)
- setTimer(setElementData, 5000, 1, localPlayer, "nc", false)
- resetMissionAssets()
- for k, v in pairs(resourceElements['vehicles']) do
- destroyElement(v)
- end
- for k, v in pairs(resourceElements['objects']) do
- destroyElement(v)
- end
- for k, v in pairs(resourceElements['objects2']) do
- destroyElement(v)
- end
- resourceElements['vehicles'] = {}
- resourceElements['objects'] = {}
- resourceElements['objects2'] = {}
- dangerousItemBonus = false
- hasResources = false
- startResourcesMission()
- end
- function enteredTrainStation(player, matchDim)
- if (not matchDim or player ~= localPlayer or not isJobActive) then
- return false
- end
- local veh = getPedOccupiedVehicle(localPlayer)
- if (not veh or not allowedTrains[getElementModel(veh)] or getVehicleController(veh) ~= localPlayer) then
- return false
- end
- local speedX, speedY, speedZ = getElementVelocity(veh)
- local actualSpeed = math.sqrt(speedX ^ 2 + speedY ^ 2 + speedZ ^ 2)
- local finalSpeed = actualSpeed * 180
- if (finalSpeed > 30) then
- 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)
- return false
- end
- setTrainSpeed(veh, 0)
- local hours, mins = getTime()
- if (hours >= 12 and hours <= 14) then
- passengerLimit = 30
- else
- passengerLimit = 15
- end
- randomPassengersToPick = math.random(1, passengerLimit)
- randomPassengersToDrop = math.random(0, passengersOnBoard)
- iprint(randomPassengersToDrop)
- iprint(randomPassengersToPick)
- stationID = stationID + 1
- if (stationID >= #trainStations) then
- stationID = 1
- end
- if (passengersOnBoard > 0) and (randomPassengersToDrop > 0) then
- triggerServerEvent("CITtraindriver.receivePayment", resourceRoot, "passenger", distToStation, randomPassengersToDrop)
- if ((passengersOnBoard + randomPassengersToPick) - randomPassengersToDrop > seatLimit) then
- passengersOnBoard = seatLimit
- else
- passengersOnBoard = (passengersOnBoard + randomPassengersToPick) - randomPassengersToDrop
- end
- else
- if (passengersOnBoard + randomPassengersToPick > seatLimit) then
- passengersOnBoard = seatLimit
- else
- passengersOnBoard = passengersOnBoard + randomPassengersToPick
- end
- end
- setElementData(localPlayer, "nc", true)
- setTimer(setElementData, 10000, 1, localPlayer, "nc", false)
- exports.CITradar:loadingBar("trainPassengerShow", "timed", "Loading passengers..", 50, 100, 255, 255, 255, 255, 10000, 10000)
- iprint(passengersOnBoard)
- isLoadingPassengers = true
- setTimer(function() isLoadingPassengers = false end, 10000, 1)
- resetMissionAssets()
- setTimer(startPassengersMission, 10000, 1)
- end
- function cancelMission()
- resetMainAssets()
- resetMissionAssets()
- resetFuel()
- destroyCrowdedAreas()
- isJobActive = false
- hasPassenger = false
- hasResources = false
- train = nil
- passengersOnBoard = 0
- stationID = 1
- end
- addEvent("onClientPlayerResign", true)
- addEvent("onClientPlayerEndShift", true)
- addEventHandler("onClientPlayerEndShift", localPlayer, cancelMission)
- function resetMissionAssets()
- -- Killing all timers
- for tName, timer in pairs(timers) do
- killTimer(timer)
- end
- -- Destroying all elements
- for eName, e in pairs(elements) do
- destroyElement(e)
- end
- -- Resetting variables
- timers = {}
- elements = {}
- end
- function resetMainAssets()
- if (derailedTimer) then
- killTimer(derailedTimer)
- derailedTimer = nil
- end
- if (exitTimer) then
- killTimer(exitTimer)
- exitTimer = nil
- end
- if (train) then
- removeEventHandler("onClientElementDestroy", train, cancelMission)
- end
- removeEventHandler("onClientPlayerResign", localPlayer, cancelMission)
- removeEventHandler("onClientPlayerWasted", localPlayer, cancelMission)
- removeEventHandler("onClientPlayerVehicleExit", localPlayer, driverLeftTrain)
- exports.CITradar:loadingBar("trainResourceLoader", "")
- exports.CITradar:loadingBar("trainPassengerShow", "")
- exports.CIThelp:modTextBar("trainSpeedLimitBar", "")
- end
- function checkIfDerailed()
- local rX, rY, rZ = getElementRotation(train)
- if (rY ~= 0) then
- cancelMission()
- exports.CIThelp:dm("You failed the mission for going over the accepted speed limit and getting your train derailed.", 255, 0, 0, true)
- end
- end
- function driverLeftTrain(veh, seat)
- if (veh ~= train) then
- return false
- end
- exports.CIThelp:dm("You have 20 seconds to get back to your vehicle else you will fail the mission.", 255, 0, 0, true)
- exitTimer = setTimer(checkLeaving, 20000, 1)
- end
- function checkLeaving()
- exitTimer = nil
- if (train and getVehicleController(train) == localPlayer) then
- return false
- end
- cancelMission()
- end
- function setCrowdedAreas()
- resourceElements["warningCol"][createColRectangle(2185, -1912, 800, 800)] = true -- LS
- resourceElements["warningCol"][createColRectangle(-1856, 270, 800, 800)] = true -- SF
- resourceElements["warningCol"][createColRectangle(1051, 2523, 800, 800)] = true -- LV
- resourceElements["speedCol"][createColRectangle(2068, -1723, 400, 400)] = true -- LS
- resourceElements["speedCol"][createColRectangle(-1725, 497, 400, 400)] = true -- SF
- resourceElements["speedCol"][createColRectangle(1249, 2515, 400, 400)] = true -- LV
- resourceElements["radar"][createRadarArea(2068, -1723, 400, 400, 255, 50, 50, 150)] = true -- LS
- resourceElements["radar"][createRadarArea(-1725, 497, 400, 400, 255, 50, 50, 150)] = true -- SF
- resourceElements["radar"][createRadarArea(1249, 2515, 400, 400, 255, 50, 50, 150)] = true -- LV
- removeEventHandler("onClientElementColShapeHit", localPlayer, playerHitColshape)
- removeEventHandler("onClientElementColShapeLeave", localPlayer, playerLeftColshape)
- addEventHandler("onClientElementColShapeHit", localPlayer, playerHitColshape)
- addEventHandler("onClientElementColShapeLeave", localPlayer, playerLeftColshape)
- triggerEvent("mtacompatradar", root)
- end
- function destroyCrowdedAreas()
- for i, v in pairs(resourceElements["warningCol"]) do
- destroyElement(i)
- end
- resourceElements["warningCol"] = {}
- for i, v in pairs(resourceElements["speedCol"]) do
- destroyElement(i)
- end
- resourceElements["speedCol"] = {}
- for i, v in pairs(resourceElements["radar"]) do
- destroyElement(i)
- end
- resourceElements["radar"] = {}
- triggerEvent("mtacompatradar", root)
- end
- function getCrowdedSpeedLimit()
- local speed = 50
- --if (exports.CITperks:doesPlayerHavePerk("Mechanic Specialist")) then
- if (exports.CDperks:doesPlayerHavePerk("Mechanic Specialist")) then
- speed = speed + (0.2 * speed)
- end
- return speed
- end
- function playerHitColshape(colshape, dim)
- if (not isJobActive) then
- return false
- end
- if (resourceElements["warningCol"][colshape]) then
- local crowdedLimit = getCrowdedSpeedLimit()
- setTrainSpeedLimit(crowdedLimit)
- 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)
- elseif (resourceElements["speedCol"][colshape]) then
- timers["speedTimer"] = setTimer(checkSpeed, 1000, 0)
- end
- end
- function checkSpeed()
- if (not train) then
- return false
- end
- local kph = math.abs(getTrainSpeed(train) * 160)
- if (kph > getCrowdedSpeedLimit()) then
- triggerServerEvent("CITtraindriver.finePlayer", resourceRoot)
- killTimer(timers["speedTimer"])
- timers["speedTimer"] = nil
- setTrainSpeedLimit(0)
- end
- end
- function playerLeftColshape(colshape, dim)
- if (not resourceElements["speedCol"][colshape]) then
- return false
- end
- if (timers["speedTimer"]) then
- killTimer(timers["speedTimer"])
- timers["speedTimer"] = nil
- end
- exports.CIThelp:dm("You left the crowded area, you can start going like crazy again!", 255, 255, 0, true)
- setTrainSpeedLimit(0)
- end
- -------------------------------------------
- -- SPEED LIMIT system to handle modTextBar
- -------------------------------------------
- local playerSpeedLimit = 0
- function setTrainSpeedLimit(speed)
- if (playerSpeedLimit == 0 or playerSpeedLimit > speed) then
- playerSpeedLimit = speed
- end
- if (speed == 0) then
- exports.CIThelp:modTextBar("trainSpeedLimitBar", "")
- return true
- end
- exports.CIThelp:modTextBar("trainSpeedLimitBar", "Speed Limit: "..playerSpeedLimit.." km/h", 255, 255, 0, 255, 10000)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement