Guest User

Untitled

a guest
Oct 29th, 2017
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.83 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 0.5f;
  32. case HITGROUP_HEAD:
  33. return 2.0f;
  34. case HITGROUP_CHEST:
  35. return 0.5f;
  36. case HITGROUP_STOMACH:
  37. return 0.75f;
  38. case HITGROUP_LEFTARM:
  39. return 0.5f;
  40. case HITGROUP_RIGHTARM:
  41. return 0.5f;
  42. case HITGROUP_LEFTLEG:
  43. return 0.375f;
  44. case HITGROUP_RIGHTLEG:
  45. return 0.375f;
  46. case HITGROUP_GEAR:
  47. return 0.5f;
  48. default:
  49. return 1.0f;
  50.  
  51. }
  52.  
  53. return 1.0f;
  54. }
  55.  
  56. void ScaleDamage(int hitgroup, IClientEntity *enemy, float weapon_armor_ratio, float &current_damage)
  57. {
  58. current_damage *= GetHitgroupDamageMult(hitgroup);
  59.  
  60. if (enemy->ArmorValue() > 0)
  61. {
  62. if (hitgroup == HITGROUP_HEAD)
  63. {
  64. if (enemy->HasHelmet())
  65. current_damage *= (weapon_armor_ratio);
  66. }
  67. else
  68. {
  69. current_damage *= (weapon_armor_ratio);
  70. }
  71. }
  72. }
  73.  
  74. bool SimulateFireBullet(IClientEntity *local, CBaseCombatWeapon *weapon, FireBulletData &data)
  75. {
  76. data.penetrate_count = 4; // Max Amount Of Penitration
  77. data.trace_length = 0.0f; // wow what a meme
  78. auto *wpn_data = weapon->GetCSWpnData(); // Get Weapon Info
  79. data.current_damage = (float)wpn_data->m_iDamage;// Set Damage Memes
  80. while ((data.penetrate_count > 0) && (data.current_damage >= 1.0f))
  81. {
  82. data.trace_length_remaining = wpn_data->m_flRange - data.trace_length;
  83. Vector End_Point = data.src + data.direction * data.trace_length_remaining;
  84. UTIL_TraceLine(data.src, End_Point, 0x4600400B, local, 0, &data.enter_trace);
  85. UTIL_ClipTraceToPlayers(data.src, End_Point * 40.f, 0x4600400B, &data.filter, &data.enter_trace);
  86. if (data.enter_trace.fraction == 1.0f) break;
  87. if ((data.enter_trace.hitgroup <= 7) && (data.enter_trace.hitgroup > 0) && (local->GetTeamNum() != data.enter_trace.m_pEnt->GetTeamNum()))
  88. {
  89. data.trace_length += data.enter_trace.fraction * data.trace_length_remaining;
  90. data.current_damage *= pow(wpn_data->m_flRangeModifier, data.trace_length * 0.002);
  91. ScaleDamage(data.enter_trace.hitgroup, data.enter_trace.m_pEnt, wpn_data->m_flArmorRatio, data.current_damage);
  92. return true;
  93. }
  94. if (!HandleBulletPenetration(wpn_data, data)) break;
  95. }
  96. return false;
  97. }
  98.  
  99. bool HandleBulletPenetration(CSWeaponInfo *wpn_data, FireBulletData &data)
  100. {
  101. surfacedata_t *enter_surface_data = Interfaces::PhysProps->GetSurfaceData(data.enter_trace.surface.surfaceProps);
  102. int enter_material = enter_surface_data->game.material;
  103. float enter_surf_penetration_mod = enter_surface_data->game.flPenetrationModifier;
  104. data.trace_length += data.enter_trace.fraction * data.trace_length_remaining;
  105. data.current_damage *= pow(wpn_data->m_flRangeModifier, (data.trace_length * 0.002));
  106. if ((data.trace_length > 3000.f) || (enter_surf_penetration_mod < 0.1f))data.penetrate_count = 0;
  107. if (data.penetrate_count <= 0)return false;
  108. Vector dummy;
  109. trace_t trace_exit;
  110. if (!TraceToExit(dummy, data.enter_trace, data.enter_trace.endpos, data.direction, &trace_exit)) return false;
  111. surfacedata_t *exit_surface_data = Interfaces::PhysProps->GetSurfaceData(trace_exit.surface.surfaceProps);
  112. int exit_material = exit_surface_data->game.material;
  113. float exit_surf_penetration_mod = exit_surface_data->game.flPenetrationModifier;
  114. float final_damage_modifier = 0.16f;
  115. float combined_penetration_modifier = 0.0f;
  116. if (((data.enter_trace.contents & CONTENTS_GRATE) != 0) || (enter_material == 89) || (enter_material == 71)) { combined_penetration_modifier = 3.0f; final_damage_modifier = 0.05f; }
  117. else { combined_penetration_modifier = (enter_surf_penetration_mod + exit_surf_penetration_mod) * 0.5f; }
  118. if (enter_material == exit_material)
  119. {
  120. if (exit_material == 87 || exit_material == 85)combined_penetration_modifier = 3.0f;
  121. else if (exit_material == 76)combined_penetration_modifier = 2.0f;
  122. }
  123. float v34 = fmaxf(0.f, 1.0f / combined_penetration_modifier);
  124. float v35 = (data.current_damage * final_damage_modifier) + v34 * 3.0f * fmaxf(0.0f, (3.0f / wpn_data->m_flPenetration) * 1.25f);
  125. float thickness = VectorLength(trace_exit.endpos - data.enter_trace.endpos);
  126. thickness *= thickness;
  127. thickness *= v34;
  128. thickness /= 24.0f;
  129. float lost_damage = fmaxf(0.0f, v35 + thickness);
  130. if (lost_damage > data.current_damage)return false;
  131. if (lost_damage >= 0.0f)data.current_damage -= lost_damage;
  132. if (data.current_damage < 1.0f) return false;
  133. data.src = trace_exit.endpos;
  134. data.penetrate_count--;
  135.  
  136. return true;
  137. }
  138.  
  139.  
  140. /*
  141. * CanHit() - example of how to use the code
  142. * @in point: target hitbox vector
  143. * @out damage_given: amount of damage the shot would do
  144. */
  145. bool CanHit(const Vector &point, float *damage_given)
  146. {
  147. //Utils::ToLog("CANHIT");
  148. auto *local = Interfaces::EntList->GetClientEntity(Interfaces::Engine->GetLocalPlayer());
  149. auto data = FireBulletData(local->GetOrigin() + local->GetViewOffset());
  150. data.filter = CTraceFilter();
  151. data.filter.pSkip = local;
  152.  
  153. Vector angles;
  154. CalcAngle(data.src, point, angles);
  155. AngleVectors(angles, &data.direction);
  156. VectorNormalize(data.direction);
  157.  
  158. if (SimulateFireBullet(local, (CBaseCombatWeapon*)Interfaces::EntList->GetClientEntityFromHandle((HANDLE)local->GetActiveWeaponHandle()), data))
  159. {
  160. *damage_given = data.current_damage;
  161. //Utils::ToLog("CANHIT END");
  162. return true;
  163. }
  164.  
  165. return false;
  166. }
Add Comment
Please, Sign In to add comment