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)
17 if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
22 pointparticles(particleeffectnum("crylink_impactbig"), self.origin, '0 0 0', 1);
23 RadiusDamage (self, self.realowner, cvar("g_balance_crylink_primary_damage"), cvar("g_balance_crylink_primary_edgedamage"), cvar("g_balance_crylink_primary_radius"), world, cvar("g_balance_crylink_primary_force"), IT_CRYLINK);
24 if (self.cnt <= 0 || other.takedamage != DAMAGE_NO)
29 self.cnt = self.cnt - 1;
30 self.angles = vectoangles(self.velocity);
31 self.nextthink = time;
33 //self.scale = 1 + self.cnt;
36 void W_Crylink_Touch2 (void)
38 if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
43 pointparticles(particleeffectnum("crylink_impact"), self.origin, '0 0 0', 1);
44 RadiusDamage (self, self.realowner, cvar("g_balance_crylink_secondary_damage"), cvar("g_balance_crylink_secondary_edgedamage"), cvar("g_balance_crylink_secondary_radius"), world, cvar("g_balance_crylink_secondary_force"), IT_CRYLINK);
45 if (self.cnt <= 0 || other.takedamage != DAMAGE_NO)
50 self.cnt = self.cnt - 1;
51 self.angles = vectoangles(self.velocity);
52 self.nextthink = time;
54 // self.scale = 1 + 1 * self.cnt;
57 void W_Crylink_Attack (void)
59 local float counter, shots;
63 if (cvar("g_use_ammunition"))
64 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
66 W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
68 shots = cvar("g_balance_crylink_primary_shots");
69 pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
70 while (counter < shots)
73 proj.realowner = proj.owner = self;
74 proj.classname = "spike";
75 proj.bot_dodge = TRUE;
76 proj.bot_dodgerating = cvar("g_balance_crylink_primary_damage");
78 proj.movetype = MOVETYPE_BOUNCEMISSILE;
79 proj.solid = SOLID_BBOX;
80 //proj.gravity = 0.001;
82 setmodel (proj, "models/plasmatrail.mdl"); // precision set below
83 setsize (proj, '0 0 0', '0 0 0');
84 setorigin (proj, w_shotorg);
89 else if (counter == 1)
91 else if (counter == 2)
93 else if (counter == 3)
97 s = s * cvar("g_balance_crylink_primary_spread");
98 proj.velocity = (w_shotdir + v_right * s_y + v_up * s_z) * cvar("g_balance_crylink_primary_speed");
99 // proj.velocity = (w_shotdir + randomvec() * cvar("g_balance_crylink_primary_spread")) * cvar("g_balance_crylink_primary_speed");
100 W_SetupProjectileVelocity(proj);
101 proj.touch = W_Crylink_Touch;
102 proj.count = time + cvar("g_balance_crylink_primary_lifetime");
103 proj.think = W_Crylink_Think;
104 proj.nextthink = proj.count;
105 proj.cnt = cvar("g_balance_crylink_primary_bounces");
106 proj.scale = 1 + 1 * proj.cnt;
108 proj.angles = vectoangles (proj.velocity);
110 //proj.glow_size = 20;
112 proj.effects = EF_LOWPRECISION;
113 proj.flags = FL_PROJECTILE;
114 proj.colormod = proj_color;
115 counter = counter + 1;
119 void W_Crylink_Attack2 (void)
121 local float counter, shots;
124 if (cvar("g_use_ammunition"))
125 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_secondary_ammo");
127 W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
129 shots = cvar("g_balance_crylink_secondary_shots");
130 pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
131 while (counter < shots)
134 proj.realowner = proj.owner = self;
135 proj.classname = "spike";
136 proj.bot_dodge = TRUE;
137 proj.bot_dodgerating = cvar("g_balance_crylink_secondary_damage");
139 proj.movetype = MOVETYPE_BOUNCEMISSILE;
140 proj.solid = SOLID_BBOX;
141 //proj.gravity = 0.001;
143 setmodel (proj, "models/plasmatrail.mdl"); // precision set below
144 setsize (proj, '0 0 0', '0 0 0');
145 setorigin (proj, w_shotorg);
147 proj.velocity = (w_shotdir + (((counter + 0.5) / shots) * 2 - 1) * v_right * cvar("g_balance_crylink_secondary_spread")) * cvar("g_balance_crylink_secondary_speed");
148 W_SetupProjectileVelocity(proj);
149 proj.touch = W_Crylink_Touch2;
150 proj.count = time + cvar("g_balance_crylink_primary_lifetime");
151 proj.think = W_Crylink_Think;
152 proj.nextthink = proj.count;
153 proj.cnt = cvar("g_balance_crylink_secondary_bounces");
154 proj.scale = 1 + 1 * proj.cnt;
156 proj.angles = vectoangles (proj.velocity);
158 //proj.glow_size = 20;
160 proj.effects = EF_LOWPRECISION;
161 proj.flags = FL_PROJECTILE;
162 proj.colormod = proj_color;
163 counter = counter + 1;
169 // experimental lightning gun
170 void W_Crylink_Attack3 (void)
172 if (cvar("g_use_ammunition"))
173 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
174 W_SetupShot (self, '25 8 -8', TRUE, 0, "weapons/crylink_fire.wav");
176 traceline_antilag(self, w_shotorg, w_shotorg + w_shotdir * 1000, FALSE, self, self.ping * 0.001);
178 pointparticles(particleeffectnum("lightning_muzzleflash", w_shotorg, w_shotdir * 1000, 1);
179 pointparticles(particleeffectnum("lightning_impact", trace_endpos, trace_plane_normal * 1000, 1);
180 trailparticles(world, particleeffectnum("lightning_beam", w_shotorg, trace_endpos);
182 if (trace_fraction < 1)
183 Damage(trace_ent, self, self, cvar("g_balance_crylink_primary_damage"), IT_CRYLINK, trace_endpos, '0 0 0');
187 float(float req) w_crylink =
192 self.button0 = bot_aim(cvar("g_balance_crylink_primary_speed"), 0, cvar("g_balance_crylink_primary_lifetime"), FALSE);
194 self.button3 = bot_aim(cvar("g_balance_crylink_secondary_speed"), 0, cvar("g_balance_crylink_secondary_lifetime"), FALSE);
196 else if (req == WR_THINK)
199 if (weapon_prepareattack(0, cvar("g_balance_crylink_primary_refire")))
202 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_crylink_primary_animtime"), w_ready);
205 if (weapon_prepareattack(1, cvar("g_balance_crylink_secondary_refire")))
208 weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_crylink_secondary_animtime"), w_ready);
211 else if (req == WR_PRECACHE)
213 precache_model ("models/plasma.mdl");
214 precache_model ("models/plasmatrail.mdl");
215 precache_model ("models/weapons/g_crylink.md3");
216 precache_model ("models/weapons/v_crylink.md3");
217 precache_model ("models/weapons/w_crylink.zym");
218 precache_sound ("weapons/crylink_fire.wav");
220 else if (req == WR_SETUP)
221 weapon_setup(WEP_CRYLINK, "crylink", IT_CELLS);
222 else if (req == WR_CHECKAMMO1)
223 return self.ammo_cells >= cvar("g_balance_crylink_primary_ammo");
224 else if (req == WR_CHECKAMMO2)
225 return self.ammo_cells >= cvar("g_balance_crylink_secondary_ammo");
226 else if (req == WR_REGISTER)
227 weapon_register(WEP_CRYLINK, min(cvar("g_balance_crylink_primary_ammo"), cvar("g_balance_crylink_secondary_ammo")));