2 MauveBot v1.0 for Nexuiz
11 float THREAT_UNFLAGGED = 0;
12 float THREAT_IGNORE = -1;
14 float DODGE_DIST = 500;
15 float SEARCH_DIST = 1000;
21 string(float r) BotName =
25 self.playermodel = "models/player/visitant.zym";
26 self.playerskin = "0";
31 self.playermodel = "models/player/marine.zym";
32 self.playerskin = "0";
37 self.playermodel = "models/player/specop.zym";
38 self.playerskin = "0";
43 self.playermodel = "models/player/nexus.zym";
44 self.playerskin = "0";
49 self.playermodel = "models/player/skadi.zym";
50 self.playerskin = "0";
55 self.playermodel = "models/player/lurk.zym";
56 self.playerskin = "0";
61 self.playermodel = "models/player/headhunter.zym";
62 self.playerskin = "0";
67 self.playermodel = "models/player/carni.zym";
68 self.playerskin = "0";
73 self.playermodel = "models/player/grunt.zym";
74 self.playerskin = "0";
79 self.playermodel = "models/player/insurrectionist.zym";
80 self.playerskin = "0";
81 return "Insurrectionist";
85 self.playermodel = "models/player/jeandarc.zym";
86 self.playerskin = "0";
91 self.playermodel = "models/player/lycanthrope.zym";
92 self.playerskin = "0";
97 self.playermodel = "models/player/pyria.zym";
98 self.playerskin = "0";
103 self.playermodel = "models/player/shock.zym";
104 self.playerskin = "0";
109 self.playermodel = "models/player/marine.zym";
110 self.playerskin = "1";
115 self.playermodel = "models/player/nexus.zym";
116 self.playerskin = "1";
121 self.playermodel = "models/player/skadi.zym";
122 self.playerskin = "1";
127 self.playermodel = "models/player/lurk.zym";
128 self.playerskin = "1";
133 self.playermodel = "models/player/crash.zym";
134 self.playerskin = "2";
139 self.playermodel = "models/player/crash.zym";
140 self.playerskin = "1";
145 self.playermodel = "models/player/insurrectionist.zym";
146 self.playerskin = "1";
151 self.playermodel = "models/player/jeandarc.zym";
152 self.playerskin = "1";
157 self.playermodel = "models/player/lycanthrope.zym";
158 self.playerskin = "1";
163 self.playermodel = "models/player/pyria.zym";
164 self.playerskin = "1";
169 self.playermodel = "models/player/shock.zym";
170 self.playerskin = "1";
175 self.playermodel = "models/player/crash.zym";
176 self.playerskin = "0";
182 string () PickARandomName =
188 t = find(world, classname, "player");
191 if (clienttype(self) == CLIENTTYPE_BOT)
193 t = find(t, classname, "player");
198 self.playermodel = "models/player/marine.zym";
199 self.playerskin = "0";
206 test = ceil(random() * 25);
208 t = find(world, netname, h);
215 // Adds a bot to the server
216 void() add_MauveBot =
218 local entity oldself;
223 self = spawnclient();
226 bprint("Can not add bot, server full.\n");
227 str = ftos(bot_number);
228 cvar_set("bot_number", str);
233 flo = floor(random() * 5);
235 self.clientcolors = 0;
237 self.clientcolors = 3;
239 self.clientcolors = 4;
241 self.clientcolors = 12;
243 self.clientcolors = 13;
244 self.clientcolors = self.clientcolors + self.clientcolors * 16;
246 self.netname = PickARandomName();
250 self.skill_level = cvar("skill");
251 if (self.skill_level > 10)
252 self.skill_level = 10;
253 if (self.skill_level < 1)
254 self.skill_level = 1;
257 bot_number = bot_number + 1;
260 void() remove_MauveBot =
265 flo = floor(random() * bot_number);
267 ent = find(world, classname, "player");
271 if (clienttype(ent) == CLIENTTYPE_BOT)
276 bot_number = bot_number - 1;
281 ent = find(ent, classname, "player");
285 float (entity targ) visible =
287 local vector start, end, org;
289 // if (self.skill_level < 3)
290 // if (random() > self.skill_level / 10)
295 org = (targ.absmin + targ.absmax) * 0.5;
297 start = self.origin + self.view_ofs;
299 traceline (start, end, TRUE, self);
300 if (!(trace_inopen && trace_inwater))
301 if (trace_fraction == 1)
306 void(entity ent) bot_set_angle =
314 view = (ent.absmin + ent.absmax) * 0.5;
316 if (self.skill_level < 6)
317 view = view - ent.velocity * (0.5 / self.skill_level);
319 flo = vlen(ent.origin - self.origin) / (self.skill_level * 4);
321 view_x = view_x + (random() * flo * 2) - flo;
322 view_y = view_y + (random() * flo * 2) - flo;
323 view_z = view_z + (random() * flo * 2) - flo;
325 view = view - (self.origin + self.view_ofs);
326 self.v_angle = vectoangles(view);
327 self.v_angle_x = self.v_angle_x * -1;
328 self.angles = self.v_angle;
329 self.angles_x = self.angles_x * -1;
330 if (self.angles_x > 180)
331 self.angles_x = self.angles_x - 360;
332 if (self.angles_x != 0)
333 self.angles_x = self.angles_x / 6;
336 self.angles_x = 0;// hack!
341 local vector vec, en, diff, dir;
348 diff = en - self.origin;
350 diff = self.goalentity.origin - self.origin;
352 if (self.search_time < time)
354 self.goalentity.search_time = time + 20;
355 self.goalentity = world;
359 dir = normalize(diff);
360 dir = dir * cvar("cl_forwardspeed");// - (self.velocity - dir * (self.velocity * dir));
362 makevectors(self.v_angle);
363 self.movement_x = dir * v_forward;
364 self.movement_y = dir * v_right;
365 self.movement_z = dir * v_up;
368 void() look_for_stuff =
370 local entity item, best, best2, best3;
371 local float dist, tdist, dist2, topthreat;
373 item = findradius(self.origin, 1000);
375 if (self.search_time < time)
378 if (self.enemy.health < 0)
381 if (self.enemy.deadflag)
384 dist = dist2 = SEARCH_DIST;
389 if (item.flags & FL_CLIENT)
393 if ((item.health > 0) && (!item.deadflag))
397 tdist = vlen(item.origin - self.origin);
407 else if (( (item.flags & FL_ITEM) && item.model != string_null) && (item.search_time < time))
411 tdist = vlen(item.origin - self.origin);
419 if (item.threat == THREAT_UNFLAGGED)
421 if (item.classname == "missile")
423 else if (item.classname == "laserbolt")
425 else if (item.classname == "grenade")
427 else if (item.classname == "plasma")
429 else if (item.classname == "spike")
432 item.threat = THREAT_IGNORE;
436 if ((item.owner != self) || (item.velocity == '0 0 0'))
438 tdist = vlen(item.origin - self.origin);
439 if (tdist < DODGE_DIST)
441 if (item.threat / tdist > topthreat)
443 topthreat = item.threat / tdist;
451 if ((best != self.enemy) && (best != world))
453 if ((best2 != self.goalentity) && (best2 != world))
455 self.goalentity = best2;
456 self.search_time = time + 5;
458 self.dodgeent = best3;
461 void() DodgeProjectile =
465 vec = vectoangles(self.dodgeent.origin - self.origin);
468 self.goalentity = spawn();
470 if (self.dodgeent.velocity != '0 0 0')
471 setorigin(self.goalentity, self.origin + v_right * 50);
473 setorigin(self.goalentity, self.origin - v_forward * 50);
477 remove(self.goalentity);
478 self.goalentity = world;
483 if (clienttype(self) != CLIENTTYPE_BOT)
486 flo = cvar("bot_number");
488 if (flo > bot_number)
490 else if (flo < bot_number)
499 self.movement = '0 0 0';
501 if (self.deadflag == DEAD_RESPAWNABLE)
506 else if (self.deadflag)
509 if (self.goalentity.model == string_null)
510 self.goalentity = world;
512 if (time > self.ai_time)
514 self.ai_time = time + (0.5 / self.skill_level) + (random() * (1 / self.skill_level));
520 bot_set_angle(self.enemy);
521 if (visible(self.enemy))
524 self.search_time = 100000;
526 else if (self.search_time == 100000)
527 self.search_time = time + 5;
528 if (self.goalentity == world)
532 self.goalentity = self.enemy;
533 if (vlen(self.enemy.origin - self.origin) < 300)
534 self.dodgeent = self.enemy;
538 else if (self.goalentity)
539 bot_set_angle(self.goalentity);
546 if (self.skill_level > 3)
548 if (visible(self.enemy))
551 self.search_time = 100000;
556 if (self.dodgeent != world)
558 else if (self.goalentity != world)