2 MauveBot v1.0 for Nexuiz
5 string(float r) BotName =
9 self.playermodel = "models/player/visitant.zym";
10 self.playerskin = "1";
15 self.playermodel = "models/player/marine.zym";
16 self.playerskin = "0";
21 self.playermodel = "models/player/specop.zym";
22 self.playerskin = "0";
27 self.playermodel = "models/player/nexus.zym";
28 self.playerskin = "0";
33 self.playermodel = "models/player/skadi.zym";
34 self.playerskin = "0";
39 self.playermodel = "models/player/lurk.zym";
40 self.playerskin = "0";
45 self.playermodel = "models/player/headhunter.zym";
46 self.playerskin = "0";
51 self.playermodel = "models/player/carni.zym";
52 self.playerskin = "0";
57 self.playermodel = "models/player/grunt.zym";
58 self.playerskin = "0";
63 self.playermodel = "models/player/insurrectionist.zym";
64 self.playerskin = "0";
65 return "Insurrectionist";
69 self.playermodel = "models/player/lycanthrope.zym";
70 self.playerskin = "0";
75 self.playermodel = "models/player/pyria.zym";
76 self.playerskin = "0";
81 self.playermodel = "models/player/shock.zym";
82 self.playerskin = "0";
87 self.playermodel = "models/player/lurk.zym";
88 self.playerskin = "1";
93 self.playermodel = "models/player/crash.zym";
94 self.playerskin = "0";
99 self.playermodel = "models/player/insurrectionist.zym";
100 self.playerskin = "1";
105 self.playermodel = "models/player/carni.zym";
106 self.playerskin = "1";
107 return "Armored Carni";
111 self.playermodel = "models/player/nexus.zym";
112 self.playerskin = "1";
117 self.playermodel = "models/player/carni.zym";
118 self.playerskin = "0";
123 string () PickARandomName =
129 t = find(world, classname, "player");
132 if (clienttype(self) == CLIENTTYPE_BOT)
134 t = find(t, classname, "player");
139 self.playermodel = "models/player/marine.zym";
140 self.playerskin = "0";
147 test = ceil(random() * 18);
149 t = find(world, netname, h);
156 // Adds a bot to the server
157 entity(float bottype) add_MauveBot =
159 local entity oldself, ret;
160 local float shirt, pants;
163 self = spawnclient();
166 bprint("Can not add bot, server full.\n");
167 if (bottype == BOT_TYPE_MAUVEBOT)
168 cvar_set("mauvebots", ftos(mauvebots));
170 cvar_set("bot_number", ftos(bot_number));
177 // keep teams balanced
178 JoinBestTeam(self, 0);
182 shirt = floor(random()*15);
183 pants = floor(random()*15);
184 self.clientcolors = pants + shirt * 16;
187 self.netname = PickARandomName();
191 self.autoswitch = 1; // bots currently need autoswitching
192 self.skill_level = cvar("skill");
193 if (self.skill_level > 10)
194 self.skill_level = 10;
195 if (self.skill_level < 1)
196 self.skill_level = 1;
203 void() remove_MauveBot =
208 flo = floor(random() * mauvebots);
210 ent = find(world, classname, "player");
214 if (clienttype(ent) == CLIENTTYPE_BOT)
216 if (ent.bot_type == BOT_TYPE_MAUVEBOT)
221 // bot was dead, so decrease dead count
222 // if(cvar("g_lms") && self.frags < 1) DP_SV_BOTCLIENT handles this automaticly
223 // lms_dead_count -= 1;
225 mauvebots = mauvebots - 1;
231 ent = find(ent, classname, "player");
235 float (entity targ) visible =
237 local vector start, end, org;
239 // if (self.skill_level < 3)
240 // if (random() > self.skill_level / 10)
245 org = (targ.absmin + targ.absmax) * 0.5;
247 start = self.origin + self.view_ofs;
249 traceline (start, end, TRUE, self);
250 if (!(trace_inopen && trace_inwater))
251 if (trace_fraction == 1)
256 void(entity ent) bot_set_angle =
264 view = (ent.absmin + ent.absmax) * 0.5;
266 if (self.skill_level < 6)
267 view = view - ent.velocity * (0.5 / self.skill_level);
269 flo = vlen(ent.origin - self.origin) / (self.skill_level * 4);
271 view_x = view_x + (random() * flo * 2) - flo;
272 view_y = view_y + (random() * flo * 2) - flo;
273 view_z = view_z + (random() * flo * 2) - flo;
275 view = view - (self.origin + self.view_ofs);
276 self.v_angle = vectoangles(view);
277 self.v_angle_x = self.v_angle_x * -1;
278 self.angles = self.v_angle;
279 self.angles_x = self.angles_x * -1;
280 if (self.angles_x > 180)
281 self.angles_x = self.angles_x - 360;
282 if (self.angles_x != 0)
283 self.angles_x = self.angles_x / 6;
286 self.angles_x = 0;// hack!
291 local vector vec, en, diff, dir;
298 diff = en - self.origin;
300 diff = self.goalentity.origin - self.origin;
302 if (self.search_time < time)
304 self.goalentity.search_time = time + 20;
305 self.goalentity = world;
309 dir = normalize(diff);
310 dir = dir * cvar("sv_maxspeed");// - (self.velocity - dir * (self.velocity * dir));
312 makevectors(self.v_angle);
313 self.movement_x = dir * v_forward;
314 self.movement_y = dir * v_right;
315 self.movement_z = dir * v_up;
318 void() look_for_stuff =
320 local entity item, best, best2, best3;
321 local float dist, tdist, dist2, topthreat;
323 item = findradius(self.origin, 1000);
325 if (self.search_time < time)
328 if (self.enemy.health < 0)
331 if (self.enemy.deadflag)
334 dist = dist2 = SEARCH_DIST;
339 if (item.flags & FL_CLIENT)
341 if (!(item.flags & FL_NOTARGET) || item.killcount != -666) // -666 is spec/obs
342 if (item != self && !(cvar("teamplay") && (item.clientcolors == self.clientcolors)))
343 if ((item.health > 0) && (!item.deadflag))
346 tdist = vlen(item.origin - self.origin);
354 else if (( (item.flags & FL_ITEM) && item.model != string_null) && (item.search_time < time))
358 tdist = vlen(item.origin - self.origin);
366 if (item.threat == THREAT_UNFLAGGED)
368 if (item.classname == "missile")
370 else if (item.classname == "laserbolt")
372 else if (item.classname == "grenade")
374 else if (item.classname == "plasma")
376 else if (item.classname == "spike")
379 item.threat = THREAT_IGNORE;
383 if ((item.owner != self) || (item.velocity == '0 0 0'))
385 tdist = vlen(item.origin - self.origin);
386 if (tdist < DODGE_DIST)
388 if (item.threat / tdist > topthreat)
390 topthreat = item.threat / tdist;
398 if ((best != self.enemy) && (best != world))
400 if ((best2 != self.goalentity) && (best2 != world))
402 self.goalentity = best2;
403 self.search_time = time + 5;
405 self.dodgeent = best3;
408 void() DodgeProjectile =
412 vec = vectoangles(self.dodgeent.origin - self.origin);
415 self.goalentity = spawn();
417 if (self.dodgeent.velocity != '0 0 0')
418 setorigin(self.goalentity, self.origin + v_right * 50);
420 setorigin(self.goalentity, self.origin - v_forward * 50);
424 remove(self.goalentity);
425 self.goalentity = world;
434 self.movement = '0 0 0';
436 if (self.deadflag == DEAD_RESPAWNABLE)
441 else if (self.deadflag)
444 if (self.goalentity.model == string_null)
445 self.goalentity = world;
447 if (time > self.ai_time)
449 self.ai_time = time + (0.5 / self.skill_level) + (random() * (1 / self.skill_level));
455 bot_set_angle(self.enemy);
456 if (visible(self.enemy))
459 self.search_time = 100000;
461 else if (self.search_time == 100000)
462 self.search_time = time + 5;
463 if (self.goalentity == world)
467 self.goalentity = self.enemy;
468 if (vlen(self.enemy.origin - self.origin) < 300)
469 self.dodgeent = self.enemy;
473 else if (self.goalentity)
474 bot_set_angle(self.goalentity);
481 if (self.skill_level > 3)
483 if (visible(self.enemy))
486 self.search_time = 100000;
491 if (self.dodgeent != world)
493 else if (self.goalentity != world)