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();
252 self.skill_level = cvar("skill");
253 if (self.skill_level > 10)
254 self.skill_level = 10;
255 if (self.skill_level < 1)
256 self.skill_level = 1;
259 bot_number = bot_number + 1;
262 void() remove_MauveBot =
267 flo = floor(random() * bot_number);
269 ent = find(world, classname, "player");
273 if (clienttype(ent) == CLIENTTYPE_BOT)
279 bot_number = bot_number - 1;
284 ent = find(ent, classname, "player");
288 float (entity targ) visible =
290 local vector start, end, org;
292 // if (self.skill_level < 3)
293 // if (random() > self.skill_level / 10)
298 org = (targ.absmin + targ.absmax) * 0.5;
300 start = self.origin + self.view_ofs;
302 traceline (start, end, TRUE, self);
303 if (!(trace_inopen && trace_inwater))
304 if (trace_fraction == 1)
309 void(entity ent) bot_set_angle =
317 view = (ent.absmin + ent.absmax) * 0.5;
319 if (self.skill_level < 6)
320 view = view - ent.velocity * (0.5 / self.skill_level);
322 flo = vlen(ent.origin - self.origin) / (self.skill_level * 4);
324 view_x = view_x + (random() * flo * 2) - flo;
325 view_y = view_y + (random() * flo * 2) - flo;
326 view_z = view_z + (random() * flo * 2) - flo;
328 view = view - (self.origin + self.view_ofs);
329 self.v_angle = vectoangles(view);
330 self.v_angle_x = self.v_angle_x * -1;
331 self.angles = self.v_angle;
332 self.angles_x = self.angles_x * -1;
333 if (self.angles_x > 180)
334 self.angles_x = self.angles_x - 360;
335 if (self.angles_x != 0)
336 self.angles_x = self.angles_x / 6;
339 self.angles_x = 0;// hack!
344 local vector vec, en, diff, dir;
351 diff = en - self.origin;
353 diff = self.goalentity.origin - self.origin;
355 if (self.search_time < time)
357 self.goalentity.search_time = time + 20;
358 self.goalentity = world;
362 dir = normalize(diff);
363 dir = dir * cvar("sv_maxspeed");// - (self.velocity - dir * (self.velocity * dir));
365 makevectors(self.v_angle);
366 self.movement_x = dir * v_forward;
367 self.movement_y = dir * v_right;
368 self.movement_z = dir * v_up;
371 void() look_for_stuff =
373 local entity item, best, best2, best3;
374 local float dist, tdist, dist2, topthreat;
376 item = findradius(self.origin, 1000);
378 if (self.search_time < time)
381 if (self.enemy.health < 0)
384 if (self.enemy.deadflag)
387 dist = dist2 = SEARCH_DIST;
392 if (item.flags & FL_CLIENT)
394 if (item != self && !(cvar("teamplay") && (item.clientcolors == self.clientcolors)))
396 if ((item.health > 0) && (!item.deadflag))
400 tdist = vlen(item.origin - self.origin);
410 else if (( (item.flags & FL_ITEM) && item.model != string_null) && (item.search_time < time))
414 tdist = vlen(item.origin - self.origin);
422 if (item.threat == THREAT_UNFLAGGED)
424 if (item.classname == "missile")
426 else if (item.classname == "laserbolt")
428 else if (item.classname == "grenade")
430 else if (item.classname == "plasma")
432 else if (item.classname == "spike")
435 item.threat = THREAT_IGNORE;
439 if ((item.owner != self) || (item.velocity == '0 0 0'))
441 tdist = vlen(item.origin - self.origin);
442 if (tdist < DODGE_DIST)
444 if (item.threat / tdist > topthreat)
446 topthreat = item.threat / tdist;
454 if ((best != self.enemy) && (best != world))
456 if ((best2 != self.goalentity) && (best2 != world))
458 self.goalentity = best2;
459 self.search_time = time + 5;
461 self.dodgeent = best3;
464 void() DodgeProjectile =
468 vec = vectoangles(self.dodgeent.origin - self.origin);
471 self.goalentity = spawn();
473 if (self.dodgeent.velocity != '0 0 0')
474 setorigin(self.goalentity, self.origin + v_right * 50);
476 setorigin(self.goalentity, self.origin - v_forward * 50);
480 remove(self.goalentity);
481 self.goalentity = world;
487 if (clienttype(self) != CLIENTTYPE_BOT)
494 flo = rint(cvar("bot_number"));
495 cvar_set("bot_number", ftos(flo));
497 if (flo > bot_number)
499 else if (flo < bot_number)
511 self.movement = '0 0 0';
513 if (self.deadflag == DEAD_RESPAWNABLE)
518 else if (self.deadflag)
521 if (self.goalentity.model == string_null)
522 self.goalentity = world;
524 if (time > self.ai_time)
526 self.ai_time = time + (0.5 / self.skill_level) + (random() * (1 / self.skill_level));
532 bot_set_angle(self.enemy);
533 if (visible(self.enemy))
536 self.search_time = 100000;
538 else if (self.search_time == 100000)
539 self.search_time = time + 5;
540 if (self.goalentity == world)
544 self.goalentity = self.enemy;
545 if (vlen(self.enemy.origin - self.origin) < 300)
546 self.dodgeent = self.enemy;
550 else if (self.goalentity)
551 bot_set_angle(self.goalentity);
558 if (self.skill_level > 3)
560 if (visible(self.enemy))
563 self.search_time = 100000;
568 if (self.dodgeent != world)
570 else if (self.goalentity != world)