Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Cheat.h"
- CAutowall* AutoWall = new CAutowall;
- float CAutowall::GetHitgroupDamageMultiplier(int iHitGroup)
- {
- switch (iHitGroup)
- {
- case HITGROUP_HEAD:
- return 4.0f;
- case HITGROUP_CHEST:
- case HITGROUP_LEFTARM:
- case HITGROUP_RIGHTARM:
- return 1.0f;
- case HITGROUP_STOMACH:
- return 1.25f;
- case HITGROUP_LEFTLEG:
- case HITGROUP_RIGHTLEG:
- return 0.75f;
- }
- return 1.0f;
- }
- void CAutowall::ScaleDamage(int hitgroup, CBaseEntity* enemy, float weapon_armor_ratio, float& current_damage)
- {
- current_damage *= GetHitgroupDamageMultiplier(hitgroup);
- if (enemy->GetArmor() > 0)
- {
- if (hitgroup == HITGROUP_HEAD)
- {
- if (enemy->HasHelmet())
- current_damage *= weapon_armor_ratio * 0.5f;
- }
- else
- current_damage *= weapon_armor_ratio * 0.5f;
- }
- }
- void CAutowall::ClipTraceToPlayers(const Vector& vecAbsStart, const Vector& vecAbsEnd, unsigned int mask, ITraceFilter* filter, trace_t* tr)
- {
- // https://github.com/ValveSoftware/source-sdk-2013/blob/master/sp/src/game/shared/util_shared.cpp#L687
- 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"));
- if (!ClipTraceToPlayers)
- return;
- _asm
- {
- mov eax, filter
- lea ecx, tr
- push ecx
- push eax
- push mask
- lea edx, vecAbsEnd
- lea ecx, vecAbsStart
- call ClipTraceToPlayers
- add esp, 0xC
- }
- }
- bool CAutowall::IsBreakableEntity(CBaseEntity* ent)
- {
- // https://github.com/ValveSoftware/source-sdk-2013/blob/master/sp/src/game/shared/obstacle_pushaway.cpp#L104
- typedef bool(__thiscall* IsBreakbaleEntityFn)(CBaseEntity*);
- static IsBreakbaleEntityFn IsBreakableEntity;
- if (!IsBreakableEntity)
- IsBreakableEntity = (IsBreakbaleEntityFn)U::FindPattern(XorStr("client.dll"), XorStr("55 8B EC 51 56 8B F1 85 F6 74 68"));
- return IsBreakableEntity(ent);
- }
- bool CAutowall::TraceToExit(Vector& end, trace_t* enter_trace, Vector start, Vector dir, trace_t* exit_trace)
- {
- float distance = 0.0f;
- while (distance <= 90.0f)
- {
- distance += 4.0f;
- end = start + dir * distance;
- int point_contents = I::EngineTrace->GetPointContents(end, MASK_SHOT_HULL | CONTENTS_HITBOX, nullptr);
- if (point_contents & MASK_SHOT_HULL && !(point_contents & CONTENTS_HITBOX))
- continue;
- Vector new_end = end - (dir * 4.0f);
- U::TraceLine(end, new_end, MASK_SHOT | CONTENTS_GRATE, nullptr, exit_trace);
- if (exit_trace->m_pEnt == nullptr)
- return false;
- if (exit_trace->startsolid && exit_trace->surface.flags & SURF_HITBOX)
- {
- 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);
- if ((exit_trace->fraction < 1.0f || exit_trace->allsolid) && !exit_trace->startsolid)
- {
- end = exit_trace->endpos;
- return true;
- }
- continue;
- }
- if (!(exit_trace->fraction < 1.0 || exit_trace->allsolid || exit_trace->startsolid) || exit_trace->startsolid)
- {
- if (exit_trace->m_pEnt)
- {
- if ((enter_trace->m_pEnt != nullptr && enter_trace->m_pEnt != I::ClientEntList->GetClientEntity(0)) && IsBreakableEntity(enter_trace->m_pEnt))
- return true;
- }
- continue;
- }
- if (((exit_trace->surface.flags >> 7) & 1) && !((enter_trace->surface.flags >> 7) & 1))
- continue;
- if (exit_trace->plane.normal.Dot(dir) <= 1.0f)
- {
- float fraction = exit_trace->fraction * 4.0f;
- end = end - (dir * fraction);
- return true;
- }
- }
- return false;
- }
- bool CAutowall::HandleBulletPenetration(WeaponInfo_t* wpn_data, FireBulletData& data)
- {
- surfacedata_t* enter_surface_data = I::PhysProps->GetSurfaceData(data.enter_trace.surface.surfaceProps);
- int enter_material = enter_surface_data->game.material;
- float enter_surf_penetration_mod = *(float*)((DWORD)enter_surface_data + 76);
- data.trace_length += data.enter_trace.fraction * data.trace_length_remaining;
- 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);
- if (data.trace_length > 3000.f || enter_surf_penetration_mod < 0.1f)
- data.penetrate_count = 0;
- if (data.penetrate_count <= 0)
- return false;
- Vector dummy;
- trace_t trace_exit;
- if (!TraceToExit(dummy, &data.enter_trace, data.enter_trace.endpos, data.direction, &trace_exit))
- return false;
- surfacedata_t* exit_surface_data = I::PhysProps->GetSurfaceData(trace_exit.surface.surfaceProps);
- int exit_material = exit_surface_data->game.material;
- float exit_surf_penetration_mod = *(float*)((DWORD)exit_surface_data + 76);
- float final_damage_modifier = 0.16f;
- float combined_penetration_modifier = 0.0f;
- if ((data.enter_trace.contents & CONTENTS_GRATE /*| CONTENTS_WINDOW*/) != 0 || enter_material == 89 || enter_material == 71) //this shit really awesome
- {
- combined_penetration_modifier = 3.0f;
- final_damage_modifier = 0.05f;
- }
- else
- combined_penetration_modifier = (enter_surf_penetration_mod + exit_surf_penetration_mod) * 0.5f;
- if (enter_material == exit_material)
- {
- if (exit_material == 87 || exit_material == 85)
- combined_penetration_modifier = 3.0f;
- else if (exit_material == 76)
- combined_penetration_modifier = 2.0f;
- }
- float v34 = fmaxf(0.f, 1.0f / combined_penetration_modifier);
- 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);
- float thickness = (trace_exit.endpos - data.enter_trace.endpos).Length();
- thickness *= thickness;
- thickness *= v34;
- thickness /= 24.0f;
- float lost_damage = fmaxf(0.0f, v35 + thickness);
- if (lost_damage > data.current_damage)
- return false;
- if (lost_damage >= 0.0f)
- data.current_damage -= lost_damage;
- if (data.current_damage < 1.0f)
- return false;
- data.src = trace_exit.endpos;
- data.penetrate_count--;
- return true;
- }
- bool CAutowall::SimulateFireBullet(CBaseCombatWeapon* pWeapon, FireBulletData& data)
- {
- data.penetrate_count = 4;
- data.trace_length = 0.0f;
- WeaponInfo_t* weaponData = G::LocalPlayer->GetWeapon()->GetCSWpnData();
- if (weaponData == NULL)
- return false;
- data.current_damage = (float)weaponData->iDamage; // m_iDamage
- while (data.penetrate_count > 0 && data.current_damage >= 1.0f)
- {
- data.trace_length_remaining = weaponData->flRange - data.trace_length; //m_flRange
- Vector end = data.src + data.direction * data.trace_length_remaining;
- U::TraceLine(data.src, end, MASK_SHOT | CONTENTS_GRATE, G::LocalPlayer, &data.enter_trace);
- ClipTraceToPlayers(data.src, end + data.direction * 40.f, MASK_SHOT | CONTENTS_GRATE, &data.filter, &data.enter_trace);
- if (data.enter_trace.fraction == 1.0f)
- break;
- if (data.enter_trace.hitgroup <= HITGROUP_RIGHTLEG && data.enter_trace.hitgroup > HITGROUP_GENERIC)
- {
- data.trace_length += data.enter_trace.fraction * data.trace_length_remaining;
- data.current_damage *= pow(weaponData->flRangeModifier, data.trace_length * 0.002); //m_flRangeModifier
- if (!Vars.Ragebot.FriendlyFire && data.enter_trace.m_pEnt->GetTeam() == G::LocalPlayer->GetTeam())
- return false;
- ScaleDamage(data.enter_trace.hitgroup, data.enter_trace.m_pEnt, weaponData->flArmorRatio, data.current_damage); //m_flArmorRatio
- return true;
- }
- if (!HandleBulletPenetration(weaponData, data))
- break;
- }
- return false;
- }
- float CAutowall::GetDamage(const Vector& point)
- {
- float damage = 0.f;
- Vector dst = point;
- FireBulletData data;
- data.src = G::LocalPlayer->GetEyePosition();
- data.filter.pSkip = G::LocalPlayer;
- QAngle angles = M::CalcAngle(data.src, dst);
- M::AngleVectors(angles, &data.direction);
- Vector dataNormalized;
- data.direction.Normalize();
- CBaseCombatWeapon* weapon = G::LocalPlayer->GetWeapon();
- if (!weapon)
- return -1.0f;
- if (SimulateFireBullet(weapon, data))
- damage = data.current_damage;
- return damage;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement