ph0ne

NEOTOKYO autowall [2013]

Oct 19th, 2015
481
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.47 KB | None | 0 0
  1. //=========================================================
  2. #include "stdafx.h"
  3. //=========================================================
  4. /*
  5.     ladies and gentlemen, may I present to you the WORST
  6.     bullet penetration code I have ever seen in a game.
  7.  
  8.     credits to tatsur0, his team of disabled people,
  9.     and his dead dad. none of this would be possible otherwise.
  10. */
  11. //=========================================================
  12. void __stdcall UTIL_TraceLine ( vec3_t& src, vec3_t& dest, int mask, base_entity* ignore, int group, trace_t* tr )
  13. {
  14.     CRay ray;
  15.    
  16.     dword filter[3];
  17.    
  18.     if ( !tr )
  19.         return;
  20.    
  21.     ray.Init ( src, dest );
  22.     hook->CTraceFilterSimple ( filter, ignore, group );
  23.     enginetrace->TraceRay ( ray, mask, (ITraceFilter*)&filter, tr );
  24. }
  25. //=========================================================
  26. float __stdcall NT_GetDensityFromMaterial ( int props )
  27. {
  28.     surfacedata_t* data = surfaceprops->GetSurfaceData ( props );
  29.    
  30.     if ( !data )
  31.         return 0.0f;
  32.  
  33.     switch ( data->material ) {
  34.     case 0x43:
  35.         return 0.3f;
  36.     case 0x4D:
  37.     case 0x50:
  38.     case 0x54:
  39.         return 0.5f;
  40.     case 0x47:
  41.     case 0x56:
  42.     case 0x57:
  43.         return 0.75f;
  44.     case 0x44:
  45.     case 0x4E:
  46.         return 0.2f;
  47.     case 0x59:
  48.         return 0.9f;
  49.     case 0x4C:
  50.     case 0x4F:
  51.         return 0.8f;
  52.     case 0x46:
  53.         return 0.6f;
  54.     default:
  55.         return 1.0f;
  56.     }
  57. }
  58. //=========================================================
  59. bool __stdcall NT_PathFree ( vec3_t& dest, int target, bool ignore )
  60. {
  61.     int i;
  62.    
  63.     trace_t tr;
  64.    
  65.     vec3_t start, end, dir, hit, penetrationExit;
  66.    
  67.     float fLength, fPower, fDensity, tmpLen;
  68.    
  69.     // this is the only FileWeaponInfo_t member we nead.
  70.     fPower = cl.wpnInfo.fPenetration;
  71.    
  72.     // setup vectors.
  73.     VectorCopy ( cl.eyepos, start );
  74.     VectorSubtract ( (float*)dest, start, dir );
  75.    
  76.     // distance to target.
  77.     fLength = VectorNormalize ( dir );
  78.    
  79.     // iterate each surface.
  80.     for ( i = 0; i < 9; i++ )
  81.     {
  82.         // extend this trace by max range (why aren't they iteratively reducing the range?)
  83.         VectorMA ( start, dir, WEAPON_MAX_RANGE, end );
  84.    
  85.         // trace forward from our (current) start position.
  86.         UTIL_TraceLine ( start, end, 0x4600400B, cl.player, 0, &tr );
  87.         VectorCopy ( tr.endpos, hit );
  88.  
  89.         // check if we've reached our desired endpoint.
  90.         if ( ignore ) {
  91.             if ( VectorDistance ( cl.eyepos, hit ) >= fLength )
  92.                 return true;       
  93.         }
  94.        
  95.         if ( tr.pEnt ) {
  96.             // check if we reached our target.
  97.             if ( target != -1 ) {
  98.                 if ( tr.pEnt->GetClientNetworkable()->entindex() == target )
  99.                     return true;
  100.             } else {
  101.                 if ( !ignore && CL_IsValidTarget ( tr.pEnt ) )
  102.                     return true;
  103.             }
  104.             // can't shoot through players.
  105.             if ( tr.pEnt->IsPlayer() )
  106.                 break;
  107.         }
  108.        
  109.         // trace didn't hit anything, give up.
  110.         if ( (tr.fraction == 1.0f) || !CVAR( AIM_AUTOWALL ) )
  111.             break;
  112.        
  113.         // assume we've hit a wall; try to penetrate it.       
  114.         fDensity = NT_GetDensityFromMaterial ( tr.surfaceProps );
  115.         VectorMA ( hit, dir, min(fPower * fDensity, 12.0f), penetrationExit );
  116.         UTIL_TraceLine ( penetrationExit, hit, 0x4600400B, cl.player, 0, &tr );
  117.        
  118.         // this is really dumb, why isn't Studio Radi-8 checking startsolid?
  119.         if ( tr.fraction == 1.0f )
  120.             break;
  121.        
  122.         // is the surface too thick?
  123.         tmpLen = VectorDistance ( hit, tr.endpos );
  124.         fPower -= tmpLen / fDensity;       
  125.         if ( fPower <= 0.0f )
  126.             break;
  127.        
  128.         // copy the other side of the wall to our starting position.
  129.         VectorCopy ( tr.endpos, start );       
  130.     }
  131.    
  132.     return false;
  133. }
  134. //=========================================================
Advertisement
Add Comment
Please, Sign In to add comment