Guest User

autowall.cpp

a guest
Jan 23rd, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.87 KB | None | 0 0
  1. #include "AutoWall.h"
  2. //#include "R.h"
  3.  
  4. #define HITGROUP_GENERIC 0
  5. #define HITGROUP_HEAD 1
  6. #define HITGROUP_CHEST 2
  7. #define HITGROUP_STOMACH 3
  8. #define HITGROUP_LEFTARM 4
  9. #define HITGROUP_RIGHTARM 5
  10. #define HITGROUP_LEFTLEG 6
  11. #define HITGROUP_RIGHTLEG 7
  12. #define HITGROUP_GEAR 10
  13.  
  14. inline bool CGameTrace::DidHitWorld() const
  15. {
  16. return m_pEnt->GetIndex() == 0;
  17. }
  18.  
  19. inline bool CGameTrace::DidHitNonWorldEntity() const
  20. {
  21. return m_pEnt != NULL && !DidHitWorld();
  22. }
  23.  
  24. bool HandleBulletPenetration(CSWeaponInfo *wpn_data, FireBulletData &data);
  25.  
  26. float GetHitgroupDamageMult(int iHitGroup)
  27. {
  28. switch (iHitGroup)
  29. {
  30. case HITGROUP_GENERIC:
  31. return 1.0f;
  32.  
  33. case HITGROUP_HEAD:
  34. return 2.0f;
  35.  
  36. case HITGROUP_CHEST:
  37. return 1.0f;
  38.  
  39. case HITGROUP_STOMACH:
  40. return 1.0f;
  41.  
  42. case HITGROUP_LEFTARM:
  43. case HITGROUP_RIGHTARM:
  44. return 1.0f;
  45.  
  46. case HITGROUP_LEFTLEG:
  47. case HITGROUP_RIGHTLEG:
  48. return 1.0f;
  49.  
  50. default:
  51. return 1.0f;
  52. }
  53. }
  54.  
  55. void ScaleDamage(int hitgroup, IClientEntity *enemy, float weapon_armor_ratio, float &current_damage)
  56. {
  57. current_damage *= GetHitgroupDamageMult(hitgroup);
  58.  
  59. if (enemy->ArmorValue() > 0)
  60. {
  61. if (hitgroup == HITGROUP_HEAD)
  62. {
  63. if (enemy->HasHelmet())
  64. current_damage *= (weapon_armor_ratio * .5f);
  65. }
  66. else
  67. {
  68. current_damage *= (weapon_armor_ratio * .5f);
  69. }
  70. }
  71. }
  72.  
  73. bool SimulateFireBullet(IClientEntity *local, CBaseCombatWeapon *weapon, FireBulletData &data)
  74. {
  75. //Utils::ToLog("SimulateFireBullet");
  76. data.penetrate_count = 4;
  77. data.trace_length = 0.0f;
  78. auto *wpn_data = weapon->GetCSWpnData();
  79.  
  80. data.current_damage = (float)wpn_data->m_iDamage;
  81.  
  82. while ((data.penetrate_count > 0) && (data.current_damage >= 1.0f))
  83. {
  84. data.trace_length_remaining = wpn_data->m_flRange - data.trace_length;
  85.  
  86. Vector end = data.src + data.direction * data.trace_length_remaining;
  87.  
  88. UTIL_TraceLine(data.src, end, 0x4600400B, local, 0, &data.enter_trace);
  89. UTIL_ClipTraceToPlayers(data.src, end + data.direction * 40.f, 0x4600400B, &data.filter, &data.enter_trace);
  90.  
  91. if (data.enter_trace.fraction == 1.0f)
  92. break;
  93.  
  94. if ((data.enter_trace.hitgroup <= 7)
  95. && (data.enter_trace.hitgroup > 0)
  96. && (local->GetTeamNum() != data.enter_trace.m_pEnt->GetTeamNum())
  97. /*&& (DoesRayTouchHitbox(end, &data))*/)
  98. {
  99. data.trace_length += data.enter_trace.fraction * data.trace_length_remaining;
  100. data.current_damage *= pow(wpn_data->m_flRangeModifier, data.trace_length * 0.002);
  101. ScaleDamage(data.enter_trace.hitgroup, data.enter_trace.m_pEnt, wpn_data->m_flArmorRatio, data.current_damage);
  102.  
  103. return true;
  104. }
  105.  
  106. if (!HandleBulletPenetration(wpn_data, data))
  107. break;
  108. }
  109.  
  110. return false;
  111. }
  112.  
  113. bool HandleBulletPenetration(CSWeaponInfo *wpn_data, FireBulletData &data)
  114. {
  115. surfacedata_t *enter_surface_data = Interfaces::PhysProps->GetSurfaceData(data.enter_trace.surface.surfaceProps);
  116. int enter_material = enter_surface_data->game.material;
  117. float enter_surf_penetration_mod = enter_surface_data->game.flPenetrationModifier;
  118.  
  119.  
  120. data.trace_length += data.enter_trace.fraction * data.trace_length_remaining;
  121. data.current_damage *= pow(wpn_data->m_flRangeModifier, (data.trace_length * 0.002));
  122.  
  123. if ((data.trace_length > 3000.f) || (enter_surf_penetration_mod < 0.1f))
  124. data.penetrate_count = 0;
  125.  
  126. if (data.penetrate_count <= 0)
  127. return false;
  128.  
  129. Vector dummy;
  130. trace_t trace_exit;
  131. if (!TraceToExit(dummy, data.enter_trace, data.enter_trace.endpos, data.direction, &trace_exit))
  132. return false;
  133.  
  134. surfacedata_t *exit_surface_data = Interfaces::PhysProps->GetSurfaceData(trace_exit.surface.surfaceProps);
  135. int exit_material = exit_surface_data->game.material;
  136.  
  137. float exit_surf_penetration_mod = exit_surface_data->game.flPenetrationModifier;
  138. float final_damage_modifier = 0.16f;
  139. float combined_penetration_modifier = 0.0f;
  140.  
  141. if (((data.enter_trace.contents & CONTENTS_GRATE) != 0) || (enter_material == 89) || (enter_material == 71))
  142. {
  143. combined_penetration_modifier = 3.0f;
  144. final_damage_modifier = 0.05f;
  145. }
  146. else
  147. {
  148. combined_penetration_modifier = (enter_surf_penetration_mod + exit_surf_penetration_mod) * 0.5f;
  149. }
  150.  
  151. if (enter_material == exit_material)
  152. {
  153. if (exit_material == 87 || exit_material == 85)
  154. combined_penetration_modifier = 3.0f;
  155. else if (exit_material == 76)
  156. combined_penetration_modifier = 2.0f;
  157. }
  158.  
  159. float v34 = fmaxf(0.f, 1.0f / combined_penetration_modifier);
  160. float v35 = (data.current_damage * final_damage_modifier) + v34 * 3.0f * fmaxf(0.0f, (3.0f / wpn_data->m_flPenetration) * 1.25f);
  161. float thickness = VectorLength(trace_exit.endpos - data.enter_trace.endpos);
  162.  
  163. thickness *= thickness;
  164. thickness *= v34;
  165. thickness /= 24.0f;
  166.  
  167.  
  168. float lost_damage = fmaxf(0.0f, v35 + thickness);
  169.  
  170. if (lost_damage > data.current_damage)
  171. return false;
  172.  
  173. if (lost_damage >= 0.0f)
  174. data.current_damage -= lost_damage;
  175.  
  176. if (data.current_damage < 1.0f)
  177. return false;
  178.  
  179. data.src = trace_exit.endpos;
  180. data.penetrate_count--;
  181.  
  182. return true;
  183. }
  184.  
  185.  
  186. /*
  187. * CanHit() - example of how to use the code
  188. * @in point: target hitbox vector
  189. * @out damage_given: amount of damage the shot would do
  190. */
  191. bool CanHit(const Vector &point, float *damage_given)
  192. {
  193. //Utils::ToLog("CANHIT");
  194. auto *local = Interfaces::EntList->GetClientEntity(Interfaces::Engine->GetLocalPlayer());
  195. auto data = FireBulletData(local->GetOrigin() + local->GetViewOffset());
  196. data.filter = CTraceFilter();
  197. data.filter.pSkip = local;
  198.  
  199. Vector angles;
  200. CalcAngle(data.src, point, angles);
  201. AngleVectors(angles, &data.direction);
  202. VectorNormalize(data.direction);
  203.  
  204. if (SimulateFireBullet(local, (CBaseCombatWeapon*)Interfaces::EntList->GetClientEntityFromHandle((HANDLE)local->GetActiveWeaponHandle()), data))
  205. {
  206. *damage_given = data.current_damage;
  207. //Utils::ToLog("CANHIT END");
  208. return true;
  209. }
  210.  
  211. return false;
  212. }
Add Comment
Please, Sign In to add comment