]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/w_rocketlauncher.c
- Added new backpack/tfitem property -- item_backpack gives metal ammo when var...
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / w_rocketlauncher.c
1 void() rlauncher_ready_01;\r
2 void() rlauncher_fire1_01;\r
3 void() rlauncher_deselect_01;\r
4 void() rlauncher_select_01;\r
5 \r
6 float() rlauncher_check =\r
7 {\r
8         if (self.ammo_rockets >= 3)\r
9                 return TRUE;\r
10         return FALSE;\r
11 };\r
12 \r
13 void(float req) w_rlauncher =\r
14 {\r
15         if (req == WR_IDLE)\r
16                 rlauncher_ready_01();\r
17         else if (req == WR_FIRE1)\r
18                 weapon_prepareattack(rlauncher_check, rlauncher_check, rlauncher_fire1_01, cvar("g_balance_rocketlauncher_refire"));\r
19         else if (req == WR_RAISE)\r
20                 rlauncher_select_01();\r
21         else if (req == WR_UPDATECOUNTS)\r
22                 self.currentammo = floor(self.ammo_rockets / 3);\r
23         else if (req == WR_DROP)\r
24                 rlauncher_deselect_01();\r
25         else if (req == WR_SETUP)\r
26                 weapon_setup(WEP_ROCKET_LAUNCHER, "w_rl.zym", IT_ROCKETS);\r
27         else if (req == WR_CHECKAMMO)\r
28                 weapon_hasammo = rlauncher_check();\r
29 };\r
30 \r
31 \r
32 void W_Rocket_Explode (void)\r
33 {\r
34         vector  org2;\r
35         org2 = findbetterlocation (self.origin);\r
36         te_explosion (org2);\r
37         effect (org2, "models/sprites/rocketexplosion.spr32", 0, 20, 40);\r
38         sound (self, CHAN_BODY, "weapons/rocket_impact.wav", 1, ATTN_NORM);\r
39 \r
40         self.event_damage = SUB_Null;\r
41         RadiusDamage (self, self.owner, cvar("g_balance_rocketlauncher_damage"), cvar("g_balance_rocketlauncher_edgedamage"), cvar("g_balance_rocketlauncher_radius"), world, cvar("g_balance_rocketlauncher_force"), WEP_ROCKET_LAUNCHER);\r
42 \r
43         remove (self);\r
44 }\r
45 \r
46 void W_Rocket_Think (void)\r
47 {\r
48         self.nextthink = time;\r
49         if (time > self.cnt)\r
50         {\r
51                 W_Rocket_Explode ();\r
52                 return;\r
53         }\r
54         if (self.owner)\r
55         {\r
56                 if (self.owner.deadflag)\r
57                         self.owner = self;\r
58                 else if (self.owner.wpn == WEP_ROCKET_LAUNCHER && self.owner.button3)\r
59                         W_Rocket_Explode ();\r
60         }\r
61 }\r
62 \r
63 void W_Rocket_Touch (void)\r
64 {\r
65         if (pointcontents (self.origin) == CONTENT_SKY)\r
66         {\r
67                 remove (self);\r
68                 return;\r
69         }\r
70         else\r
71                 W_Rocket_Explode ();\r
72 }\r
73 \r
74 void W_Rocket_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)\r
75 {\r
76         self.health = self.health - damage;\r
77         if (self.health <= 0)\r
78                 W_Rocket_Explode();\r
79 }\r
80 \r
81 void W_Rocket_Attack (void)\r
82 {\r
83         local entity missile;\r
84         local entity flash;\r
85         local vector org;\r
86         local vector end;\r
87         \r
88         local vector trueaim;\r
89         org = self.origin + self.view_ofs;\r
90         end = self.origin + self.view_ofs + v_forward * 4096;\r
91         traceline(org,end,TRUE,self);\r
92         trueaim = trace_endpos;\r
93         \r
94         sound (self, CHAN_WEAPON, "weapons/rocket_fire.ogg", 1, ATTN_NORM);\r
95         if (self.items & IT_STRENGTH) {\r
96                 sound (self, CHAN_AUTO, "weapons/strength_fire.ogg", 1, ATTN_NORM);\r
97         }\r
98         \r
99         if (cvar("g_use_ammunition") && !cvar("g_rocketarena"))\r
100                 self.ammo_rockets = self.ammo_rockets - 3;\r
101         self.punchangle_x = -4;\r
102         org = self.origin + self.view_ofs + v_forward * 15 + v_right * 3 + v_up * -11;\r
103         te_smallflash(org);\r
104 \r
105         missile = spawn ();\r
106         missile.owner = self;\r
107         missile.classname = "missile";\r
108 \r
109         missile.takedamage = DAMAGE_YES;\r
110         missile.damageforcescale = 4;\r
111         missile.health = 30;\r
112         missile.event_damage = W_Rocket_Damage;\r
113 \r
114         missile.movetype = MOVETYPE_FLY;\r
115         missile.solid = SOLID_BBOX;\r
116         setmodel (missile, "models/rocket.md3");\r
117         setsize (missile, '0 0 0', '0 0 0');\r
118 \r
119         setorigin (missile, org);\r
120         missile.velocity = normalize(trueaim - org) * cvar("g_balance_rocketlauncher_speed");\r
121         missile.angles = vectoangles (missile.velocity);\r
122 \r
123         missile.touch = W_Rocket_Touch;\r
124         missile.think = W_Rocket_Think;\r
125         missile.nextthink = time;\r
126         missile.cnt = time + 9;\r
127         sound (missile, CHAN_BODY, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);\r
128 \r
129         flash = spawn ();\r
130         setorigin (flash, org);\r
131         setmodel (flash, "models/flash.md3");\r
132         flash.velocity = v_forward * 20;\r
133         flash.angles = vectoangles (flash.velocity);\r
134         SUB_SetFade (flash, time, 0.4);\r
135         flash.effects = flash.effects | EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;\r
136         self.clip_rockets = self.clip_rockets - 1;\r
137         if (self.clip_rockets == 0)\r
138         {\r
139                 DoReload (3, 4);        // weapon type 3 is RL, and reload 4 rockets.\r
140         }\r
141 }\r
142 \r
143 // weapon frames\r
144 \r
145 void()  rlauncher_ready_01 =    {weapon_thinkf(WFRAME_IDLE, 0.1, rlauncher_ready_01); self.weaponentity.state = WS_READY;};\r
146 void()  rlauncher_select_01 =   {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');};\r
147 void()  rlauncher_deselect_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);};\r
148 void()  rlauncher_fire1_01 =\r
149 {\r
150         weapon_doattack(rlauncher_check, rlauncher_check, W_Rocket_Attack);\r
151         weapon_thinkf(WFRAME_FIRE1, 0.3, rlauncher_ready_01);\r
152 };\r
153 \r