//=========================================================================== // returns qtrue if the bot is against a ladder // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== int AAS_AgainstLadder(vec3_t origin) { int areanum, i, facenum, side; vec3_t org; aas_plane_t *plane; aas_face_t *face; aas_area_t *area; VectorCopy(origin, org); areanum = AAS_PointAreaNum(org); if (!areanum) { org[0] += 1; areanum = AAS_PointAreaNum(org); if (!areanum) { org[1] += 1; areanum = AAS_PointAreaNum(org); if (!areanum) { org[0] -= 2; areanum = AAS_PointAreaNum(org); if (!areanum) { org[1] -= 2; areanum = AAS_PointAreaNum(org); } //end if } //end if } //end if } //end if //if in solid... wrrr shouldn't happen if (!areanum) return qfalse; //if not in a ladder area if (!(aasworld.areasettings[areanum].areaflags & AREA_LADDER)) return qfalse; //if a crouch only area if (!(aasworld.areasettings[areanum].presencetype & PRESENCE_NORMAL)) return qfalse; // area = &aasworld.areas[areanum]; for (i = 0; i < area->numfaces; i++) { facenum = aasworld.faceindex[area->firstface + i]; side = facenum < 0; face = &aasworld.faces[abs(facenum)]; //if the face isn't a ladder face if (!(face->faceflags & FACE_LADDER)) continue; //get the plane the face is in plane = &aasworld.planes[face->planenum ^ side]; //if the origin is pretty close to the plane if (fabsf(DotProduct(plane->normal, origin) - plane->dist) < 3) { if (AAS_PointInsideFace(abs(facenum), origin, 0.1f)) return qtrue; } //end if } //end for return qfalse; } //end of the function AAS_AgainstLadder
//=========================================================================== // returns qtrue if the bot is against a ladder // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== int AAS_AgainstLadder( vec3_t origin, int ms_areanum ) { int areanum, i, facenum, side; vec3_t org; aas_plane_t *plane; aas_face_t *face; aas_area_t *area; VectorCopy( origin, org ); areanum = AAS_PointAreaNum( org ); if ( !areanum ) { org[0] += 1; areanum = AAS_PointAreaNum( org ); if ( !areanum ) { org[1] += 1; areanum = AAS_PointAreaNum( org ); if ( !areanum ) { org[0] -= 2; areanum = AAS_PointAreaNum( org ); if ( !areanum ) { org[1] -= 2; areanum = AAS_PointAreaNum( org ); } //end if } //end if } //end if } //end if //if in solid... wrrr shouldn't happen //if (!areanum) return qfalse; // RF, it does if they're in a monsterclip brush if ( !areanum ) { areanum = ms_areanum; } //if not in a ladder area if ( !( ( *aasworld ).areasettings[areanum].areaflags & AREA_LADDER ) ) { return qfalse; } //if a crouch only area if ( !( ( *aasworld ).areasettings[areanum].presencetype & PRESENCE_NORMAL ) ) { return qfalse; } // area = &( *aasworld ).areas[areanum]; for ( i = 0; i < area->numfaces; i++ ) { facenum = ( *aasworld ).faceindex[area->firstface + i]; side = facenum < 0; face = &( *aasworld ).faces[c::abs( facenum )]; //if the face isn't a ladder face if ( !( face->faceflags & FACE_LADDER ) ) { continue; } //get the plane the face is in plane = &( *aasworld ).planes[face->planenum ^ side]; //if the origin is pretty close to the plane #if !defined RTCW_ET if ( c::abs( DotProduct( plane->normal, origin ) - plane->dist ) < 3 ) { if ( AAS_PointInsideFace( c::abs( facenum ), origin, 0.1 ) ) { #else if ( c::abs( DotProduct( plane->normal, origin ) - plane->dist ) < 7 ) { // RF, if hanging on to the edge of a ladder, we have to account for bounding box touching //if (AAS_PointInsideFace(c::abs(facenum), origin, 0.1)) return qtrue; if ( AAS_PointInsideFace( c::abs( facenum ), origin, 2.0 ) ) { #endif // RTCW_XX return qtrue; } } //end if } //end for return qfalse; } //end of the function AAS_AgainstLadder //=========================================================================== // returns qtrue if the bot is on the ground // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== int AAS_OnGround( vec3_t origin, int presencetype, int passent ) { #if !defined RTCW_ET aas_trace_t trace; #else //aas_trace_t trace; bsp_trace_t trace; #endif // RTCW_XX vec3_t end, up = {0, 0, 1}; #if !defined RTCW_ET aas_plane_t *plane; #else //aas_plane_t *plane; vec3_t mins, maxs; #endif // RTCW_XX VectorCopy( origin, end ); end[2] -= 10; #if !defined RTCW_ET trace = AAS_TraceClientBBox( origin, end, presencetype, passent ); #else //trace = AAS_TraceClientBBox(origin, end, presencetype, passent); AAS_PresenceTypeBoundingBox( presencetype, mins, maxs ); trace = AAS_Trace( origin, mins, maxs, end, passent, CONTENTS_SOLID | CONTENTS_PLAYERCLIP ); #endif // RTCW_XX //if in solid if ( trace.startsolid ) { #if !defined RTCW_MP return qtrue; //qfalse; #else return qfalse; #endif // RTCW_XX } //if nothing hit at all if ( trace.fraction >= 1.0 ) { return qfalse; } //if too far from the hit plane if ( origin[2] - trace.endpos[2] > 10 ) { return qfalse; } //check if the plane isn't too steep #if !defined RTCW_ET plane = AAS_PlaneFromNum( trace.planenum ); if ( DotProduct( plane->normal, up ) < aassettings.sv_maxsteepness ) { #else //plane = AAS_PlaneFromNum(trace.planenum); if ( DotProduct( trace.plane.normal, up ) < aassettings.sv_maxsteepness ) { #endif // RTCW_XX return qfalse; } //the bot is on the ground return qtrue; } //end of the function AAS_OnGround //=========================================================================== // returns qtrue if a bot at the given position is swimming // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== int AAS_Swimming( vec3_t origin ) { vec3_t testorg; VectorCopy( origin, testorg ); testorg[2] -= 2; if ( AAS_PointContents( testorg ) & ( CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_WATER ) ) { return qtrue; } return qfalse; } //end of the function AAS_Swimming //=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== vec3_t VEC_UP = {0, -1, 0}; vec3_t MOVEDIR_UP = {0, 0, 1}; vec3_t VEC_DOWN = {0, -2, 0}; vec3_t MOVEDIR_DOWN = {0, 0, -1}; void AAS_SetMovedir( vec3_t angles, vec3_t movedir ) { if ( VectorCompare( angles, VEC_UP ) ) { VectorCopy( MOVEDIR_UP, movedir ); } //end if else if ( VectorCompare( angles, VEC_DOWN ) ) { VectorCopy( MOVEDIR_DOWN, movedir ); } //end else if else { AngleVectors( angles, movedir, NULL, NULL ); } //end else } //end of the function AAS_SetMovedir //=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== void AAS_JumpReachRunStart( aas_reachability_t *reach, vec3_t runstart ) { vec3_t hordir, start, cmdmove; aas_clientmove_t move; // hordir[0] = reach->start[0] - reach->end[0]; hordir[1] = reach->start[1] - reach->end[1]; hordir[2] = 0; VectorNormalize( hordir ); //start point VectorCopy( reach->start, start ); start[2] += 1; //get command movement VectorScale( hordir, 400, cmdmove ); // AAS_PredictClientMovement( &move, -1, start, PRESENCE_NORMAL, qtrue, vec3_origin, cmdmove, 1, 2, 0.1, SE_ENTERWATER | SE_ENTERSLIME | SE_ENTERLAVA | SE_HITGROUNDDAMAGE | SE_GAP, 0, qfalse ); VectorCopy( move.endpos, runstart ); //don't enter slime or lava and don't fall from too high if ( move.stopevent & ( SE_ENTERLAVA | SE_HITGROUNDDAMAGE ) ) { //----(SA) modified since slime is no longer deadly // if (move.stopevent & (SE_ENTERSLIME|SE_ENTERLAVA|SE_HITGROUNDDAMAGE)) VectorCopy( start, runstart ); } //end if } //end of the function AAS_JumpReachRunStart
//=========================================================================== // returns qtrue if the bot is against a ladder // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== int AAS_AgainstLadder(vec3_t origin, int ms_areanum) { int areanum, i, facenum, side; vec3_t org; aas_plane_t *plane; aas_face_t *face; aas_area_t *area; VectorCopy(origin, org); areanum = AAS_PointAreaNum(org); if (!areanum) { org[0] += 1; areanum = AAS_PointAreaNum(org); if (!areanum) { org[1] += 1; areanum = AAS_PointAreaNum(org); if (!areanum) { org[0] -= 2; areanum = AAS_PointAreaNum(org); if (!areanum) { org[1] -= 2; areanum = AAS_PointAreaNum(org); } //end if } //end if } //end if } //end if //if in solid... wrrr shouldn't happen //if (!areanum) return qfalse; // RF, it does if they're in a monsterclip brush if (!areanum) { areanum = ms_areanum; } //if not in a ladder area if (!((*aasworld).areasettings[areanum].areaflags & AREA_LADDER)) { return qfalse; } //if a crouch only area if (!((*aasworld).areasettings[areanum].presencetype & PRESENCE_NORMAL)) { return qfalse; } // area = &(*aasworld).areas[areanum]; for (i = 0; i < area->numfaces; i++) { facenum = (*aasworld).faceindex[area->firstface + i]; side = facenum < 0; face = &(*aasworld).faces[abs(facenum)]; //if the face isn't a ladder face if (!(face->faceflags & FACE_LADDER)) { continue; } //get the plane the face is in plane = &(*aasworld).planes[face->planenum ^ side]; //if the origin is pretty close to the plane if (abs(DotProduct(plane->normal, origin) - plane->dist) < 7) { // RF, if hanging on to the edge of a ladder, we have to account for bounding box touching //if (AAS_PointInsideFace(abs(facenum), origin, 0.1)) return qtrue; if (AAS_PointInsideFace(abs(facenum), origin, 2.0)) { return qtrue; } } //end if } //end for return qfalse; } //end of the function AAS_AgainstLadder