home *** CD-ROM | disk | FTP | other *** search
/ PC Gamer 3.2 / 1997-05_Disc_3.2.iso / QUAKECTF / SRC / BOT / BOTCAM.QC < prev    next >
Text File  |  1997-01-29  |  14KB  |  608 lines

  1. float old_crosshair;
  2. float old_r_drawviewmodel;
  3. float old_viewsize;
  4.  
  5. //=============================================================
  6. void () SaveViewSettings =
  7. {
  8.     old_crosshair = cvar("crosshair");
  9.     old_r_drawviewmodel = cvar("r_drawviewmodel");
  10.     old_viewsize = cvar("viewsize");
  11. };
  12. //=============================================================
  13. void () FullView =
  14. {
  15.     stuffcmd(self, "crosshair 0\n");
  16.     stuffcmd(self, "r_drawviewmodel 0\n");
  17.     stuffcmd(self, "viewsize 120\n");
  18. };
  19. //=============================================================
  20. void () RestoreViewSettings =
  21. {
  22. local string st;
  23.  
  24.     stuffcmd(self, "crosshair ");
  25.     st = ftos(old_crosshair);
  26.     stuffcmd(self, st);
  27.     stuffcmd(self, "\n");
  28.     
  29.     stuffcmd(self, "r_drawviewmodel ");
  30.     st = ftos(old_r_drawviewmodel);
  31.     stuffcmd(self, st);
  32.     stuffcmd(self, "\n");
  33.     
  34.     stuffcmd(self, "viewsize ");
  35.     st = ftos(old_viewsize);
  36.     stuffcmd(self, st);
  37.     stuffcmd(self, "\n");
  38. };
  39.  
  40. //=============================================================
  41. // self is the player
  42. //=============================================================
  43. void () ToggleCamera =
  44. {
  45.     if (self.classname != "player")
  46.         return;
  47.         
  48.     if (self.observer_flags & PLAYER_USING_CAMERA)
  49.         self.observer_flags = self.observer_flags - PLAYER_USING_CAMERA;
  50.     else
  51.         self.observer_flags = self.observer_flags | PLAYER_USING_CAMERA;
  52.     
  53.     if (self.observer_flags & PLAYER_USING_CAMERA)
  54.     {
  55.         sprint(self, "camera view ON\n");
  56.         if (!auto_camera_view)
  57.             ToggleAutoCamera();
  58.             
  59.         self.observer_flags = self.observer_flags | PLAYER_NO_TARGET;
  60.                     
  61.         cur_camera_watch_ent = find(world, classname, "bot");
  62.         if (cur_camera_watch_ent == world)
  63.             sprint(self, "no bots to watch\n");
  64.         self.takedamage = DAMAGE_NO;
  65.         self.solid = SOLID_NOT;
  66.         self.movetype = MOVETYPE_NONE;
  67.         setmodel (self, string_null);
  68.         setsize(self, '0 0 0', '0 0 0');
  69.         self.weaponmodel = "";
  70.         self.weaponframe = 0;
  71.         self.weapon = 0;
  72.         
  73.         //SaveViewSettings();
  74.         //FullView();
  75.     }
  76.     else
  77.     {
  78.         sprint(self, "camera view OFF\n");
  79.         if (auto_fov_control)
  80.             stuffcmd(self, "fov 90\n");
  81.         self.takedamage = DAMAGE_AIM;
  82.         self.solid = SOLID_SLIDEBOX;
  83.         self.movetype = MOVETYPE_WALK;
  84.         setmodel (self, "progs/player.mdl");
  85.         setsize(self, VEC_HULL_MIN, VEC_HULL_MAX);
  86.         self.weapon = IT_SHOTGUN;
  87.         
  88.         //RestoreViewSettings();
  89.     }
  90. };
  91.  
  92.  
  93. //=============================================================
  94. // self is the player
  95. //=============================================================
  96. void (entity ent) WatchEnt =
  97. {
  98.     if (self.classname != "player")
  99.         return;
  100.  
  101.     if (cur_camera_watch_ent != ent)
  102.     {
  103.         cur_camera_watch_ent = ent;        
  104.         
  105.         if (bot_debug >= 1)
  106.         {
  107.             if (cur_camera_watch_ent != world)
  108.             {
  109.                 sprint(self, "watching ");
  110.                 sprint(self, cur_camera_watch_ent.netname);
  111.                 sprint(self, "\n");
  112.             }
  113.             else
  114.             {
  115.                 sprint(self, "watching nothing\n");
  116.             }
  117.         }
  118.     }
  119. };
  120.  
  121. //=============================================================
  122. // self is the player
  123. //=============================================================
  124. void () ToggleAutoCamera =
  125. {
  126.     if (self.classname != "player")
  127.         return;
  128.         
  129.     auto_camera_view = !auto_camera_view;
  130.     if (auto_camera_view)
  131.         sprint(self, "auto-camera ON\n");
  132.     else
  133.     {
  134.         sprint(self, "auto-camera OFF\n");
  135.         stuffcmd(self, "fov 90\n");
  136.     }
  137. };
  138. //=============================================================
  139. // self is the player
  140. // this is kind of cool but in Quake 1.06 fov is not stored in
  141. // demo files, so this is off by default.
  142. //=============================================================
  143. void () ToggleFOVControl =
  144. {
  145.     if (self.classname != "player")
  146.         return;
  147.         
  148.     auto_fov_control = !auto_fov_control;
  149.     if (auto_fov_control)
  150.         sprint(self, "auto-fov control ON\n");
  151.     else
  152.     {
  153.         sprint(self, "auto-fov control OFF\n");
  154.         stuffcmd(self, "fov 90\n");
  155.     }
  156. };
  157.  
  158.  
  159. //====================================================
  160. // self is the bot
  161. // trace out a few lines and try to see the thing
  162. //====================================================
  163. float (vector spot1, vector spot2) entvisible =
  164. {
  165.     traceline (spot1, spot2, TRUE, self);    // see through other monsters
  166.     
  167.     if (trace_inopen && trace_inwater)
  168.         return FALSE;            // sight line crossed contents
  169.  
  170.     if (trace_fraction == 1)
  171.         return TRUE;
  172.     
  173.     return FALSE;
  174. };
  175.  
  176. //=============================================================
  177. // self is the player
  178. //=============================================================
  179. entity (entity p) GetNextPlayerOrBot =
  180. {
  181. local entity p, bot;
  182.  
  183.     bot = FindNextPlayerOrBot(p);
  184.     if (bot == world)
  185.         bot = find(world, classname, "player");    
  186.     return bot;
  187. };
  188.  
  189. //=============================================================
  190. //=============================================================
  191. void () AutoSetCameraWatchEnt = 
  192. {
  193. local entity bot, best_bot, p;
  194. local float num_bots_nearby, best_num_bots_nearby;
  195.  
  196.     best_num_bots_nearby = 0;
  197.     best_bot = world;
  198.     bot = find(world, classname, "player");
  199.     while (bot != world)
  200.     {
  201.         num_bots_nearby = 0;
  202.     
  203.         p = findradius(bot.origin, 700);
  204.         while (p != world)
  205.         {
  206.             if (p != bot)
  207.             if ((p.classname == "bot") || (p.classname == "player"))
  208.             if (!(p.observer_flags & PLAYER_NO_TARGET))
  209.             if (!(p.observer_flags & PLAYER_USING_CAMERA))
  210.             if (p.deadflag != DEAD_DEAD)
  211.             if (p.team != bot.team)
  212.             if (entvisible(p.origin, bot.origin))
  213.             {
  214.                 num_bots_nearby = num_bots_nearby + 1;
  215.             }
  216.  
  217.             p = p.chain;
  218.         }
  219.         
  220.         if (bot.deadflag != DEAD_DEAD)
  221.         if (num_bots_nearby > best_num_bots_nearby)
  222.         {
  223.             best_bot = bot;
  224.             best_num_bots_nearby = num_bots_nearby;
  225.         }
  226.         
  227.         bot = FindNextPlayerOrBot(bot);
  228.     }
  229.     
  230.     // if can't find some action, find a game-relevant bot
  231.     
  232.     local float found;
  233.     found = FALSE;
  234.     if (best_bot == world)
  235.     {
  236.         bot = find(world, classname, "player");
  237.         while ((bot != world) && (!found))
  238.         {
  239.             if (bot.player_flag & ITEM_ENEMY_FLAG)
  240.             {
  241.                 best_bot = bot;
  242.                 found = TRUE;
  243.             }
  244.             bot = FindNextPlayerOrBot(bot);
  245.         }
  246.  
  247.         if (!found)
  248.         {
  249.             best_num_bots_nearby = 0;
  250.             best_bot = world;
  251.             bot = find(world, classname, "player");
  252.             while (bot != world)
  253.             {
  254.                 num_bots_nearby = 0;
  255.  
  256.                 p = findradius(bot.origin, 700);
  257.                 while (p != world)
  258.                 {
  259.                     if (p != bot)
  260.                     if ((p.classname == "bot") || (p.classname == "player"))
  261.                     if (!(p.observer_flags & PLAYER_NO_TARGET))
  262.                     if (!(p.observer_flags & PLAYER_USING_CAMERA))
  263.                     if (p.deadflag != DEAD_DEAD)
  264.                     if (p.team == bot.team)
  265.                     if (entvisible(p.origin, bot.origin))
  266.                     {
  267.                         num_bots_nearby = num_bots_nearby + 1;
  268.                     }
  269.  
  270.                     p = p.chain;
  271.                 }
  272.  
  273.                 if (bot.deadflag != DEAD_DEAD)
  274.                 if (num_bots_nearby > best_num_bots_nearby)
  275.                 {
  276.                     best_bot = bot;
  277.                     best_num_bots_nearby = num_bots_nearby;
  278.                 }
  279.  
  280.                 bot = FindNextPlayerOrBot(bot);
  281.             }
  282.             
  283.             // a team going to kick some ass
  284.             if (best_num_bots_nearby > 0)
  285.             {
  286.                 found = TRUE;
  287.             }
  288.         }
  289.         
  290.         // no action, no flag carrier, no same-team group
  291.         
  292.         // look for a bot with pentagram
  293.         if (!found)
  294.         {
  295.             bot = find(world, classname, "player");
  296.             while ((bot != world) && (!found))
  297.             {
  298.                 if (bot.invincible_finished > time)
  299.                 {
  300.                     best_bot = bot;
  301.                     found = TRUE;
  302.                 }
  303.                 bot = FindNextPlayerOrBot(bot);
  304.             }
  305.         }
  306.         
  307.         // look for a bot with quad
  308.         if (!found)
  309.         {
  310.             bot = find(world, classname, "player");
  311.             while ((bot != world) && (!found))
  312.             {
  313.                 if (bot.super_damage_finished > time)
  314.                 {
  315.                     best_bot = bot;
  316.                     found = TRUE;
  317.                 }
  318.                 bot = FindNextPlayerOrBot(bot);
  319.             }
  320.         }
  321.         
  322.         // look for a bot with strength rune
  323.         if (!found)
  324.         {
  325.             bot = find(world, classname, "player");
  326.             while ((bot != world) && (!found))
  327.             {
  328.                 if (bot.player_flag & ITEM_RUNE2_FLAG)
  329.                 {
  330.                     best_bot = bot;
  331.                     found = TRUE;
  332.                 }
  333.                 bot = FindNextPlayerOrBot(bot);
  334.             }
  335.         }
  336.         
  337.         // look for a bot with a rocket launcher
  338.         if (!found)
  339.         {
  340.             bot = find(world, classname, "player");
  341.             while ((bot != world) && (!found))
  342.             {
  343.                 if (bot.items & IT_ROCKET_LAUNCHER)
  344.                 {
  345.                     best_bot = bot;
  346.                     found = TRUE;
  347.                 }
  348.                 bot = FindNextPlayerOrBot(bot);
  349.             }
  350.         }
  351.         
  352.         // look for a bot with a thunderbolt
  353.         if (!found)
  354.         {
  355.             bot = find(world, classname, "player");
  356.             while ((bot != world) && (!found))
  357.             {
  358.                 if (bot.items & IT_LIGHTNING)
  359.                 {
  360.                     best_bot = bot;
  361.                     found = TRUE;
  362.                 }
  363.                 bot = FindNextPlayerOrBot(bot);
  364.             }
  365.         }
  366.         
  367.         // look for a bot with a grenade launcher
  368.         if (!found)
  369.         {
  370.             bot = find(world, classname, "player");
  371.             while ((bot != world) && (!found))
  372.             {
  373.                 if (bot.items & IT_GRENADE_LAUNCHER)
  374.                 {
  375.                     best_bot = bot;
  376.                     found = TRUE;
  377.                 }
  378.                 bot = FindNextPlayerOrBot(bot);
  379.             }
  380.         }
  381.     }
  382.     
  383.     // still haven't found a bot?  random bot.
  384.     if (best_bot == world)
  385.     {
  386.         local float nb;
  387.         
  388.         nb = (next_bot_num - 1);
  389.         nb = nb + GetNumHumans();
  390.         
  391.         nb = random() * nb;
  392.         nb = floor(nb);
  393.         bot = find(world, classname, "player");
  394.         while ((bot != world) && (!found))
  395.         {
  396.             if (nb == 0)
  397.             {
  398.                 best_bot = bot;
  399.                 found = TRUE;
  400.             }
  401.             nb = nb - 1;
  402.             if (nb < 0)
  403.                 nb = 0;
  404.             bot = GetNextPlayerOrBot(bot);
  405.         }
  406.     }
  407.     
  408.     if (best_bot == world)
  409.         dprint("can't find a bot to watch\n");
  410.  
  411.     WatchEnt(best_bot);
  412. };
  413. //=============================================================
  414. void (vector vec) SetPlayerFOV =
  415. {
  416.     if (auto_fov_control)
  417.     {
  418.         local float vl;
  419.         vl = vlen(vec);
  420.  
  421.         if (vl < 200)
  422.             stuffcmd(self, "fov 90\n");
  423.         else 
  424.         {
  425.             // we want to map 200...700 to 90..40
  426.             vl = vl - 200;
  427.             vl = 500 - vl;
  428.  
  429.             // now vl in the range 500..0
  430.             vl = vl / 10;
  431.  
  432.             // now vl in the range 50..0
  433.             vl = vl + 40;
  434.  
  435.             // now vl in the range 90..40
  436.             local string st;
  437.             st = ftos(vl);
  438.             stuffcmd(self, "fov ");
  439.             stuffcmd(self, st);
  440.             stuffcmd(self, "\n");
  441.         }
  442.     }
  443. };
  444. //=============================================================
  445. // self is the player
  446. //setorigin(self, org);
  447. //self.angles = me.v_angle = ang;
  448. //self.fixangle = TRUE;        // turn this way immediately
  449. //=============================================================
  450. void (float force_update) SetPlayerViewPoint =
  451. {
  452. local entity bot, p;
  453. local vector ang, vec;
  454. local float force_update_camera, dot;
  455.  
  456.     if (self.classname != "player")
  457.         return;
  458.  
  459.     if (auto_camera_view)
  460.         AutoSetCameraWatchEnt();
  461.  
  462.     bot = cur_camera_watch_ent;
  463.     if (bot == world)
  464.         return;
  465.  
  466.     local vector watch_pos;
  467.     
  468.     watch_pos = bot.origin;
  469.     
  470.     local float nm_bots;
  471.  
  472.     watch_pos = '0 0 0';
  473.     nm_bots = 0;
  474.     p = findradius(bot.origin, 700);
  475.     while (p != world)
  476.     {
  477.         if ((p.classname == "bot") || (p.classname == "player"))
  478.         if (!(p.observer_flags & PLAYER_NO_TARGET))
  479.         if (!(p.observer_flags & PLAYER_USING_CAMERA))
  480.         if (p.deadflag != DEAD_DEAD)
  481.         if (entvisible(p.origin, bot.origin))
  482.         {
  483.             watch_pos = watch_pos + p.origin;
  484.             nm_bots = nm_bots + 1;
  485.         }
  486.  
  487.         p = p.chain;
  488.     }
  489.  
  490.     watch_pos_x = watch_pos_x / nm_bots;
  491.     watch_pos_y = watch_pos_y / nm_bots;
  492.     watch_pos_z = watch_pos_z / nm_bots;
  493.     
  494.     force_update_camera = force_update;
  495.  
  496.     makevectors (self.angles);
  497.     vec = normalize (watch_pos - (last_camera_ent.origin + '0 0 30'));
  498.     dot = vec * v_forward;
  499.     if ((dot > -0.5) && (dot < 0.5))
  500.         force_update_camera = TRUE;
  501.         
  502.     if (!entvisible(watch_pos, last_camera_ent.origin + '0 0 30'))
  503.         force_update_camera = TRUE;
  504.         
  505.     // extra-nifty tracking camera view when bot is falling/flying
  506.     if ((!(bot.flags & FL_ONGROUND)) && (watch_pos == bot.origin))
  507.         force_update_camera = TRUE;
  508.     
  509.     // update camera every 1 sec, or whenever we force an update
  510.     if ((time < (last_camera_update + 1)) && (!force_update_camera))
  511.     {
  512.         // no need to change camera position, but change fov if that is enabled
  513.         SetPlayerFOV(vec);
  514.         return;
  515.     }
  516.         
  517.     p = findradius(bot.origin, 700);
  518.     while (p != world)
  519.     {
  520.         if (p != bot)
  521.         if (p.classname != "bot")
  522.         if (p.classname != "item_flag_team1")
  523.         if (p.classname != "item_flag_team2")
  524.         if (p.model != "progs/s_spike.mdl")
  525.         if (p.model != "progs/spike.mdl")
  526.         if (entvisible(watch_pos, p.origin + '0 0 30'))
  527.         {
  528.             // update player viewpoint if it's the same ent as last time,
  529.             // or if it's more than 0.3 seconds later
  530.             // i.e. don't be flashing from viewpoint to viewpoint faster
  531.             // than every 0.3 seconds... however this allows the same ent
  532.             // to change vector
  533.             if ((p == last_camera_ent) || (time > (last_camera_update + 0.5)))
  534.             {    
  535.                 last_camera_ent = p;
  536.                 last_camera_update = time;
  537.             
  538.                 setorigin(self, p.origin + '0 0 30');
  539.                 
  540.                 vec = watch_pos - (p.origin + '0 0 30');
  541.                 vec_z = 0 - vec_z;
  542.                 ang = vectoangles(vec);
  543.                 self.angles = ang;
  544.                 self.v_angle = ang;
  545.                 self.fixangle = TRUE;        // turn this way immediately
  546.                 
  547.                 SetPlayerFOV(vec);
  548.                 return;
  549.             }
  550.         }
  551.  
  552.         p = p.chain;
  553.     }
  554. };
  555. //=============================================================
  556. // self is the player
  557. // this forces an update of the camera view...it's for
  558. // doing in response to a button push, as a one-shot deal
  559. //=============================================================
  560. void () SetPlayerViewpointNow =
  561. {
  562. local float old_auto_camera_view;
  563.  
  564.     old_auto_camera_view = auto_camera_view;
  565.     auto_camera_view = TRUE;
  566.     SetPlayerViewPoint(TRUE);
  567.     auto_camera_view = old_auto_camera_view;
  568. };
  569. //=============================================================
  570. // self is the player
  571. //=============================================================
  572. void () WatchNextPlayerOrBot =
  573. {
  574. local entity bot;
  575. local float found;
  576.  
  577.     if (auto_camera_view)
  578.         ToggleAutoCamera();        // if we are auto-camera, turn it off first
  579.  
  580.     bot = cur_camera_watch_ent;
  581.  
  582.     found = FALSE;
  583.     while (!found)
  584.     {
  585.         bot = GetNextPlayerOrBot(bot);
  586.         if (!(bot.observer))
  587.         if (!(bot.observer_flags & PLAYER_USING_CAMERA))
  588.         if (!(bot.observer_flags & PLAYER_NO_TARGET))
  589.         {
  590.             found = TRUE;
  591.         }
  592.     }
  593.  
  594.     WatchEnt(bot);
  595.     
  596.     if (bot == world)
  597.     {
  598.         sprint(self, "nothing to watch\n");
  599.     }
  600.     else
  601.     {
  602.         sprint(self, "watching ");
  603.         sprint(self, bot.netname);
  604.         sprint(self, "\n");
  605.     }
  606. };
  607.  
  608.