2 MauveBot v1.0 for Nexuiz
5 string(float r) BotName =
9 self.playermodel = "models/player/visitant.zym";
10 self.playerskin = "1";
15 self.playermodel = "models/player/marine.zym";
16 self.playerskin = "0";
21 self.playermodel = "models/player/specop.zym";
22 self.playerskin = "0";
27 self.playermodel = "models/player/nexus.zym";
28 self.playerskin = "0";
33 self.playermodel = "models/player/skadi.zym";
34 self.playerskin = "0";
39 self.playermodel = "models/player/lurk.zym";
40 self.playerskin = "0";
45 self.playermodel = "models/player/headhunter.zym";
46 self.playerskin = "0";
51 self.playermodel = "models/player/carni.zym";
52 self.playerskin = "0";
57 self.playermodel = "models/player/grunt.zym";
58 self.playerskin = "0";
63 self.playermodel = "models/player/insurrectionist.zym";
64 self.playerskin = "0";
65 return "Insurrectionist";
69 self.playermodel = "models/player/lycanthrope.zym";
70 self.playerskin = "0";
75 self.playermodel = "models/player/pyria.zym";
76 self.playerskin = "0";
81 self.playermodel = "models/player/shock.zym";
82 self.playerskin = "0";
87 self.playermodel = "models/player/lurk.zym";
88 self.playerskin = "1";
93 self.playermodel = "models/player/crash.zym";
94 self.playerskin = "0";
99 self.playermodel = "models/player/insurrectionist.zym";
100 self.playerskin = "1";
105 self.playermodel = "models/player/carni.zym";
106 self.playerskin = "1";
107 return "Armored Carni";
111 self.playermodel = "models/player/nexus.zym";
112 self.playerskin = "1";
117 self.playermodel = "models/player/carni.zym";
118 self.playerskin = "0";
123 string () PickARandomName =
129 t = findflags(world, flags, FL_CLIENT);
132 if (clienttype(self) == CLIENTTYPE_BOT)
134 t = findflags(t, flags, FL_CLIENT);
139 self.playermodel = "models/player/marine.zym";
140 self.playerskin = "0";
147 test = ceil(random() * 18);
149 t = find(world, netname, h);
156 // Adds a bot to the server
157 entity(float bottype) add_MauveBot =
159 local entity oldself, ret;
160 local float shirt, pants;
163 self = spawnclient();
166 bprint("Can not add bot, server full.\n");
167 if (bottype == BOT_TYPE_MAUVEBOT)
168 cvar_set("mauvebots", ftos(mauvebots));
170 cvar_set("bot_number", ftos(bot_number));
177 // keep teams balanced
178 JoinBestTeam(self, 0);
182 shirt = floor(random()*15);
183 pants = floor(random()*15);
184 self.clientcolors = pants + shirt * 16;
187 self.netname = PickARandomName();
191 self.autoswitch = 1; // bots currently need autoswitching
192 self.skill_level = cvar("skill");
193 if (self.skill_level > 10)
194 self.skill_level = 10;
195 if (self.skill_level < 1)
196 self.skill_level = 1;
203 void() remove_MauveBot =
208 flo = floor(random() * mauvebots);
210 ent = findflags(world, flags, FL_CLIENT);
214 if (clienttype(ent) == CLIENTTYPE_BOT)
216 if (ent.bot_type == BOT_TYPE_MAUVEBOT)
223 mauvebots = mauvebots - 1;
229 ent = findflags(ent, flags, FL_CLIENT);
233 float (entity targ) visible =
235 local vector start, end, org;
237 // if (self.skill_level < 3)
238 // if (random() > self.skill_level / 10)
243 org = (targ.absmin + targ.absmax) * 0.5;
245 start = self.origin + self.view_ofs;
247 traceline (start, end, TRUE, self);
248 if (!(trace_inopen && trace_inwater))
249 if (trace_fraction == 1)
254 void(entity ent) bot_set_angle =
262 view = (ent.absmin + ent.absmax) * 0.5;
264 if (self.skill_level < 6)
265 view = view - ent.velocity * (0.5 / self.skill_level);
267 flo = vlen(ent.origin - self.origin) / (self.skill_level * 4);
269 view_x = view_x + (random() * flo * 2) - flo;
270 view_y = view_y + (random() * flo * 2) - flo;
271 view_z = view_z + (random() * flo * 2) - flo;
273 view = view - (self.origin + self.view_ofs);
274 self.v_angle = vectoangles(view);
275 self.v_angle_x = self.v_angle_x * -1;
276 self.angles = self.v_angle;
277 self.angles_x = self.angles_x * -1;
278 if (self.angles_x > 180)
279 self.angles_x = self.angles_x - 360;
280 if (self.angles_x != 0)
281 self.angles_x = self.angles_x / 6;
284 self.angles_x = 0;// hack!
289 local vector vec, en, diff, dir;
296 diff = en - self.origin;
298 diff = self.goalentity.origin - self.origin;
300 if (self.search_time < time)
302 self.goalentity.search_time = time + 20;
303 self.goalentity = world;
307 dir = normalize(diff);
308 dir = dir * cvar("sv_maxspeed");// - (self.velocity - dir * (self.velocity * dir));
310 makevectors(self.v_angle);
311 self.movement_x = dir * v_forward;
312 self.movement_y = dir * v_right;
313 self.movement_z = dir * v_up;
316 void() look_for_stuff =
318 local entity item, best, best2, best3;
319 local float dist, tdist, dist2, topthreat;
321 item = findradius(self.origin, 1000);
323 if (self.search_time < time)
326 if (self.enemy.health < 0)
329 if (self.enemy.deadflag)
332 dist = dist2 = SEARCH_DIST;
337 if (item.flags & FL_CLIENT)
339 if (!(item.flags & FL_NOTARGET))
340 if (item != self && !(cvar("teamplay") && (item.clientcolors == self.clientcolors)))
341 if ((item.health > 0) && (!item.deadflag))
344 tdist = vlen(item.origin - self.origin);
352 else if (( (item.flags & FL_ITEM) && item.model != string_null) && (item.search_time < time))
356 tdist = vlen(item.origin - self.origin);
364 if (item.threat == THREAT_UNFLAGGED)
366 if (item.classname == "missile")
368 else if (item.classname == "laserbolt")
370 else if (item.classname == "grenade")
372 else if (item.classname == "plasma")
374 else if (item.classname == "spike")
377 item.threat = THREAT_IGNORE;
381 if ((item.owner != self) || (item.velocity == '0 0 0'))
383 tdist = vlen(item.origin - self.origin);
384 if (tdist < DODGE_DIST)
386 if (item.threat / tdist > topthreat)
388 topthreat = item.threat / tdist;
396 if ((best != self.enemy) && (best != world))
398 if ((best2 != self.goalentity) && (best2 != world))
400 self.goalentity = best2;
401 self.search_time = time + 5;
403 self.dodgeent = best3;
406 void() DodgeProjectile =
410 vec = vectoangles(self.dodgeent.origin - self.origin);
413 self.goalentity = spawn();
415 if (self.dodgeent.velocity != '0 0 0')
416 setorigin(self.goalentity, self.origin + v_right * 50);
418 setorigin(self.goalentity, self.origin - v_forward * 50);
422 remove(self.goalentity);
423 self.goalentity = world;
432 self.movement = '0 0 0';
434 if (self.deadflag == DEAD_RESPAWNABLE)
439 else if (self.deadflag)
442 if (self.goalentity.model == string_null)
443 self.goalentity = world;
445 if (time > self.ai_time)
447 self.ai_time = time + (0.5 / self.skill_level) + (random() * (1 / self.skill_level));
453 bot_set_angle(self.enemy);
454 if (visible(self.enemy))
457 self.search_time = 100000;
459 else if (self.search_time == 100000)
460 self.search_time = time + 5;
461 if (self.goalentity == world)
465 self.goalentity = self.enemy;
466 if (vlen(self.enemy.origin - self.origin) < 300)
467 self.dodgeent = self.enemy;
471 else if (self.goalentity)
472 bot_set_angle(self.goalentity);
479 if (self.skill_level > 3)
481 if (visible(self.enemy))
484 self.search_time = 100000;
489 if (self.dodgeent != world)
491 else if (self.goalentity != world)