]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/w_hlac.qc
Added simple support for bots scripting. It features basic movements and actions...
[divverent/nexuiz.git] / data / qcsrc / server / w_hlac.qc
1 .float HLAC_bulletcounter;
2 void W_HLAC_Touch (void)
3 {
4         PROJECTILE_TOUCH;
5
6         self.event_damage = SUB_Null;
7
8     RadiusDamage (self, self.owner, cvar("g_balance_hlac_primary_damage"), cvar("g_balance_hlac_primary_edgedamage"), cvar("g_balance_hlac_primary_radius"), world, cvar("g_balance_hlac_primary_force"), self.projectiledeathtype, other);
9
10         remove (self);
11 }
12
13 void W_HLAC_Touch2 (void)
14 {
15         PROJECTILE_TOUCH;
16
17         self.event_damage = SUB_Null;
18
19     RadiusDamage (self, self.owner, cvar("g_balance_hlac_secondary_damage"), cvar("g_balance_hlac_secondary_edgedamage"), cvar("g_balance_hlac_secondary_radius"), world, cvar("g_balance_hlac_secondary_force"), self.projectiledeathtype, other);
20
21         remove (self);
22 }
23
24 void W_HLAC_Attack (void)
25 {
26         local entity missile;
27     float spread;
28
29     if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
30     {
31         self.ammo_cells = self.ammo_cells - cvar("g_balance_hlac_primary_ammo");
32     }
33
34     spread = cvar("g_balance_hlac_primary_spread_min") + (cvar("g_balance_hlac_primary_spread_add") * self.HLAC_bulletcounter);
35     spread = min(spread,cvar("g_balance_hlac_primary_spread_max"));
36     if(self.crouch)
37         spread = spread * cvar("g_balance_hlac_primary_spread_crouchmod");
38
39         W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav");
40         pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
41         if (!g_norecoil)
42         {
43                 self.punchangle_x = random () - 0.5;
44                 self.punchangle_y = random () - 0.5;
45         }
46
47         missile = spawn ();
48         missile.owner = self;
49         missile.classname = "hlacbolt";
50         // missile.dmg = issecondary;
51         missile.bot_dodge = TRUE;
52
53     missile.bot_dodgerating = cvar("g_balance_hlac_primary_damage");
54
55         missile.movetype = MOVETYPE_FLY;
56         missile.solid = SOLID_BBOX;
57
58         setorigin (missile, w_shotorg);
59
60     missile.velocity = (w_shotdir + randomvec() * spread) * cvar("g_balance_hlac_primary_speed");
61
62         W_SetupProjectileVelocity(missile);
63         missile.angles = vectoangles (missile.velocity);
64
65         missile.touch = W_HLAC_Touch;
66         missile.think = SUB_Remove;
67
68     missile.nextthink = time + cvar("g_balance_hlac_primary_lifetime");
69
70         missile.flags = FL_PROJECTILE;
71         missile.projectiledeathtype = WEP_HLAC;
72
73         CSQCProjectile(missile, TRUE, PROJECTILE_HLAC, TRUE);
74 }
75
76 void W_HLAC_Attack2f (void)
77 {
78         local entity missile;
79     float spread;
80
81     spread = cvar("g_balance_hlac_secondary_spread");
82
83
84     if(self.crouch)
85         spread = spread * cvar("g_balance_hlac_secondary_spread_crouchmod");
86
87         W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav");
88         pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
89
90         missile = spawn ();
91         missile.owner = self;
92         missile.classname = "hlacbolt";
93         // missile.dmg = issecondary;
94         missile.bot_dodge = TRUE;
95
96     missile.bot_dodgerating = cvar("g_balance_hlac_secondary_damage");
97
98         missile.movetype = MOVETYPE_FLY;
99         missile.solid = SOLID_BBOX;
100
101         setorigin (missile, w_shotorg);
102
103     missile.velocity = (w_shotdir + randomvec() * spread) * cvar("g_balance_hlac_secondary_speed");
104
105         W_SetupProjectileVelocity(missile);
106         missile.angles = vectoangles (missile.velocity);
107
108         missile.touch = W_HLAC_Touch2;
109         missile.think = SUB_Remove;
110
111     missile.nextthink = time + cvar("g_balance_hlac_secondary_lifetime");
112
113         missile.flags = FL_PROJECTILE;
114         missile.projectiledeathtype = WEP_HLAC | HITTYPE_SECONDARY;
115
116         CSQCProjectile(missile, TRUE, PROJECTILE_HLAC, TRUE);
117 }
118
119 void W_HLAC_Attack2 (void)
120 {
121     float i;
122
123     if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
124     {
125         self.ammo_cells = self.ammo_cells - cvar("g_balance_hlac_secondary_ammo");
126     }
127
128     for(i=cvar("g_balance_hlac_secondary_shots");i>0;--i)
129         W_HLAC_Attack2f();
130
131         if (!g_norecoil)
132         {
133                 self.punchangle_x = random () - 0.5;
134                 self.punchangle_y = random () - 0.5;
135         }
136
137         // ATTACK_FINISHED(self) = time + cvar("g_balance_hlac_secondary_refire");
138 }
139
140
141 // weapon frames
142 void HLAC_fire1_02()
143 {
144         if(self.weapon != self.switchweapon) // abort immediately if switching
145         {
146                 w_ready();
147                 return;
148         }
149
150         if (self.BUTTON_ATCK)
151         {
152                 if (!weapon_action(self.weapon, WR_CHECKAMMO1))
153                 {
154                         W_SwitchWeapon_Force(self, w_getbestweapon(self));
155                         w_ready();
156                         return;
157                 }
158
159                 ATTACK_FINISHED(self) = time + cvar("g_balance_hlac_primary_refire");
160                 W_HLAC_Attack();
161                 self.HLAC_bulletcounter = self.HLAC_bulletcounter + 1;
162         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_refire"), HLAC_fire1_02);
163         }
164         else
165         {
166                 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_animtime"), w_ready);
167         }
168 };
169
170 void spawnfunc_weapon_hlac (void)
171 {
172         weapon_defaultspawnfunc(WEP_HLAC);
173 }
174
175 float w_hlac(float req)
176 {
177         if (req == WR_AIM)
178         self.BUTTON_ATCK = bot_aim(cvar("g_balance_hlac_primary_speed"), 0, cvar("g_balance_hlac_primary_lifetime"), FALSE);
179         else if (req == WR_THINK)
180         {
181                 if (self.BUTTON_ATCK)
182                 if (weapon_prepareattack(0, cvar("g_balance_hlac_primary_refire")))
183                 {
184                         self.HLAC_bulletcounter = 0;
185                         W_HLAC_Attack();
186                         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_refire"), HLAC_fire1_02);
187                 }
188
189                 if (self.BUTTON_ATCK2)
190                 if (weapon_prepareattack(1, cvar("g_balance_hlac_secondary_refire")))
191                 {
192                         W_HLAC_Attack2();
193                         weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_hlac_secondary_animtime"), w_ready);
194                 }
195
196         }
197         else if (req == WR_PRECACHE)
198         {
199         precache_model ("models/weapons/g_hlac.md3");
200                 precache_model ("models/weapons/v_hlac.md3");
201                 precache_model ("models/weapons/h_hlac.dpm");
202                 precache_sound ("weapons/lasergun_fire.wav");
203
204         }
205         else if (req == WR_SETUP)
206                 weapon_setup(WEP_HLAC);
207         else if (req == WR_CHECKAMMO1)
208                 return self.ammo_cells >= cvar("g_balance_hlac_primary_ammo");
209         else if (req == WR_CHECKAMMO2)
210                 return self.ammo_cells >= cvar("g_balance_hlac_secondary_ammo");
211         else if (req == WR_SUICIDEMESSAGE)
212                 w_deathtypestring = "should have used a smaller gun";
213         else if (req == WR_KILLMESSAGE)
214                 w_deathtypestring = "was cut down by";
215         return TRUE;
216 };