3 const vector proj_color = '1 1 1';
7 void W_Crylink_Think (void)
9 self.nextthink = self.count;
10 self.angles = vectoangles(self.velocity);
11 if (time >= self.count)
15 void W_Crylink_Touch (void)
19 if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
24 pointparticles(particleeffectnum("crylink_impactbig"), self.origin, '0 0 0', 1);
25 finalhit = ((self.cnt <= 0) || (other.takedamage != DAMAGE_NO));
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);
36 self.cnt = self.cnt - 1;
37 self.angles = vectoangles(self.velocity);
38 self.nextthink = time;
40 //self.scale = 1 + self.cnt;
43 void W_Crylink_Touch2 (void)
47 if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
52 pointparticles(particleeffectnum("crylink_impact"), self.origin, '0 0 0', 1);
53 finalhit = ((self.cnt <= 0) || (other.takedamage != DAMAGE_NO));
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);
64 self.cnt = self.cnt - 1;
65 self.angles = vectoangles(self.velocity);
66 self.nextthink = time;
68 // self.scale = 1 + 1 * self.cnt;
71 void W_Crylink_Attack (void)
73 local float counter, shots;
77 if (cvar("g_use_ammunition"))
78 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
80 W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
82 shots = cvar("g_balance_crylink_primary_shots");
83 pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
84 while (counter < shots)
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");
92 proj.movetype = MOVETYPE_BOUNCEMISSILE;
93 proj.solid = SOLID_BBOX;
94 //proj.gravity = 0.001;
96 setmodel (proj, "models/plasmatrail.mdl"); // precision set below
97 setsize (proj, '0 0 0', '0 0 0');
98 setorigin (proj, w_shotorg);
103 else if (counter == 1)
105 else if (counter == 2)
107 else if (counter == 3)
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;
122 proj.angles = vectoangles (proj.velocity);
124 //proj.glow_size = 20;
126 proj.effects = EF_LOWPRECISION;
127 proj.flags = FL_PROJECTILE;
128 proj.colormod = proj_color;
129 counter = counter + 1;
133 void W_Crylink_Attack2 (void)
135 local float counter, shots;
138 if (cvar("g_use_ammunition"))
139 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_secondary_ammo");
141 W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
143 shots = cvar("g_balance_crylink_secondary_shots");
144 pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
145 while (counter < shots)
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");
153 proj.movetype = MOVETYPE_BOUNCEMISSILE;
154 proj.solid = SOLID_BBOX;
155 //proj.gravity = 0.001;
157 setmodel (proj, "models/plasmatrail.mdl"); // precision set below
158 setsize (proj, '0 0 0', '0 0 0');
159 setorigin (proj, w_shotorg);
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;
170 proj.angles = vectoangles (proj.velocity);
172 //proj.glow_size = 20;
174 proj.effects = EF_LOWPRECISION;
175 proj.flags = FL_PROJECTILE;
176 proj.colormod = proj_color;
177 counter = counter + 1;
183 // experimental lightning gun
184 void W_Crylink_Attack3 (void)
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");
190 traceline_antilag(self, w_shotorg, w_shotorg + w_shotdir * 1000, FALSE, self, self.ping * 0.001);
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);
196 if (trace_fraction < 1)
197 Damage(trace_ent, self, self, cvar("g_balance_crylink_primary_damage"), IT_CRYLINK, trace_endpos, '0 0 0');
201 float(float req) w_crylink =
206 self.button0 = bot_aim(cvar("g_balance_crylink_primary_speed"), 0, cvar("g_balance_crylink_primary_lifetime"), FALSE);
208 self.button3 = bot_aim(cvar("g_balance_crylink_secondary_speed"), 0, cvar("g_balance_crylink_secondary_lifetime"), FALSE);
210 else if (req == WR_THINK)
213 if (weapon_prepareattack(0, cvar("g_balance_crylink_primary_refire")))
216 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_crylink_primary_animtime"), w_ready);
219 if (weapon_prepareattack(1, cvar("g_balance_crylink_secondary_refire")))
222 weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_crylink_secondary_animtime"), w_ready);
225 else if (req == WR_PRECACHE)
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");
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")));