void aimAt(vec3_t target) { #ifdef ETH_DEBUG if (seth.value[VAR_AIM_POINT] == AIM_POINT_2D) { #define POINT_SIZE 3 int x, y; if (worldToScreen(target, &x, &y)) drawFillRect(x - (POINT_SIZE / 1.5), y - (POINT_SIZE / 1.5), POINT_SIZE, POINT_SIZE, colorYellow); } else if (seth.value[VAR_AIM_POINT] == AIM_POINT_3D) { crossRailTrail(target); } #endif vec3_t org, ang; // Self Prediction if (seth.value[VAR_SELFPREDICT]) { vec3_t pVieworg; if (seth.value[VAR_SELFPREDICT] == SELFPREDICT_PING) { VectorMA(eth.cg_refdef.vieworg, eth.cg_snap->ping / 1000, eth.cg_entities[eth.cg_clientNum].currentState->pos.trDelta, pVieworg); } else if (seth.value[VAR_SELFPREDICT] == SELFPREDICT_MANUAL) { VectorMA(eth.cg_refdef.vieworg, seth.value[VAR_SELFPREDICT_VALUE] / 100.0f, eth.cg_entities[eth.cg_clientNum].currentState->pos.trDelta, pVieworg); } else if (seth.value[VAR_SELFPREDICT] == SELFPREDICT_AUTO) { VectorMA(eth.cg_refdef.vieworg, (float)(eth.cg_frametime) / 1000.0f, eth.cg_entities[eth.cg_clientNum].currentState->pos.trDelta, pVieworg); } else { ethLog("error: invalid aim prediction type: %i", seth.value[VAR_SELFPREDICT]); VectorCopy(eth.cg_refdef.vieworg, pVieworg); } VectorSubtract(target, pVieworg, org); } else { VectorSubtract(target, eth.cg_refdef.vieworg, org); } vectoangles(org, ang); ang[PITCH] -= eth.cg_refdefViewAngles[PITCH]; ang[YAW] -= eth.cg_refdefViewAngles[YAW]; // Simple human aim for now - will try to make it cg_time based, not framebased like now if (seth.value[VAR_HUMAN]) { while (ang[PITCH] < -360.0f) ang[PITCH] += 360.0f; while (ang[PITCH] > 360.0f) ang[PITCH] -= 360.0f; while (ang[YAW] < -360.0f) ang[YAW] += 360.0f; while (ang[YAW] > 360.0f) ang[YAW] -= 360.0f; if (ang[PITCH] > 180.0f) ang[PITCH] -= 360.0f; if (ang[PITCH] < -180.0f) ang[PITCH] += 360.0f; if (ang[YAW] > 180.0f) ang[YAW] -= 360.0f; if (ang[YAW] < -180.0f) ang[YAW] += 360.0f; float aimDiv = seth.value[VAR_DIVMAX]; if (aimDiv>(float)(seth.value[VAR_DIVMIN])) { ang[PITCH] *= seth.value[VAR_HUMANVALUE]/aimDiv; ang[YAW] *= seth.value[VAR_HUMANVALUE]/aimDiv; aimDiv -= seth.value[VAR_HUMANVALUE]; } else { aimDiv = (float)(seth.value[VAR_DIVMAX]); } } *(float *)sethET->cl_mouseDx += ang[PITCH]; *(float *)sethET->cl_mouseDy += ang[YAW]; // *(float *)CL_MOUSEDX_ADDR += AngleDelta(ang[PITCH], seth.refdefViewAngles[PITCH]); // *(float *)CL_MOUSEDY_ADDR += AngleDelta(ang[YAW], seth.refdefViewAngles[YAW]); }