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 void() add_MauveBot =
159 local entity oldself;
160 local float shirt, pants;
164 self = spawnclient();
167 bprint("Can not add bot, server full.\n");
168 str = ftos(bot_number);
169 cvar_set("bot_number", str);
176 // keep teams balanced
177 JoinBestTeam(self, 0);
181 shirt = floor(random()*15);
182 pants = floor(random()*15);
183 self.clientcolors = pants + shirt * 16;
186 self.netname = PickARandomName();
189 self.classname = "player";
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;
199 bot_number = bot_number + 1;
202 void() remove_MauveBot =
207 flo = floor(random() * bot_number);
209 ent = find(world, classname, "player");
213 if (clienttype(ent) == CLIENTTYPE_BOT)
215 if (ent.bottype == BOTTYPE_MAUVEBOT) // Urre
220 // bot was dead, so decrease dead count
221 if(cvar("g_lms") && self.frags < 1)
224 bot_number = bot_number - 1;
230 ent = find(ent, classname, "player");
234 float (entity targ) visible =
236 local vector start, end, org;
238 // if (self.skill_level < 3)
239 // if (random() > self.skill_level / 10)
244 org = (targ.absmin + targ.absmax) * 0.5;
246 start = self.origin + self.view_ofs;
248 traceline (start, end, TRUE, self);
249 if (!(trace_inopen && trace_inwater))
250 if (trace_fraction == 1)
255 void(entity ent) bot_set_angle =
263 view = (ent.absmin + ent.absmax) * 0.5;
265 if (self.skill_level < 6)
266 view = view - ent.velocity * (0.5 / self.skill_level);
268 flo = vlen(ent.origin - self.origin) / (self.skill_level * 4);
270 view_x = view_x + (random() * flo * 2) - flo;
271 view_y = view_y + (random() * flo * 2) - flo;
272 view_z = view_z + (random() * flo * 2) - flo;
274 view = view - (self.origin + self.view_ofs);
275 self.v_angle = vectoangles(view);
276 self.v_angle_x = self.v_angle_x * -1;
277 self.angles = self.v_angle;
278 self.angles_x = self.angles_x * -1;
279 if (self.angles_x > 180)
280 self.angles_x = self.angles_x - 360;
281 if (self.angles_x != 0)
282 self.angles_x = self.angles_x / 6;
285 self.angles_x = 0;// hack!
290 local vector vec, en, diff, dir;
297 diff = en - self.origin;
299 diff = self.goalentity.origin - self.origin;
301 if (self.search_time < time)
303 self.goalentity.search_time = time + 20;
304 self.goalentity = world;
308 dir = normalize(diff);
309 dir = dir * cvar("sv_maxspeed");// - (self.velocity - dir * (self.velocity * dir));
311 makevectors(self.v_angle);
312 self.movement_x = dir * v_forward;
313 self.movement_y = dir * v_right;
314 self.movement_z = dir * v_up;
317 void() look_for_stuff =
319 local entity item, best, best2, best3;
320 local float dist, tdist, dist2, topthreat;
322 item = findradius(self.origin, 1000);
324 if (self.search_time < time)
327 if (self.enemy.health < 0)
330 if (self.enemy.deadflag)
333 dist = dist2 = SEARCH_DIST;
338 if (item.flags & FL_CLIENT)
340 if (!(item.flags & FL_NOTARGET) || item.killcount != -666) // -666 is spec/obs
341 if (item != self && !(cvar("teamplay") && (item.clientcolors == self.clientcolors)))
342 if ((item.health > 0) && (!item.deadflag))
345 tdist = vlen(item.origin - self.origin);
353 else if (( (item.flags & FL_ITEM) && item.model != string_null) && (item.search_time < time))
357 tdist = vlen(item.origin - self.origin);
365 if (item.threat == THREAT_UNFLAGGED)
367 if (item.classname == "missile")
369 else if (item.classname == "laserbolt")
371 else if (item.classname == "grenade")
373 else if (item.classname == "plasma")
375 else if (item.classname == "spike")
378 item.threat = THREAT_IGNORE;
382 if ((item.owner != self) || (item.velocity == '0 0 0'))
384 tdist = vlen(item.origin - self.origin);
385 if (tdist < DODGE_DIST)
387 if (item.threat / tdist > topthreat)
389 topthreat = item.threat / tdist;
397 if ((best != self.enemy) && (best != world))
399 if ((best2 != self.goalentity) && (best2 != world))
401 self.goalentity = best2;
402 self.search_time = time + 5;
404 self.dodgeent = best3;
407 void() DodgeProjectile =
411 vec = vectoangles(self.dodgeent.origin - self.origin);
414 self.goalentity = spawn();
416 if (self.dodgeent.velocity != '0 0 0')
417 setorigin(self.goalentity, self.origin + v_right * 50);
419 setorigin(self.goalentity, self.origin - v_forward * 50);
423 remove(self.goalentity);
424 self.goalentity = world;
430 if (clienttype(self) != CLIENTTYPE_BOT)
437 botnumbercvar = cvar("bot_number");
438 flo = rint(botnumbercvar);
439 if(flo != botnumbercvar)
440 cvar_set("bot_number", ftos(flo));
442 if (flo > bot_number)
444 else if (flo < bot_number)
456 self.movement = '0 0 0';
458 if (self.deadflag == DEAD_RESPAWNABLE)
463 else if (self.deadflag)
466 if (self.goalentity.model == string_null)
467 self.goalentity = world;
469 if (time > self.ai_time)
471 self.ai_time = time + (0.5 / self.skill_level) + (random() * (1 / self.skill_level));
477 bot_set_angle(self.enemy);
478 if (visible(self.enemy))
481 self.search_time = 100000;
483 else if (self.search_time == 100000)
484 self.search_time = time + 5;
485 if (self.goalentity == world)
489 self.goalentity = self.enemy;
490 if (vlen(self.enemy.origin - self.origin) < 300)
491 self.dodgeent = self.enemy;
495 else if (self.goalentity)
496 bot_set_angle(self.goalentity);
503 if (self.skill_level > 3)
505 if (visible(self.enemy))
508 self.search_time = 100000;
513 if (self.dodgeent != world)
515 else if (self.goalentity != world)