]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/w_crylink.qc
fixed several bugs in bots to do with movement and aiming
[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 void W_Crylink_Touch (void)
7 {
8         if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
9         {
10                 remove(self);
11                 return;
12         }
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);
15         remove (self);
16 }
17
18 void W_Crylink_Touch2 (void)
19 {
20         if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
21         {
22                 remove(self);
23                 return;
24         }
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);
27         remove (self);
28 }
29
30 void W_Crylink_Attack (void)
31 {
32         local float counter, shots;
33         local entity proj;
34
35         if (cvar("g_use_ammunition"))
36                 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo");
37
38         W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
39
40         shots = cvar("g_balance_crylink_primary_shots");
41         pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
42         while (counter < shots)
43         {
44                 proj = spawn ();
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");
49
50                 proj.movetype = MOVETYPE_BOUNCE;
51                 proj.solid = SOLID_BBOX;
52                 proj.gravity = 0.001;
53
54                 setmodel (proj, "models/plasmatrail.mdl"); // precision set below
55                 setsize (proj, '0 0 0', '0 0 0');
56                 setorigin (proj, w_shotorg);
57
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");
63
64                 proj.angles = vectoangles (proj.velocity);
65
66                 //proj.glow_size = 20;
67
68                 proj.effects = EF_LOWPRECISION;
69                 proj.flags = FL_PROJECTILE;
70                 proj.colormod = proj_color;
71                 counter = counter + 1;
72         }
73 }
74
75 void W_Crylink_Attack2 (void)
76 {
77         local float counter, shots;
78         local entity proj;
79
80         if (cvar("g_use_ammunition"))
81                 self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_secondary_ammo");
82
83         W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav");
84
85         shots = cvar("g_balance_crylink_secondary_shots");
86         pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
87         while (counter < shots)
88         {
89                 proj = spawn ();
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");
94
95                 proj.movetype = MOVETYPE_BOUNCE;
96                 proj.solid = SOLID_BBOX;
97                 proj.gravity = 0.001;
98
99                 setmodel (proj, "models/plasmatrail.mdl"); // precision set below
100                 setsize (proj, '0 0 0', '0 0 0');
101                 setorigin (proj, w_shotorg);
102
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");
108
109                 proj.angles = vectoangles (proj.velocity);
110
111                 //proj.glow_size = 20;
112
113                 proj.effects = EF_LOWPRECISION;
114                 proj.flags = FL_PROJECTILE;
115                 proj.colormod = proj_color;
116                 counter = counter + 1;
117         }
118 }
119
120
121 /*
122 // experimental lightning gun
123 void W_Crylink_Attack3 (void)
124 {
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");
128
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);
131
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);
135
136         if (trace_fraction < 1)
137                 Damage(trace_ent, self, self, cvar("g_balance_crylink_primary_damage"), IT_CRYLINK, trace_endpos, '0 0 0');
138 }
139 */
140
141 float(float req) w_crylink =
142 {
143         if (req == WR_AIM)
144         {
145                 if (random() > 0.15)
146                         self.button0 = bot_aim(cvar("g_balance_crylink_primary_speed"), 0, cvar("g_balance_crylink_primary_lifetime"), FALSE);
147                 else
148                         self.button3 = bot_aim(cvar("g_balance_crylink_secondary_speed"), 0, cvar("g_balance_crylink_secondary_lifetime"), FALSE);
149         }
150         else if (req == WR_THINK)
151         {
152                 if (self.button0)
153                 if (weapon_prepareattack(0, cvar("g_balance_crylink_primary_refire")))
154                 {
155                         W_Crylink_Attack();
156                         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_crylink_primary_animtime"), w_ready);
157                 }
158                 if (self.button3)
159                 if (weapon_prepareattack(1, cvar("g_balance_crylink_secondary_refire")))
160                 {
161                         W_Crylink_Attack2();
162                         weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_crylink_secondary_animtime"), w_ready);
163                 }
164         }
165         else if (req == WR_PRECACHE)
166         {
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");
173         }
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")));
182         return TRUE;
183 };