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 = "1";
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/lycanthrope.zym";
88 self.playerskin = "0";
93 self.playermodel = "models/player/pyria.zym";
94 self.playerskin = "0";
99 self.playermodel = "models/player/shock.zym";
100 self.playerskin = "0";
105 self.playermodel = "models/player/lurk.zym";
106 self.playerskin = "1";
111 self.playermodel = "models/player/crash.zym";
112 self.playerskin = "0";
117 self.playermodel = "models/player/insurrectionist.zym";
118 self.playerskin = "1";
123 self.playermodel = "models/player/carni.zym";
124 self.playerskin = "1";
125 return "Armored Carni";
129 self.playermodel = "models/player/carni.zym";
130 self.playerskin = "0";
135 string () PickARandomName =
141 t = find(world, classname, "player");
144 if (clienttype(self) == CLIENTTYPE_BOT)
146 t = find(t, classname, "player");
151 self.playermodel = "models/player/marine.zym";
152 self.playerskin = "0";
159 test = ceil(random() * 17);
161 t = find(world, netname, h);
168 // Adds a bot to the server
169 void() add_MauveBot =
171 local entity oldself;
176 self = spawnclient();
179 bprint("Can not add bot, server full.\n");
180 str = ftos(bot_number);
181 cvar_set("bot_number", str);
188 // keep teams balanced
189 JoinBestTeam(self, 0);
193 // MORE COLORS!!!!! :P
194 flo = floor(random() * 15);
195 self.clientcolors = flo + flo * 16;
198 self.netname = PickARandomName();
201 self.classname = "player";
203 self.autoswitch = 1; // bots currently need autoswitching
204 self.skill_level = cvar("skill");
205 if (self.skill_level > 10)
206 self.skill_level = 10;
207 if (self.skill_level < 1)
208 self.skill_level = 1;
211 bot_number = bot_number + 1;
214 void() remove_MauveBot =
219 flo = floor(random() * bot_number);
221 ent = find(world, classname, "player");
225 if (clienttype(ent) == CLIENTTYPE_BOT)
231 // bot was dead, so decrease dead count
232 if(cvar("g_lms") && self.frags < 1)
235 bot_number = bot_number - 1;
240 ent = find(ent, classname, "player");
244 float (entity targ) visible =
246 local vector start, end, org;
248 // if (self.skill_level < 3)
249 // if (random() > self.skill_level / 10)
254 org = (targ.absmin + targ.absmax) * 0.5;
256 start = self.origin + self.view_ofs;
258 traceline (start, end, TRUE, self);
259 if (!(trace_inopen && trace_inwater))
260 if (trace_fraction == 1)
265 void(entity ent) bot_set_angle =
273 view = (ent.absmin + ent.absmax) * 0.5;
275 if (self.skill_level < 6)
276 view = view - ent.velocity * (0.5 / self.skill_level);
278 flo = vlen(ent.origin - self.origin) / (self.skill_level * 4);
280 view_x = view_x + (random() * flo * 2) - flo;
281 view_y = view_y + (random() * flo * 2) - flo;
282 view_z = view_z + (random() * flo * 2) - flo;
284 view = view - (self.origin + self.view_ofs);
285 self.v_angle = vectoangles(view);
286 self.v_angle_x = self.v_angle_x * -1;
287 self.angles = self.v_angle;
288 self.angles_x = self.angles_x * -1;
289 if (self.angles_x > 180)
290 self.angles_x = self.angles_x - 360;
291 if (self.angles_x != 0)
292 self.angles_x = self.angles_x / 6;
295 self.angles_x = 0;// hack!
300 local vector vec, en, diff, dir;
307 diff = en - self.origin;
309 diff = self.goalentity.origin - self.origin;
311 if (self.search_time < time)
313 self.goalentity.search_time = time + 20;
314 self.goalentity = world;
318 dir = normalize(diff);
319 dir = dir * cvar("sv_maxspeed");// - (self.velocity - dir * (self.velocity * dir));
321 makevectors(self.v_angle);
322 self.movement_x = dir * v_forward;
323 self.movement_y = dir * v_right;
324 self.movement_z = dir * v_up;
327 void() look_for_stuff =
329 local entity item, best, best2, best3;
330 local float dist, tdist, dist2, topthreat;
332 item = findradius(self.origin, 1000);
334 if (self.search_time < time)
337 if (self.enemy.health < 0)
340 if (self.enemy.deadflag)
343 dist = dist2 = SEARCH_DIST;
348 if (item.flags & FL_CLIENT)
350 if (item != self && !(cvar("teamplay") && (item.clientcolors == self.clientcolors)))
352 if ((item.health > 0) && (!item.deadflag))
356 tdist = vlen(item.origin - self.origin);
366 else if (( (item.flags & FL_ITEM) && item.model != string_null) && (item.search_time < time))
370 tdist = vlen(item.origin - self.origin);
378 if (item.threat == THREAT_UNFLAGGED)
380 if (item.classname == "missile")
382 else if (item.classname == "laserbolt")
384 else if (item.classname == "grenade")
386 else if (item.classname == "plasma")
388 else if (item.classname == "spike")
391 item.threat = THREAT_IGNORE;
395 if ((item.owner != self) || (item.velocity == '0 0 0'))
397 tdist = vlen(item.origin - self.origin);
398 if (tdist < DODGE_DIST)
400 if (item.threat / tdist > topthreat)
402 topthreat = item.threat / tdist;
410 if ((best != self.enemy) && (best != world))
412 if ((best2 != self.goalentity) && (best2 != world))
414 self.goalentity = best2;
415 self.search_time = time + 5;
417 self.dodgeent = best3;
420 void() DodgeProjectile =
424 vec = vectoangles(self.dodgeent.origin - self.origin);
427 self.goalentity = spawn();
429 if (self.dodgeent.velocity != '0 0 0')
430 setorigin(self.goalentity, self.origin + v_right * 50);
432 setorigin(self.goalentity, self.origin - v_forward * 50);
436 remove(self.goalentity);
437 self.goalentity = world;
443 if (clienttype(self) != CLIENTTYPE_BOT)
450 botnumbercvar = cvar("bot_number");
451 flo = rint(botnumbercvar);
452 if(flo != botnumbercvar)
453 cvar_set("bot_number", ftos(flo));
455 if (flo > bot_number)
457 else if (flo < bot_number)
469 self.movement = '0 0 0';
471 if (self.deadflag == DEAD_RESPAWNABLE)
476 else if (self.deadflag)
479 if (self.goalentity.model == string_null)
480 self.goalentity = world;
482 if (time > self.ai_time)
484 self.ai_time = time + (0.5 / self.skill_level) + (random() * (1 / self.skill_level));
490 bot_set_angle(self.enemy);
491 if (visible(self.enemy))
494 self.search_time = 100000;
496 else if (self.search_time == 100000)
497 self.search_time = time + 5;
498 if (self.goalentity == world)
502 self.goalentity = self.enemy;
503 if (vlen(self.enemy.origin - self.origin) < 300)
504 self.dodgeent = self.enemy;
508 else if (self.goalentity)
509 bot_set_angle(self.goalentity);
516 if (self.skill_level > 3)
518 if (visible(self.enemy))
521 self.search_time = 100000;
526 if (self.dodgeent != world)
528 else if (self.goalentity != world)