//taken from dlls\combat.cpp static cell AMX_NATIVE_CALL in_view_cone(AMX *amx, cell *params) { int src = params[1]; CHECK_ENTITY(src); edict_t *pEdictSrc = INDEXENT(src); Vector vecLOS, vecForward; float flDot; cell *addr = MF_GetAmxAddr(amx, params[2]); Vector origin(amx_ctof(addr[0]), amx_ctof(addr[1]), amx_ctof(addr[2])); bool use2D = (params[0] / sizeof(cell)) == 2 || params[3] == 0; if (use2D) { MAKE_VECTORS(pEdictSrc->v.angles); vecForward = gpGlobals->v_forward; vecLOS = origin - pEdictSrc->v.origin; vecForward.z = 0; vecLOS.z = 0; } else { MAKE_VECTORS(pEdictSrc->v.v_angle); vecForward = gpGlobals->v_forward; vecLOS = origin - (pEdictSrc->v.origin + pEdictSrc->v.view_ofs); } vecLOS = vecLOS.Normalize(); flDot = DotProduct(vecLOS, vecForward); /* Dividing fov by two and then converting it to radians - don't ask about this ever again, please :\ */ if (flDot >= cos(pEdictSrc->v.fov * (M_PI / 360))) return 1; else return 0; }
void UTIL_MakeInvVectors( const Vector &vec, globalvars_t *pgv ) { MAKE_VECTORS(vec); float tmp; pgv->v_right = pgv->v_right * -1; SWAP(pgv->v_forward.y, pgv->v_right.x, tmp); SWAP(pgv->v_forward.z, pgv->v_up.x, tmp); SWAP(pgv->v_right.z, pgv->v_up.y, tmp); }
void PlayerPostThink_Post(edict_t *pEntity) { if(plinfo[ENTINDEX(pEntity)].pViewEnt) { edict_t *pCamEnt = plinfo[ENTINDEX(pEntity)].pViewEnt; MAKE_VECTORS(pEntity->v.v_angle + pEntity->v.punchangle); Vector vecSrc = pEntity->v.origin + pEntity->v.view_ofs; Vector vecAiming = gpGlobals->v_forward; TraceResult tr; switch(plinfo[ENTINDEX(pEntity)].iViewType) { case CAMERA_3RDPERSON: TRACE_LINE(vecSrc, vecSrc - (vecAiming * 128), ignore_monsters, ENT(pEntity), &tr); SET_VIEW(pEntity, pCamEnt); pCamEnt->v.origin = tr.vecEndPos; pCamEnt->v.angles = pEntity->v.v_angle; break; case CAMERA_UPLEFT: TRACE_LINE(vecSrc, vecSrc - ((vecAiming * 32) - ((gpGlobals->v_right * 15) + (gpGlobals->v_up * 15))), ignore_monsters, ENT(pEntity), &tr); SET_VIEW(pEntity, pCamEnt); pCamEnt->v.origin = tr.vecEndPos; pCamEnt->v.angles = pEntity->v.v_angle; break; case CAMERA_TOPDOWN: TRACE_LINE(vecSrc, vecSrc + Vector(0,0,2048), dont_ignore_monsters, ENT(pEntity), &tr); SET_VIEW(pEntity, pCamEnt); pCamEnt->v.origin = tr.vecEndPos; pCamEnt->v.origin.z -= 40; pCamEnt->v.angles = Vector(90,pEntity->v.v_angle.y,0); break; default: SET_VIEW(pEntity, pEntity); REMOVE_ENTITY(plinfo[ENTINDEX(pEntity)].pViewEnt); plinfo[ENTINDEX(pEntity)].iViewType = CAMERA_NONE; plinfo[ENTINDEX(pEntity)].pViewEnt = NULL; break; } } if (PlayerPostThinkForward != -1) { if (MF_ExecuteForward(PlayerPostThinkForward, (cell)ENTINDEX(pEntity))) RETURN_META(MRES_SUPERCEDE); } RETURN_META(MRES_IGNORED); }
void UTIL_MakeAimVectors( const Vector &vecAngles ) { Vector rgflVec = vecAngles; rgflVec[0] = -rgflVec[0]; MAKE_VECTORS(rgflVec); }
void UTIL_MakeVectors( const Vector &vecAngles ) { MAKE_VECTORS( vecAngles ); }
//contributed by twistedeuphoria static cell AMX_NATIVE_CALL trace_forward(AMX *amx, cell *params) //native trace_forward(Float:start[3], Float:angles[3], give, ignoreEnt, &Float:hitX, &Float:hitY, &Float:shortestDistance, &Float:shortestDistLow, &Float:shortestDistHigh) { cell *cStart = MF_GetAmxAddr(amx, params[1]); cell *cAngles = MF_GetAmxAddr(amx, params[2]); REAL fGive = amx_ctof(params[3]); int iIgnoreEnt = params[4]; cell *hitX = MF_GetAmxAddr(amx, params[5]); cell *hitY = MF_GetAmxAddr(amx, params[6]); cell *shortestDistance = MF_GetAmxAddr(amx, params[7]); cell *shortestDistLow = MF_GetAmxAddr(amx, params[8]); cell *shortestDistHigh = MF_GetAmxAddr(amx, params[9]); if(fGive < 0.0) fGive = 20.0; REAL fStartX = amx_ctof(cStart[0]); REAL fStartY = amx_ctof(cStart[1]); REAL fStartZ = amx_ctof(cStart[2]); REAL fAnglesX = amx_ctof(cAngles[0]); REAL fAnglesY = amx_ctof(cAngles[1]); REAL fAnglesZ = amx_ctof(cAngles[2]); Vector playerAngleVector = Vector(fAnglesX,fAnglesY,fAnglesZ); MAKE_VECTORS(playerAngleVector); Vector forwardVector = gpGlobals->v_forward; REAL fEndX = forwardVector[0] * 4000; REAL fEndY = forwardVector[1] * 4000; REAL fClosestDist = 999999.9; REAL fClosestLow = 0.0; REAL fClosestHigh = 0.0; REAL fClosestX = 0.0; REAL fClosestY = 0.0; TraceResult tr; REAL fRetX; REAL fRetY; REAL fRetZ; for(int inum=-36;inum<=36;inum++) { REAL fUseZ = fStartZ + (REAL)inum; Vector vStart = Vector(fStartX, fStartY, fUseZ); Vector vEnd = Vector(fEndX, fEndY, fUseZ); if(iIgnoreEnt == -1) TRACE_LINE(vStart, vEnd, ignore_monsters, NULL, &tr); else TRACE_LINE(vStart, vEnd, dont_ignore_monsters, INDEXENT2(iIgnoreEnt), &tr); fRetX = tr.vecEndPos.x; fRetY = tr.vecEndPos.y; fRetZ = tr.vecEndPos.z; Vector vHit = Vector(fRetX, fRetY, fRetZ); REAL fLength = (vStart - vHit).Length(); if(fabs(fLength - fClosestDist) < fGive) fClosestHigh = fUseZ - fStartZ; else if(fLength < fClosestDist) { fClosestDist = fLength; fClosestLow = fUseZ - fStartZ; fClosestHigh = fUseZ - fStartZ; fClosestX = fRetX; fClosestY = fRetY; } } fClosestLow += 36.0; fClosestHigh += 36.0; *hitX = amx_ftoc(fClosestX); *hitY = amx_ftoc(fClosestY); *shortestDistance = amx_ftoc(fClosestDist); *shortestDistLow = amx_ftoc(fClosestLow); *shortestDistHigh = amx_ftoc(fClosestHigh); return 1; }