2 MauveBot v1.0 for Nexuiz
5 float intermission_running;
13 float THREAT_UNFLAGGED = 0;
14 float THREAT_IGNORE = -1;
16 float DODGE_DIST = 500;
17 float SEARCH_DIST = 1000;
23 string(float r) BotName =
27 self.playermodel = "models/player/visitant.zym";
28 self.playerskin = "0";
33 self.playermodel = "models/player/marine.zym";
34 self.playerskin = "0";
39 self.playermodel = "models/player/specop.zym";
40 self.playerskin = "0";
45 self.playermodel = "models/player/nexus.zym";
46 self.playerskin = "0";
51 self.playermodel = "models/player/skadi.zym";
52 self.playerskin = "0";
57 self.playermodel = "models/player/lurk.zym";
58 self.playerskin = "0";
63 self.playermodel = "models/player/headhunter.zym";
64 self.playerskin = "0";
69 self.playermodel = "models/player/carni.zym";
70 self.playerskin = "0";
75 self.playermodel = "models/player/grunt.zym";
76 self.playerskin = "0";
81 self.playermodel = "models/player/insurrectionist.zym";
82 self.playerskin = "0";
83 return "Insurrectionist";
87 self.playermodel = "models/player/jeandarc.zym";
88 self.playerskin = "0";
93 self.playermodel = "models/player/lycanthrope.zym";
94 self.playerskin = "0";
99 self.playermodel = "models/player/pyria.zym";
100 self.playerskin = "0";
105 self.playermodel = "models/player/shock.zym";
106 self.playerskin = "0";
111 self.playermodel = "models/player/marine.zym";
112 self.playerskin = "1";
117 self.playermodel = "models/player/nexus.zym";
118 self.playerskin = "1";
123 self.playermodel = "models/player/skadi.zym";
124 self.playerskin = "1";
129 self.playermodel = "models/player/lurk.zym";
130 self.playerskin = "1";
135 self.playermodel = "models/player/crash.zym";
136 self.playerskin = "2";
141 self.playermodel = "models/player/crash.zym";
142 self.playerskin = "1";
147 self.playermodel = "models/player/insurrectionist.zym";
148 self.playerskin = "1";
153 self.playermodel = "models/player/jeandarc.zym";
154 self.playerskin = "1";
159 self.playermodel = "models/player/lycanthrope.zym";
160 self.playerskin = "1";
165 self.playermodel = "models/player/pyria.zym";
166 self.playerskin = "1";
171 self.playermodel = "models/player/shock.zym";
172 self.playerskin = "1";
177 self.playermodel = "models/player/crash.zym";
178 self.playerskin = "0";
184 string () PickARandomName =
190 t = find(world, classname, "player");
193 if (clienttype(self) == CLIENTTYPE_BOT)
195 t = find(t, classname, "player");
200 self.playermodel = "models/player/marine.zym";
201 self.playerskin = "0";
208 test = ceil(random() * 25);
210 t = find(world, netname, h);
217 // Adds a bot to the server
218 void() add_MauveBot =
220 local entity oldself;
225 self = spawnclient();
228 bprint("Can not add bot, server full.\n");
229 str = ftos(bot_number);
230 cvar_set("bot_number", str);
235 flo = floor(random() * 5);
237 self.clientcolors = 0;
239 self.clientcolors = 3;
241 self.clientcolors = 4;
243 self.clientcolors = 12;
245 self.clientcolors = 13;
246 self.clientcolors = self.clientcolors + self.clientcolors * 16;
248 self.netname = PickARandomName();
251 self.classname = "player";
253 self.autoswitch = 1; // bots currently need autoswitching
254 self.skill_level = cvar("skill");
255 if (self.skill_level > 10)
256 self.skill_level = 10;
257 if (self.skill_level < 1)
258 self.skill_level = 1;
261 bot_number = bot_number + 1;
264 void() remove_MauveBot =
269 flo = floor(random() * bot_number);
271 ent = find(world, classname, "player");
275 if (clienttype(ent) == CLIENTTYPE_BOT)
281 bot_number = bot_number - 1;
286 ent = find(ent, classname, "player");
290 float (entity targ) visible =
292 local vector start, end, org;
294 // if (self.skill_level < 3)
295 // if (random() > self.skill_level / 10)
300 org = (targ.absmin + targ.absmax) * 0.5;
302 start = self.origin + self.view_ofs;
304 traceline (start, end, TRUE, self);
305 if (!(trace_inopen && trace_inwater))
306 if (trace_fraction == 1)
311 void(entity ent) bot_set_angle =
319 view = (ent.absmin + ent.absmax) * 0.5;
321 if (self.skill_level < 6)
322 view = view - ent.velocity * (0.5 / self.skill_level);
324 flo = vlen(ent.origin - self.origin) / (self.skill_level * 4);
326 view_x = view_x + (random() * flo * 2) - flo;
327 view_y = view_y + (random() * flo * 2) - flo;
328 view_z = view_z + (random() * flo * 2) - flo;
330 view = view - (self.origin + self.view_ofs);
331 self.v_angle = vectoangles(view);
332 self.v_angle_x = self.v_angle_x * -1;
333 self.angles = self.v_angle;
334 self.angles_x = self.angles_x * -1;
335 if (self.angles_x > 180)
336 self.angles_x = self.angles_x - 360;
337 if (self.angles_x != 0)
338 self.angles_x = self.angles_x / 6;
341 self.angles_x = 0;// hack!
346 local vector vec, en, diff, dir;
353 diff = en - self.origin;
355 diff = self.goalentity.origin - self.origin;
357 if (self.search_time < time)
359 self.goalentity.search_time = time + 20;
360 self.goalentity = world;
364 dir = normalize(diff);
365 dir = dir * cvar("sv_maxspeed");// - (self.velocity - dir * (self.velocity * dir));
367 makevectors(self.v_angle);
368 self.movement_x = dir * v_forward;
369 self.movement_y = dir * v_right;
370 self.movement_z = dir * v_up;
373 void() look_for_stuff =
375 local entity item, best, best2, best3;
376 local float dist, tdist, dist2, topthreat;
378 item = findradius(self.origin, 1000);
380 if (self.search_time < time)
383 if (self.enemy.health < 0)
386 if (self.enemy.deadflag)
389 dist = dist2 = SEARCH_DIST;
394 if (item.flags & FL_CLIENT)
396 if (item != self && !(cvar("teamplay") && (item.clientcolors == self.clientcolors)))
398 if ((item.health > 0) && (!item.deadflag))
402 tdist = vlen(item.origin - self.origin);
412 else if (( (item.flags & FL_ITEM) && item.model != string_null) && (item.search_time < time))
416 tdist = vlen(item.origin - self.origin);
424 if (item.threat == THREAT_UNFLAGGED)
426 if (item.classname == "missile")
428 else if (item.classname == "laserbolt")
430 else if (item.classname == "grenade")
432 else if (item.classname == "plasma")
434 else if (item.classname == "spike")
437 item.threat = THREAT_IGNORE;
441 if ((item.owner != self) || (item.velocity == '0 0 0'))
443 tdist = vlen(item.origin - self.origin);
444 if (tdist < DODGE_DIST)
446 if (item.threat / tdist > topthreat)
448 topthreat = item.threat / tdist;
456 if ((best != self.enemy) && (best != world))
458 if ((best2 != self.goalentity) && (best2 != world))
460 self.goalentity = best2;
461 self.search_time = time + 5;
463 self.dodgeent = best3;
466 void() DodgeProjectile =
470 vec = vectoangles(self.dodgeent.origin - self.origin);
473 self.goalentity = spawn();
475 if (self.dodgeent.velocity != '0 0 0')
476 setorigin(self.goalentity, self.origin + v_right * 50);
478 setorigin(self.goalentity, self.origin - v_forward * 50);
482 remove(self.goalentity);
483 self.goalentity = world;
489 if (clienttype(self) != CLIENTTYPE_BOT)
496 botnumbercvar = cvar("bot_number");
497 flo = rint(botnumbercvar);
498 if(flo != botnumbercvar)
499 cvar_set("bot_number", ftos(flo));
501 if (flo > bot_number)
503 else if (flo < bot_number)
515 self.movement = '0 0 0';
517 if (self.deadflag == DEAD_RESPAWNABLE)
522 else if (self.deadflag)
525 if (self.goalentity.model == string_null)
526 self.goalentity = world;
528 if (time > self.ai_time)
530 self.ai_time = time + (0.5 / self.skill_level) + (random() * (1 / self.skill_level));
536 bot_set_angle(self.enemy);
537 if (visible(self.enemy))
540 self.search_time = 100000;
542 else if (self.search_time == 100000)
543 self.search_time = time + 5;
544 if (self.goalentity == world)
548 self.goalentity = self.enemy;
549 if (vlen(self.enemy.origin - self.origin) < 300)
550 self.dodgeent = self.enemy;
554 else if (self.goalentity)
555 bot_set_angle(self.goalentity);
562 if (self.skill_level > 3)
564 if (visible(self.enemy))
567 self.search_time = 100000;
572 if (self.dodgeent != world)
574 else if (self.goalentity != world)