]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/w_crylink.qc
git-svn-id: svn://svn.icculus.org/nexuiz/trunk@3661 f962a42d-fe04-0410-a3ab-8c8b0445ebaa
[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         if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
18         {
19                 remove(self);
20                 return;
21         }
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)
25         {
26                 remove (self);
27                 return;
28         }
29         self.cnt = self.cnt - 1;
30         self.angles = vectoangles(self.velocity);
31         self.nextthink = time;
32         self.owner = world;
33         //self.scale = 1 + self.cnt;
34 }
35
36 void W_Crylink_Touch2 (void)
37 {
38         if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
39         {
40                 remove(self);
41                 return;
42         }
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)
46         {
47                 remove (self);
48                 return;
49         }
50         self.cnt = self.cnt - 1;
51         self.angles = vectoangles(self.velocity);
52         self.nextthink = time;
53         self.owner = world;
54 //      self.scale = 1 + 1 * self.cnt;
55 }
56
57 void W_Crylink_Attack (void)
58 {
59         local float counter, shots;
60         local entity proj;
61         local vector s;
62
63         if (cvar("g_use_ammunition"))
64                 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
65
66         W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
67
68         shots = cvar("g_balance_crylink_primary_shots");
69         pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
70         while (counter < shots)
71         {
72                 proj = spawn ();
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");
77
78                 proj.movetype = MOVETYPE_BOUNCEMISSILE;
79                 proj.solid = SOLID_BBOX;
80                 //proj.gravity = 0.001;
81
82                 setmodel (proj, "models/plasmatrail.mdl"); // precision set below
83                 setsize (proj, '0 0 0', '0 0 0');
84                 setorigin (proj, w_shotorg);
85
86                 s = '0 0 0';
87                 if (counter == 0)
88                         s = '0 0 0';
89                 else if (counter == 1)
90                         s = '0 0 1';
91                 else if (counter == 2)
92                         s = '0 -0.71 -0.71';
93                 else if (counter == 3)
94                         s = '0 0.71 -0.71';
95                 else
96                         s = randomvec();
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;
107
108                 proj.angles = vectoangles (proj.velocity);
109
110                 //proj.glow_size = 20;
111
112                 proj.effects = EF_LOWPRECISION;
113                 proj.flags = FL_PROJECTILE;
114                 proj.colormod = proj_color;
115                 counter = counter + 1;
116         }
117 }
118
119 void W_Crylink_Attack2 (void)
120 {
121         local float counter, shots;
122         local entity proj;
123
124         if (cvar("g_use_ammunition"))
125                 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_secondary_ammo");
126
127         W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
128
129         shots = cvar("g_balance_crylink_secondary_shots");
130         pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
131         while (counter < shots)
132         {
133                 proj = spawn ();
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");
138
139                 proj.movetype = MOVETYPE_BOUNCEMISSILE;
140                 proj.solid = SOLID_BBOX;
141                 //proj.gravity = 0.001;
142
143                 setmodel (proj, "models/plasmatrail.mdl"); // precision set below
144                 setsize (proj, '0 0 0', '0 0 0');
145                 setorigin (proj, w_shotorg);
146
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;
155
156                 proj.angles = vectoangles (proj.velocity);
157
158                 //proj.glow_size = 20;
159
160                 proj.effects = EF_LOWPRECISION;
161                 proj.flags = FL_PROJECTILE;
162                 proj.colormod = proj_color;
163                 counter = counter + 1;
164         }
165 }
166
167
168 /*
169 // experimental lightning gun
170 void W_Crylink_Attack3 (void)
171 {
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");
175
176         traceline_antilag(self, w_shotorg, w_shotorg + w_shotdir * 1000, FALSE, self, self.ping * 0.001);
177
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);
181
182         if (trace_fraction < 1)
183                 Damage(trace_ent, self, self, cvar("g_balance_crylink_primary_damage"), IT_CRYLINK, trace_endpos, '0 0 0');
184 }
185 */
186
187 float(float req) w_crylink =
188 {
189         if (req == WR_AIM)
190         {
191                 if (random() > 0.15)
192                         self.button0 = bot_aim(cvar("g_balance_crylink_primary_speed"), 0, cvar("g_balance_crylink_primary_lifetime"), FALSE);
193                 else
194                         self.button3 = bot_aim(cvar("g_balance_crylink_secondary_speed"), 0, cvar("g_balance_crylink_secondary_lifetime"), FALSE);
195         }
196         else if (req == WR_THINK)
197         {
198                 if (self.button0)
199                 if (weapon_prepareattack(0, cvar("g_balance_crylink_primary_refire")))
200                 {
201                         W_Crylink_Attack();
202                         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_crylink_primary_animtime"), w_ready);
203                 }
204                 if (self.button3)
205                 if (weapon_prepareattack(1, cvar("g_balance_crylink_secondary_refire")))
206                 {
207                         W_Crylink_Attack2();
208                         weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_crylink_secondary_animtime"), w_ready);
209                 }
210         }
211         else if (req == WR_PRECACHE)
212         {
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");
219         }
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")));
228         return TRUE;
229 };