Skip to content

Commit 49961eb

Browse files
committed
rustlerbombs: Added new resource
1 parent c618a18 commit 49961eb

File tree

2 files changed

+141
-0
lines changed

2 files changed

+141
-0
lines changed

[gameplay]/rustlerbombs/client.lua

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
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

[gameplay]/rustlerbombs/meta.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<meta>
2+
<info author="MTA contributors (github.com/multitheftauto/mtasa-resources)" version="1.0" name="Rustler bombs" description="Rustler glider bomb (controlled with left ALT)" type="script" />
3+
<min_mta_version client="1.5.6-9.16404"></min_mta_version>
4+
<script src="client.lua" type="client" />
5+
</meta>

0 commit comments

Comments
 (0)