2 MauveBot v1.0 for Nexuiz
12 float THREAT_UNFLAGGED = 0;
13 float THREAT_IGNORE = -1;
15 float DODGE_DIST = 500;
16 float SEARCH_DIST = 1000;
22 string(float r) BotName =
26 self.playermodel = "models/player/visitant.zym";
27 self.playerskin = "0";
32 self.playermodel = "models/player/marine.zym";
33 self.playerskin = "0";
38 self.playermodel = "models/player/specop.zym";
39 self.playerskin = "0";
44 self.playermodel = "models/player/nexus.zym";
45 self.playerskin = "0";
50 self.playermodel = "models/player/skadi.zym";
51 self.playerskin = "0";
56 self.playermodel = "models/player/lurk.zym";
57 self.playerskin = "0";
62 self.playermodel = "models/player/headhunter.zym";
63 self.playerskin = "0";
68 self.playermodel = "models/player/carni.zym";
69 self.playerskin = "0";
74 self.playermodel = "models/player/grunt.zym";
75 self.playerskin = "0";
80 self.playermodel = "models/player/insurrectionist.zym";
81 self.playerskin = "0";
82 return "Insurrectionist";
86 self.playermodel = "models/player/jeandarc.zym";
87 self.playerskin = "0";
92 self.playermodel = "models/player/lycanthrope.zym";
93 self.playerskin = "0";
98 self.playermodel = "models/player/pyria.zym";
99 self.playerskin = "0";
104 self.playermodel = "models/player/shock.zym";
105 self.playerskin = "0";
110 self.playermodel = "models/player/marine.zym";
111 self.playerskin = "1";
116 self.playermodel = "models/player/nexus.zym";
117 self.playerskin = "1";
122 self.playermodel = "models/player/skadi.zym";
123 self.playerskin = "1";
128 self.playermodel = "models/player/lurk.zym";
129 self.playerskin = "1";
134 self.playermodel = "models/player/crash.zym";
135 self.playerskin = "2";
140 self.playermodel = "models/player/crash.zym";
141 self.playerskin = "1";
146 self.playermodel = "models/player/insurrectionist.zym";
147 self.playerskin = "1";
152 self.playermodel = "models/player/jeandarc.zym";
153 self.playerskin = "1";
158 self.playermodel = "models/player/lycanthrope.zym";
159 self.playerskin = "1";
164 self.playermodel = "models/player/pyria.zym";
165 self.playerskin = "1";
170 self.playermodel = "models/player/rebel.zym";
171 self.playerskin = "0";
176 self.playermodel = "models/player/crash.zym";
177 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;
222 self = spawnclient();
225 bprint("Can not add bot, server full.\n");
230 flo = floor(random() * 5);
232 self.clientcolors = 0;
234 self.clientcolors = 3;
236 self.clientcolors = 4;
238 self.clientcolors = 12;
240 self.clientcolors = 13;
241 self.clientcolors = self.clientcolors + self.clientcolors * 16;
243 self.netname = PickARandomName();
247 self.skill_level = cvar("skill");
250 bot_number = bot_number + 1;
253 void() remove_MauveBot
258 flo = floor(random() * bot_number)
260 ent = find(world, classname, "player");
264 if (clienttype(ent) == CLIENTTYPE_BOT)
269 bot_number = bot_number - 1;
274 ent = find(ent, classname, "player");
278 float (entity targ) visible =
280 local vector start, end, org;
282 // if (self.skill_level < 3)
283 // if (random() > self.skill_level / 10)
288 org = (targ.absmin + targ.absmax) * 0.5;
290 start = self.origin + self.view_ofs;
292 traceline (start, end, TRUE, self);
293 if (!(trace_inopen && trace_inwater))
294 if (trace_fraction == 1)
299 void(entity ent) bot_set_angle =
307 view = (ent.absmin + ent.absmax) * 0.5;
309 if (self.skill_level < 6)
310 view = view - ent.velocity * (0.5 / self.skill_level);
312 flo = vlen(ent.origin - self.origin) / (self.skill_level * 4);
314 view_x = view_x + (random() * flo * 2) - flo;
315 view_y = view_y + (random() * flo * 2) - flo;
316 view_z = view_z + (random() * flo * 2) - flo;
318 view = view - (self.origin + self.view_ofs);
319 self.v_angle = vectoangles(view);
320 self.v_angle_x = self.v_angle_x * -1;
321 self.angles = self.v_angle;
322 self.angles_x = self.angles_x * -1;
323 if (self.angles_x > 180)
324 self.angles_x = self.angles_x - 360;
325 if (self.angles_x != 0)
326 self.angles_x = self.angles_x / 6;
329 self.angles_x = 0;// hack!
334 local vector vec, en, diff, dir;
341 diff = en - self.origin;
343 diff = self.goalentity.origin - self.origin;
345 if (self.search_time < time)
347 self.goalentity.search_time = time + 20;
348 self.goalentity = world;
352 dir = normalize(diff);
353 dir = dir * cvar("cl_forwardspeed");// - (self.velocity - dir * (self.velocity * dir));
355 makevectors(self.v_angle);
356 self.movement_x = dir * v_forward;
357 self.movement_y = dir * v_right;
358 self.movement_z = dir * v_up;
361 void() look_for_stuff =
363 local entity item, best, best2, best3;
364 local float dist, tdist, dist2, topthreat;
366 item = findradius(self.origin, 1000);
368 if (self.search_time < time)
371 if (self.enemy.health < 0)
374 if (self.enemy.deadflag)
377 dist = dist2 = SEARCH_DIST;
382 if (item.flags & FL_CLIENT)
386 if ((item.health > 0) && (!item.deadflag))
390 tdist = vlen(item.origin - self.origin);
400 else if (( (item.flags & FL_ITEM) && item.model != string_null) && (item.search_time < time))
404 tdist = vlen(item.origin - self.origin);
412 if (item.threat == THREAT_UNFLAGGED)
414 if (item.classname == "missile")
416 else if (item.classname == "laserbolt")
418 else if (item.classname == "grenade")
420 else if (item.classname == "plasma")
422 else if (item.classname == "spike")
425 item.threat = THREAT_IGNORE;
429 if ((item.owner != self) || (item.velocity == '0 0 0'))
431 tdist = vlen(item.origin - self.origin);
432 if (tdist < DODGE_DIST)
434 if (item.threat / tdist > topthreat)
436 topthreat = item.threat / tdist;
444 if ((best != self.enemy) && (best != world))
446 if ((best2 != self.goalentity) && (best2 != world))
448 self.goalentity = best2;
449 self.search_time = time + 5;
451 self.dodgeent = best3;
454 void() DodgeProjectile =
458 vec = vectoangles(self.dodgeent.origin - self.origin);
461 self.goalentity = spawn();
463 if (self.dodgeent.velocity != '0 0 0')
464 setorigin(self.goalentity, self.origin + v_right * 50);
466 setorigin(self.goalentity, self.origin - v_forward * 50);
470 remove(self.goalentity);
471 self.goalentity = world;
476 if (clienttype(self) != CLIENTTYPE_BOT)
479 flo = cvar("bot_number");
480 if (flo > bot_number)
482 else if (flo < bot_number)
487 if ((self.skill_level > 3) && (self.button0) && (self.ai_time > time))
495 self.movement = '0 0 0';
497 if (self.deadflag == DEAD_RESPAWNABLE)
502 else if (self.deadflag)
505 if (self.goalentity.model == string_null)
506 self.goalentity = world;
508 if (time > self.ai_time)
510 self.ai_time = time + (1 / self.skill_level);
516 bot_set_angle(self.enemy);
517 if (visible(self.enemy))
520 self.search_time = 100000;
522 else if (self.search_time == 100000)
523 self.search_time = time + 5;
524 if (self.goalentity == world)
525 self.goalentity = self.enemy;
527 else if (self.goalentity)
528 bot_set_angle(self.goalentity);
534 if (self.dodgeent != world)
536 else if (self.goalentity != world)
539 // self.oldmove = self.movement;