fr1kin

MadCow AutoWall

Feb 6th, 2012
432
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.71 KB | None | 0 0
  1. // TODO: Fix ILuaObject *dmgMulti so it doesn't crash all the time. For now use the GetDamageModifier function.
  2.  
  3. float GetDamageModifier( int iMaterial )
  4. {
  5. float flDamageModifier = 0.5f;
  6.  
  7. switch( iMaterial )
  8. {
  9. case CHAR_TEX_CONCRETE:
  10. {
  11. flDamageModifier = 0.3f;
  12. break;
  13. }
  14. case CHAR_TEX_PLASTIC:
  15. {
  16. flDamageModifier = 0.8f;
  17. break;
  18. }
  19. case CHAR_TEX_GLASS:
  20. {
  21. flDamageModifier = 0.8f;
  22. break;
  23. }
  24. case CHAR_TEX_FLESH:
  25. {
  26. flDamageModifier = 0.9f;
  27. break;
  28. }
  29. case CHAR_TEX_WOOD:
  30. {
  31. flDamageModifier = 0.8f;
  32. break;
  33. }
  34. case CHAR_TEX_ALIENFLESH:
  35. {
  36. flDamageModifier = 0.9f;
  37. break;
  38. }
  39. case CHAR_TEX_METAL:
  40. {
  41. flDamageModifier = 0.0f;
  42. break;
  43. }
  44. case CHAR_TEX_SAND:
  45. {
  46. flDamageModifier = 0.0f;
  47. break;
  48. }
  49. default:
  50. {
  51. flDamageModifier = 0.5f;
  52. break;
  53. }
  54. }
  55.  
  56. return flDamageModifier;
  57. }
  58.  
  59. bool CanPenitrate( int iPenetration, float flDamage, Vector vStart, Vector vEnd, ILuaObject *dmgMulti )
  60. {
  61. if( !dmgMulti )
  62. return false;
  63.  
  64. Vector vecStart, vecEnd, vecDir, vecLeng, vecDirNormal;
  65. float flLength, flTemp, flDamageMulti;
  66.  
  67. VectorCopy( vStart, vecStart );
  68. VectorCopy( vEnd, vecEnd );
  69.  
  70. VectorSubtract( vEnd, vStart, vecDir );
  71. flLength = VectorLength( vecDir );
  72.  
  73. if( flLength <= 0 )
  74. return false;
  75.  
  76. VectorDivide( vecDir, flLength, vecDirNormal );
  77.  
  78. trace_t tr;
  79. Ray_t ray;
  80.  
  81. int qPenetration = iPenetration;
  82.  
  83. do
  84. {
  85. VectorMA( vecStart, 8.0, vecDirNormal, vecEnd );
  86.  
  87. ray.Init( vecStart, vecEnd );
  88. Interfaces::m_pEngineTrace->TraceRay( ray, MASK_SHOT, NULL, &tr );
  89.  
  90. if( tr.fraction != 1.0f )
  91. {
  92. vecLeng = vecEnd - vStart;
  93. flTemp = VectorLength( vecLeng );
  94.  
  95. if( flTemp >= flLength )
  96. {
  97. if( flDamage > 1 )
  98. return true;
  99. }
  100.  
  101. surfacedata_t *pSurface = Interfaces::m_pPhysicsSurfaceProps->GetSurfaceData( tr.surface.surfaceProps );
  102. flDamageMulti = GetDamageModifier( static_cast< int >( pSurface->game.material ) );
  103.  
  104. flDamage *= flDamageMulti;
  105. qPenetration--;
  106. }
  107. VectorCopy( vecEnd, vecStart );
  108. } while( qPenetration != 0 && flDamage > 0.0f );
  109.  
  110. return false;
  111. }
  112.  
  113. LUA_FUNCTION( lua_CanPenitrate )
  114. {
  115. Interfaces::Lua->CheckType( 1, GLua::TYPE_NUMBER ); // Penetration
  116. Interfaces::Lua->CheckType( 2, GLua::TYPE_VECTOR ); // Start
  117. Interfaces::Lua->CheckType( 3, GLua::TYPE_VECTOR ); // End
  118. Interfaces::Lua->CheckType( 4, GLua::TYPE_NUMBER ); // Damage
  119. Interfaces::Lua->CheckType( 5, GLua::TYPE_TABLE ); // Damage Multiplyer
  120.  
  121. float iPenetration = (float)Interfaces::Lua->GetNumber( 1 );
  122. float flDamage = (float)Interfaces::Lua->GetNumber( 4 );
  123.  
  124. Vector &vStart = *(Vector*)Interfaces::Lua->GetUserData( 2 );
  125. Vector &vEnd = *(Vector*)Interfaces::Lua->GetUserData( 3 );
  126.  
  127. ILuaObject *dmgMulti = Interfaces::Lua->GetObject( 5 );
  128.  
  129. Interfaces::Lua->Push( CanPenitrate( iPenetration, flDamage, vStart, vEnd, dmgMulti ) );
  130. dmgMulti->UnReference();
  131.  
  132. return 1;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment