Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports GTA
Imports System.IO
Public Class ChainSaw
Inherits Script
Private chainSaw As GTA.Object = Nothing
Private chainSaw2 As GTA.Object = Nothing
Private bChainOn As Boolean = False
Private RotAttacking As Vector3
Private PosAttacking As Vector3
Private RotWalking As Vector3
Private PosWalking As Vector3
Private affectedVehicles As Vehicle()
Private timeSearchAffected As Double = 0
Private bSetWalking As Boolean = True
Private bSetAttacking As Boolean = True
Private soundWalking As System.Media.SoundPlayer = New System.Media.SoundPlayer
Private soundAttacking As System.Media.SoundPlayer = New System.Media.SoundPlayer
Shared texBlood1 As Texture
Shared texBlood2 As Texture
Shared tRandom As Random = New Random()
Shared myInterval As Int16 = 10
Private timeCheckPlayer As Int16 = 0
Private hkActivate As Keys
Private bHasChaina As Boolean = False
Private bWasBikeMode As Boolean = False
Private bWasntBikeMode As Boolean = False
Private lastPlayerPos As Vector3
Private Function BikeMode() As Boolean
Return Exists(Player.Character.CurrentVehicle) AndAlso Player.Character.CurrentVehicle.Model.isBike
End Function
Public Sub New()
Me.Interval = myInterval
Wait(500)
hkActivate = Helper.StringToKey(settingsGetValueString("hkActivate", "general", "D0"), Keys.D0)
Dim sModel As String = settingsGetValueString("model_name", "general", "chainsaw")
PosAttacking.X = Double.Parse(settingsGetValueString("x", "attack_pos", "-0.05"))
PosAttacking.Y = Double.Parse(settingsGetValueString("y", "attack_pos", "0.25"))
PosAttacking.Z = Double.Parse(settingsGetValueString("z", "attack_pos", "-0.3"))
RotAttacking.X = Double.Parse(settingsGetValueString("x", "attack_rot", "-3.6"))
RotAttacking.Y = Double.Parse(settingsGetValueString("y", "attack_rot", "-0.6"))
RotAttacking.Z = Double.Parse(settingsGetValueString("z", "attack_rot", "-0.6"))
PosWalking.X = Double.Parse(settingsGetValueString("x", "walking_pos", "0"))
PosWalking.Y = Double.Parse(settingsGetValueString("y", "walking_pos", "0.2"))
PosWalking.Z = Double.Parse(settingsGetValueString("z", "walking_pos", "0.35"))
RotWalking.X = Double.Parse(settingsGetValueString("x", "walking_rot", "-1.2"))
RotWalking.Y = Double.Parse(settingsGetValueString("y", "walking_rot", "1.5"))
RotWalking.Z = Double.Parse(settingsGetValueString("z", "walking_rot", "0.9"))
Settings.Save()
For Each o As GTA.Object In World.GetAllObjects(sModel)
o.Delete()
Next
While Not Exists(chainSaw)
chainSaw = World.CreateObject(sModel, Vector3.Zero)
Wait(50)
End While
chainSaw.Visible = False
chainSaw.Collision = False
chainSaw.FreezePosition = True
While Not Exists(chainSaw2)
chainSaw2 = World.CreateObject(sModel, Vector3.Zero)
Wait(50)
End While
chainSaw2.Visible = False
chainSaw2.Collision = False
chainSaw2.FreezePosition = True
soundWalking.SoundLocation = ".\scripts\ChainSaw Files\Idle.wav"
soundAttacking.SoundLocation = ".\scripts\ChainSaw Files\Attack.wav"
texBlood1 = New Texture(File.ReadAllBytes(".\scripts\ChainSaw Files\Blood1.png"))
texBlood2 = New Texture(File.ReadAllBytes(".\scripts\ChainSaw Files\Blood2.png"))
Native.Function.Call("SET_ANIM_GROUP_FOR_CHAR", Player.Character, "move_player")
Game.Console.Print("Chainsaw script by JulioNIB")
End Sub
Private Function settingsGetValueString(sOption As String, sCategory As String, sDefault As String) As String
If Settings.GetValueString(sOption, sCategory, "") = "" Then Settings.SetValue(sOption, sCategory, sDefault)
Return Settings.GetValueString(sOption, sCategory, "")
End Function
Private Class Blood
Public tex As Texture
Public x, y, w, h As Int16
Public timeWait As Double
Public Sub New()
If tRandom.NextDouble <= 0.5 Then
tex = texBlood1
Else
tex = texBlood2
End If
x = Game.Resolution.Width * tRandom.NextDouble + 10
y = Game.Resolution.Height * tRandom.NextDouble + 10
w = 55 + tRandom.NextDouble
h = 55 + tRandom.NextDouble
timeWait = tRandom.Next(100, 300)
End Sub
Public Sub tick()
y += 1
w -= tRandom.NextDouble * 0.7
h = w
If timeWait > 0 Then timeWait -= myInterval
End Sub
End Class
Private BloodList As New List(Of Blood)
Private tmpBlood As Blood
Private Class Peds
Public p As Ped
Public bleedingTime As Double = 0
Public fleeing As Boolean = False
Public Sub New(tped As Ped)
p = tped
End Sub
Public Sub flee(attacker As Ped)
fleeing = True
If (tRandom.NextDouble < 0.5) AndAlso Not p.CurrentVehicle Is Nothing AndAlso (p.CurrentVehicle.GetPedOnSeat(VehicleSeat.Driver) = p) Then
p.Task.CruiseWithVehicle(p.CurrentVehicle, 80, False)
Else
p.Task.FleeFromChar(attacker)
End If
End Sub
End Class
Private PedsList As New List(Of Peds)
Private tmpPed As Peds = Nothing
Private Sub msg(ByVal smsg As String, ByVal duracao As Int32)
Native.Function.Call("PRINT_STRING_WITH_LITERAL_STRING_NOW", "STRING", smsg, duracao, 1)
End Sub
Private Sub keyDown(ByVal sender As Object, ByVal e As GTA.KeyEventArgs) Handles MyBase.KeyDown
If e.Key = hkActivate Then
If Player.Character.isRagdoll OrElse (Exists(Player.Character.CurrentVehicle) AndAlso Not Player.Character.CurrentVehicle.Model.isBike) Then
bChainOn = False
Exit Sub
End If
bChainOn = Not bChainOn
If bChainOn Then
equipChain()
Else
stopChain(False)
End If
End If
If bChainOn AndAlso (e.Key = Keys.RButton) AndAlso Not Exists(Player.Character.CurrentVehicle) AndAlso _
Not Native.Function.Call(Of Boolean)("IS_CHAR_PLAYING_ANIM", Player.Character, "gun@ak47", "melee") Then
Player.Character.Animation.Play(New AnimationSet("gun@ak47"), "melee", 5, AnimationFlags.Unknown12 Or AnimationFlags.Unknown11 Or AnimationFlags.Unknown10 Or AnimationFlags.Unknown09)
End If
End Sub
Private Sub equipChain()
bChainOn = True
chainSaw.Collision = True
chainSaw.Visible = True
bSetAttacking = True
bSetWalking = True
timeCheckPlayer = 0
If BikeMode() Then
chainSaw2.Collision = True
chainSaw2.Visible = True
chainSaw2.FreezePosition = False
Else
chainSaw2.Collision = False
chainSaw2.Visible = False
chainSaw2.FreezePosition = True
End If
End Sub
Private Sub stopChain(bDropChain As Boolean)
bChainOn = False
chainSaw.Detach()
chainSaw.Velocity = (Vector3.WorldDown)
chainSaw2.Detach()
chainSaw2.Velocity = (Vector3.WorldDown)
If Not bDropChain Then
chainSaw.Visible = False
chainSaw.Collision = False
chainSaw.FreezePosition = True
chainSaw2.Visible = False
chainSaw2.Collision = False
chainSaw2.FreezePosition = True
End If
Native.Function.Call("SET_ANIM_GROUP_FOR_CHAR", Player.Character, "move_player")
bSetAttacking = True
bSetWalking = True
soundAttacking.Stop()
soundWalking.Stop()
End Sub
Private Sub keyUp(ByVal sender As Object, ByVal e As GTA.KeyEventArgs) Handles MyBase.KeyUp
End Sub
Private Sub general_tick(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Tick
If bChainOn AndAlso (timeCheckPlayer Mod 500 = 0) Then
If (Player.Character.Health <= 0) OrElse _
Native.Function.Call(Of Boolean)("IS_PLAYER_BEING_ARRESTED", Player) Then
stopChain(True)
Exit Sub
ElseIf Exists(Player.Character.CurrentVehicle) AndAlso Not BikeMode() Then
stopChain(False)
Exit Sub
End If
ElseIf Not bChainOn AndAlso (timeCheckPlayer Mod 4000 = 0) Then
chainSaw.Visible = False
chainSaw.Collision = False
chainSaw.FreezePosition = True
chainSaw2.Visible = False
chainSaw2.Collision = False
chainSaw2.FreezePosition = True
End If
timeCheckPlayer += myInterval
If timeCheckPlayer > 5000 Then timeCheckPlayer = 0
If bChainOn Then
Dim bBikeMode As Boolean = BikeMode()
If bBikeMode AndAlso Not bWasBikeMode Then
chainSaw2.Visible = True
chainSaw2.Collision = True
chainSaw2.FreezePosition = False
bSetWalking = True
bSetAttacking = True
End If
If Not bBikeMode AndAlso Not bWasntBikeMode Then
chainSaw2.Visible = False
chainSaw2.Collision = False
chainSaw2.FreezePosition = True
bSetWalking = True
bSetAttacking = True
End If
bWasBikeMode = bBikeMode
bWasntBikeMode = Not bBikeMode
Try
Dim tmpRot As Vector3 = RotAttacking
tmpRot.Y *= -1
If Not Game.isGameKeyPressed(GameKey.Sprint) AndAlso (Game.isGameKeyPressed(GameKey.MoveForward) OrElse Game.isGameKeyPressed(GameKey.MoveBackward)) Then
If bSetAttacking Then
bSetAttacking = False
bSetWalking = True
If Not bBikeMode Then
Native.Function.Call("SET_ANIM_GROUP_FOR_CHAR", Player.Character, "move_melee")
chainSaw.AttachToPed(Player.Character, Bone.LeftHand, PosAttacking, RotAttacking)
Else
chainSaw.AttachToPed(Player.Character, Bone.LeftHand, Vector3.Zero, RotAttacking)
chainSaw2.AttachToPed(Player.Character, Bone.RightHand, Vector3.Zero, tmpRot)
End If
soundAttacking.PlayLooping()
End If
Else
If bSetWalking Then
bSetAttacking = True
bSetWalking = False
If Not bBikeMode Then
Native.Function.Call("SET_ANIM_GROUP_FOR_CHAR", Player.Character, "move_rifle")
chainSaw.AttachToPed(Player.Character, Bone.LeftHand, PosWalking, RotWalking)
Else
chainSaw.AttachToPed(Player.Character, Bone.LeftHand, Vector3.Zero, RotAttacking)
chainSaw2.AttachToPed(Player.Character, Bone.RightHand, Vector3.Zero, tmpRot)
End If
soundWalking.PlayLooping()
End If
End If
If Not Exists(Player.Character.CurrentVehicle) AndAlso (lastPlayerPos = Player.Character.Position) Then
Player.Character.Task.ClearAll()
End If
lastPlayerPos = Player.Character.Position
Dim mySpeed As Double = Player.Character.Velocity.DistanceTo(Vector3.Zero)
If Exists(Player.Character.CurrentVehicle) Then mySpeed = Player.Character.CurrentVehicle.Speed
If timeSearchAffected <= 0 Then
timeSearchAffected = 500
PedsList.Clear()
For Each p As Ped In World.GetPeds(Player.Character.Position, 20)
If Exists(p) AndAlso (p <> Player.Character) AndAlso (p.Health > 0) Then
tmpPed = New Peds(p)
PedsList.Add(tmpPed)
End If
Next
affectedVehicles = World.GetVehicles(Player.Character.Position, 20)
Else
timeSearchAffected -= Interval
If mySpeed > 7.5 Then timeSearchAffected -= Interval
End If
Dim tmpPos As Vector3
Dim tmpPos2 As Vector3
Dim tmpDim As Vector3
Dim closetToHood As Boolean = False
Dim closetToTrunk As Boolean = False
Dim closetToHood2 As Boolean = False
Dim closetToTrunk2 As Boolean = False
Dim bCloseToPos2 As Boolean = False
If Not bBikeMode Then
tmpPos = chainSaw.GetOffsetPosition(Vector3.RelativeRight)
tmpPos2 = chainSaw.GetOffsetPosition(Vector3.RelativeRight * 0.5)
Else
tmpPos = chainSaw.GetOffsetPosition(Vector3.RelativeRight * 0.5)
tmpPos2 = chainSaw2.GetOffsetPosition(Vector3.RelativeRight * 0.5)
End If
'Native.Function.Call("draw_corona", tmpPos.X, tmpPos.Y, tmpPos.Z, 10.0, 0, 0, 255, 0, 0)
'Native.Function.Call("draw_corona", tmpPos2.X, tmpPos2.Y, tmpPos2.Z, 10.0, 0, 0, 255, 255, 0)
For Each v As Vehicle In affectedVehicles
If Exists(v) AndAlso (v <> Player.Character.CurrentVehicle) Then
tmpDim = v.Model.GetDimensions
If Not bBikeMode Then tmpDim.X = tmpDim.X * 0.5
closetToHood = (v.GetOffsetPosition(Vector3.RelativeFront * tmpDim.Y * 0.3).DistanceTo(tmpPos) < tmpDim.X)
closetToTrunk = (v.GetOffsetPosition(Vector3.RelativeBack * tmpDim.Y * 0.3).DistanceTo(tmpPos) < tmpDim.X)
If bBikeMode AndAlso Not closetToHood Then _
closetToHood2 = (bBikeMode AndAlso (v.GetOffsetPosition(Vector3.RelativeFront * tmpDim.Y * 0.3).DistanceTo(tmpPos2) < tmpDim.X))
If bBikeMode AndAlso Not closetToTrunk Then _
closetToTrunk2 = (bBikeMode AndAlso (v.GetOffsetPosition(Vector3.RelativeBack * tmpDim.Y * 0.3).DistanceTo(tmpPos2) < tmpDim.X))
If Not closetToHood AndAlso Not closetToHood2 AndAlso Not closetToTrunk AndAlso Not closetToTrunk2 Then _
bCloseToPos2 = (v.Position.DistanceTo(tmpPos2) < tmpDim.X)
If (v.Model.isBike AndAlso (v.Position.DistanceTo(tmpPos) < 1)) OrElse _
(v.Position.DistanceTo(tmpPos) < tmpDim.X) OrElse closetToHood OrElse closetToTrunk OrElse _
closetToHood2 OrElse closetToTrunk2 OrElse bCloseToPos2 Then
If bCloseToPos2 OrElse closetToHood2 OrElse closetToTrunk2 Then
Native.Function.Call("TRIGGER_PTFX_ON_OBJ", "imp_bullet_metal", chainSaw2,
0.8, 0, 0, 0, 0, 90.0, 1.5)
Native.Function.Call("PLAY_SOUND_FROM_position", -1, "random_main_metal_collisions", tmpPos2.X, tmpPos2.Y, tmpPos2.Z)
Else
Native.Function.Call("TRIGGER_PTFX_ON_OBJ", "imp_bullet_metal", chainSaw,
0.8, 0, 0, 0, 0, 90.0, 1.5)
Native.Function.Call("PLAY_SOUND_FROM_position", -1, "random_main_metal_collisions", tmpPos.X, tmpPos.Y, tmpPos.Z)
End If
v.ApplyForce(Vector3.WorldDown * 0.05)
If v.GetOffsetPosition(Vector3.RelativeLeft).DistanceTo(tmpPos) < tmpDim.X Then
Native.Function.Call("BREAK_CAR_DOOR", v, 0, False)
Native.Function.Call("BREAK_CAR_DOOR", v, 2, False)
End If
If v.GetOffsetPosition(Vector3.RelativeRight).DistanceTo(tmpPos) < tmpDim.X Then
Native.Function.Call("BREAK_CAR_DOOR", v, 1, False)
Native.Function.Call("BREAK_CAR_DOOR", v, 3, False)
End If
If closetToHood OrElse closetToHood2 Then
Native.Function.Call("BREAK_CAR_DOOR", v, 4, False)
End If
If closetToTrunk OrElse closetToTrunk2 Then
Native.Function.Call("BREAK_CAR_DOOR", v, 5, False)
End If
For Each p As Peds In PedsList
If Exists(p.p) AndAlso (p.p.CurrentVehicle = v) AndAlso (p.p.Health > 0) Then
p.p.LeaveVehicle()
If p.p.PedType = PedType.Cop Then
Native.Function.Call("ALTER_WANTED_LEVEL_no_drop", Player, 2)
Native.Function.Call("APPLY_WANTED_LEVEL_CHANGE_NOW", Player)
Else
p.p.Task.FleeFromChar(Player.Character)
End If
End If
Next
End If
End If
Next
Player.Character.Weapons.Unarmed.Select()
Dim bKiller As Boolean = False
For Each p As Peds In PedsList
If Not Exists(p.p) Then
PedsList.RemoveAt(PedsList.IndexOf(p))
Exit For
End If
'Native.Function.Call("draw_corona", p.p.Position.X, p.p.Position.Y, p.p.Position.Z, 10.0, 0, 0, 0, 255, 0)
If p.bleedingTime <= 0 Then
If (p.p.Health > 0) AndAlso (((p.p.Position.DistanceTo(tmpPos) < 0.5) OrElse (p.p.Position.DistanceTo(tmpPos2) < 0.5)) OrElse _
(bBikeMode AndAlso ((p.p.Position.DistanceTo(tmpPos) < 1.5) OrElse (p.p.Position.DistanceTo(tmpPos2) < 1.5)))) Then
If Not p.p.isInVehicle Then
p.p.CancelAmbientSpeech()
p.bleedingTime = 100
If p.p.PedType = PedType.Cop Then
Native.Function.Call("ALTER_WANTED_LEVEL_no_drop", Player, 2)
Native.Function.Call("APPLY_WANTED_LEVEL_CHANGE_NOW", Player)
End If
p.p.Task.ClearAll()
p.p.Task.FleeFromChar(Player.Character)
Dim tmpBloodCount As Int16 = tRandom.Next(20, 50)
For c As Int16 = 1 To tmpBloodCount
tmpBlood = New Blood
BloodList.Add(tmpBlood)
If BloodList.Count > 100 Then Exit For
Next
bKiller = True
Else
p.p.LeaveVehicle()
End If
ElseIf bKiller Then
If p.p.PedType = PedType.Cop Then
Native.Function.Call("ALTER_WANTED_LEVEL_no_drop", Player, 2)
Native.Function.Call("APPLY_WANTED_LEVEL_CHANGE_NOW", Player)
ElseIf Not p.fleeing Then
p.flee(Player.Character)
End If
End If
Else
p.bleedingTime -= Interval
Native.Function.Call("TRIGGER_PTFX_ON_PED", "blood_wheel_squash", p.p,
0, 0, 0, 0, 0, 0, 1.0)
Native.Function.Call("PLAY_SOUND_FROM_position", -1, "special_someone_blood", p.p.Position.X, p.p.Position.Y, p.p.Position.Z)
Native.Function.Call("HIGH_FALL_SCREAM", p.p)
If bBikeMode Then
p.p.ApplyForce(Vector3.Normalize(Player.Character.CurrentVehicle.Velocity) * 0.05 + Vector3.WorldUp * 0.5)
Else
p.p.ApplyForce(Player.Character.Direction * 0.5 + Vector3.WorldDown * 0.5)
End If
If p.bleedingTime <= 0 Then
p.p.Die()
PedsList.RemoveAt(PedsList.IndexOf(p))
Exit For
End If
End If
Next
Catch
PedsList.Clear()
End Try
End If
For Each b As Blood In BloodList
b.tick()
If Not bChainOn Then
b.tick()
b.tick()
End If
If b.w < 15 Then
BloodList.RemoveAt(BloodList.IndexOf(b))
Exit For
End If
Next
End Sub
Private Sub console_CMD(ByVal sender As Object, ByVal e As ConsoleEventArgs) Handles MyBase.ConsoleCommand
End Sub
Private Sub GraphicsEventHandler(ByVal sender As Object, ByVal e As GTA.GraphicsEventArgs) Handles MyBase.PerFrameDrawing
For Each b As Blood In BloodList
If b.timeWait <= 0 Then _
e.Graphics.DrawSprite(b.tex, b.x, b.y, b.w, b.h, 0)
Next
End Sub
End Class