1 /* --- UrreBotSetup ---
\r
2 Issues a random funky name, random colors, playermodel and team to the bot*/
\r
4 void() UrreBotSetup =
\r
6 local float r, shirt, pants;
\r
11 s = "GrooveMachine";
\r
52 self.playermodel = "models/player/carni.zym";
\r
54 self.playerskin = "0";
\r
56 self.playerskin = "1";
\r
60 self.playermodel = "models/player/crash.zym";
\r
61 self.playerskin = "0";
\r
65 self.playermodel = "models/player/grunt.zym";
\r
66 self.playerskin = "0";
\r
70 self.playermodel = "models/player/headhunter.zym";
\r
71 self.playerskin = "0";
\r
75 self.playermodel = "models/player/insurrectionist.zym";
\r
76 self.playerskin = "0";
\r
80 self.playermodel = "models/player/jeandarc.zym";
\r
81 self.playerskin = "0";
\r
85 self.playermodel = "models/player/lurk.zym";
\r
87 self.playerskin = "0";
\r
89 self.playerskin = "1";
\r
93 self.playermodel = "models/player/lycanthrope.zym";
\r
94 self.playerskin = "0";
\r
98 self.playermodel = "models/player/marine.zym";
\r
99 self.playerskin = "0";
\r
103 self.playermodel = "models/player/nexus.zym";
\r
104 if (random() < 0.5)
\r
105 self.playerskin = "0";
\r
107 self.playerskin = "1";
\r
111 self.playermodel = "models/player/pyria.zym";
\r
112 self.playerskin = "0";
\r
116 self.playermodel = "models/player/shock.zym";
\r
117 self.playerskin = "0";
\r
121 self.playermodel = "models/player/skadi.zym";
\r
122 self.playerskin = "0";
\r
126 self.playermodel = "models/player/specop.zym";
\r
127 self.playerskin = "0";
\r
131 self.playermodel = "models/player/visitant.zym";
\r
132 self.playerskin = "0";
\r
136 JoinBestTeam(self, 0);
\r
139 shirt = floor(random()*15);
\r
140 pants = floor(random()*15);
\r
141 self.clientcolors = pants + shirt * 16;
\r
145 /* --- UrreBotAdd ---
\r
146 Adds an UrreBot to the server*/
\r
148 entity(float bottype) UrreBotAdd =
\r
150 local entity ent, ret;
\r
153 self = spawnclient();
\r
156 bprint("Can not add UrreBot, server full\n");
\r
157 if (bottype == BOT_TYPE_URREBOT)
\r
158 cvar_set("urrebots", ftos(urrebots));
\r
160 cvar_set("bot_number", ftos(bot_number));
\r
165 self.list = urrebot_chain;
\r
166 urrebot_chain = self;
\r
168 PutClientInServer();
\r
172 strategytoken = urrebot_chain;
\r
177 /* --- UrreBotRemove ---
\r
178 removes an UrreBot from the server*/
\r
180 void() UrreBotRemove =
\r
182 local entity ent, t;
\r
184 ent = findchainflags(flags, FL_CLIENT);
\r
187 if (clienttype(ent) == CLIENTTYPE_BOT)
\r
189 if (ent.bot_type == BOT_TYPE_URREBOT)
\r
191 if (urrebot_chain == self)
\r
192 urrebot_chain = self.list;
\r
195 t = find(world, classname, "player");
\r
200 t = find(t, classname, "player");
\r
206 ClientDisconnect();
\r
214 /* --- SpawnNavNode ---
\r
215 The one to guess what this does gets free bacon from FrikaC*/
\r
217 entity(vector org, vector nnmins, vector nnmaxs) SpawnNavNode =
\r
220 setsize(newmis, nnmins, nnmaxs);
\r
221 newmis.classname = "navnode";
\r
222 setorigin(newmis, org);
\r
226 /* --- AddPlane ---
\r
227 Adds a plane to the plane list of a navnode*/
\r
229 void(entity navn, vector normal, float dist) AddPlane =
\r
234 newmis.classname = "plane";
\r
235 newmis.list = navn.plane_chain;
\r
236 navn.plane_chain = newmis;
\r
237 newmis.mangle = normal*-1;
\r
238 newmis.delay = dist;
\r
239 f = (navn.origin * newmis.mangle) - ((navn.origin + (newmis.delay * newmis.mangle)) * newmis.mangle);
\r
242 newmis.mangle = newmis.mangle*-1;
\r
243 newmis.delay = newmis.delay*-1;
\r
247 /* --- SpawnOptPoint ---
\r
248 This function spawns waypoints for the most used paths between navnodes as an
\r
251 void(entity navn, entity l1, entity l2) SpawnOptPoint =
\r
254 local vector point;
\r
255 local entity oldself;
\r
256 local entity l, upd_pt;
\r
259 point = ClampPointToSpace(ClampPointToSpace(l2.origin, l2, navn), l1, navn);
\r
260 l = navn.optp_chain;
\r
263 if (point == l.origin)
\r
273 if (upd_pt.link0 != l1)
\r
274 if (upd_pt.link1 != l1)
\r
275 if (upd_pt.link2 != l1)
\r
276 if (upd_pt.link3 != l1)
\r
277 if (upd_pt.link4 != l1)
\r
278 if (upd_pt.link5 != l1)
\r
279 if (upd_pt.link6 != l1)
\r
280 if (upd_pt.link7 != l1)
\r
281 if (upd_pt.link8 != l1)
\r
282 if (upd_pt.link9 != l1)
\r
286 else if (!upd_pt.link1)
\r
288 else if (!upd_pt.link2)
\r
290 else if (!upd_pt.link3)
\r
292 else if (!upd_pt.link4)
\r
294 else if (!upd_pt.link5)
\r
296 else if (!upd_pt.link6)
\r
298 else if (!upd_pt.link7)
\r
300 else if (!upd_pt.link8)
\r
302 else if (!upd_pt.link9)
\r
306 if (upd_pt.link10 != l2)
\r
307 if (upd_pt.link11 != l2)
\r
308 if (upd_pt.link12 != l2)
\r
309 if (upd_pt.link13 != l2)
\r
310 if (upd_pt.link14 != l2)
\r
311 if (upd_pt.link15 != l2)
\r
312 if (upd_pt.link16 != l2)
\r
313 if (upd_pt.link17 != l2)
\r
314 if (upd_pt.link18 != l2)
\r
315 if (upd_pt.link19 != l2)
\r
317 if (!upd_pt.link10)
\r
319 upd_pt.link10 = l2;
\r
322 else if (!upd_pt.link11)
\r
324 upd_pt.link11 = l2;
\r
327 else if (!upd_pt.link12)
\r
329 upd_pt.link12 = l2;
\r
332 else if (!upd_pt.link13)
\r
334 upd_pt.link13 = l2;
\r
337 else if (!upd_pt.link14)
\r
339 upd_pt.link14 = l2;
\r
342 else if (!upd_pt.link15)
\r
344 upd_pt.link15 = l2;
\r
347 else if (!upd_pt.link16)
\r
349 upd_pt.link16 = l2;
\r
352 else if (!upd_pt.link17)
\r
354 upd_pt.link17 = l2;
\r
357 else if (!upd_pt.link18)
\r
359 upd_pt.link18 = l2;
\r
362 else if (!upd_pt.link19)
\r
364 upd_pt.link19 = l2;
\r
373 newmis.classname = "optpoint";
\r
374 newmis.list = navn.optp_chain;
\r
375 navn.optp_chain = newmis;
\r
376 // setmodel(newmis, "models/misc/chatbubble.spr");
\r
377 setsize (newmis, PL_MIN, PL_MAX);
\r
380 point = ClampPointToSpace(ClampPointToSpace(l2.origin, l2, navn), l1, navn);
\r
382 setorigin(newmis, point);
\r
384 newmis.link10 = l2;
\r
388 void() OptimiseNavigation =
\r
390 local entity navn, l;
\r
392 navn = navnode_chain;
\r
395 l = navn.optp_chain;
\r
398 l.think = SUB_Remove;
\r
399 l.nextthink = time;
\r
400 SpawnOptPoint(navn, l.enemy, navn);
\r
401 if (navn.link0 != l.enemy)
\r
402 SpawnOptPoint(navn, l.enemy, navn.link0);
\r
405 if (navn.link1 != l.enemy)
\r
406 SpawnOptPoint(navn, l.enemy, navn.link1);
\r
409 if (navn.link2 != l.enemy)
\r
410 SpawnOptPoint(navn, l.enemy, navn.link2);
\r
413 if (navn.link3 != l.enemy)
\r
414 SpawnOptPoint(navn, l.enemy, navn.link3);
\r
417 if (navn.link4 != l.enemy)
\r
418 SpawnOptPoint(navn, l.enemy, navn.link4);
\r
421 if (navn.link5 != l.enemy)
\r
422 SpawnOptPoint(navn, l.enemy, navn.link5);
\r
425 if (navn.link6 != l.enemy)
\r
426 SpawnOptPoint(navn, l.enemy, navn.link6);
\r
429 if (navn.link7 != l.enemy)
\r
430 SpawnOptPoint(navn, l.enemy, navn.link7);
\r
433 if (navn.link8 != l.enemy)
\r
434 SpawnOptPoint(navn, l.enemy, navn.link8);
\r
437 if (navn.link9 != l.enemy)
\r
438 SpawnOptPoint(navn, l.enemy, navn.link9);
\r
441 if (navn.link10 != l.enemy)
\r
442 SpawnOptPoint(navn, l.enemy, navn.link10);
\r
445 if (navn.link11 != l.enemy)
\r
446 SpawnOptPoint(navn, l.enemy, navn.link11);
\r
449 if (navn.link12 != l.enemy)
\r
450 SpawnOptPoint(navn, l.enemy, navn.link12);
\r
453 if (navn.link13 != l.enemy)
\r
454 SpawnOptPoint(navn, l.enemy, navn.link13);
\r
457 if (navn.link14 != l.enemy)
\r
458 SpawnOptPoint(navn, l.enemy, navn.link14);
\r
461 if (navn.link15 != l.enemy)
\r
462 SpawnOptPoint(navn, l.enemy, navn.link15);
\r
465 if (navn.link16 != l.enemy)
\r
466 SpawnOptPoint(navn, l.enemy, navn.link16);
\r
469 if (navn.link17 != l.enemy)
\r
470 SpawnOptPoint(navn, l.enemy, navn.link17);
\r
473 if (navn.link18 != l.enemy)
\r
474 SpawnOptPoint(navn, l.enemy, navn.link18);
\r
476 if (navn.link19 != l.enemy)
\r
477 SpawnOptPoint(navn, l.enemy, navn.link19);
\r
502 void(entity navn, entity linked) SpawnOptController =
\r
505 newmis.classname = "optcontroller";
\r
506 newmis.list = navn.optp_chain;
\r
507 navn.optp_chain = newmis;
\r
508 newmis.enemy = linked;
\r
511 /* --- LinkNavNodes ---
\r
512 Links the navnodes and gives some special attributes (like doors, teleporters)*/
\r
514 void() LinkNavNodes =
\r
516 local entity e, t, tdest;
\r
518 navnode_chain = world;
\r
521 e = findchain(classname, "navnode");
\r
524 e.list = navnode_chain;
\r
526 e.delay = navnodes;
\r
527 navnodes = navnodes + 1;
\r
536 e.link0.think = SUB_Remove;
\r
537 e.link0.nextthink = time;
\r
541 if (t.delay == e.link0.delay)
\r
545 e.lflags0 = e.lflags0 | LF_REMOTE;
\r
549 e.link1.think = SUB_Remove;
\r
550 e.link1.nextthink = time;
\r
554 if (t.delay == e.link1.delay)
\r
558 e.lflags1 = e.lflags1 | LF_REMOTE;
\r
562 e.link2.think = SUB_Remove;
\r
563 e.link2.nextthink = time;
\r
567 if (t.delay == e.link2.delay)
\r
571 e.lflags2 = e.lflags2 | LF_REMOTE;
\r
575 e.link3.think = SUB_Remove;
\r
576 e.link3.nextthink = time;
\r
580 if (t.delay == e.link3.delay)
\r
584 e.lflags3 = e.lflags3 | LF_REMOTE;
\r
588 e.link4.think = SUB_Remove;
\r
589 e.link4.nextthink = time;
\r
593 if (t.delay == e.link4.delay)
\r
597 e.lflags4 = e.lflags4 | LF_REMOTE;
\r
601 e.link5.think = SUB_Remove;
\r
602 e.link5.nextthink = time;
\r
606 if (t.delay == e.link5.delay)
\r
610 e.lflags5 = e.lflags5 | LF_REMOTE;
\r
614 e.link6.think = SUB_Remove;
\r
615 e.link6.nextthink = time;
\r
619 if (t.delay == e.link6.delay)
\r
623 e.lflags6 = e.lflags6 | LF_REMOTE;
\r
627 e.link7.think = SUB_Remove;
\r
628 e.link7.nextthink = time;
\r
632 if (t.delay == e.link7.delay)
\r
636 e.lflags7 = e.lflags7 | LF_REMOTE;
\r
640 e.link8.think = SUB_Remove;
\r
641 e.link8.nextthink = time;
\r
645 if (t.delay == e.link8.delay)
\r
649 e.lflags8 = e.lflags8 | LF_REMOTE;
\r
653 e.link9.think = SUB_Remove;
\r
654 e.link9.nextthink = time;
\r
658 if (t.delay == e.link9.delay)
\r
662 e.lflags9 = e.lflags9 | LF_REMOTE;
\r
666 e.link10.think = SUB_Remove;
\r
667 e.link10.nextthink = time;
\r
671 if (t.delay == e.link10.delay)
\r
675 e.lflags10 = e.lflags10 | LF_REMOTE;
\r
679 e.link11.think = SUB_Remove;
\r
680 e.link11.nextthink = time;
\r
684 if (t.delay == e.link11.delay)
\r
688 e.lflags11 = e.lflags11 | LF_REMOTE;
\r
692 e.link12.think = SUB_Remove;
\r
693 e.link12.nextthink = time;
\r
697 if (t.delay == e.link12.delay)
\r
701 e.lflags12 = e.lflags12 | LF_REMOTE;
\r
705 e.link13.think = SUB_Remove;
\r
706 e.link13.nextthink = time;
\r
710 if (t.delay == e.link13.delay)
\r
714 e.lflags13 = e.lflags13 | LF_REMOTE;
\r
718 e.link14.think = SUB_Remove;
\r
719 e.link14.nextthink = time;
\r
723 if (t.delay == e.link14.delay)
\r
727 e.lflags14 = e.lflags14 | LF_REMOTE;
\r
731 e.link15.think = SUB_Remove;
\r
732 e.link15.nextthink = time;
\r
736 if (t.delay == e.link15.delay)
\r
740 e.lflags15 = e.lflags15 | LF_REMOTE;
\r
744 e.link16.think = SUB_Remove;
\r
745 e.link16.nextthink = time;
\r
749 if (t.delay == e.link16.delay)
\r
753 e.lflags16 = e.lflags16 | LF_REMOTE;
\r
757 e.link17.think = SUB_Remove;
\r
758 e.link17.nextthink = time;
\r
762 if (t.delay == e.link17.delay)
\r
766 e.lflags17 = e.lflags17 | LF_REMOTE;
\r
770 e.link18.think = SUB_Remove;
\r
771 e.link18.nextthink = time;
\r
775 if (t.delay == e.link18.delay)
\r
779 e.lflags18 = e.lflags18 | LF_REMOTE;
\r
783 e.link19.think = SUB_Remove;
\r
784 e.link19.nextthink = time;
\r
788 if (t.delay == e.link19.delay)
\r
792 e.lflags19 = e.lflags19 | LF_REMOTE;
\r
799 if (!(e.sflags & S_TELEPORT))
\r
804 if (boxesoverlap(e.origin + e.mins, e.origin + e.maxs, t.origin + t.mins, t.origin + t.maxs))
\r
847 else if (!e.link10)
\r
849 else if (!e.link11)
\r
851 else if (!e.link12)
\r
853 else if (!e.link13)
\r
855 else if (!e.link14)
\r
857 else if (!e.link15)
\r
859 else if (!e.link16)
\r
861 else if (!e.link17)
\r
863 else if (!e.link18)
\r
865 else if (!e.link19)
\r
868 dprint("WARNING: Too many linking NavNodes!\n");
\r
869 SpawnOptController(e, t);
\r
879 if (e.sflags & S_TELEPORT)
\r
881 t = findchain(classname, "trigger_teleport");
\r
884 if (boxesoverlap(t.absmin, t.absmax, e.absmin, e.absmax))
\r
886 tdest = find(world, targetname, t.target);
\r
887 tdest = FindCurrentNavNode(tdest.origin, '0 0 0', '0 0 0');
\r
893 error("Expected navnode\n");
\r
895 else if (e.sflags & S_DOOR)
\r
897 t = findchain(classname, "door");
\r
900 if (boxesoverlap(t.absmin, t.absmax, e.absmin, e.absmax))
\r
905 error("Expected door\n");
\r
911 /* --- LoadNavNodes ---
\r
912 Loads the navnodes from an .nnl file (NavNodeList) for the map*/
\r
914 void() LoadNavNodes =
\r
916 local float f, file, length;
\r
919 local float tfl0, tfl1, tfl2, tfl3, tfl4, tfl5, tfl6, tfl7, tfl8, tfl9;
\r
920 local float tfl10, tfl11, tfl12, tfl13, tfl14, tfl15, tfl16, tfl17, tfl18, tfl19;
\r
922 local float rl0, rl1, rl2, rl3, rl4, rl5, rl6, rl7, rl8, rl9;
\r
923 local float rl10, rl11, rl12, rl13, rl14, rl15, rl16, rl17, rl18, rl19;
\r
925 local vector wborg, wbmaxs, wbmins;
\r
926 local entity e, plane_storage;
\r
930 dprint("NavNodes present, map needs to be reloaded to load navnode-file\n");
\r
934 plane_storage = spawn();
\r
936 length = strlen(world.model);
\r
937 length = length - 5;
\r
938 s = substring(world.model, 5, length);
\r
939 s = strcat("maps/", s, ".nnl");
\r
941 file = fopen(s, FILE_READ);
\r
945 dprint("Found navnode file\n");
\r
947 while (s == "navnode")
\r
952 wborg = wbmaxs = wbmins = nullvector;
\r
953 plane_storage.plane_chain = world;
\r
955 tfl0 = tfl1 = tfl2 = tfl3 = tfl4 = tfl5 = tfl6 = tfl7 = tfl8 = tfl9 = 0;
\r
956 tfl10 = tfl11 = tfl12 = tfl13 = tfl14 = tfl15 = tfl16 = tfl17 = tfl18 = tfl19 = 0;
\r
957 rl0 = rl1 = rl2 = rl3 = rl4 = rl5 = rl6 = rl7 = rl8 = rl9 = -1;
\r
958 rl10 = rl11 = rl12 = rl13 = rl14 = rl15 = rl16 = rl17 = rl18 = rl19 = -1;
\r
966 while (s == "plane")
\r
972 AddPlane(plane_storage, pln*-1, pdst);
\r
975 while (substring(s, 0, 6) == "remote")
\r
977 length = strlen(s);
\r
978 f = stof(substring(s, 6, length));
\r
1022 if (s == "sflags")
\r
1028 while (substring(s, 0, 6) == "lflags")
\r
1030 length = strlen(s);
\r
1031 f = stof(substring(s, 6, length));
\r
1075 e = SpawnNavNode(wborg, wbmins, wbmaxs);
\r
1076 if (plane_storage.plane_chain)
\r
1077 e.plane_chain = plane_storage.plane_chain;
\r
1089 e.lflags10 = tfl10;
\r
1090 e.lflags11 = tfl11;
\r
1091 e.lflags12 = tfl12;
\r
1092 e.lflags13 = tfl13;
\r
1093 e.lflags14 = tfl14;
\r
1094 e.lflags15 = tfl15;
\r
1095 e.lflags16 = tfl16;
\r
1096 e.lflags17 = tfl17;
\r
1097 e.lflags18 = tfl18;
\r
1098 e.lflags19 = tfl19;
\r
1102 newmis.classname = "remotelinker";
\r
1103 newmis.delay = rl0;
\r
1109 newmis.classname = "remotelinker";
\r
1110 newmis.delay = rl1;
\r
1116 newmis.classname = "remotelinker";
\r
1117 newmis.delay = rl2;
\r
1123 newmis.classname = "remotelinker";
\r
1124 newmis.delay = rl3;
\r
1130 newmis.classname = "remotelinker";
\r
1131 newmis.delay = rl4;
\r
1137 newmis.classname = "remotelinker";
\r
1138 newmis.delay = rl5;
\r
1144 newmis.classname = "remotelinker";
\r
1145 newmis.delay = rl6;
\r
1151 newmis.classname = "remotelinker";
\r
1152 newmis.delay = rl7;
\r
1158 newmis.classname = "remotelinker";
\r
1159 newmis.delay = rl8;
\r
1165 newmis.classname = "remotelinker";
\r
1166 newmis.delay = rl9;
\r
1172 newmis.classname = "remotelinker";
\r
1173 newmis.delay = rl10;
\r
1174 e.link10 = newmis;
\r
1179 newmis.classname = "remotelinker";
\r
1180 newmis.delay = rl11;
\r
1181 e.link11 = newmis;
\r
1186 newmis.classname = "remotelinker";
\r
1187 newmis.delay = rl12;
\r
1188 e.link12 = newmis;
\r
1193 newmis.classname = "remotelinker";
\r
1194 newmis.delay = rl13;
\r
1195 e.link13 = newmis;
\r
1200 newmis.classname = "remotelinker";
\r
1201 newmis.delay = rl14;
\r
1202 e.link14 = newmis;
\r
1207 newmis.classname = "remotelinker";
\r
1208 newmis.delay = rl15;
\r
1209 e.link15 = newmis;
\r
1214 newmis.classname = "remotelinker";
\r
1215 newmis.delay = rl16;
\r
1216 e.link16 = newmis;
\r
1221 newmis.classname = "remotelinker";
\r
1222 newmis.delay = rl17;
\r
1223 e.link17 = newmis;
\r
1228 newmis.classname = "remotelinker";
\r
1229 newmis.delay = rl18;
\r
1230 e.link18 = newmis;
\r
1235 newmis.classname = "remotelinker";
\r
1236 newmis.delay = rl19;
\r
1237 e.link19 = newmis;
\r
1243 dprint("No navnode file found\n");
\r
1244 remove(plane_storage);
\r
1245 plane_storage = world;
\r