Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- if CLIENT then return end
- trainSpeed = 60
- trainTrack = {}
- trainTrack[1] = {pos = Vector(2275.99,-1536.68,-262), ang = Angle(0,90,0), tele = true, busstop = false}
- trainTrack[2] = {pos = Vector(2272.5,-4714.65,-262), ang = Angle(0,90,0), tele =false, busstop = true}
- trainSegment = 1
- // scrubbing time!
- for k,v in pairs(trainTrack) do
- track2 = trainTrack[1]
- if trainTrack[k+1] then
- track2 = trainTrack[k+1]
- end
- v.pos = Vector(math.Round(v.pos.x), math.Round(v.pos.y), math.Round(v.pos.z))
- v.ang = Angle(math.Round(v.ang.p), math.Round(v.ang.y), math.Round(v.ang.r))
- if v.ang == track2.ang then
- local dir = (v.pos - track2.pos):GetNormal()
- if dir.x==1 then track2.pos[x]=v.pos[x] end
- if dir.y==1 then track2.pos[y]=v.pos[y] end
- if dir.z==1 then track2.pos[z]=v.pos[z] end
- end
- trainPositions = {}
- trainPositions[1] = table.Copy(trainTrack[1])
- trainPositions[2] = table.Copy(trainTrack[2])
- end
- function writeRedirectorInfo()
- if not trainTrack then return end
- local S = ""
- for i,place in pairs(trainTrack) do
- if (place.busstop==true) then
- //print("truthfound")
- end
- S = S .. "$" .. tostring(place.tele) ..") " .. tostring(place.busstop) .. ") "
- S = S .. math.Round(place.pos.x,3) .. ";" .. math.Round(place.pos.y,3) .. ";" .. math.Round(place.pos.z,3) .. ";".. math.Round(place.ang.p,3) .. ";" .. math.Round(place.ang.y,3) .. ";" .. math.Round(place.ang.r,3)
- end
- file.Write("trainredirectors_"..game.GetMap()..".txt",S)
- end
- function readRedirectorInfo()
- local str = file.Read("trainredirectors_"..game.GetMap()..".txt") || ""
- local lines = string.Explode("$",str)
- //PrintTable(st)
- trainTrack = {}
- for k,v in pairs(lines) do
- if v != "" then
- local rtab = string.Explode(") ",v)
- local tel = rtab[1]
- local bstop = rtab[2]
- local coords = string.Explode(";",rtab[3])
- local trackPiece = {ang = Angle(coords[4],coords[5],coords[6]), pos = Vector(coords[1],coords[2],coords[3]), tele = tobool(tel), busstop = tobool(bstop)}
- //print(bstop)
- //if bstop==true then
- //print("truth")
- //end
- // dunno why i have to do this
- trackPiece.ang.p = coords[4]
- trackPiece.ang.y = coords[5]
- trackPiece.ang.r = coords[6]
- table.insert(trainTrack, trackPiece)
- end
- end
- for k,plyy in pairs(player.GetAll()) do
- if plyy:IsSuperAdmin() then
- sendJoinTrains(plyy)
- end
- end
- end
- // how many times we're going to move when we go between two redirects
- movementSections = 35
- movementSectionCurrent = 1
- function moveTrain()
- if not GAMEMODE.busStop then GAMEMODE.busStop=false end
- if not trainTrack[1] || not trainTrack[2] then print("No track, probably no file to read either.") return end
- if not IsValid(trainMain) then // Create a train if there ever isn't one
- GAMEMODE.trackComingFrom = 1
- GAMEMODE.trackGoingTo = 2
- tp = trainTrack[GAMEMODE.trackComingFrom].pos
- ta = trainTrack[GAMEMODE.trackGoingTo].ang
- //trainMain = nil
- trainMain = ents.Create("prop_physics")
- trainMain:SetModel("models/inaki/vehicles/borderlands_bus.mdl")
- trainMain:SetPos(tp)
- trainMain:SetAngles(ta)
- trainMain:SetNoDraw(false)
- trainMain:Spawn()
- trainMain:SetCollisionGroup( COLLISION_GROUP_WORLD )
- trainMain.seats = {}
- // this is just for shorthand
- //ta = trainPositions[1].ang
- //tp = trainPositions[1].pos
- local seatsToSpawn = {
- tp + ta:Up()*50 + ta:Forward()*-20,
- tp + ta:Up()*50 + ta:Right()*130 + ta:Forward()*-20,
- tp + ta:Up()*50 + ta:Right()*130,
- tp + ta:Up()*50 + ta:Right()*130 + ta:Forward()*20,
- tp + ta:Up()*50 + ta:Right()*60 + ta:Forward()*-20,
- tp + ta:Up()*50 + ta:Right()*30 + ta:Forward()*-20,
- tp + ta:Up()*50 + ta:Right()*-30 + ta:Forward()*-20,
- tp + ta:Up()*50 + ta:Right()*-60 + ta:Forward()*-20
- }
- for k,v in pairs(seatsToSpawn) do
- trainMain.seats[k] = ents.Create("prop_vehicle_prisoner_pod")
- trainMain.seats[k]:SetModel("models/nova/jeep_seat.mdl")
- trainMain.seats[k]:SetPos(v)
- trainMain.seats[k]:SetAngles(ta)
- trainMain.seats[k]:SetParent(trainMain)
- trainMain.seats[k]:Spawn()
- trainMain.seats[k]:SetCollisionGroup( COLLISION_GROUP_WORLD )
- if not trainMain.seats[k].DoorData then
- trainMain.seats[k].DoorData = {}
- end
- trainMain.seats[k]:setKeysNonOwnable(true)
- //trainMain.seats[k]:Activate()
- end
- local phys = trainMain:GetPhysicsObject()
- if IsValid(phys) then
- phys:EnableMotion(false)
- end
- readRedirectorInfo()
- end
- if not IsValid(trainMain) || not istable(trainTrack) then return end
- if not trainTrack[GAMEMODE.trackComingFrom] || not trainTrack[GAMEMODE.trackGoingTo] then
- print("No track! Attempting to read redirector info...")
- readRedirectorInfo()
- return
- end
- movementSectionCurrent = movementSectionCurrent+1
- // If the train has gone further than the next redirect, or it's a teleport
- if trainMain:GetPos():Distance(trainTrack[GAMEMODE.trackComingFrom].pos) > trainTrack[GAMEMODE.trackComingFrom].pos:Distance(trainTrack[GAMEMODE.trackGoingTo].pos) || trainTrack[GAMEMODE.trackGoingTo].tele==true then
- //print("nextpiece")
- trainMain:SetPos(trainTrack[GAMEMODE.trackGoingTo].pos)
- // adjust 90 here for the model being off
- //local angtrainTrack[GAMEMODE.trackGoingTo].ang
- ta = trainTrack[GAMEMODE.trackGoingTo].ang
- local fixedFinalTurn = Angle(ta.p,ta.y,ta.r)
- fixedFinalTurn:RotateAroundAxis(fixedFinalTurn:Up(),90)
- trainMain:SetAngles(fixedFinalTurn)
- GAMEMODE.trackComingFrom = GAMEMODE.trackComingFrom + 1
- GAMEMODE.trackGoingTo = GAMEMODE.trackGoingTo + 1
- // we bumped up both, now we check if either overran, to loop back to 1, now we have our current track
- if GAMEMODE.trackComingFrom>table.Count(trainTrack) then
- GAMEMODE.trackComingFrom = 1
- end
- if GAMEMODE.trackGoingTo>table.Count(trainTrack) then
- GAMEMODE.trackGoingTo = 1
- end
- movementSectionCurrent = 1
- if trainTrack[GAMEMODE.trackComingFrom].busstop==true then
- GAMEMODE.busStop = true
- timer.Simple(8,function() GAMEMODE.busStop = false end)
- end
- end
- // take a break once we change redirectors if the new one is a busstop
- if GAMEMODE.busStop == false then
- // this will be a local vector of the section of movement
- local movementPiece = (trainTrack[GAMEMODE.trackGoingTo].pos - trainTrack[GAMEMODE.trackComingFrom].pos) * (1/movementSections)
- //print(movementPiece)
- trainMain:SetPos( trainMain:GetPos() + movementPiece )
- local fixturn = Angle(ta.p,ta.y,ta.r)
- fixturn = LerpAngle( movementSectionCurrent/movementSections, trainTrack[GAMEMODE.trackComingFrom].ang, trainTrack[GAMEMODE.trackGoingTo].ang )
- //print(fixturn)
- fixturn:RotateAroundAxis(fixturn:Up(), 90)
- //turnPiece:Normalize()
- trainMain:SetAngles( fixturn )
- end
- //if not trainTrack[trackComingFrom] then trackComingFrom
- // same as movement but for angle
- // rotate the current angle around the current up direction by: trackyawdifference /sections
- //
- //local trackyawdifference = trainTrack[GAMEMODE.trackGoingTo].ang.y - trainTrack[GAMEMODE.trackComingFrom].ang.y
- //local difference = trainMain:GetPos()-lastPos
- //if not difference then difference = Vector(0,0,0) end
- //difference = Vector(difference.x,difference.y,0)
- end
- hook.Add ( "Think", "startTrainMotion", moveTrain)
- //hook.Add("InitPostEntity","startTrainMotion",function () timer.Simple(3,function() moveTrain() end) end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement