Advertisement
Guest User

Autowall.cpp

a guest
Aug 27th, 2017
409
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.09 KB | None | 0 0
  1. #include "Cheat.h"
  2.  
  3. CAutowall* AutoWall = new CAutowall;
  4.  
  5. float CAutowall::GetHitgroupDamageMultiplier(int iHitGroup)
  6. {
  7. switch (iHitGroup)
  8. {
  9. case HITGROUP_HEAD:
  10. return 4.0f;
  11. case HITGROUP_CHEST:
  12. case HITGROUP_LEFTARM:
  13. case HITGROUP_RIGHTARM:
  14. return 1.0f;
  15. case HITGROUP_STOMACH:
  16. return 1.25f;
  17. case HITGROUP_LEFTLEG:
  18. case HITGROUP_RIGHTLEG:
  19. return 0.75f;
  20. }
  21. return 1.0f;
  22. }
  23.  
  24. void CAutowall::ScaleDamage(int hitgroup, CBaseEntity* enemy, float weapon_armor_ratio, float& current_damage)
  25. {
  26. current_damage *= GetHitgroupDamageMultiplier(hitgroup);
  27.  
  28. if (enemy->GetArmor() > 0)
  29. {
  30. if (hitgroup == HITGROUP_HEAD)
  31. {
  32. if (enemy->HasHelmet())
  33. current_damage *= weapon_armor_ratio * 0.5f;
  34. }
  35. else
  36. current_damage *= weapon_armor_ratio * 0.5f;
  37. }
  38. }
  39.  
  40. void CAutowall::ClipTraceToPlayers(const Vector& vecAbsStart, const Vector& vecAbsEnd, unsigned int mask, ITraceFilter* filter, trace_t* tr)
  41. {
  42. // https://github.com/ValveSoftware/source-sdk-2013/blob/master/sp/src/game/shared/util_shared.cpp#L687
  43.  
  44. static DWORD ClipTraceToPlayers = U::FindPattern(XorStr("client.dll"), XorStr("53 8B DC 83 EC 08 83 E4 F0 83 C4 04 55 8B 6B 04 89 6C 24 04 8B EC 81 EC ? ? ? ? 8B 43 10"));
  45.  
  46. if (!ClipTraceToPlayers)
  47. return;
  48.  
  49. _asm
  50. {
  51. mov eax, filter
  52. lea ecx, tr
  53. push ecx
  54. push eax
  55. push mask
  56. lea edx, vecAbsEnd
  57. lea ecx, vecAbsStart
  58. call ClipTraceToPlayers
  59. add esp, 0xC
  60. }
  61. }
  62.  
  63. bool CAutowall::IsBreakableEntity(CBaseEntity* ent)
  64. {
  65. // https://github.com/ValveSoftware/source-sdk-2013/blob/master/sp/src/game/shared/obstacle_pushaway.cpp#L104
  66.  
  67. typedef bool(__thiscall* IsBreakbaleEntityFn)(CBaseEntity*);
  68. static IsBreakbaleEntityFn IsBreakableEntity;
  69.  
  70. if (!IsBreakableEntity)
  71. IsBreakableEntity = (IsBreakbaleEntityFn)U::FindPattern(XorStr("client.dll"), XorStr("55 8B EC 51 56 8B F1 85 F6 74 68"));
  72.  
  73. return IsBreakableEntity(ent);
  74. }
  75.  
  76. bool CAutowall::TraceToExit(Vector& end, trace_t* enter_trace, Vector start, Vector dir, trace_t* exit_trace)
  77. {
  78. float distance = 0.0f;
  79.  
  80. while (distance <= 90.0f)
  81. {
  82. distance += 4.0f;
  83. end = start + dir * distance;
  84.  
  85. int point_contents = I::EngineTrace->GetPointContents(end, MASK_SHOT_HULL | CONTENTS_HITBOX, nullptr);
  86. if (point_contents & MASK_SHOT_HULL && !(point_contents & CONTENTS_HITBOX))
  87. continue;
  88.  
  89. Vector new_end = end - (dir * 4.0f);
  90.  
  91. U::TraceLine(end, new_end, MASK_SHOT | CONTENTS_GRATE, nullptr, exit_trace);
  92.  
  93. if (exit_trace->m_pEnt == nullptr)
  94. return false;
  95.  
  96. if (exit_trace->startsolid && exit_trace->surface.flags & SURF_HITBOX)
  97. {
  98. U::TraceLine(end, start, MASK_NPCWORLDSTATIC | CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTER | CONTENTS_WINDOW | CONTENTS_DEBRIS | CONTENTS_HITBOX | CONTENTS_GRATE, exit_trace->m_pEnt, exit_trace);
  99.  
  100. if ((exit_trace->fraction < 1.0f || exit_trace->allsolid) && !exit_trace->startsolid)
  101. {
  102. end = exit_trace->endpos;
  103. return true;
  104. }
  105. continue;
  106. }
  107.  
  108. if (!(exit_trace->fraction < 1.0 || exit_trace->allsolid || exit_trace->startsolid) || exit_trace->startsolid)
  109. {
  110. if (exit_trace->m_pEnt)
  111. {
  112. if ((enter_trace->m_pEnt != nullptr && enter_trace->m_pEnt != I::ClientEntList->GetClientEntity(0)) && IsBreakableEntity(enter_trace->m_pEnt))
  113. return true;
  114. }
  115. continue;
  116. }
  117.  
  118. if (((exit_trace->surface.flags >> 7) & 1) && !((enter_trace->surface.flags >> 7) & 1))
  119. continue;
  120.  
  121. if (exit_trace->plane.normal.Dot(dir) <= 1.0f)
  122. {
  123. float fraction = exit_trace->fraction * 4.0f;
  124. end = end - (dir * fraction);
  125.  
  126. return true;
  127. }
  128. }
  129. return false;
  130. }
  131.  
  132. bool CAutowall::HandleBulletPenetration(WeaponInfo_t* wpn_data, FireBulletData& data)
  133. {
  134. surfacedata_t* enter_surface_data = I::PhysProps->GetSurfaceData(data.enter_trace.surface.surfaceProps);
  135. int enter_material = enter_surface_data->game.material;
  136. float enter_surf_penetration_mod = *(float*)((DWORD)enter_surface_data + 76);
  137.  
  138. data.trace_length += data.enter_trace.fraction * data.trace_length_remaining;
  139. data.current_damage *= pow(wpn_data->flRangeModifier, data.trace_length * 0.002); // data.current_damage *= pow(wpn_data->m_flRangeModifier, data.trace_length * 0.002);
  140.  
  141. if (data.trace_length > 3000.f || enter_surf_penetration_mod < 0.1f)
  142. data.penetrate_count = 0;
  143.  
  144. if (data.penetrate_count <= 0)
  145. return false;
  146.  
  147. Vector dummy;
  148. trace_t trace_exit;
  149.  
  150. if (!TraceToExit(dummy, &data.enter_trace, data.enter_trace.endpos, data.direction, &trace_exit))
  151. return false;
  152.  
  153. surfacedata_t* exit_surface_data = I::PhysProps->GetSurfaceData(trace_exit.surface.surfaceProps);
  154. int exit_material = exit_surface_data->game.material;
  155.  
  156. float exit_surf_penetration_mod = *(float*)((DWORD)exit_surface_data + 76);
  157. float final_damage_modifier = 0.16f;
  158. float combined_penetration_modifier = 0.0f;
  159.  
  160. if ((data.enter_trace.contents & CONTENTS_GRATE /*| CONTENTS_WINDOW*/) != 0 || enter_material == 89 || enter_material == 71) //this shit really awesome
  161. {
  162. combined_penetration_modifier = 3.0f;
  163. final_damage_modifier = 0.05f;
  164. }
  165. else
  166. combined_penetration_modifier = (enter_surf_penetration_mod + exit_surf_penetration_mod) * 0.5f;
  167.  
  168. if (enter_material == exit_material)
  169. {
  170. if (exit_material == 87 || exit_material == 85)
  171. combined_penetration_modifier = 3.0f;
  172. else if (exit_material == 76)
  173. combined_penetration_modifier = 2.0f;
  174. }
  175.  
  176. float v34 = fmaxf(0.f, 1.0f / combined_penetration_modifier);
  177. float v35 = (data.current_damage * final_damage_modifier) + v34 * 3.0f * fmaxf(0.0f, (3.0f / wpn_data->flPenetration) * 1.25f); // float v35 = (data.current_damage * final_damage_modifier) + v34 * 3.0f * fmaxf(0.0f, (3.0f / wpn_data->m_flPenetration) * 1.25f);
  178. float thickness = (trace_exit.endpos - data.enter_trace.endpos).Length();
  179.  
  180. thickness *= thickness;
  181. thickness *= v34;
  182. thickness /= 24.0f;
  183.  
  184. float lost_damage = fmaxf(0.0f, v35 + thickness);
  185.  
  186. if (lost_damage > data.current_damage)
  187. return false;
  188.  
  189. if (lost_damage >= 0.0f)
  190. data.current_damage -= lost_damage;
  191.  
  192. if (data.current_damage < 1.0f)
  193. return false;
  194.  
  195. data.src = trace_exit.endpos;
  196. data.penetrate_count--;
  197.  
  198. return true;
  199. }
  200.  
  201. bool CAutowall::SimulateFireBullet(CBaseCombatWeapon* pWeapon, FireBulletData& data)
  202. {
  203. data.penetrate_count = 4;
  204. data.trace_length = 0.0f;
  205. WeaponInfo_t* weaponData = G::LocalPlayer->GetWeapon()->GetCSWpnData();
  206.  
  207. if (weaponData == NULL)
  208. return false;
  209.  
  210. data.current_damage = (float)weaponData->iDamage; // m_iDamage
  211.  
  212. while (data.penetrate_count > 0 && data.current_damage >= 1.0f)
  213. {
  214. data.trace_length_remaining = weaponData->flRange - data.trace_length; //m_flRange
  215.  
  216. Vector end = data.src + data.direction * data.trace_length_remaining;
  217.  
  218. U::TraceLine(data.src, end, MASK_SHOT | CONTENTS_GRATE, G::LocalPlayer, &data.enter_trace);
  219. ClipTraceToPlayers(data.src, end + data.direction * 40.f, MASK_SHOT | CONTENTS_GRATE, &data.filter, &data.enter_trace);
  220.  
  221. if (data.enter_trace.fraction == 1.0f)
  222. break;
  223.  
  224. if (data.enter_trace.hitgroup <= HITGROUP_RIGHTLEG && data.enter_trace.hitgroup > HITGROUP_GENERIC)
  225. {
  226. data.trace_length += data.enter_trace.fraction * data.trace_length_remaining;
  227. data.current_damage *= pow(weaponData->flRangeModifier, data.trace_length * 0.002); //m_flRangeModifier
  228.  
  229. if (!Vars.Ragebot.FriendlyFire && data.enter_trace.m_pEnt->GetTeam() == G::LocalPlayer->GetTeam())
  230. return false;
  231.  
  232. ScaleDamage(data.enter_trace.hitgroup, data.enter_trace.m_pEnt, weaponData->flArmorRatio, data.current_damage); //m_flArmorRatio
  233.  
  234. return true;
  235. }
  236.  
  237. if (!HandleBulletPenetration(weaponData, data))
  238. break;
  239. }
  240.  
  241. return false;
  242. }
  243.  
  244. float CAutowall::GetDamage(const Vector& point)
  245. {
  246. float damage = 0.f;
  247. Vector dst = point;
  248. FireBulletData data;
  249. data.src = G::LocalPlayer->GetEyePosition();
  250. data.filter.pSkip = G::LocalPlayer;
  251.  
  252. QAngle angles = M::CalcAngle(data.src, dst);
  253. M::AngleVectors(angles, &data.direction);
  254. Vector dataNormalized;
  255.  
  256. data.direction.Normalize();
  257.  
  258. CBaseCombatWeapon* weapon = G::LocalPlayer->GetWeapon();
  259. if (!weapon)
  260. return -1.0f;
  261.  
  262. if (SimulateFireBullet(weapon, data))
  263. damage = data.current_damage;
  264.  
  265. return damage;
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement