1 /***********************************************
\r
3 * FrikBot Misc Code *
\r
4 * "Because you can't name it anything else" *
\r
6 ***********************************************/
\r
9 This program is in the Public Domain. My crack legal
\r
10 team would like to add:
\r
12 RYAN "FRIKAC" SMITH IS PROVIDING THIS SOFTWARE "AS IS"
\r
13 AND MAKES NO WARRANTY, EXPRESS OR IMPLIED, AS TO THE
\r
14 ACCURACY, CAPABILITY, EFFICIENCY, MERCHANTABILITY, OR
\r
15 FUNCTIONING OF THIS SOFTWARE AND/OR DOCUMENTATION. IN
\r
16 NO EVENT WILL RYAN "FRIKAC" SMITH BE LIABLE FOR ANY
\r
17 GENERAL, CONSEQUENTIAL, INDIRECT, INCIDENTAL,
\r
18 EXEMPLARY, OR SPECIAL DAMAGES, EVEN IF RYAN "FRIKAC"
\r
19 SMITH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
\r
20 DAMAGES, IRRESPECTIVE OF THE CAUSE OF SUCH DAMAGES.
\r
22 You accept this software on the condition that you
\r
23 indemnify and hold harmless Ryan "FrikaC" Smith from
\r
24 any and all liability or damages to third parties,
\r
25 including attorney fees, court costs, and other
\r
26 related costs and expenses, arising out of your use
\r
27 of this software irrespective of the cause of said
\r
30 The export from the United States or the subsequent
\r
31 reexport of this software is subject to compliance
\r
32 with United States export control and munitions
\r
33 control restrictions. You agree that in the event you
\r
34 seek to export this software, you assume full
\r
35 responsibility for obtaining all necessary export
\r
36 licenses and approvals and for assuring compliance
\r
37 with applicable reexport restrictions.
\r
39 Any reproduction of this software must contain
\r
40 this notice in its entirety.
\r
45 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
49 Sets bot's name and colors
\r
51 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
53 string(float r) BotName =
\r
58 self.playermodel = "models/player/visitant.zym";
\r
59 self.playerskin = "0";
\r
64 self.playermodel = "models/player/marine.zym";
\r
65 self.playerskin = "0";
\r
70 self.playermodel = "models/player/specop.zym";
\r
71 self.playerskin = "0";
\r
76 self.playermodel = "models/player/nexus.zym";
\r
77 self.playerskin = "0";
\r
82 self.playermodel = "models/player/skadi.zym";
\r
83 self.playerskin = "0";
\r
88 self.playermodel = "models/player/lurk.zym";
\r
89 self.playerskin = "0";
\r
94 self.playermodel = "models/player/headhunter.zym";
\r
95 self.playerskin = "0";
\r
96 return "HeadHunter";
\r
100 self.playermodel = "models/player/carni.zym";
\r
101 self.playerskin = "0";
\r
106 self.playermodel = "models/player/grunt.zym";
\r
107 self.playerskin = "0";
\r
112 self.playermodel = "models/player/insurrectionist.zym";
\r
113 self.playerskin = "0";
\r
114 return "Insurrectionist";
\r
118 self.playermodel = "models/player/jeandarc.zym";
\r
119 self.playerskin = "0";
\r
124 self.playermodel = "models/player/lycanthrope.zym";
\r
125 self.playerskin = "0";
\r
126 return "Lycanthrope";
\r
130 self.playermodel = "models/player/pyria.zym";
\r
131 self.playerskin = "0";
\r
136 self.playermodel = "models/player/shock.zym";
\r
137 self.playerskin = "0";
\r
142 self.playermodel = "models/player/marine.zym";
\r
143 self.playerskin = "1";
\r
148 self.playermodel = "models/player/nexus.zym";
\r
149 self.playerskin = "1";
\r
154 self.playermodel = "models/player/skadi.zym";
\r
155 self.playerskin = "1";
\r
160 self.playermodel = "models/player/lurk.zym";
\r
161 self.playerskin = "1";
\r
166 self.playermodel = "models/player/crash.zym";
\r
167 self.playerskin = "2";
\r
168 return "mechanical";
\r
172 self.playermodel = "models/player/crash.zym";
\r
173 self.playerskin = "1";
\r
178 self.playermodel = "models/player/insurrectionist.zym";
\r
179 self.playerskin = "1";
\r
180 return "Anarchist";
\r
184 self.playermodel = "models/player/jeandarc.zym";
\r
185 self.playerskin = "1";
\r
190 self.playermodel = "models/player/lycanthrope.zym";
\r
191 self.playerskin = "1";
\r
196 self.playermodel = "models/player/pyria.zym";
\r
197 self.playerskin = "1";
\r
202 self.playermodel = "models/player/rebel.zym";
\r
203 self.playerskin = "0";
\r
208 self.playermodel = "models/player/crash.zym";
\r
209 self.playerskin = "0";
\r
214 string () PickARandomName =
\r
216 if (bot_count > 16)
\r
219 local float y, test;
\r
225 test = ceil(random() * 16);
\r
227 t = find(world, netname, h);
\r
236 // I didn't like the old code so this is very stripped down
\r
238 entity b_originator;
\r
242 b_originator == self
\r
245 3 - team message "friendly eyes"
\r
246 4 - team message "on your back"
\r
247 5 - team message "need back up"
\r
252 8 - welcoming someone onto server
\r
253 9 - ridicule lost frag (killed self?)
\r
254 10 - ridicule lost frag (lava)
\r
256 b_originator == targ
\r
260 void(float tpic) bot_start_topic =
\r
262 if (random() < 0.2)
\r
265 b_originator = self;
\r
275 if (b_options & OPT_NOCHAT)
\r
277 r = ceil (random() * 6);
\r
279 if (self.b_chattime > time)
\r
281 if (self.b_skill < 2)
\r
282 self.keys = self.button0 = self.button2 = 0;
\r
285 else if (self.b_chattime)
\r
289 if (b_originator == self)
\r
293 BotSay(": lo all\n");
\r
294 bot_start_topic(8);
\r
298 BotSay(": hey everyone\n");
\r
299 bot_start_topic(8);
\r
303 BotSay(": prepare to be fragged!\n");
\r
304 bot_start_topic(0);
\r
308 BotSay(": boy this is laggy\n");
\r
309 bot_start_topic(11);
\r
313 BotSay(": #mm getting some lag here\n");
\r
314 bot_start_topic(11);
\r
318 BotSay(": hi everyone\n");
\r
319 bot_start_topic(8);
\r
323 else if (b_topic == 2)
\r
325 if (b_originator == self)
\r
328 BotSay(": take that\n");
\r
330 BotSay(": yehaww!\n");
\r
332 BotSay(": wh00p\n");
\r
334 BotSay(": j00_sawk();\n");
\r
336 BotSay(": i rule\n");
\r
338 BotSay(": eat that\n");
\r
339 bot_start_topic(0);
\r
342 else if (b_topic == 3)
\r
344 if (b_originator == self)
\r
347 BotSayTeam(": friendly eyes\n");
\r
349 BotSayTeam(": team eyes\n");
\r
350 bot_start_topic(0);
\r
353 else if (b_topic == 4)
\r
355 if (b_originator == self)
\r
358 BotSayTeam(": on your back\n");
\r
360 BotSayTeam(": I'm with you\n");
\r
361 bot_start_topic(0);
\r
364 else if (b_topic == 5)
\r
366 if (b_originator == self)
\r
369 BotSayTeam(": I need help\n");
\r
371 BotSayTeam(": need backup\n");
\r
372 bot_start_topic(0);
\r
375 else if (b_topic == 6)
\r
377 if (b_originator == self)
\r
381 BotSay(": sun got in my eyes\n");
\r
382 bot_start_topic(0);
\r
386 BotSay(": mouse needs cleaning\n");
\r
387 bot_start_topic(0);
\r
391 BotSay(": i meant to do that\n");
\r
392 bot_start_topic(0);
\r
397 bot_start_topic(11);
\r
401 BotSay(": killer lag\n");
\r
402 bot_start_topic(11);
\r
406 BotSay(": 100% lag\n");
\r
407 bot_start_topic(11);
\r
411 else if (b_topic == 7)
\r
416 BotSay(": gg all\n");
\r
418 BotSay(": that was fun\n");
\r
420 BotSay(": good game\n");
\r
425 bot_start_topic(0);
\r
427 else if (b_topic == 8)
\r
429 if (b_originator != self)
\r
433 BotSay(": heya\n");
\r
434 bot_start_topic(0);
\r
438 BotSay(": welcome\n");
\r
439 bot_start_topic(0);
\r
445 BotSay2(b_originator.netname);
\r
447 bot_start_topic(0);
\r
453 BotSay2(b_originator.netname);
\r
455 bot_start_topic(0);
\r
459 BotSay(": howdy\n");
\r
460 bot_start_topic(0);
\r
465 bot_start_topic(0);
\r
470 else if (b_topic == 9)
\r
472 if (b_originator != self)
\r
477 BotSay(": heheh\n");
\r
481 BotSay2(": good work ");
\r
482 BotSay2(b_originator.netname);
\r
488 BotSay2(": nice1 ");
\r
489 BotSay2(b_originator.netname);
\r
499 else if (b_topic == 10)
\r
501 if (b_originator != self)
\r
504 BotSay(": have a nice dip?\n");
\r
506 BotSay(": bah I hate levels with lava\n");
\r
510 BotSay2(": good job ");
\r
511 BotSay2(b_originator.netname);
\r
517 BotSay2(": nice backflip ");
\r
518 BotSay2(b_originator.netname);
\r
522 BotSay(": watch your step\n");
\r
524 BotSay(": hehe\n");
\r
529 else if (b_topic == 11)
\r
531 if (b_originator != self)
\r
536 BotSay2(": yeah right ");
\r
537 BotSay2(b_originator.netname);
\r
539 bot_start_topic(0);
\r
543 BotSay(": ping\n");
\r
544 bot_start_topic(0);
\r
548 BotSay(": shuddup, you're an lpb\n");
\r
549 bot_start_topic(0);
\r
553 BotSay(": lag my eye\n");
\r
554 bot_start_topic(0);
\r
558 BotSay(": yeah\n");
\r
559 bot_start_topic(11);
\r
563 BotSay(": totally\n");
\r
564 bot_start_topic(11);
\r
568 self.b_chattime = 0;
\r
572 if (random() < 0.5)
\r
574 if (self == b_originator)
\r
577 self.b_chattime = time + 2;
\r
582 self.b_chattime = time + 2;
\r
590 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
594 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
600 ty = find(world, classname, "player");
\r
601 while (ty != world)
\r
611 ty = find(ty, classname, "player");
\r
618 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
620 Simplified origin checking.
\r
622 God, I wish I had inline
\r
624 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
627 vector(entity ent) realorigin =
\r
629 // even more simplified...
\r
630 return (ent.absmin + ent.absmax) * 0.5;
\r
634 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
638 a version of visible that checks for corners
\r
639 of the bounding boxes
\r
641 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
644 float (entity targ) fisible =
\r
646 local vector spot1, org;
\r
647 local float thruwater, pc1, pc2;
\r
649 org = realorigin(targ);
\r
650 spot1 = self.origin + self.view_ofs;
\r
652 if (targ.solid == SOLID_BSP)
\r
654 traceline (spot1, org, TRUE, self);
\r
655 if (trace_ent == targ)
\r
657 else if (trace_fraction == 1)
\r
663 pc1 = pointcontents(org);
\r
664 pc2 = pointcontents(spot1);
\r
665 if (targ.classname == "player")
\r
667 else if (pc1 == CONTENT_LAVA)
\r
673 if (pc1 < -1) // targ's origin is in water or other liquid
\r
677 // look for their head
\r
678 traceline (spot1, org + targ.mins, TRUE, self);
\r
679 // cross the water check
\r
684 if (trace_ent == targ)
\r
686 else if (trace_fraction == 1)
\r
695 traceline (spot1, org + targ.maxs, TRUE, self);
\r
700 if (trace_ent == targ)
\r
702 else if (trace_fraction == 1)
\r
707 traceline (spot1, org, TRUE, self);
\r
708 if (trace_ent == targ)
\r
710 else if (trace_fraction == 1)
\r
712 traceline (spot1, org + targ.maxs, TRUE, self);
\r
713 if (trace_ent == targ)
\r
715 else if (trace_fraction == 1)
\r
717 traceline (spot1, org + targ.mins, TRUE, self);
\r
718 if (trace_ent == targ)
\r
720 else if (trace_fraction == 1)
\r
727 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
731 goes through movable brushes/entities, used
\r
734 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
737 // this is used for waypoint stuff....
\r
738 float (entity targ1, entity targ2) wisible =
\r
740 local vector spot1, spot2;
\r
741 local entity ignore;
\r
743 spot1 = targ1.origin;
\r
744 spot2 = realorigin(targ2);
\r
749 traceline (spot1, spot2, TRUE, ignore);
\r
750 spot1 = realorigin(trace_ent);
\r
751 ignore = trace_ent;
\r
752 } while ((trace_ent != world) && (trace_fraction != 1));
\r
753 if (trace_endpos == spot2)
\r
761 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
765 Now this is getting ridiculous. Simple visible,
\r
766 used when we need just a simple traceline nothing else
\r
768 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
771 float (entity targ) sisible =
\r
773 traceline (self.origin, targ.origin, TRUE, self);
\r
774 if (trace_ent == targ)
\r
776 else if (trace_fraction == 1)
\r
781 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
785 subtracts one angle from another
\r
787 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
790 float (float y1, float y2) angcomp =
\r
792 y1 = frik_anglemod(y1);
\r
793 y2 = frik_anglemod(y2);
\r
795 local float answer;
\r
798 answer = (360 - answer) * -1;
\r
799 else if (answer < -180)
\r
800 answer = answer + 360;
\r
805 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
809 is the entity in the bot's field of view
\r
811 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
813 float (entity targ) fov =
\r
817 yawn = realorigin(targ);
\r
818 yawn = (yawn + targ.view_ofs) - (self.origin + self.view_ofs);
\r
819 yawn = normalize(yawn);
\r
820 yawn = vectoangles(yawn);
\r
821 g = angcomp(self.v_angle_x, yawn_x);
\r
824 g = angcomp(self.v_angle_y, yawn_y);
\r
832 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
836 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
838 float(float v) frik_anglemod =
\r
840 return v - floor(v/360) * 360;
\r