]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/w_crylink.qc
actually use g_balance_crylink_secondary_bouncedamagefactor (even though secondary...
[divverent/nexuiz.git] / data / qcsrc / server / w_crylink.qc
1
2 .float gravity;
3 const vector proj_color = '1 1 1';
4
5 .entity realowner;
6
7 void W_Crylink_Think (void)
8 {
9         self.nextthink = self.count;
10         self.angles = vectoangles(self.velocity);
11         if (time >= self.count)
12                 remove(self);
13 }
14
15 void W_Crylink_Touch (void)
16 {
17         float finalhit;
18         float f;
19         if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
20         {
21                 remove(self);
22                 return;
23         }
24         pointparticles(particleeffectnum("crylink_impactbig"), self.origin, '0 0 0', 1);
25         finalhit = ((self.cnt <= 0) || (other.takedamage != DAMAGE_NO));
26         if(finalhit)
27                 f = 1;
28         else
29                 f = cvar("g_balance_crylink_primary_bouncedamagefactor");
30         RadiusDamage (self, self.realowner, cvar("g_balance_crylink_primary_damage") * f, cvar("g_balance_crylink_primary_edgedamage") * f, cvar("g_balance_crylink_primary_radius"), world, cvar("g_balance_crylink_primary_force") * f, IT_CRYLINK);
31         if (finalhit)
32         {
33                 remove (self);
34                 return;
35         }
36         self.cnt = self.cnt - 1;
37         self.angles = vectoangles(self.velocity);
38         self.nextthink = time;
39         self.owner = world;
40         //self.scale = 1 + self.cnt;
41 }
42
43 void W_Crylink_Touch2 (void)
44 {
45         float finalhit;
46         float f;
47         if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
48         {
49                 remove(self);
50                 return;
51         }
52         pointparticles(particleeffectnum("crylink_impact"), self.origin, '0 0 0', 1);
53         finalhit = ((self.cnt <= 0) || (other.takedamage != DAMAGE_NO));
54         if(finalhit)
55                 f = 1;
56         else
57                 f = cvar("g_balance_crylink_secondary_bouncedamagefactor");
58         RadiusDamage (self, self.realowner, cvar("g_balance_crylink_secondary_damage") * f, cvar("g_balance_crylink_secondary_edgedamage") * f, cvar("g_balance_crylink_secondary_radius"), world, cvar("g_balance_crylink_secondary_force") * f, IT_CRYLINK);
59         if (finalhit)
60         {
61                 remove (self);
62                 return;
63         }
64         self.cnt = self.cnt - 1;
65         self.angles = vectoangles(self.velocity);
66         self.nextthink = time;
67         self.owner = world;
68 //      self.scale = 1 + 1 * self.cnt;
69 }
70
71 void W_Crylink_Attack (void)
72 {
73         local float counter, shots;
74         local entity proj;
75         local vector s;
76
77         if (cvar("g_use_ammunition"))
78                 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
79
80         W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
81
82         shots = cvar("g_balance_crylink_primary_shots");
83         pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
84         while (counter < shots)
85         {
86                 proj = spawn ();
87                 proj.realowner = proj.owner = self;
88                 proj.classname = "spike";
89                 proj.bot_dodge = TRUE;
90                 proj.bot_dodgerating = cvar("g_balance_crylink_primary_damage");
91
92                 proj.movetype = MOVETYPE_BOUNCEMISSILE;
93                 proj.solid = SOLID_BBOX;
94                 //proj.gravity = 0.001;
95
96                 setmodel (proj, "models/plasmatrail.mdl"); // precision set below
97                 setsize (proj, '0 0 0', '0 0 0');
98                 setorigin (proj, w_shotorg);
99
100                 s = '0 0 0';
101                 if (counter == 0)
102                         s = '0 0 0';
103                 else if (counter == 1)
104                         s = '0 0 1';
105                 else if (counter == 2)
106                         s = '0 -0.71 -0.71';
107                 else if (counter == 3)
108                         s = '0 0.71 -0.71';
109                 else
110                         s = randomvec();
111                 s = s * cvar("g_balance_crylink_primary_spread");
112                 proj.velocity = (w_shotdir + v_right * s_y + v_up * s_z) * cvar("g_balance_crylink_primary_speed");
113 //              proj.velocity = (w_shotdir + randomvec() * cvar("g_balance_crylink_primary_spread")) * cvar("g_balance_crylink_primary_speed");
114                 W_SetupProjectileVelocity(proj);
115                 proj.touch = W_Crylink_Touch;
116                 proj.count = time + cvar("g_balance_crylink_primary_lifetime");
117                 proj.think = W_Crylink_Think;
118                 proj.nextthink = proj.count;
119                 proj.cnt = cvar("g_balance_crylink_primary_bounces");
120                 proj.scale = 1 + 1 * proj.cnt;
121
122                 proj.angles = vectoangles (proj.velocity);
123
124                 //proj.glow_size = 20;
125
126                 proj.effects = EF_LOWPRECISION;
127                 proj.flags = FL_PROJECTILE;
128                 proj.colormod = proj_color;
129                 counter = counter + 1;
130         }
131 }
132
133 void W_Crylink_Attack2 (void)
134 {
135         local float counter, shots;
136         local entity proj;
137
138         if (cvar("g_use_ammunition"))
139                 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_secondary_ammo");
140
141         W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
142
143         shots = cvar("g_balance_crylink_secondary_shots");
144         pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
145         while (counter < shots)
146         {
147                 proj = spawn ();
148                 proj.realowner = proj.owner = self;
149                 proj.classname = "spike";
150                 proj.bot_dodge = TRUE;
151                 proj.bot_dodgerating = cvar("g_balance_crylink_secondary_damage");
152
153                 proj.movetype = MOVETYPE_BOUNCEMISSILE;
154                 proj.solid = SOLID_BBOX;
155                 //proj.gravity = 0.001;
156
157                 setmodel (proj, "models/plasmatrail.mdl"); // precision set below
158                 setsize (proj, '0 0 0', '0 0 0');
159                 setorigin (proj, w_shotorg);
160
161                 proj.velocity = (w_shotdir + (((counter + 0.5) / shots) * 2 - 1) * v_right * cvar("g_balance_crylink_secondary_spread")) * cvar("g_balance_crylink_secondary_speed");
162                 W_SetupProjectileVelocity(proj);
163                 proj.touch = W_Crylink_Touch2;
164                 proj.count = time + cvar("g_balance_crylink_primary_lifetime");
165                 proj.think = W_Crylink_Think;
166                 proj.nextthink = proj.count;
167                 proj.cnt = cvar("g_balance_crylink_secondary_bounces");
168                 proj.scale = 1 + 1 * proj.cnt;
169
170                 proj.angles = vectoangles (proj.velocity);
171
172                 //proj.glow_size = 20;
173
174                 proj.effects = EF_LOWPRECISION;
175                 proj.flags = FL_PROJECTILE;
176                 proj.colormod = proj_color;
177                 counter = counter + 1;
178         }
179 }
180
181
182 /*
183 // experimental lightning gun
184 void W_Crylink_Attack3 (void)
185 {
186         if (cvar("g_use_ammunition"))
187                 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
188         W_SetupShot (self, '25 8 -8', TRUE, 0, "weapons/crylink_fire.wav");
189
190         traceline_antilag(self, w_shotorg, w_shotorg + w_shotdir * 1000, FALSE, self, self.ping * 0.001);
191
192         pointparticles(particleeffectnum("lightning_muzzleflash", w_shotorg, w_shotdir * 1000, 1);
193         pointparticles(particleeffectnum("lightning_impact", trace_endpos, trace_plane_normal * 1000, 1);
194         trailparticles(world, particleeffectnum("lightning_beam", w_shotorg, trace_endpos);
195
196         if (trace_fraction < 1)
197                 Damage(trace_ent, self, self, cvar("g_balance_crylink_primary_damage"), IT_CRYLINK, trace_endpos, '0 0 0');
198 }
199 */
200
201 float(float req) w_crylink =
202 {
203         if (req == WR_AIM)
204         {
205                 if (random() > 0.15)
206                         self.button0 = bot_aim(cvar("g_balance_crylink_primary_speed"), 0, cvar("g_balance_crylink_primary_lifetime"), FALSE);
207                 else
208                         self.button3 = bot_aim(cvar("g_balance_crylink_secondary_speed"), 0, cvar("g_balance_crylink_secondary_lifetime"), FALSE);
209         }
210         else if (req == WR_THINK)
211         {
212                 if (self.button0)
213                 if (weapon_prepareattack(0, cvar("g_balance_crylink_primary_refire")))
214                 {
215                         W_Crylink_Attack();
216                         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_crylink_primary_animtime"), w_ready);
217                 }
218                 if (self.button3)
219                 if (weapon_prepareattack(1, cvar("g_balance_crylink_secondary_refire")))
220                 {
221                         W_Crylink_Attack2();
222                         weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_crylink_secondary_animtime"), w_ready);
223                 }
224         }
225         else if (req == WR_PRECACHE)
226         {
227                 precache_model ("models/plasma.mdl");
228                 precache_model ("models/plasmatrail.mdl");
229                 precache_model ("models/weapons/g_crylink.md3");
230                 precache_model ("models/weapons/v_crylink.md3");
231                 precache_model ("models/weapons/w_crylink.zym");
232                 precache_sound ("weapons/crylink_fire.wav");
233         }
234         else if (req == WR_SETUP)
235                 weapon_setup(WEP_CRYLINK, "crylink", IT_CELLS);
236         else if (req == WR_CHECKAMMO1)
237                 return self.ammo_cells >= cvar("g_balance_crylink_primary_ammo");
238         else if (req == WR_CHECKAMMO2)
239                 return self.ammo_cells >= cvar("g_balance_crylink_secondary_ammo");
240         else if (req == WR_REGISTER)
241                 weapon_register(WEP_CRYLINK, min(cvar("g_balance_crylink_primary_ammo"), cvar("g_balance_crylink_secondary_ammo")));
242         return TRUE;
243 };