CBotFollowLastEnemy :: CBotFollowLastEnemy ( CBot *pBot, edict_t *pEnemy, Vector vLastSee ) { Vector vVelocity = Vector(0,0,0); CClient *pClient = CClients::get(pEnemy); CFindPathTask *pFindPath = new CFindPathTask(vLastSee,LOOK_LAST_ENEMY); if ( CClassInterface :: getVelocity(pEnemy,&vVelocity) ) { if ( pClient && (vVelocity == Vector(0,0,0)) ) vVelocity = pClient->getVelocity(); } else if ( pClient ) vVelocity = pClient->getVelocity(); pFindPath->setCompleteInterrupt(CONDITION_SEE_CUR_ENEMY); addTask(pFindPath); /*if ( pBot->isTF2() ) { int playerclass = ((CBotTF2*)pBot)->getClass(); if ( ( playerclass == TF_CLASS_SOLDIER ) || (playerclass == TF_CLASS_DEMOMAN) ) addTask(new CBotTF2ShootLastEnemyPosition(vLastSee,pEnemy,vVelocity)); }*/ addTask(new CFindLastEnemy(vLastSee,vVelocity)); ////////////// pFindPath->setNoInterruptions(); }
CGotoHideSpotSched :: CGotoHideSpotSched ( CBot *pBot, edict_t *pEdict, bool bIsGrenade ) { // run at flank while shooting CFindPathTask *pHideGoalPoint = new CFindPathTask(pEdict); pBot->setCoverFrom(pEdict); addTask(new CFindGoodHideSpot(pEdict)); addTask(pHideGoalPoint); if ( bIsGrenade ) addTask(new CDODWaitForGrenadeTask(pEdict)); // don't need to hide if the player we're hiding from died while we're running away pHideGoalPoint->failIfTaskEdictDead(); pHideGoalPoint->setLookTask(LOOK_WAYPOINT); // no interrupts, should be a quick waypoint path anyway pHideGoalPoint->setNoInterruptions(); // get vector from good hide spot task pHideGoalPoint->getPassedVector(); pHideGoalPoint->dontGoToEdict(); if ( bIsGrenade ) { pHideGoalPoint->setRange(BLAST_RADIUS+100.0f); pHideGoalPoint->completeOutOfRangeFromEdict(); } }
CGotoHideSpotSched :: CGotoHideSpotSched (CBot *pBot, Vector vOrigin, IBotTaskInterrupt *interrupt ) { // run at flank while shooting CFindPathTask *pHideGoalPoint = new CFindPathTask(); pBot->setCoverFrom(NULL); addTask(new CFindGoodHideSpot(vOrigin)); addTask(pHideGoalPoint); // no interrupts, should be a quick waypoint path anyway pHideGoalPoint->setNoInterruptions(); pHideGoalPoint->setInterruptFunction(interrupt); // get vector from good hide spot task pHideGoalPoint->getPassedVector(); }
// from the bots UTILITIES , execute the given action bool CHLDMBot :: executeAction ( eBotAction iAction ) { switch ( iAction ) { case BOT_UTIL_HL2DM_USE_CRATE: // check if it is worth it first { const char *szModel; char type; CBotWeapon *pWeapon = NULL; /* possible models 0000000000111111111122222222223333 0123456789012345678901234567890123 models/items/ammocrate_ar2.mdl models/items/ammocrate_grenade.mdl models/items/ammocrate_rockets.mdl models/items/ammocrate_smg1.mdl */ szModel = m_pAmmoCrate.get()->GetIServerEntity()->GetModelName().ToCStr(); type = szModel[23]; if ( type == 'a' ) // ar2 { pWeapon = m_pWeapons->getWeapon(CWeapons::getWeapon(HL2DM_WEAPON_AR2)); } else if ( type == 'g' ) // grenade { pWeapon = m_pWeapons->getWeapon(CWeapons::getWeapon(HL2DM_WEAPON_FRAG)); } else if ( type == 'r' ) // rocket { pWeapon = m_pWeapons->getWeapon(CWeapons::getWeapon(HL2DM_WEAPON_RPG)); } else if ( type == 's' ) // smg { pWeapon = m_pWeapons->getWeapon(CWeapons::getWeapon(HL2DM_WEAPON_SMG1)); } if ( pWeapon && (pWeapon->getAmmo(this) < 1) ) { CBotSchedule *pSched = new CBotSchedule(); pSched->addTask(new CFindPathTask(m_pAmmoCrate)); pSched->addTask(new CBotHL2DMUseButton(m_pAmmoCrate)); m_pSchedules->add(pSched); m_fUtilTimes[iAction] = engine->Time() + randomFloat(5.0f,10.0f); return true; } } return false; case BOT_UTIL_PICKUP_WEAPON: m_pSchedules->add(new CBotPickupSched(m_pNearbyWeapon.get())); return true; case BOT_UTIL_FIND_NEAREST_HEALTH: m_pSchedules->add(new CBotPickupSched(m_pHealthKit.get())); return true; case BOT_UTIL_HL2DM_FIND_ARMOR: m_pSchedules->add(new CBotPickupSched(m_pBattery.get())); return true; case BOT_UTIL_FIND_NEAREST_AMMO: m_pSchedules->add(new CBotPickupSched(m_pAmmoKit.get())); m_fUtilTimes[iAction] = engine->Time() + randomFloat(5.0f,10.0f); return true; case BOT_UTIL_HL2DM_USE_HEALTH_CHARGER: { CBotSchedule *pSched = new CBotSchedule(); pSched->addTask(new CFindPathTask(m_pHealthCharger)); pSched->addTask(new CBotHL2DMUseCharger(m_pHealthCharger,CHARGER_HEALTH)); m_pSchedules->add(pSched); m_fUtilTimes[BOT_UTIL_HL2DM_USE_HEALTH_CHARGER] = engine->Time() + randomFloat(5.0f,10.0f); return true; } case BOT_UTIL_HL2DM_USE_CHARGER: { CBotSchedule *pSched = new CBotSchedule(); pSched->addTask(new CFindPathTask(m_pCharger)); pSched->addTask(new CBotHL2DMUseCharger(m_pCharger,CHARGER_ARMOR)); m_pSchedules->add(pSched); m_fUtilTimes[BOT_UTIL_HL2DM_USE_CHARGER] = engine->Time() + randomFloat(5.0f,10.0f); return true; } case BOT_UTIL_HL2DM_GRAVIGUN_PICKUP: { CBotSchedule *pSched = new CBotSchedule(new CBotGravGunPickup(m_pCurrentWeapon,m_NearestPhysObj)); pSched->setID(SCHED_GRAVGUN_PICKUP); m_pSchedules->add(pSched); return true; } case BOT_UTIL_FIND_LAST_ENEMY: { Vector vVelocity = Vector(0,0,0); CClient *pClient = CClients::get(m_pLastEnemy); CBotSchedule *pSchedule = new CBotSchedule(); CFindPathTask *pFindPath = new CFindPathTask(m_vLastSeeEnemy); pFindPath->setCompleteInterrupt(CONDITION_SEE_CUR_ENEMY); if ( !CClassInterface::getVelocity(m_pLastEnemy,&vVelocity) ) { if ( pClient ) vVelocity = pClient->getVelocity(); } pSchedule->addTask(pFindPath); pSchedule->addTask(new CFindLastEnemy(m_vLastSeeEnemy,vVelocity)); ////////////// pFindPath->setNoInterruptions(); m_pSchedules->add(pSchedule); m_bLookedForEnemyLast = true; return true; } case BOT_UTIL_THROW_GRENADE: { // find hide waypoint CWaypoint *pWaypoint = CWaypoints::getWaypoint(CWaypointLocations::GetCoverWaypoint(getOrigin(),m_vLastSeeEnemy,NULL)); if ( pWaypoint ) { CBotSchedule *pSched = new CBotSchedule(); pSched->addTask(new CThrowGrenadeTask(m_pWeapons->getWeapon(CWeapons::getWeapon(HL2DM_WEAPON_FRAG)),getAmmo(CWeapons::getWeapon(HL2DM_WEAPON_FRAG)->getAmmoIndex1()),m_vLastSeeEnemyBlastWaypoint)); // first - throw pSched->addTask(new CFindPathTask(pWaypoint->getOrigin())); // 2nd -- hide m_pSchedules->add(pSched); return true; } } case BOT_UTIL_SNIPE: { // roam CWaypoint *pWaypoint = CWaypoints::randomWaypointGoal(CWaypointTypes::W_FL_SNIPER); if ( pWaypoint ) { CBotSchedule *snipe = new CBotSchedule(); CBotTask *findpath = new CFindPathTask(CWaypoints::getWaypointIndex(pWaypoint)); CBotTask *snipetask; // use DOD task snipetask = new CBotHL2DMSnipe(m_pWeapons->getWeapon(CWeapons::getWeapon(HL2DM_WEAPON_CROSSBOW)),pWaypoint->getOrigin(),pWaypoint->getAimYaw(),false,0); findpath->setCompleteInterrupt(CONDITION_PUSH); snipetask->setCompleteInterrupt(CONDITION_PUSH); snipe->setID(SCHED_DEFENDPOINT); snipe->addTask(findpath); snipe->addTask(snipetask); m_pSchedules->add(snipe); return true; } break; } case BOT_UTIL_ROAM: // roam CWaypoint *pWaypoint = CWaypoints::getWaypoint(CWaypoints::randomFlaggedWaypoint(getTeam())); if ( pWaypoint ) { m_pSchedules->add(new CBotGotoOriginSched(pWaypoint->getOrigin())); return true; } break; } return false; }