Điểm yếu của hệ thống giao thông trong GTA IV là gì? đó là không giống thật. Thực tế ở ngoài xe cộ đi trên đường ko chỉ có đạp thắng và lên ga mà phải tùy tốc độ mình đang chạy, tùy tình huống trên đường mà phát sinh lách né, đạp thắng từ xa, rồ ga vượt mặt... và phản ứng của mỗi người là khác nhau. Vì vậy mới cần lập trình lại hệ thống giao thông trong GTA IV cho giống thật. Tuy nhiên nếu tính toán sai thì tai nạn giao thông sẽ tăng đáng kể. đây là hậu quả:

Clip ví dụ

http://www.youtube.com/watch?v=Ft2vNLKzu7I

http://www.youtube.com/watch?v=OTEDKfm8Zco

http://www.youtube.com/watch?v=lxj-1xdRY4Q





Ghi là lập trình vậy thôi chứ dễ ẹc chả có gì khó, mình cũng chả biết gì về VB mà vẫn hiểu được tí xíu. Các bác down file nén ở dưới về, giải nén vào thư mục gta IV Version 1.0.7.0 rồi vào thư mục scripts để mở file traffic.vb ra chỉnh sửa bằng notepad.

File traffic đã được mình làm sẵn theo ý của mình, các bác có thể chỉnh sửa tùy ý. ví dụ, khi open file traffic nó sẽ có những dòng sau:



Imports System

Imports System.Collections

Imports System.Drawing

Imports System.Windows.Forms

Imports GTA



Public Class Traffic

Inherits Script



Private xephiatruoc As Vehicle :gán tên cho xe phía trước, tác dụng là để canh khoảng cách tránh ủi đít xe. cái này các bác ko cần sửa chữa gì cả.



Private xehientai As Vehicle : khỏi nói cũng hiểu đây là xe đang xét.



Private Sub PanicTraffic_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Tick

World.UnlockAllIslands()



Dim vehicles As vehicle() = world.getvehicles(player.character.Position, 90.0F) : gom hết những xe trong khoảng cách 90 so với người chơi để chỉnh sửa giao thông.





For Each vehicle As Vehicle In vehicles

If exists(vehicle) Then



Dim ped As Ped = vehicle.getpedonseat(vehicleseat.Driver) '





xehientai=vehicle

xephiatruoc = World.GetClosestVehicle(xehientai.Position, 10.0F) : xe phía trước ta chọn trong khoảng 10 là đủ dùng theo ý tui.



If exists(ped) AndAlso ped.isrequiredformission = False AndAlso xehientai.Speed >= 0 AndAlso xehientai.Speed < 40 AndAlso not exists(xephiatruoc) Then : nếu tốc độ xe đang xét >=0 và <40 và ko có xe phía trước trong khoảng 10 thì:

ped.Task.CruiseWithVehicle(xehientai, 35.0F, false) : chạy thả ga với tốc độ cao nhất là 35, lưu ý tốc độ 35 tương đương với 105 km/h. chữ false sau cùng nghĩa là thấy đèn đỏ thì vẫn vượt, thấy xe phía trước thì đánh tay lái né chứ ko thắng gấp...

ped.nolongerneeded()

End If







If exists(ped) AndAlso ped.isrequiredformission = False AndAlso xehientai.Speed >= 10 AndAlso xehientai.Speed < 40 AndAlso exists(xephiatruoc) AndAlso xephiatruoc.speed > 15 Then : nếu tốc độ xe đang xét >=10 và <40 và có xe phía trước trong khoảng 10 và tốc độ xe phía trước >15, tức là xe phía trước đang chạy nhanh chứ ko thắng gấp thì:





ped.Task.CruiseWithVehicle(xehientai, 25.0F, true) : chạy vừa vừa với tốc độ 25 (75km/h) nhưng cách chạy là true, có đèn đỏ thì phải ngừng, xe phía trước giảm tốc thì phải đạp thắng theo chứ ko lách.

ped.nolongerneeded()

End If





If exists(ped) AndAlso ped.isrequiredformission = False AndAlso xehientai.Speed >= 10 AndAlso xehientai.Speed < 40 AndAlso exists(xephiatruoc) AndAlso xephiatruoc.speed < 15 Then : nếu tốc độ xe đang xét >=10 và <40 và có xe phía trước và tốc độ xe phía trước chậm hơn 15 thì:





ped.Task.CruiseWithVehicle(xehientai, 15.0F, false) : chạy với tốc độ 15 (45km/h) nhưng chạy kiểu false, lỡ nó thắng gấp thì ta cứ đánh tay lái lách.

ped.nolongerneeded()

End If







If exists(ped) AndAlso ped.isrequiredformission = False AndAlso xehientai.Speed >= 0 AndAlso xehientai.Speed < 10 AndAlso exists(xephiatruoc) Then :nếu đơn giản tốc độ xe đang xét >=0 và <10 và có xe phía trước, tốc độ xe phía trước ko cần quan tâm.



ped.Task.CruiseWithVehicle(xehientai, 30.0F, true) : chạy tốc 30 (90km/h và chạy đàng hoàng)

ped.nolongerneeded()

End If









End If

Next

End Sub

End Class













Bác nào muốn đơn giản là cho xe chạy vượt đèn đỏ, lạng lách lung tung thì chỉ việc để 1 dòng If như thế này:











Imports System

Imports System.Collections

Imports System.Drawing

Imports System.Windows.Forms

Imports GTA



Public Class Traffic

Inherits Script



Private xephiatruoc As Vehicle :gán tên cho xe phía trước, tác dụng là để canh khoảng cách tránh ủi đít xe. cái này các bác ko cần sửa chữa gì cả.



Private xehientai As Vehicle : khỏi nói cũng hiểu đây là xe đang xét.



Private Sub PanicTraffic_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Tick

World.UnlockAllIslands()



Dim vehicles As vehicle() = world.getvehicles(player.character.Position, 90.0F) : gom hết những xe trong khoảng cách 90 so với người chơi để chỉnh sửa giao thông.





For Each vehicle As Vehicle In vehicles

If exists(vehicle) Then



Dim ped As Ped = vehicle.getpedonseat(vehicleseat.Driver) '





xehientai=vehicle







If exists(ped) AndAlso ped.isrequiredformission = False AndAlso xehientai.Speed >= 0 AndAlso xehientai.Speed < 100 Then nếu đơn giản tốc độ xe đang xét >=0 và <100 (cứ x3 lên là ra km/h)



ped.Task.CruiseWithVehicle(xehientai, 100.0F, false) : chạy tốc max là 100 (300km/h tùy phân khối xe và chạy ẩu)

ped.nolongerneeded()

End If









End If

Next

End Sub

End Class





Hướng dẫn test nhanh: để khỏi phải thoát game mỗi lần test thì các bác cứ việc mở file script song song với game, khi nào cần sửa chữa thì bấm alt + tab ra ngoài để sửa rồi alt + tab vào game lại, bấm dấu ~ cho hiện bảng console rồi gõ:reloadscripts là game tự load script bạn mới chỉnh sửa.



Xong rồi, nếu bác nào lập trình được giao thông chạy nhanh mà vẫn an toàn thì gửi mình xem thử nhé. Mình làm lâu lâu vẫn gặp tai nạn hihi.