unsigned int AI_CurrentLinkType( edict_t *self ) { if( !AI_PlinkExists( self->ai.current_node, self->ai.next_node ) ) return LINK_INVALID; return AI_PlinkMoveType( self->ai.current_node, self->ai.next_node ); }
//========================================== // AI_FindServerLinkType // determine what type of link it is //========================================== int AI_FindServerLinkType( int n1, int n2 ) { if( AI_PlinkExists( n1, n2 )) return LINK_INVALID; //already saved if( nodes[n1].flags & NODEFLAGS_PLATFORM || nodes[n2].flags & NODEFLAGS_PLATFORM ) { return AI_IsPlatformLink(n1, n2); } else if( nodes[n2].flags & NODEFLAGS_TELEPORTER_IN || nodes[n1].flags & NODEFLAGS_TELEPORTER_OUT ) { return AI_IsTeleporterLink(n1, n2); } else if( nodes[n2].flags & NODEFLAGS_JUMPPAD || nodes[n1].flags & NODEFLAGS_JUMPPAD_LAND ) { return AI_IsJumpPadLink(n1, n2); } return LINK_INVALID; }
//========================================== // M_default_Move // movement following paths code //========================================== //void M_default_Move( edict_t *self, usercmd_t *ucmd ) //{ // BOT_DMclass_Move( self, ucmd ); //} void M_default_Move(edict_t *self, usercmd_t *ucmd) { int current_node_flags = 0; int next_node_flags = 0; int current_link_type = 0; // int i; current_node_flags = nodes[self->ai->current_node].flags; next_node_flags = nodes[self->ai->next_node].flags; if( AI_PlinkExists( self->ai->current_node, self->ai->next_node )) { current_link_type = AI_PlinkMoveType( self->ai->current_node, self->ai->next_node ); //Com_Printf("%s\n", AI_LinkString( current_link_type )); } // Falling off ledge if(!self->groundentity && !self->is_step && !self->is_swim ) { AI_ChangeAngle(self); if (current_link_type == LINK_JUMPPAD ) { ucmd->forwardmove = 100; } else if( current_link_type == LINK_JUMP ) { self->velocity[0] = self->ai->move_vector[0] * 280; self->velocity[1] = self->ai->move_vector[1] * 280; } else { self->velocity[0] = self->ai->move_vector[0] * 160; self->velocity[1] = self->ai->move_vector[1] * 160; } return; } // swimming if( self->is_swim ) { // We need to be pointed up/down AI_ChangeAngle(self); //if( !(trap_PointContents(nodes[self->ai->next_node].origin) & MASK_WATER) ) // Exit water if( !(gi.pointcontents(nodes[self->ai->next_node].origin) & MASK_WATER) ) // Exit water ucmd->upmove = 400; ucmd->forwardmove = 300; return; } // Check to see if stuck, and if so try to free us if(VectorCompare(self->s.old_origin, self->s.origin)) { // Keep a random factor just in case.... if( random() > 0.1 && AI_SpecialMove(self, ucmd) ) //jumps, crouches, turns... return; self->s.angles[YAW] += random() * 180 - 90; AI_ChangeAngle(self); ucmd->forwardmove = 400; return; } AI_ChangeAngle(self); // Otherwise move as fast as we can... ucmd->forwardmove = 400; }