1 /* --- UrreBotSetup ---
2 Issues a random funky name, random colors, playermodel and team to the bot*/
6 local float r, shirt, pants;
52 self.playermodel = "models/player/carni.zym";
54 self.playerskin = "0";
56 self.playerskin = "1";
60 self.playermodel = "models/player/crash.zym";
61 self.playerskin = "0";
65 self.playermodel = "models/player/grunt.zym";
66 self.playerskin = "0";
70 self.playermodel = "models/player/headhunter.zym";
71 self.playerskin = "0";
75 self.playermodel = "models/player/insurrectionist.zym";
76 self.playerskin = "0";
80 self.playermodel = "models/player/jeandarc.zym";
81 self.playerskin = "0";
85 self.playermodel = "models/player/lurk.zym";
87 self.playerskin = "0";
89 self.playerskin = "1";
93 self.playermodel = "models/player/lycanthrope.zym";
94 self.playerskin = "0";
98 self.playermodel = "models/player/marine.zym";
99 self.playerskin = "0";
103 self.playermodel = "models/player/nexus.zym";
105 self.playerskin = "0";
107 self.playerskin = "1";
111 self.playermodel = "models/player/pyria.zym";
112 self.playerskin = "0";
116 self.playermodel = "models/player/shock.zym";
117 self.playerskin = "0";
121 self.playermodel = "models/player/skadi.zym";
122 self.playerskin = "0";
126 self.playermodel = "models/player/specop.zym";
127 self.playerskin = "0";
131 self.playermodel = "models/player/visitant.zym";
132 self.playerskin = "0";
136 JoinBestTeam(self, 0);
139 shirt = floor(random()*15);
140 pants = floor(random()*15);
141 self.clientcolors = pants + shirt * 16;
145 /* --- UrreBotAdd ---
146 Adds an UrreBot to the server*/
148 entity(float bottype) UrreBotAdd =
150 local float shirt, pants;
151 local entity ent, ret;
154 self = spawnclient();
157 bprint("Can not add UrreBot, server full\n");
158 if (bottype == BOT_TYPE_URREBOT)
159 cvar_set("urrebots", ftos(urrebots));
161 cvar_set("bot_number", ftos(bot_number));
166 // Requested by Vermeulen
167 self.netname = PickARandomName();
169 JoinBestTeam(self, 0);
172 shirt = floor(random()*15);
173 pants = floor(random()*15);
174 self.clientcolors = pants + shirt * 16;
176 self.list = urrebot_chain;
177 urrebot_chain = self;
183 strategytoken = urrebot_chain;
188 /* --- UrreBotRemove ---
189 removes an UrreBot from the server*/
191 void() UrreBotRemove =
193 local entity ent, t, oldself;
195 ent = findchainflags(flags, FL_CLIENT);
198 if (clienttype(ent) == CLIENTTYPE_BOT)
200 if (ent.bot_type == BOT_TYPE_URREBOT)
202 if (urrebot_chain == ent)
203 urrebot_chain = ent.list;
206 t = find(world, classname, "player");
211 t = find(t, classname, "player");
226 /* --- SpawnNavNode ---
227 The one to guess what this does gets free bacon from FrikaC*/
229 entity(vector org, vector nnmins, vector nnmaxs) SpawnNavNode =
232 setsize(newmis, nnmins, nnmaxs);
233 newmis.classname = "navnode";
234 setorigin(newmis, org);
239 Adds a plane to the plane list of a navnode*/
241 void(entity navn, vector normal, float dist) AddPlane =
246 newmis.classname = "plane";
247 newmis.list = navn.plane_chain;
248 navn.plane_chain = newmis;
249 newmis.mangle = normal*-1;
251 f = (navn.origin * newmis.mangle) - ((navn.origin + (newmis.delay * newmis.mangle)) * newmis.mangle);
254 newmis.mangle = newmis.mangle*-1;
255 newmis.delay = newmis.delay*-1;
259 /* --- SpawnOptPoint ---
260 This function spawns waypoints for the most used paths between navnodes as an
263 void(entity navn, entity l1, entity l2) SpawnOptPoint =
267 local entity oldself;
268 local entity l, upd_pt;
271 setsize (newmis, PL_MIN, PL_MAX);
274 point = ClampPointToSpace(ClampPointToSpace(l2.origin, l2, navn), l1, navn);
280 if (point == l.origin)
292 if (upd_pt.link0 != l1)
293 if (upd_pt.link1 != l1)
294 if (upd_pt.link2 != l1)
295 if (upd_pt.link3 != l1)
296 if (upd_pt.link4 != l1)
297 if (upd_pt.link5 != l1)
298 if (upd_pt.link6 != l1)
299 if (upd_pt.link7 != l1)
300 if (upd_pt.link8 != l1)
301 if (upd_pt.link9 != l1)
305 else if (!upd_pt.link1)
307 else if (!upd_pt.link2)
309 else if (!upd_pt.link3)
311 else if (!upd_pt.link4)
313 else if (!upd_pt.link5)
315 else if (!upd_pt.link6)
317 else if (!upd_pt.link7)
319 else if (!upd_pt.link8)
321 else if (!upd_pt.link9)
325 if (upd_pt.link10 != l2)
326 if (upd_pt.link11 != l2)
327 if (upd_pt.link12 != l2)
328 if (upd_pt.link13 != l2)
329 if (upd_pt.link14 != l2)
330 if (upd_pt.link15 != l2)
331 if (upd_pt.link16 != l2)
332 if (upd_pt.link17 != l2)
333 if (upd_pt.link18 != l2)
334 if (upd_pt.link19 != l2)
341 else if (!upd_pt.link11)
346 else if (!upd_pt.link12)
351 else if (!upd_pt.link13)
356 else if (!upd_pt.link14)
361 else if (!upd_pt.link15)
366 else if (!upd_pt.link16)
371 else if (!upd_pt.link17)
376 else if (!upd_pt.link18)
381 else if (!upd_pt.link19)
391 newmis.classname = "optpoint";
392 newmis.list = navn.optp_chain;
393 navn.optp_chain = newmis;
394 setorigin(newmis, point);
402 void() OptimiseNavigation =
404 local entity navn, l;
406 navn = navnode_chain;
412 l.think = SUB_Remove;
414 SpawnOptPoint(navn, l.enemy, navn);
415 if (navn.link0 != l.enemy)
416 if (!(navn.lflags0 & LF_NOWALK))
417 if (!(navn.lflags0 & LF_NOLINK))
418 SpawnOptPoint(navn, l.enemy, navn.link0);
421 if (navn.link1 != l.enemy)
422 if (!(navn.lflags1 & LF_NOWALK))
423 if (!(navn.lflags1 & LF_NOLINK))
424 SpawnOptPoint(navn, l.enemy, navn.link1);
427 if (navn.link2 != l.enemy)
428 if (!(navn.lflags2 & LF_NOWALK))
429 if (!(navn.lflags2 & LF_NOLINK))
430 SpawnOptPoint(navn, l.enemy, navn.link2);
433 if (navn.link3 != l.enemy)
434 if (!(navn.lflags3 & LF_NOWALK))
435 if (!(navn.lflags3 & LF_NOLINK))
436 SpawnOptPoint(navn, l.enemy, navn.link3);
439 if (navn.link4 != l.enemy)
440 if (!(navn.lflags4 & LF_NOWALK))
441 if (!(navn.lflags4 & LF_NOLINK))
442 SpawnOptPoint(navn, l.enemy, navn.link4);
445 if (navn.link5 != l.enemy)
446 if (!(navn.lflags5 & LF_NOWALK))
447 if (!(navn.lflags5 & LF_NOLINK))
448 SpawnOptPoint(navn, l.enemy, navn.link5);
451 if (navn.link6 != l.enemy)
452 if (!(navn.lflags6 & LF_NOWALK))
453 if (!(navn.lflags6 & LF_NOLINK))
454 SpawnOptPoint(navn, l.enemy, navn.link6);
457 if (navn.link7 != l.enemy)
458 if (!(navn.lflags7 & LF_NOWALK))
459 if (!(navn.lflags7 & LF_NOLINK))
460 SpawnOptPoint(navn, l.enemy, navn.link7);
463 if (navn.link8 != l.enemy)
464 if (!(navn.lflags8 & LF_NOWALK))
465 if (!(navn.lflags8 & LF_NOLINK))
466 SpawnOptPoint(navn, l.enemy, navn.link8);
469 if (navn.link9 != l.enemy)
470 if (!(navn.lflags9 & LF_NOWALK))
471 if (!(navn.lflags9 & LF_NOLINK))
472 SpawnOptPoint(navn, l.enemy, navn.link9);
475 if (navn.link10 != l.enemy)
476 if (!(navn.lflags10 & LF_NOWALK))
477 if (!(navn.lflags10 & LF_NOLINK))
478 SpawnOptPoint(navn, l.enemy, navn.link10);
481 if (navn.link11 != l.enemy)
482 if (!(navn.lflags11 & LF_NOWALK))
483 if (!(navn.lflags11 & LF_NOLINK))
484 SpawnOptPoint(navn, l.enemy, navn.link11);
487 if (navn.link12 != l.enemy)
488 if (!(navn.lflags12 & LF_NOWALK))
489 if (!(navn.lflags12 & LF_NOLINK))
490 SpawnOptPoint(navn, l.enemy, navn.link12);
493 if (navn.link13 != l.enemy)
494 if (!(navn.lflags13 & LF_NOWALK))
495 if (!(navn.lflags13 & LF_NOLINK))
496 SpawnOptPoint(navn, l.enemy, navn.link13);
499 if (navn.link14 != l.enemy)
500 if (!(navn.lflags14 & LF_NOWALK))
501 if (!(navn.lflags14 & LF_NOLINK))
502 SpawnOptPoint(navn, l.enemy, navn.link14);
505 if (navn.link15 != l.enemy)
506 if (!(navn.lflags15 & LF_NOWALK))
507 if (!(navn.lflags15 & LF_NOLINK))
508 SpawnOptPoint(navn, l.enemy, navn.link15);
511 if (navn.link16 != l.enemy)
512 if (!(navn.lflags16 & LF_NOWALK))
513 if (!(navn.lflags16 & LF_NOLINK))
514 SpawnOptPoint(navn, l.enemy, navn.link16);
517 if (navn.link17 != l.enemy)
518 if (!(navn.lflags17 & LF_NOWALK))
519 if (!(navn.lflags17 & LF_NOLINK))
520 SpawnOptPoint(navn, l.enemy, navn.link17);
523 if (navn.link18 != l.enemy)
524 if (!(navn.lflags18 & LF_NOWALK))
525 if (!(navn.lflags18 & LF_NOLINK))
526 SpawnOptPoint(navn, l.enemy, navn.link18);
528 if (navn.link19 != l.enemy)
529 if (!(navn.lflags19 & LF_NOWALK))
530 if (!(navn.lflags19 & LF_NOLINK))
531 SpawnOptPoint(navn, l.enemy, navn.link19);
556 void(entity navn, entity linked) SpawnOptController =
559 newmis.classname = "optcontroller";
560 newmis.list = navn.optp_chain;
561 navn.optp_chain = newmis;
562 newmis.enemy = linked;
565 /* --- LinkNavNodes ---
566 Links the navnodes and gives some special attributes (like doors, teleporters)*/
568 void() LinkNavNodes =
570 local entity e, t, tdest;
572 navnode_chain = world;
575 e = findchain(classname, "navnode");
578 e.list = navnode_chain;
581 navnodes = navnodes + 1;
590 e.link0.think = SUB_Remove;
591 e.link0.nextthink = time;
595 if (t.delay == e.link0.delay)
599 e.lflags0 = e.lflags0 | LF_REMOTE;
603 e.link1.think = SUB_Remove;
604 e.link1.nextthink = time;
608 if (t.delay == e.link1.delay)
612 e.lflags1 = e.lflags1 | LF_REMOTE;
616 e.link2.think = SUB_Remove;
617 e.link2.nextthink = time;
621 if (t.delay == e.link2.delay)
625 e.lflags2 = e.lflags2 | LF_REMOTE;
629 e.link3.think = SUB_Remove;
630 e.link3.nextthink = time;
634 if (t.delay == e.link3.delay)
638 e.lflags3 = e.lflags3 | LF_REMOTE;
642 e.link4.think = SUB_Remove;
643 e.link4.nextthink = time;
647 if (t.delay == e.link4.delay)
651 e.lflags4 = e.lflags4 | LF_REMOTE;
655 e.link5.think = SUB_Remove;
656 e.link5.nextthink = time;
660 if (t.delay == e.link5.delay)
664 e.lflags5 = e.lflags5 | LF_REMOTE;
668 e.link6.think = SUB_Remove;
669 e.link6.nextthink = time;
673 if (t.delay == e.link6.delay)
677 e.lflags6 = e.lflags6 | LF_REMOTE;
681 e.link7.think = SUB_Remove;
682 e.link7.nextthink = time;
686 if (t.delay == e.link7.delay)
690 e.lflags7 = e.lflags7 | LF_REMOTE;
694 e.link8.think = SUB_Remove;
695 e.link8.nextthink = time;
699 if (t.delay == e.link8.delay)
703 e.lflags8 = e.lflags8 | LF_REMOTE;
707 e.link9.think = SUB_Remove;
708 e.link9.nextthink = time;
712 if (t.delay == e.link9.delay)
716 e.lflags9 = e.lflags9 | LF_REMOTE;
720 e.link10.think = SUB_Remove;
721 e.link10.nextthink = time;
725 if (t.delay == e.link10.delay)
729 e.lflags10 = e.lflags10 | LF_REMOTE;
733 e.link11.think = SUB_Remove;
734 e.link11.nextthink = time;
738 if (t.delay == e.link11.delay)
742 e.lflags11 = e.lflags11 | LF_REMOTE;
746 e.link12.think = SUB_Remove;
747 e.link12.nextthink = time;
751 if (t.delay == e.link12.delay)
755 e.lflags12 = e.lflags12 | LF_REMOTE;
759 e.link13.think = SUB_Remove;
760 e.link13.nextthink = time;
764 if (t.delay == e.link13.delay)
768 e.lflags13 = e.lflags13 | LF_REMOTE;
772 e.link14.think = SUB_Remove;
773 e.link14.nextthink = time;
777 if (t.delay == e.link14.delay)
781 e.lflags14 = e.lflags14 | LF_REMOTE;
785 e.link15.think = SUB_Remove;
786 e.link15.nextthink = time;
790 if (t.delay == e.link15.delay)
794 e.lflags15 = e.lflags15 | LF_REMOTE;
798 e.link16.think = SUB_Remove;
799 e.link16.nextthink = time;
803 if (t.delay == e.link16.delay)
807 e.lflags16 = e.lflags16 | LF_REMOTE;
811 e.link17.think = SUB_Remove;
812 e.link17.nextthink = time;
816 if (t.delay == e.link17.delay)
820 e.lflags17 = e.lflags17 | LF_REMOTE;
824 e.link18.think = SUB_Remove;
825 e.link18.nextthink = time;
829 if (t.delay == e.link18.delay)
833 e.lflags18 = e.lflags18 | LF_REMOTE;
837 e.link19.think = SUB_Remove;
838 e.link19.nextthink = time;
842 if (t.delay == e.link19.delay)
846 e.lflags19 = e.lflags19 | LF_REMOTE;
853 if (!(e.sflags & S_TELEPORT))
858 if (boxesoverlap(e.origin + e.mins, e.origin + e.maxs, t.origin + t.mins, t.origin + t.maxs))
922 dprint("WARNING: Too many linking NavNodes!\n");
924 SpawnOptController(e, t);
934 if (e.sflags & S_TELEPORT)
936 t = findchain(classname, "trigger_teleport");
939 if (boxesoverlap(t.absmin, t.absmax, e.absmin, e.absmax))
941 tdest = find(world, targetname, t.target);
942 tdest = FindCurrentNavNode(tdest.origin, '0 0 0', '0 0 0');
948 error("Expected navnode\n");
950 else if (e.sflags & S_DOOR)
952 t = findchain(classname, "door");
955 if (boxesoverlap(t.absmin, t.absmax, e.absmin, e.absmax))
960 error("Expected door\n");
966 /* --- LoadNavNodes ---
967 Loads the navnodes from an .nnl file (NavNodeList) for the map*/
969 void() LoadNavNodes =
971 local float f, file, length;
974 local float tfl0, tfl1, tfl2, tfl3, tfl4, tfl5, tfl6, tfl7, tfl8, tfl9;
975 local float tfl10, tfl11, tfl12, tfl13, tfl14, tfl15, tfl16, tfl17, tfl18, tfl19;
977 local float rl0, rl1, rl2, rl3, rl4, rl5, rl6, rl7, rl8, rl9;
978 local float rl10, rl11, rl12, rl13, rl14, rl15, rl16, rl17, rl18, rl19;
980 local vector wborg, wbmaxs, wbmins;
981 local entity e, plane_storage;
985 dprint("NavNodes present, map needs to be reloaded to load navnode-file\n");
989 plane_storage = spawn();
991 length = strlen(world.model);
993 s = substring(world.model, 5, length);
994 s = strcat("maps/", s, ".nnl");
996 file = fopen(s, FILE_READ);
1000 dprint("Found navnode file\n");
1002 while (s == "navnode")
1007 wborg = wbmaxs = wbmins = nullvector;
1008 plane_storage.plane_chain = world;
1010 tfl0 = tfl1 = tfl2 = tfl3 = tfl4 = tfl5 = tfl6 = tfl7 = tfl8 = tfl9 = 0;
1011 tfl10 = tfl11 = tfl12 = tfl13 = tfl14 = tfl15 = tfl16 = tfl17 = tfl18 = tfl19 = 0;
1012 rl0 = rl1 = rl2 = rl3 = rl4 = rl5 = rl6 = rl7 = rl8 = rl9 = -1;
1013 rl10 = rl11 = rl12 = rl13 = rl14 = rl15 = rl16 = rl17 = rl18 = rl19 = -1;
1021 while (s == "plane")
1027 AddPlane(plane_storage, pln*-1, pdst);
1030 while (substring(s, 0, 6) == "remote")
1033 f = stof(substring(s, 6, length));
1083 while (substring(s, 0, 6) == "lflags")
1086 f = stof(substring(s, 6, length));
1130 e = SpawnNavNode(wborg, wbmins, wbmaxs);
1131 if (plane_storage.plane_chain)
1132 e.plane_chain = plane_storage.plane_chain;
1157 newmis.classname = "remotelinker";
1164 newmis.classname = "remotelinker";
1171 newmis.classname = "remotelinker";
1178 newmis.classname = "remotelinker";
1185 newmis.classname = "remotelinker";
1192 newmis.classname = "remotelinker";
1199 newmis.classname = "remotelinker";
1206 newmis.classname = "remotelinker";
1213 newmis.classname = "remotelinker";
1220 newmis.classname = "remotelinker";
1227 newmis.classname = "remotelinker";
1228 newmis.delay = rl10;
1234 newmis.classname = "remotelinker";
1235 newmis.delay = rl11;
1241 newmis.classname = "remotelinker";
1242 newmis.delay = rl12;
1248 newmis.classname = "remotelinker";
1249 newmis.delay = rl13;
1255 newmis.classname = "remotelinker";
1256 newmis.delay = rl14;
1262 newmis.classname = "remotelinker";
1263 newmis.delay = rl15;
1269 newmis.classname = "remotelinker";
1270 newmis.delay = rl16;
1276 newmis.classname = "remotelinker";
1277 newmis.delay = rl17;
1283 newmis.classname = "remotelinker";
1284 newmis.delay = rl18;
1290 newmis.classname = "remotelinker";
1291 newmis.delay = rl19;
1298 dprint("No navnode file found\n");
1299 remove(plane_storage);
1300 plane_storage = world;