CBotTF2HealSched::CBotTF2HealSched(edict_t *pHeal) { CFindPathTask *findpath = new CFindPathTask(pHeal); findpath->setCompleteInterrupt(CONDITION_SEE_HEAL); addTask(findpath); addTask(new CBotTF2MedicHeal()); }
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(); }
// 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; }