+ float ef_speed = cl.realframetime * cl_leanmodel_up_speed.value;
+
+ // gun model leaning code
+ if(cl_leanmodel_up.value && cl_leanmodel_up_speed.value * ef_speed < 1) // bad things happen if this goes over 1, so prevent the effect
+ {
+ // prevent the gun from doing a 360* rotation when going around the 0 <-> 360 border
+ if(cl.viewangles[PITCH] - viewmodel_push_x >= 180)
+ viewmodel_push_x += 360;
+ if(viewmodel_push_x - cl.viewangles[PITCH] >= 180)
+ viewmodel_push_x -= 360;
+
+ if(viewmodel_push_x < cl.viewangles[PITCH])
+ {
+ if(cl.viewangles[PITCH] - viewmodel_push_x > cl_leanmodel_up_limit.value)
+ viewmodel_push_x = cl.viewangles[PITCH] - cl_leanmodel_up_limit.value;
+ else
+ viewmodel_push_x += (cl.viewangles[PITCH] - viewmodel_push_x) * cl_leanmodel_up_speed.value * ef_speed;
+ }
+ if(viewmodel_push_x > cl.viewangles[PITCH])
+ {
+ if(viewmodel_push_x - cl.viewangles[PITCH] > cl_leanmodel_up_limit.value)
+ viewmodel_push_x = cl.viewangles[PITCH] + cl_leanmodel_up_limit.value;
+ else
+ viewmodel_push_x -= (viewmodel_push_x - cl.viewangles[PITCH]) * cl_leanmodel_up_speed.value * ef_speed;
+ }
+ }
+ else
+ viewmodel_push_x = cl.viewangles[PITCH];
+
+ if(cl_leanmodel_side.value && cl_leanmodel_side_speed.value * ef_speed < 1) // bad things happen if this goes over 1, so prevent the effect
+ {
+ // prevent the gun from doing a 360* rotation when going around the 0 <-> 360 border
+ if(cl.viewangles[YAW] - viewmodel_push_y >= 180)
+ viewmodel_push_y += 360;
+ if(viewmodel_push_y - cl.viewangles[YAW] >= 180)
+ viewmodel_push_y -= 360;
+
+ if(viewmodel_push_y < cl.viewangles[YAW])
+ {
+ if(cl.viewangles[YAW] - viewmodel_push_y > cl_leanmodel_side_limit.value)
+ viewmodel_push_y = cl.viewangles[YAW] - cl_leanmodel_side_limit.value;
+ else
+ viewmodel_push_y += (cl.viewangles[YAW] - viewmodel_push_y) * cl_leanmodel_side_speed.value * ef_speed;
+ }
+ if(viewmodel_push_y > cl.viewangles[YAW])
+ {
+ if(viewmodel_push_y - cl.viewangles[YAW] > cl_leanmodel_side_limit.value)
+ viewmodel_push_y = cl.viewangles[YAW] + cl_leanmodel_side_limit.value;
+ else
+ viewmodel_push_y -= (viewmodel_push_y - cl.viewangles[YAW]) * cl_leanmodel_side_speed.value * ef_speed;
+ }
+ }
+ else
+ viewmodel_push_y = cl.viewangles[YAW];
+
+ VectorSet(gunangles, viewmodel_push_x, viewmodel_push_y, viewangles[2]);
+
+ // gun model following code
+ // TODO: make the weapon model not shake when looking around horizontally (due to X axis vs. Y axis)
+ if(cl_followmodel_side.value && cl_followmodel_side_speed.value * ef_speed < 1) // bad things happen if this goes over 1, so prevent the effect
+ {
+ if(gunorg_follow[0] < vieworg[0])
+ {
+ if(vieworg[0] - gunorg_follow[0] > cl_followmodel_side_limit.value)
+ gunorg_follow[0] = vieworg[0] - cl_followmodel_side_limit.value;
+ else
+ gunorg_follow[0] += (vieworg[0] - gunorg_follow[0]) * cl_followmodel_side_speed.value * ef_speed;
+ }
+ if(gunorg_follow[0] > vieworg[0])
+ {
+ if(gunorg_follow[0] - vieworg[0] > cl_followmodel_side_limit.value)
+ gunorg_follow[0] = vieworg[0] + cl_followmodel_side_limit.value;
+ else
+ gunorg_follow[0] -= (gunorg_follow[0] - vieworg[0]) * cl_followmodel_side_speed.value * ef_speed;
+ }
+
+ if(gunorg_follow[1] < vieworg[1])
+ {
+ if(vieworg[1] - gunorg_follow[1] > cl_followmodel_side_limit.value)
+ gunorg_follow[1] = vieworg[1] - cl_followmodel_side_limit.value;
+ else
+ gunorg_follow[1] += (vieworg[1] - gunorg_follow[1]) * cl_followmodel_side_speed.value * ef_speed;
+ }
+ if(gunorg_follow[1] > vieworg[1])
+ {
+ if(gunorg_follow[1] - vieworg[1] > cl_followmodel_side_limit.value)
+ gunorg_follow[1] = vieworg[1] + cl_followmodel_side_limit.value;
+ else
+ gunorg_follow[1] -= (gunorg_follow[1] - vieworg[1]) * cl_followmodel_side_speed.value * ef_speed;
+ }
+ }
+ else
+ {
+ gunorg_follow[0] = vieworg[0];
+ gunorg_follow[1] = vieworg[1];
+ }
+
+ if(cl_followmodel_up.value && cl_followmodel_up_speed.value * ef_speed < 1) // bad things happen if this goes over 1, so prevent the effect
+ {
+ if(gunorg_follow[2] < vieworg[2])
+ {
+ if(vieworg[2] - gunorg_follow[2] > cl_followmodel_up_limit.value)
+ gunorg_follow[2] = vieworg[2] - cl_followmodel_up_limit.value;
+ else
+ gunorg_follow[2] += (vieworg[2] - gunorg_follow[2]) * cl_followmodel_up_speed.value * ef_speed;
+ }
+ if(gunorg_follow[2] > vieworg[2])
+ {
+ if(gunorg_follow[2] - vieworg[2] > cl_followmodel_up_limit.value)
+ gunorg_follow[2] = vieworg[2] + cl_followmodel_up_limit.value;
+ else
+ gunorg_follow[2] -= (gunorg_follow[2] - vieworg[2]) * cl_followmodel_up_speed.value * ef_speed;
+ }
+ }
+ else
+ gunorg_follow[2] = vieworg[2];
+
+ VectorCopy(gunorg_follow, gunorg);
+
+ // gun model bobbing code