2 MauveBot v1.0 for Nexuiz
5 const float names = 19;
7 string(float r) BotName =
11 self.playermodel = "models/player/visitant.zym";
12 self.playerskin = "1";
17 self.playermodel = "models/player/marine.zym";
18 self.playerskin = "0";
23 self.playermodel = "models/player/specop.zym";
24 self.playerskin = "0";
29 self.playermodel = "models/player/nexus.zym";
30 self.playerskin = "0";
35 self.playermodel = "models/player/skadi.zym";
36 self.playerskin = "0";
41 self.playermodel = "models/player/lurk.zym";
42 self.playerskin = "0";
47 self.playermodel = "models/player/headhunter.zym";
48 self.playerskin = "0";
53 self.playermodel = "models/player/carni.zym";
54 self.playerskin = "0";
59 self.playermodel = "models/player/grunt.zym";
60 self.playerskin = "0";
65 self.playermodel = "models/player/insurrectionist.zym";
66 self.playerskin = "0";
67 return "Insurrectionist";
71 self.playermodel = "models/player/lycanthrope.zym";
72 self.playerskin = "0";
77 self.playermodel = "models/player/pyria.zym";
78 self.playerskin = "0";
83 self.playermodel = "models/player/shock.zym";
84 self.playerskin = "0";
89 self.playermodel = "models/player/lurk.zym";
90 self.playerskin = "1";
95 self.playermodel = "models/player/crash.zym";
96 self.playerskin = "0";
101 self.playermodel = "models/player/insurrectionist.zym";
102 self.playerskin = "1";
107 self.playermodel = "models/player/carni.zym";
108 self.playerskin = "1";
109 return "Armored Carni";
113 self.playermodel = "models/player/nexus.zym";
114 self.playerskin = "1";
119 self.playermodel = "models/player/nexus.zym";
120 self.playerskin = "2";
125 string () PickARandomName =
131 t = findflags(world, flags, FL_CLIENT);
134 if (clienttype(self) == CLIENTTYPE_BOT)
136 t = findflags(t, flags, FL_CLIENT);
141 self.playermodel = "models/player/marine.zym";
142 self.playerskin = "0";
146 test = ceil(random() * names);
152 t = find(world, netname, h);
157 test = math_mod(test+1, names);
162 // Adds a bot to the server
163 entity(float bottype) add_MauveBot =
165 local entity oldself, ret;
166 local float shirt, pants;
169 self = spawnclient();
172 bprint("Can not add bot, server full.\n");
173 if (bottype == BOT_TYPE_MAUVEBOT)
174 cvar_set("mauvebots", ftos(mauvebots));
176 cvar_set("bot_number", ftos(bot_number));
183 // keep teams balanced
184 JoinBestTeam(self, 0);
188 shirt = floor(random()*15);
189 pants = floor(random()*15);
190 self.clientcolors = pants + shirt * 16;
193 self.netname = PickARandomName();
197 self.autoswitch = 1; // bots currently need autoswitching
198 self.skill_level = cvar("skill");
199 if (self.skill_level > 10)
200 self.skill_level = 10;
201 if (self.skill_level < 1)
202 self.skill_level = 1;
209 void() remove_MauveBot =
214 flo = floor(random() * mauvebots);
216 ent = findflags(world, flags, FL_CLIENT);
220 if (clienttype(ent) == CLIENTTYPE_BOT)
222 if (ent.bot_type == BOT_TYPE_MAUVEBOT)
229 mauvebots = mauvebots - 1;
235 ent = findflags(ent, flags, FL_CLIENT);
239 float (entity targ) visible =
241 local vector start, end, org;
243 // if (self.skill_level < 3)
244 // if (random() > self.skill_level / 10)
249 org = (targ.absmin + targ.absmax) * 0.5;
251 start = self.origin + self.view_ofs;
253 traceline (start, end, TRUE, self);
254 if (!(trace_inopen && trace_inwater))
255 if (trace_fraction == 1)
260 void(entity ent) bot_set_angle =
268 view = (ent.absmin + ent.absmax) * 0.5;
270 if (self.skill_level < 6)
271 view = view - ent.velocity * (0.5 / self.skill_level);
273 flo = vlen(ent.origin - self.origin) / (self.skill_level * 4);
275 view_x = view_x + (random() * flo * 2) - flo;
276 view_y = view_y + (random() * flo * 2) - flo;
277 view_z = view_z + (random() * flo * 2) - flo;
279 view = view - (self.origin + self.view_ofs);
280 self.v_angle = vectoangles(view);
281 self.v_angle_x = self.v_angle_x * -1;
282 self.angles = self.v_angle;
283 self.angles_x = self.angles_x * -1;
284 if (self.angles_x > 180)
285 self.angles_x = self.angles_x - 360;
286 if (self.angles_x != 0)
287 self.angles_x = self.angles_x / 6;
290 self.angles_x = 0;// hack!
295 local vector vec, en, diff, dir;
302 diff = en - self.origin;
304 diff = self.goalentity.origin - self.origin;
306 if (self.search_time < time)
308 self.goalentity.search_time = time + 20;
309 self.goalentity = world;
313 dir = normalize(diff);
314 dir = dir * cvar("sv_maxspeed");// - (self.velocity - dir * (self.velocity * dir));
316 makevectors(self.v_angle);
317 self.movement_x = dir * v_forward;
318 self.movement_y = dir * v_right;
319 self.movement_z = dir * v_up;
322 void() look_for_stuff =
324 local entity item, best, best2, best3;
325 local float dist, tdist, dist2, topthreat;
327 item = findradius(self.origin, 1000);
329 if (self.search_time < time)
332 if (self.enemy.health < 0)
335 if (self.enemy.deadflag)
338 dist = dist2 = SEARCH_DIST;
343 if (item.flags & FL_CLIENT)
345 if (!(item.flags & FL_NOTARGET))
346 if (item != self && !(cvar("teamplay") && (item.clientcolors == self.clientcolors)))
347 if ((item.health > 0) && (!item.deadflag))
350 tdist = vlen(item.origin - self.origin);
358 else if (( (item.flags & FL_ITEM) && item.model != string_null) && (item.search_time < time))
362 tdist = vlen(item.origin - self.origin);
370 if (item.threat == THREAT_UNFLAGGED)
372 if (item.classname == "missile")
374 else if (item.classname == "laserbolt")
376 else if (item.classname == "grenade")
378 else if (item.classname == "plasma")
380 else if (item.classname == "spike")
383 item.threat = THREAT_IGNORE;
387 if ((item.owner != self) || (item.velocity == '0 0 0'))
389 tdist = vlen(item.origin - self.origin);
390 if (tdist < DODGE_DIST)
392 if (item.threat / tdist > topthreat)
394 topthreat = item.threat / tdist;
402 if ((best != self.enemy) && (best != world))
404 if ((best2 != self.goalentity) && (best2 != world))
406 self.goalentity = best2;
407 self.search_time = time + 5;
409 self.dodgeent = best3;
412 void() DodgeProjectile =
416 vec = vectoangles(self.dodgeent.origin - self.origin);
419 self.goalentity = spawn();
421 if (self.dodgeent.velocity != '0 0 0')
422 setorigin(self.goalentity, self.origin + v_right * 50);
424 setorigin(self.goalentity, self.origin - v_forward * 50);
428 remove(self.goalentity);
429 self.goalentity = world;
438 self.movement = '0 0 0';
440 if (self.deadflag == DEAD_RESPAWNABLE)
445 else if (self.deadflag)
448 if (self.goalentity.model == string_null)
449 self.goalentity = world;
451 if (time > self.ai_time)
453 self.ai_time = time + (0.5 / self.skill_level) + (random() * (1 / self.skill_level));
459 bot_set_angle(self.enemy);
460 if (visible(self.enemy))
463 self.search_time = 100000;
465 else if (self.search_time == 100000)
466 self.search_time = time + 5;
467 if (self.goalentity == world)
471 self.goalentity = self.enemy;
472 if (vlen(self.enemy.origin - self.origin) < 300)
473 self.dodgeent = self.enemy;
477 else if (self.goalentity)
478 bot_set_angle(self.goalentity);
485 if (self.skill_level > 3)
487 if (visible(self.enemy))
490 self.search_time = 100000;
495 if (self.dodgeent != world)
497 else if (self.goalentity != world)