3 MauveBot v1.0 for Nexuiz
9 //float intermission_running;
25 float THREAT_UNFLAGGED = 0;
27 float THREAT_IGNORE = -1;
31 float DODGE_DIST = 500;
33 float SEARCH_DIST = 1000;
45 string(float r) BotName =
47 string gender, name, cl;
\r
61 self.playerskin = "0";
\r
66 self.playerskin = "0";
\r
71 self.playerskin = "0";
\r
76 self.playerskin = "0";
\r
81 self.playerskin = "0";
\r
86 self.playerskin = "0";
\r
89 name = strzone(strcat("bot", ftos(ceil(random()*99)), "_", cl));
\r
91 self.playermodel = strzone(strcat("models/class/", cl, "_", gender, ".zym"));
\r
98 string () PickARandomName =
110 t = find(world, classname, "player");
116 if (clienttype(self) == CLIENTTYPE_BOT)
120 t = find(t, classname, "player");
128 self.playermodel = "models/class/soldier_female.zym";
129 self.playerskin = "0";
139 test = ceil(random() * 6);//25);
141 t = find(world, netname, h);
152 // Adds a bot to the server
154 void() add_MauveBot =
158 local entity oldself;
168 self = spawnclient();
174 bprint("Can not add bot, server full.\n");
176 str = ftos(bot_number);
178 cvar_set("bot_number", str);
188 flo = floor(random() * 5);
192 self.clientcolors = 0;
196 self.clientcolors = 3;
200 self.clientcolors = 4;
204 self.clientcolors = 12;
208 self.clientcolors = 13;
210 self.clientcolors = self.clientcolors + self.clientcolors * 16;
214 self.netname = PickARandomName();
222 self.skill_level = cvar("skill");
224 if (self.skill_level > 10)
226 self.skill_level = 10;
228 if (self.skill_level < 1)
230 self.skill_level = 1;
236 bot_number = bot_number + 1;
242 void() remove_MauveBot =
252 flo = floor(random() * bot_number);
256 ent = find(world, classname, "player");
264 if (clienttype(ent) == CLIENTTYPE_BOT)
276 bot_number = bot_number - 1;
286 ent = find(ent, classname, "player");
294 float (entity targ) visible =
298 local vector start, end, org;
302 // if (self.skill_level < 3)
304 // if (random() > self.skill_level / 10)
314 org = (targ.absmin + targ.absmax) * 0.5;
318 start = self.origin + self.view_ofs;
322 traceline (start, end, TRUE, self);
324 if (!(trace_inopen && trace_inwater))
326 if (trace_fraction == 1)
336 void(entity ent) bot_set_angle =
352 view = (ent.absmin + ent.absmax) * 0.5;
356 if (self.skill_level < 6)
358 view = view - ent.velocity * (0.5 / self.skill_level);
362 flo = vlen(ent.origin - self.origin) / (self.skill_level * 4);
366 view_x = view_x + (random() * flo * 2) - flo;
368 view_y = view_y + (random() * flo * 2) - flo;
370 view_z = view_z + (random() * flo * 2) - flo;
374 view = view - (self.origin + self.view_ofs);
376 self.v_angle = vectoangles(view);
378 self.v_angle_x = self.v_angle_x * -1;
380 self.angles = self.v_angle;
382 self.angles_x = self.angles_x * -1;
384 if (self.angles_x > 180)
386 self.angles_x = self.angles_x - 360;
388 if (self.angles_x != 0)
390 self.angles_x = self.angles_x / 6;
396 self.angles_x = 0;// hack!
406 local vector vec, en, diff, dir;
420 diff = en - self.origin;
424 diff = self.goalentity.origin - self.origin;
428 if (self.search_time < time)
432 self.goalentity.search_time = time + 20;
434 self.goalentity = world;
442 dir = normalize(diff);
444 dir = dir * cvar("cl_forwardspeed");// - (self.velocity - dir * (self.velocity * dir));
448 makevectors(self.v_angle);
450 self.movement_x = dir * v_forward;
452 self.movement_y = dir * v_right;
454 self.movement_z = dir * v_up;
460 void() look_for_stuff =
464 local entity item, best, best2, best3;
466 local float dist, tdist, dist2, topthreat;
470 item = findradius(self.origin, 1000);
474 if (self.search_time < time)
480 if (self.enemy.health < 0)
486 if (self.enemy.deadflag)
492 dist = dist2 = SEARCH_DIST;
502 if (item.flags & FL_CLIENT)
510 if ((item.health > 0) && (!item.deadflag))
518 tdist = vlen(item.origin - self.origin);
538 else if (( (item.flags & FL_ITEM) && item.model != string_null) && (item.search_time < time))
546 tdist = vlen(item.origin - self.origin);
562 if (item.threat == THREAT_UNFLAGGED)
566 if (item.classname == "missile")
570 else if (item.classname == "laserbolt")
574 else if (item.classname == "grenade")
578 else if (item.classname == "plasma")
582 else if (item.classname == "spike")
588 item.threat = THREAT_IGNORE;
596 if ((item.owner != self) || (item.velocity == '0 0 0'))
600 tdist = vlen(item.origin - self.origin);
602 if (tdist < DODGE_DIST)
606 if (item.threat / tdist > topthreat)
610 topthreat = item.threat / tdist;
626 if ((best != self.enemy) && (best != world))
630 if ((best2 != self.goalentity) && (best2 != world))
634 self.goalentity = best2;
636 self.search_time = time + 5;
640 self.dodgeent = best3;
646 void() DodgeProjectile =
654 vec = vectoangles(self.dodgeent.origin - self.origin);
660 self.goalentity = spawn();
664 if (self.dodgeent.velocity != '0 0 0')
666 setorigin(self.goalentity, self.origin + v_right * 50);
670 setorigin(self.goalentity, self.origin - v_forward * 50);
678 remove(self.goalentity);
680 self.goalentity = world;
692 if (clienttype(self) != CLIENTTYPE_BOT)
706 flo = cvar("bot_number");
710 if (flo > bot_number)
714 else if (flo < bot_number)
738 self.movement = '0 0 0';
742 if (self.deadflag == DEAD_RESPAWNABLE)
752 else if (self.deadflag)
758 if (self.goalentity.model == string_null)
760 self.goalentity = world;
764 if (time > self.ai_time)
768 self.ai_time = time + (0.5 / self.skill_level) + (random() * (1 / self.skill_level));
780 bot_set_angle(self.enemy);
782 if (visible(self.enemy))
788 self.search_time = 100000;
792 else if (self.search_time == 100000)
794 self.search_time = time + 5;
796 if (self.goalentity == world)
804 self.goalentity = self.enemy;
806 if (vlen(self.enemy.origin - self.origin) < 300)
808 self.dodgeent = self.enemy;
816 else if (self.goalentity)
818 bot_set_angle(self.goalentity);
832 if (self.skill_level > 3)
836 if (visible(self.enemy))
842 self.search_time = 100000;
852 if (self.dodgeent != world)
856 else if (self.goalentity != world)