+ if(self.deadflag == DEAD_NO && !self.stat_eaten) // prevents bugs\r
+ {\r
+ // lean the player with damage and acceleration\r
+ // credits go to divVerent for these maths :)\r
+ vector L0, L1, LF, LA;\r
+\r
+ LA = AnglesTransform_FromAngles(self.angles);\r
+\r
+ // acceleration leaning\r
+ if(cvar("g_leanplayer_acceleration"))\r
+ {\r
+ // average velocity to obtain a smooth acceleration\r
+ float f;\r
+ f = frametime * cvar("g_leanplayer_acceleration_fade");\r
+ self.avg_vel = self.avg_vel * (1 - f) + self.velocity * f;\r
+ }\r
+\r
+ vector accel;\r
+ accel = self.velocity - self.avg_vel * cvar("g_leanplayer_acceleration"); // acceleration\r
+\r
+ // bound angles to the specified limit\r
+ accel_x = bound(-cvar("g_leanplayer_acceleration_max"), accel_x, cvar("g_leanplayer_acceleration_max"));\r
+ accel_y = bound(-cvar("g_leanplayer_acceleration_max"), accel_y, cvar("g_leanplayer_acceleration_max"));\r
+ accel_z = bound(-cvar("g_leanplayer_acceleration_max"), accel_z, cvar("g_leanplayer_acceleration_max"));\r
+\r
+ L0_x = vlen(accel);\r
+ L0_y = L1_y = vectoyaw(accel);\r
+\r
+ L0 = AnglesTransform_FromAngles(L0);\r
+ L1 = AnglesTransform_FromAngles(L1);\r
+ LF = AnglesTransform_Multiply(AnglesTransform_Invert(L1), L0);\r
+ LA = AnglesTransform_Multiply(LA, LF);\r
+ // end of acceleration leaning\r
+\r
+ // damage leaning\r
+ L0 = vectoangles(self.leanangle_damage_loc);\r
+ L1 = vectoangles(self.leanangle_damage_loc + self.leanangle_damage_force);\r
+\r
+ L0 = AnglesTransform_FromAngles(L0);\r
+ L1 = AnglesTransform_FromAngles(L1);\r
+ LF = AnglesTransform_Multiply(AnglesTransform_Invert(L1), L0);\r
+\r
+ LA = AnglesTransform_Multiply(LA, LF);\r
+\r
+ // fade the player back to normal rotation each frame\r
+ if(self.leanangle_damage_force) // safety\r
+ self.leanangle_damage_force = self.leanangle_damage_force * cvar("g_leanplayer_damage_fade");\r
+ // end of damage leaning\r
+\r
+ self.angles = AnglesTransform_Normalize(AnglesTransform_ToAngles(LA), TRUE);\r
+ }\r
+\r