1+ local screenW , screenH = guiGetScreenSize ()
2+
3+ local rustler = false
4+ local reloading = false
5+ local lastShotTick = 0
6+ local rounds = 10
7+ local shotsFired = 0
8+ local delayBetweenShots = 625
9+ local delayBetweenReloads = 5000
10+
11+ function drawHud ()
12+ if reloading then
13+ dxDrawText (" Reloading..." , screenW - 250 , screenH - 100 , _ , _ , tocolor (0 , 255 , 0 ), 2 )
14+ else
15+ dxDrawText (" Bombs: " .. tostring (rounds - shotsFired ) .. " /" .. tostring (rounds ), screenW - 250 , screenH - 100 , _ , _ , tocolor (0 , 255 , 0 ), 2 )
16+ end
17+ end
18+
19+ function dropGliderBomb (rustler )
20+ if not isElement (rustler ) then
21+ return
22+ end
23+ local nowTick = getTickCount ()
24+
25+ if nowTick - lastShotTick < delayBetweenShots then
26+ return
27+ end
28+
29+ local matrix = getElementMatrix (rustler )
30+ local _ , forward , up , position = unpack (matrix )
31+ local x , y , z = unpack (position )
32+
33+ if getVehicleLandingGearDown (rustler ) then
34+ return
35+ end
36+
37+ local uX , uY , uZ = unpack (up )
38+ local fX , fY , fZ = unpack (forward )
39+ local vX , vY , vZ = getElementVelocity (rustler )
40+
41+ if reloading then
42+ playSoundFrontEnd (41 )
43+ return
44+ end
45+
46+ local projectile = createProjectile (rustler , 21 , x - uX * 2 , y - uY * 2 , z - uZ * 2 , 1 , nil , 0 , 0 , 0 , vX + fX * 0.01 , vY + fY * 0.01 , vZ + fZ * 0.01 - uZ * 0.1 )
47+
48+ if not projectile then
49+ return
50+ end
51+
52+ setProjectileMatrix (projectile , Vector3 (vX , vY , vZ ))
53+
54+ setElementCollisionsEnabled (projectile , false )
55+ playSoundFrontEnd (30 )
56+
57+ shotsFired = shotsFired + 1
58+
59+ if shotsFired >= 10 then
60+ setTimer (function ()
61+ reloading = false
62+ shotsFired = 0
63+ end , delayBetweenReloads , 1 )
64+ reloading = true
65+ end
66+
67+ lastShotTick = nowTick
68+ end
69+
70+ function gliderBomb ()
71+ dropGliderBomb (rustler )
72+ end
73+
74+ function exitMode ()
75+ unbindKey (" vehicle_fire" , " down" , gliderBomb )
76+ removeEventHandler (" onClientPlayerWasted" , localPlayer , exitMode )
77+
78+ if isElement (rustler ) then
79+ removeEventHandler (" onClientVehicleExit" , rustler , exitMode )
80+ removeEventHandler (" onClientElementModelChange" , rustler , exitMode )
81+ removeEventHandler (" onClientElementDestroy" , rustler , exitMode )
82+ removeEventHandler (" onClientVehicleExplode" , rustler , exitMode )
83+ end
84+
85+ removeEventHandler (" onClientRender" , root , drawHud )
86+
87+ rustler = false
88+ reloading = false
89+ lastShotTick = 0
90+ rounds = 10
91+ shotsFired = 0
92+ delayBetweenShots = 625
93+ delayBetweenReloads = 5000
94+ end
95+ addEventHandler (" onClientResourceStop" , resourceRoot , exitMode )
96+
97+ function enterMode (vehicle )
98+ if not isElement (vehicle ) or getElementModel (vehicle ) ~= 476 then
99+ return
100+ end
101+
102+ rustler = vehicle
103+
104+ bindKey (" vehicle_fire" , " down" , gliderBomb )
105+ addEventHandler (" onClientPlayerWasted" , localPlayer , exitMode )
106+ addEventHandler (" onClientVehicleExit" , vehicle , exitMode )
107+ addEventHandler (" onClientElementModelChange" , vehicle , exitMode )
108+ addEventHandler (" onClientElementDestroy" , vehicle , exitMode )
109+ addEventHandler (" onClientVehicleExplode" , vehicle , exitMode )
110+ addEventHandler (" onClientRender" , root , drawHud )
111+ end
112+ addEventHandler (" onClientPlayerVehicleEnter" , localPlayer , enterMode )
113+
114+ function checkStart ()
115+ local vehicle = getPedOccupiedVehicle (localPlayer )
116+
117+ if vehicle and getElementModel (vehicle ) == 476 then
118+ enterMode (vehicle )
119+ end
120+ end
121+ addEventHandler (" onClientResourceStart" , resourceRoot , checkStart )
122+
123+ function setProjectileMatrix (p , forward )
124+ forward = - forward :getNormalized ()
125+ forward = Vector3 (- forward :getX (), - forward :getY (), forward :getZ ())
126+ local up = Vector3 (0 , 0 , 1 )
127+ local left = forward :cross (up )
128+
129+ local ux , uy , uz = left :getX (), left :getY (), left :getZ ()
130+ local vx , vy , vz = forward :getX (), forward :getY (), forward :getZ ()
131+ local wx , wy , wz = up :getX (), up :getY (), up :getZ ()
132+ local x , y , z = getElementPosition (p )
133+
134+ setElementMatrix (p , {{ux , uy , uz , 0 }, {vx , vy , vz , 0 }, {wx , wy , wz , 0 }, {x , y , z , 1 }})
135+ return true
136+ end
0 commit comments