Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.51 KB | None | 0 0
  1. #include "AutoWall.h"
  2. #include "Rage.h"
  3. #include "helpers\math.hpp"
  4.  
  5. #define CHAR_TEXT_WOOD 87
  6. #define CHAT_TEXT_GLASS 2
  7. #define CHAT_TEXT_METAL 60
  8.  
  9. #define HITGROUP_GENERIC 0
  10. #define HITGROUP_HEAD 1
  11. #define HITGROUP_CHEST 2
  12. #define HITGROUP_STOMACH 3
  13. #define HITGROUP_LEFTARM 4
  14. #define HITGROUP_RIGHTARM 5
  15. #define HITGROUP_LEFTLEG 6
  16. #define HITGROUP_RIGHTLEG 7
  17. #define HITGROUP_GEAR 10 // alerts NPC, but doesn't do damage or bleed (1/100th damage)
  18.  
  19.  
  20.  
  21. bool C_AutoWall::TraceDidHitWorld(trace_t* pTrace)
  22. {
  23. return(pTrace->hit_entity == g_EntityList->GetClientEntity(0));
  24. }
  25. bool C_AutoWall::TraceDidHitNonWorldEntity(trace_t* pTrace)
  26. {
  27. if (!pTrace)
  28. return false;
  29.  
  30. if (pTrace->hit_entity == NULL)
  31. return false;
  32.  
  33. if (TraceDidHitWorld(pTrace))
  34. return false;
  35.  
  36. return true;
  37. }
  38.  
  39. float VectorLength(Vector v)
  40. {
  41. return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
  42. }
  43.  
  44. bool C_AutoWall::HandleBulletPenetration(C_BaseCombatWeapon *wpn_data, FireBulletData& data)
  45. {
  46. CCSWeaponInfo* pWeaponInfo = wpn_data->GetCSWeaponData();
  47. surfacedata_t *enter_surface_data = g_PhysSurface->GetSurfaceData(data.enter_trace.surface.surfaceProps);
  48. int enter_material = enter_surface_data->game.material;
  49. float enter_surf_penetration_mod = enter_surface_data->game.flPenetrationModifier;
  50. data.trace_length += data.enter_trace.fraction * data.trace_length_remaining;
  51. data.current_damage *= pow(pWeaponInfo->flRangeModifier, (data.trace_length * 0.002));
  52. data.current_damage *= (float)pow(pWeaponInfo->flRangeModifier, (data.trace_length * 0.002f));
  53. if ((data.trace_length > 3000.f) || (enter_surf_penetration_mod < 0.1f))data.penetrate_count = 0;
  54. if (data.penetrate_count <= 0)return false;
  55. Vector dummy;
  56. trace_t trace_exit;
  57. if (!TraceToExit(dummy, &data.enter_trace, data.enter_trace.endpos, data.direction, &trace_exit)) return false;
  58. surfacedata_t *exit_surface_data = g_PhysSurface->GetSurfaceData(trace_exit.surface.surfaceProps);
  59. int exit_material = exit_surface_data->game.material;
  60. float exit_surf_penetration_mod = exit_surface_data->game.flPenetrationModifier;
  61. float final_damage_modifier = 0.16f;
  62. float combined_penetration_modifier = 0.0f;
  63. if (((data.enter_trace.contents & CONTENTS_GRATE) != 0) || (enter_material == 89) || (enter_material == 71)) { combined_penetration_modifier = 3.0f; final_damage_modifier = 0.05f; }
  64. else { combined_penetration_modifier = (enter_surf_penetration_mod + exit_surf_penetration_mod) * 0.5f; }
  65. if (enter_material == exit_material)
  66. {
  67. if (exit_material == 87 || exit_material == 85)combined_penetration_modifier = 3.0f;
  68. else if (exit_material == 76)combined_penetration_modifier = 2.0f;
  69. }
  70. float v34 = fmaxf(0.f, 1.0f / combined_penetration_modifier);
  71. float v35 = (data.current_damage * final_damage_modifier) + v34 * 3.0f * fmaxf(0.0f, (3.0f / pWeaponInfo->flRangeModifier) * 1.25f);
  72. float thickness = VectorLength(trace_exit.endpos - data.enter_trace.endpos);
  73. thickness *= thickness;
  74. thickness *= v34;
  75. thickness /= 24.0f;
  76. float lost_damage = fmaxf(0.0f, v35 + thickness);
  77. if (lost_damage > data.current_damage)return false;
  78. if (lost_damage >= 0.0f)data.current_damage -= lost_damage;
  79. if (data.current_damage < 1.0f) return false;
  80. data.src = trace_exit.endpos;
  81. data.penetrate_count--;
  82.  
  83. return true;
  84. }
  85.  
  86. bool C_AutoWall::PenetrateWall(C_BasePlayer* pBaseEntity, C_BaseCombatWeapon* pWeapon, const Vector& vecPoint, float& flDamage)
  87. {
  88. if (!pBaseEntity || !pWeapon)
  89. return false;
  90. FireBulletData BulletData(pBaseEntity->GetEyePos());
  91. BulletData.filter.pSkip = pBaseEntity;
  92. QAngle qAngles;
  93.  
  94. Vector vDelta = BulletData.src - vecPoint;
  95.  
  96. float fHyp = (vDelta.x * vDelta.x) + (vDelta.y * vDelta.y);
  97.  
  98. float fRoot;
  99.  
  100. __asm
  101. {
  102. sqrtss xmm0, fHyp
  103. movss fRoot, xmm0
  104. }
  105.  
  106. qAngles.pitch = RAD2DEG(atan(vDelta.z / fRoot));
  107. qAngles.yaw = RAD2DEG(atan(vDelta.y / vDelta.x));
  108.  
  109. if (vDelta.x >= 0.0f)
  110. qAngles.yaw += 180.0f;
  111.  
  112.  
  113. Math::AngleVectors(qAngles, BulletData.direction);
  114. Math::NormalizeAngles((QAngle&)BulletData.direction);
  115. if (!SimulateFireBullet(pBaseEntity, pWeapon, BulletData))
  116. {
  117. return false;
  118. }
  119.  
  120. flDamage = BulletData.current_damage;
  121.  
  122. return true;
  123. }
  124. float GetHitgroupDamageMult(int iHitgroup)
  125. {
  126. switch (iHitgroup)
  127. {
  128. case HITGROUP_GENERIC:
  129. return 1.f;
  130. case HITGROUP_HEAD:
  131. return 4.f;
  132. case HITGROUP_CHEST:
  133. return 1.f;
  134. case HITGROUP_STOMACH:
  135. return 1.5f;
  136. case HITGROUP_LEFTARM:
  137. return 1.f;
  138. case HITGROUP_RIGHTARM:
  139. return 1.f;
  140. case HITGROUP_LEFTLEG:
  141. return 0.75f;
  142. case HITGROUP_RIGHTLEG:
  143. return 0.75f;
  144. case HITGROUP_GEAR:
  145. return 1.f;
  146. default:
  147. break;
  148. }
  149.  
  150. return 1.f;
  151. }
  152. void C_AutoWall::ScaleDamage(int iHitgroup, C_BasePlayer* pBaseEntity, float flWeaponArmorRatio, float& flDamage)
  153. {
  154. if (!pBaseEntity)
  155. return;
  156.  
  157. flDamage *= GetHitgroupDamageMult(iHitgroup);
  158.  
  159. if (pBaseEntity->m_ArmorValue() > 0)
  160. {
  161. if (iHitgroup == HITGROUP_HEAD)
  162. {
  163. if (pBaseEntity->m_bHasHelmet())
  164. flDamage *= (flWeaponArmorRatio * 1.5f);
  165. }
  166. else flDamage *= (flWeaponArmorRatio * 0.5f);
  167. }
  168. }
  169. int GetPlayerModifiedDamage(const float &constdamage, bool isHeadshot, C_BaseCombatWeapon *Weapon, C_BasePlayer *targetEntity)
  170. {
  171. float damage = constdamage;
  172.  
  173. int armor = targetEntity->m_ArmorValue();
  174. if ((armor > 0) && (!isHeadshot || (isHeadshot)))
  175. {
  176. float weaponArmorRatio = (.5f * Weapon->GetCSWeaponData()->flArmorRatio);
  177.  
  178. float newdamage = (weaponArmorRatio * damage);
  179. float armordamage = ((damage - newdamage) * .5f);
  180.  
  181. if (armordamage <= (float)armor)
  182. {
  183. armordamage = armordamage;
  184. }
  185. else
  186. {
  187. newdamage = (damage + ((float)armor * -2.f));
  188. armordamage = (int)armor;
  189. }
  190.  
  191. damage = newdamage;
  192. }
  193. else
  194. {
  195. damage = damage;
  196. }
  197.  
  198. return (int)damage;
  199. }
  200. //=================================================
  201. float GetHitgroupModifiedDamage(float dmg, int hitgroup)
  202. {
  203. static float hitgroupModifiers[] = { 1.f, 4.f, 1.f, 1.25f, 1.f, 1.f, .75f, .75f };
  204. return (dmg * hitgroupModifiers[hitgroup]);
  205. }
  206. void C_AutoWall::UTIL_TraceLine(const Vector& vecStart, const Vector& vecEnd, unsigned int nMask, C_BasePlayer* pCSIgnore, trace_t* pTrace)
  207. {
  208. Ray_t ray;
  209. ray.Init(vecStart, vecEnd);
  210.  
  211. CTraceFilter filter;
  212. filter.pSkip = pCSIgnore;
  213. g_EngineTrace->TraceRay(ray, nMask, &filter, pTrace);
  214. }
  215.  
  216. bool C_AutoWall::SimulateFireBullet(C_BasePlayer* pBaseEntity, C_BaseCombatWeapon* pWeapon, FireBulletData& BulletData)
  217. {
  218. if (!pBaseEntity || !pWeapon)
  219. return false;
  220.  
  221. BulletData.penetrate_count = 4;
  222. BulletData.trace_length = 0.0f;
  223.  
  224. CCSWeaponInfo* pWeaponInfo = pWeapon->GetCSWeaponData();
  225.  
  226. BulletData.current_damage = (float)pWeaponInfo->iDamage;
  227. while ((BulletData.penetrate_count > 0) && (BulletData.current_damage >= 1.0f))
  228. {
  229. BulletData.trace_length_remaining = pWeaponInfo->flRange - BulletData.trace_length;
  230. auto vecEnd = BulletData.src + BulletData.direction * BulletData.trace_length_remaining;
  231. UTIL_TraceLine(BulletData.src, vecEnd, 0x4600400B, pBaseEntity, &BulletData.enter_trace);
  232.  
  233.  
  234. if (BulletData.enter_trace.fraction == 1.0f)
  235. break;
  236.  
  237. if ((BulletData.enter_trace.hitgroup <= 7) && (BulletData.enter_trace.hitgroup > 0) && pBaseEntity->m_iTeamNum() != BulletData.enter_trace.hit_entity->GetBaseEntity()->m_iTeamNum())
  238. {
  239. BulletData.trace_length += BulletData.enter_trace.fraction * BulletData.trace_length_remaining;
  240. BulletData.current_damage *= (float)pow(pWeaponInfo->flRangeModifier, BulletData.trace_length * 0.002);
  241. // MessageBox(NULL, "Kasia ma ciasnom cipeczke wiedziales ?", "Macije pFadddWare", NULL);
  242. ScaleDamage(BulletData.enter_trace.hitgroup, (C_BasePlayer*)(BulletData.enter_trace.hit_entity)->GetBaseEntity(), pWeaponInfo->flArmorRatio, BulletData.current_damage);
  243. GetPlayerModifiedDamage(GetHitgroupModifiedDamage(BulletData.current_damage, BulletData.enter_trace.hitgroup), (BulletData.enter_trace.hitgroup == 1), pWeapon, pBaseEntity); //Comment here
  244. return true;
  245. }
  246.  
  247. if (!HandleBulletPenetration(pWeapon, BulletData))
  248. break;
  249. }
  250.  
  251. return false;
  252. }
  253.  
  254.  
  255. bool C_AutoWall::TraceToExit(Vector& vecEnd, trace_t* pEnterTrace, Vector vecStart, Vector vecDir, trace_t* pExitTrace)
  256. {
  257. auto flDistance = 0.0f;
  258. while (flDistance <= 90.0f)
  259. {
  260. flDistance += 4.0f;
  261. vecEnd = vecStart + vecDir * flDistance;
  262.  
  263. auto iPointContents = g_EngineTrace->GetPointContents(vecEnd, MASK_SHOT_HULL | CONTENTS_HITBOX, NULL);
  264. if (iPointContents & MASK_SHOT_HULL && (!(iPointContents & CONTENTS_HITBOX)))
  265. continue;
  266.  
  267. auto vecNewEnd = vecEnd - (vecDir * 4.0f);
  268. UTIL_TraceLine(vecEnd, vecNewEnd, 0x4600400B, 0, pExitTrace);
  269.  
  270. if (!pExitTrace->hit_entity)
  271. {
  272. return false;
  273. }
  274.  
  275. if (pExitTrace->startsolid && pExitTrace->surface.flags & SURF_HITBOX)
  276. {
  277. UTIL_TraceLine(vecEnd, vecStart, 0x600400B, (C_BasePlayer*)pExitTrace->hit_entity, pExitTrace);
  278. if ((pExitTrace->fraction < 1.0f || pExitTrace->allsolid) && !pExitTrace->startsolid)
  279. {
  280. vecEnd = pExitTrace->endpos;
  281. return true;
  282. }
  283. continue;
  284. }
  285.  
  286. if (!(pExitTrace->fraction < 1.0 || pExitTrace->allsolid || pExitTrace->startsolid) || pExitTrace->startsolid)
  287. {
  288. if (pExitTrace->hit_entity)
  289. {
  290. if (TraceDidHitNonWorldEntity(pEnterTrace)
  291. {
  292. return true;
  293. }
  294. }
  295. continue;
  296. }
  297.  
  298. if (((pExitTrace->surface.flags >> 7) & 1) && !((pEnterTrace->surface.flags >> 7) & 1))
  299. continue;
  300.  
  301.  
  302. if (pExitTrace->plane.normal.Dot(vecDir) <= 1.0f)
  303. {
  304. auto flFraction = pExitTrace->fraction * 4.0f;
  305. vecEnd = vecEnd - (vecDir * flFraction);
  306. return true;
  307. }
  308. }
  309. return false;
  310. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement