Advertisement
Guest User

Mirrors Edge like edge grab in Quake C

a guest
Apr 27th, 2011
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.64 KB | None | 0 0
  1. // by daemonicky
  2. // comments are translated
  3. // I may have put some errors while dumping this code
  4. // I apologize for them
  5.  
  6.  
  7. void() PlayerPostThink =
  8. {
  9.     if (PlayerDoGrab(PLAYER_RADIUS))
  10.         {
  11.           // player grabbed onto ledge or something
  12. ...
  13.  
  14. //
  15. // declarations and globals
  16. //
  17.  
  18. float GRAB_EYE_UP = 10; // how much from origin eye is
  19. float GRAB_HAND_UP = 15; // how much from origin hand is
  20. float PLAYER_LEGS = 24;
  21. float PLAYER_RADIUS = 32;
  22. float PLAYER_HEIGHT = 56;//24 /* PLAYER_LEGS */+ 32;
  23.  
  24. float grab_can;
  25. float grab_z;
  26.  
  27. float(vector _origin, float _radius, vector _angles) PlayerCanGrabOne;
  28. float(vector _origin, float _radius, float _n) PlayerCanGrabAround;
  29.  
  30.  
  31. ....
  32.  
  33.  
  34. float(float _radius/*hack*/) PlayerDoGrab =
  35. {
  36.         // the grabbing itself
  37.     if (grab_can)
  38.     {
  39.                 // there is a chance it is safe and
  40.                 // does not causes problems
  41.                 // i do not know for sure
  42.         if (TRUE)
  43.         {
  44.            
  45.             local vector SafeOrigin;
  46.             SafeOrigin = self.origin;
  47.             SafeOrigin_z = grab_z;
  48.             setorigin(self,SafeOrigin);
  49.         }
  50.         else
  51.         {
  52.                 // unsafe
  53.             self.origin_z = grab_z;
  54.         }
  55.         self.velocity_z = 0; // gravitation is always applied so do this
  56.         // TODO: make it less rigid
  57.         self.velocity = self.velocity * 0.5;
  58.     }
  59.  
  60.         // always test
  61.     if (PlayerCanGrab(_radius/*hack*/))
  62.     {
  63.         // for first time- turned on
  64.         if (!grab_can)
  65.         {
  66.             // it was set
  67.             grab_can = TRUE;
  68.             // remember height
  69.             grab_z = self.origin_z;
  70.             PlayerStop();
  71.  
  72.             // possible alternative : self.movetype = MOVETYPE_FLY;
  73.         }
  74.     }
  75.     else
  76.     {
  77.         grab_can = FALSE;
  78.     }  
  79.     return grab_can;
  80. }
  81.  
  82. float(float _radius/*hack*/) PlayerCanGrab =
  83. {
  84.     return PlayerCanGrabAround(self.origin, _radius/*hack*/,  4 * 4);
  85.         // was threre, but not so cool
  86.     // return PlayerCanGrabOne(self.origin, _radius/*hack*/, self.angles);
  87. };
  88.  
  89.  
  90.  
  91. float(vector _origin, float _radius, vector _angles) PlayerCanGrabOne =
  92. {
  93.     local vector Eye;
  94.     local vector Hand;
  95.  
  96.     // remove pitch
  97.     /* v_forward = */ makevectors('0 1 0' * _angles_y + '0 0 1' * _angles_z); //
  98.     Eye = _origin + v_forward*_radius + v_up *GRAB_EYE_UP;
  99.     Hand = Eye;
  100.     Hand_z += GRAB_HAND_UP;
  101.    
  102.     if (FALSE) // debug
  103.     {
  104.         particle(Hand, '0 0 0', 1, 10);
  105.         particle(Eye, '0 0 0', 2, 10);     
  106.     }
  107.  
  108.     // eye is inside wall
  109.     traceline(_origin, Eye, TRUE, self);
  110.     if (trace_fraction == 1.0) //
  111.         return FALSE;
  112.  
  113.     // hand is free
  114.     traceline(_origin, Hand, TRUE, self);
  115.     if (trace_fraction != 1.0) {
  116.         return FALSE;
  117.     }
  118.     //bprint(" grab");
  119.     return TRUE;
  120. }
  121.  
  122. float(vector _origin, float _radius, float _n) PlayerCanGrabAround =
  123. {
  124.     local vector v = '0 0 0';
  125.     while(v_y < 360)
  126.     {
  127.         if (PlayerCanGrabOne(_origin, _radius, v))
  128.             return TRUE;
  129.         v_y += 360/_n;
  130.     }
  131.     return FALSE;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement