]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/w_incendiary_r.c
now menu qc respects g_campaign_name
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / w_incendiary_r.c
1 void() rincendiary_ready_01;\r
2 void() rincendiary_fire1_01;\r
3 void() rincendiary_deselect_01;\r
4 void() rincendiary_select_01;\r
5 \r
6 float() rincendiary_check =\r
7 {\r
8         if (self.ammo_rockets >= 5)\r
9                 return TRUE;\r
10         return FALSE;\r
11 };\r
12 \r
13 void(float req) w_rincendiary =\r
14 {\r
15         if (req == WR_IDLE)\r
16                 rincendiary_ready_01();\r
17         else if (req == WR_FIRE1)\r
18                 weapon_prepareattack(rincendiary_check, rincendiary_check, rincendiary_fire1_01, cvar("g_balance_incendiaryrocket_refire"));\r
19         else if (req == WR_RAISE)\r
20                 rincendiary_select_01();\r
21         else if (req == WR_UPDATECOUNTS)\r
22                 self.currentammo = floor(self.ammo_rockets / 5);\r
23         else if (req == WR_DROP)\r
24                 rincendiary_deselect_01();\r
25         else if (req == WR_SETUP)\r
26                 weapon_setup(WEP_ROCKET_INCENDIARY, "w_rli.zym", IT_ROCKETS);\r
27         else if (req == WR_CHECKAMMO)\r
28                 weapon_hasammo = rincendiary_check();\r
29 };\r
30 \r
31 \r
32 void W_IncendiaryRocket_Explode (void)\r
33 {\r
34         vector  org2;\r
35         entity head;\r
36 \r
37         float flametime, flamedmg, flamerate, flameedge, flameradius, distratio;\r
38 \r
39         flameradius =   cvar("g_balance_incendiaryrocket_burnradius");\r
40         flamedmg =              cvar("g_balance_incendiaryrocket_burndamage");\r
41         flamerate =             cvar("g_balance_incendiaryrocket_burnrate");\r
42         flametime =             cvar("g_balance_incendiaryrocket_burntime");\r
43         flameedge =             cvar("g_balance_incendiaryrocket_burnedge_ratio");\r
44 \r
45         org2 = findbetterlocation (self.origin);\r
46         te_explosion (org2);\r
47         effect (org2, "models/sprites/rocketexplosion.spr32", 0, 20, 40);\r
48         sound (self, CHAN_BODY, "weapons/rocket_impact.wav", 1, ATTN_NORM);\r
49 \r
50         self.event_damage = SUB_Null;\r
51         RadiusDamage (self, self.owner, cvar("g_balance_incendiaryrocket_damage"), cvar("g_balance_incendiaryrocket_edgedamage"), cvar("g_balance_incendiaryrocket_radius"), world, cvar("g_balance_incendiaryrocket_force"), WEP_ROCKET_INCENDIARY);\r
52 \r
53         // fixme: need better way to set on fire...\r
54         head = findradius(self.origin, flameradius);\r
55         while(head)\r
56         {\r
57                 if(head.takedamage == DAMAGE_AIM)//head.classname == "player" || head.classname == "turret")\r
58                 {\r
59                         traceline(self.origin, head.origin, TRUE, self);\r
60                         if(trace_fraction >= 1)\r
61                         {\r
62                                 distratio = 1 - (vlen(head.origin - self.origin) / flameradius);\r
63                                 IgniteTarget(head, self.owner,\r
64                                         (flametime*flameedge) + (flametime - flameedge)*distratio,\r
65                                         flamedmg,\r
66                                         flamerate,\r
67                                         TRUE);\r
68                         }\r
69                 }\r
70                 head = head.chain;\r
71         }\r
72 \r
73         remove (self);\r
74 }\r
75 \r
76 void W_IncendiaryRocket_Think (void)\r
77 {\r
78         self.nextthink = time;\r
79         if (time > self.cnt)\r
80         {\r
81                 W_IncendiaryRocket_Explode ();\r
82                 return;\r
83         }\r
84         if (self.owner)\r
85         {\r
86                 if (self.owner.deadflag)\r
87                         self.owner = self;\r
88                 else if (self.owner.wpn == WEP_ROCKET_INCENDIARY && self.owner.button3)\r
89                         W_IncendiaryRocket_Explode ();\r
90         }\r
91 }\r
92 \r
93 void W_IncendiaryRocket_Touch (void)\r
94 {\r
95         if (pointcontents (self.origin) == CONTENT_SKY)\r
96         {\r
97                 remove (self);\r
98                 return;\r
99         }\r
100         else\r
101                 W_IncendiaryRocket_Explode ();\r
102 }\r
103 \r
104 void W_IncendiaryRocket_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)\r
105 {\r
106         self.health = self.health - damage;\r
107         if (self.health <= 0)\r
108                 W_IncendiaryRocket_Explode();\r
109 }\r
110 \r
111 void W_IncendiaryRocket_Attack (void)\r
112 {\r
113         local entity missile;\r
114         local entity flash;\r
115         local vector org;\r
116         local vector end;\r
117 \r
118         local vector trueaim;\r
119         org = self.origin + self.view_ofs;\r
120         end = self.origin + self.view_ofs + v_forward * 4096;\r
121         traceline(org,end,TRUE,self);\r
122         trueaim = trace_endpos;\r
123 \r
124         sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", 1, ATTN_NORM);\r
125         if (cvar("g_rocketarena") == 0 && cvar("g_use_ammunition") == 1)\r
126                 self.ammo_rockets = self.ammo_rockets - 5;\r
127         self.punchangle_x = -4;\r
128         org = self.origin + self.view_ofs + v_forward * 15 + v_right * 3 + v_up * -11;\r
129         te_smallflash(org);\r
130 \r
131         missile = spawn ();\r
132         missile.owner = self;\r
133         missile.classname = "missile";\r
134 \r
135         missile.takedamage = DAMAGE_YES;\r
136         //missile.damageforcescale = 4;\r
137         missile.health = 30;\r
138         missile.event_damage = W_IncendiaryRocket_Damage;\r
139 \r
140         missile.movetype = MOVETYPE_FLY;\r
141         missile.solid = SOLID_BBOX;\r
142         setmodel (missile, "models/rocket.md3");\r
143         setsize (missile, '0 0 0', '0 0 0');\r
144 \r
145         setorigin (missile, org);\r
146         missile.velocity = normalize(trueaim - org) * cvar("g_balance_incendiaryrocket_speed");\r
147         missile.angles = vectoangles (missile.velocity);\r
148 \r
149         missile.touch = W_IncendiaryRocket_Touch;\r
150         missile.think = W_IncendiaryRocket_Think;\r
151         missile.nextthink = time;\r
152         missile.cnt = time + 9;\r
153         sound (missile, CHAN_BODY, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);\r
154 \r
155         flash = spawn ();\r
156         setorigin (flash, org);\r
157         setmodel (flash, "models/flash.md3");\r
158         flash.velocity = v_forward * 20;\r
159         flash.angles = vectoangles (flash.velocity);\r
160         SUB_SetFade (flash, time, 0.4);\r
161         flash.effects = flash.effects | EF_ADDITIVE | EF_FULLBRIGHT;\r
162 }\r
163 \r
164 // weapon frames\r
165 \r
166 void()  rincendiary_ready_01 =  {weapon_thinkf(WFRAME_IDLE, 0.1, rincendiary_ready_01); self.weaponentity.state = WS_READY;};\r
167 void()  rincendiary_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');};\r
168 void()  rincendiary_deselect_01 =       {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);};\r
169 void()  rincendiary_fire1_01 =\r
170 {\r
171         weapon_doattack(rincendiary_check, rincendiary_check, W_IncendiaryRocket_Attack);\r
172         weapon_thinkf(WFRAME_FIRE1, 0.3, rincendiary_ready_01);\r
173 };\r
174 \r