3 const vector proj_color = '1 1 1';
6 void W_Crylink_Touch (void)
8 if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
13 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);
14 pointparticles(particleeffectnum("crylink_impact"), self.origin, '0 0 0', 1);
18 void W_Crylink_Touch2 (void)
20 if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
25 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);
26 pointparticles(particleeffectnum("crylink_impact"), self.origin, '0 0 0', 1);
30 void W_Crylink_Attack (void)
32 local float counter, shots;
35 if (cvar("g_use_ammunition"))
36 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
38 W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
40 shots = cvar("g_balance_crylink_primary_shots");
41 pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
42 while (counter < shots)
45 proj.realowner = proj.owner = self;
46 proj.classname = "spike";
47 proj.bot_dodge = TRUE;
48 proj.bot_dodgerating = cvar("g_balance_crylink_primary_damage");
50 proj.movetype = MOVETYPE_BOUNCE;
51 proj.solid = SOLID_BBOX;
54 setmodel (proj, "models/plasmatrail.mdl"); // precision set below
55 setsize (proj, '0 0 0', '0 0 0');
56 setorigin (proj, w_shotorg);
58 proj.velocity = (w_shotdir + randomvec() * cvar("g_balance_crylink_primary_spread")) * cvar("g_balance_crylink_primary_speed");
59 W_SetupProjectileVelocity(proj);
60 proj.touch = W_Crylink_Touch;
61 proj.think = SUB_Remove;
62 proj.nextthink = time + cvar("g_balance_crylink_primary_lifetime");
64 proj.angles = vectoangles (proj.velocity);
66 //proj.glow_size = 20;
68 proj.effects = EF_LOWPRECISION;
69 proj.flags = FL_PROJECTILE;
70 proj.colormod = proj_color;
71 counter = counter + 1;
75 void W_Crylink_Attack2 (void)
77 local float counter, shots;
80 if (cvar("g_use_ammunition"))
81 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_secondary_ammo");
83 W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
85 shots = cvar("g_balance_crylink_secondary_shots");
86 pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
87 while (counter < shots)
90 proj.realowner = proj.owner = self;
91 proj.classname = "spike";
92 proj.bot_dodge = TRUE;
93 proj.bot_dodgerating = cvar("g_balance_crylink_secondary_damage");
95 proj.movetype = MOVETYPE_BOUNCE;
96 proj.solid = SOLID_BBOX;
99 setmodel (proj, "models/plasmatrail.mdl"); // precision set below
100 setsize (proj, '0 0 0', '0 0 0');
101 setorigin (proj, w_shotorg);
103 proj.velocity = (w_shotdir + (((counter + 0.5) / shots) * 2 - 1) * v_right * cvar("g_balance_crylink_secondary_spread")) * cvar("g_balance_crylink_secondary_speed");
104 W_SetupProjectileVelocity(proj);
105 proj.touch = W_Crylink_Touch2;
106 proj.think = SUB_Remove;
107 proj.nextthink = time + cvar("g_balance_crylink_secondary_lifetime");
109 proj.angles = vectoangles (proj.velocity);
111 //proj.glow_size = 20;
113 proj.effects = EF_LOWPRECISION;
114 proj.flags = FL_PROJECTILE;
115 proj.colormod = proj_color;
116 counter = counter + 1;
122 // experimental lightning gun
123 void W_Crylink_Attack3 (void)
125 if (cvar("g_use_ammunition"))
126 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
127 W_SetupShot (self, '25 8 -8', TRUE, 0, "weapons/crylink_fire.wav");
129 // use traceline_hitcorpse to make sure it can hit gibs and corpses too
130 traceline_hitcorpse(self, w_shotorg, w_shotorg + w_shotdir * 1000, FALSE, self);
132 pointparticles(particleeffectnum("lightning_muzzleflash", w_shotorg, w_shotdir * 1000, 1);
133 pointparticles(particleeffectnum("lightning_impact", trace_endpos, trace_plane_normal * 1000, 1);
134 trailparticles(world, particleeffectnum("lightning_beam", w_shotorg, trace_endpos);
136 if (trace_fraction < 1)
137 Damage(trace_ent, self, self, cvar("g_balance_crylink_primary_damage"), IT_CRYLINK, trace_endpos, '0 0 0');
141 float(float req) w_crylink =
146 self.button0 = bot_aim(cvar("g_balance_crylink_primary_speed"), 0, cvar("g_balance_crylink_primary_lifetime"), FALSE);
148 self.button3 = bot_aim(cvar("g_balance_crylink_secondary_speed"), 0, cvar("g_balance_crylink_secondary_lifetime"), FALSE);
150 else if (req == WR_THINK)
153 if (weapon_prepareattack(0, cvar("g_balance_crylink_primary_refire")))
156 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_crylink_primary_animtime"), w_ready);
159 if (weapon_prepareattack(1, cvar("g_balance_crylink_secondary_refire")))
162 weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_crylink_secondary_animtime"), w_ready);
165 else if (req == WR_PRECACHE)
167 precache_model ("models/plasma.mdl");
168 precache_model ("models/plasmatrail.mdl");
169 precache_model ("models/weapons/g_crylink.md3");
170 precache_model ("models/weapons/v_crylink.md3");
171 precache_model ("models/weapons/w_crylink.zym");
172 precache_sound ("weapons/crylink_fire.wav");
174 else if (req == WR_SETUP)
175 weapon_setup(WEP_CRYLINK, "crylink", IT_CELLS);
176 else if (req == WR_CHECKAMMO1)
177 return self.ammo_cells >= cvar("g_balance_crylink_primary_ammo");
178 else if (req == WR_CHECKAMMO2)
179 return self.ammo_cells >= cvar("g_balance_crylink_secondary_ammo");
180 else if (req == WR_REGISTER)
181 weapon_register(WEP_CRYLINK, min(cvar("g_balance_crylink_primary_ammo"), cvar("g_balance_crylink_secondary_ammo")));