void AvHDefenseChamber::RegenAliensThink() { // Loop through all players CBaseEntity* theBaseEntity = NULL; int theNumEntsHealed = 0; while(((theBaseEntity = UTIL_FindEntityInSphere(theBaseEntity, this->pev->origin, BALANCE_VAR(kDefensiveChamberHealRange))) != NULL) && (theNumEntsHealed < BALANCE_VAR(kAlienChamberMaxPlayers))) { if(theBaseEntity->pev->team == this->pev->team) { AvHBaseBuildable* theBuildable = dynamic_cast<AvHBaseBuildable*>(theBaseEntity); AvHPlayer* thePlayer = dynamic_cast<AvHPlayer*>(theBaseEntity); float thePercent=BALANCE_VAR(kDefensiveChamberRegenPercent)/100.0f; float amount=BALANCE_VAR(kDefensiveChamberRegenAmount) + (theBaseEntity->pev->max_health*thePercent); if(thePlayer && thePlayer->IsAlive()) { if(thePlayer->Heal(amount, true, true)) { theNumEntsHealed++; } } else if(theBuildable && theBuildable->GetIsBuilt() && (theBuildable != this)) { if(theBuildable->Regenerate(amount, true, true)) { theNumEntsHealed++; } } } } // Set next think this->pev->nextthink = gpGlobals->time + BALANCE_VAR(kDefenseChamberThinkInterval); // Play a random idle animation int theIdle = this->GetIdle1Animation(); if(RANDOM_LONG(0, 1)) { theIdle = this->GetIdle2Animation(); } this->PlayAnimationAtIndex(theIdle); }
void AvHHive::ProcessHealing() { // Regenerate nearby friendly aliens CBaseEntity* theEntity = NULL; const int theHiveHealRadius = BALANCE_VAR(kHiveHealRadius); while((theEntity = UTIL_FindEntityInSphere(theEntity, this->pev->origin, theHiveHealRadius)) != NULL) { AvHPlayer* thePlayer = dynamic_cast<AvHPlayer*>(theEntity); if(thePlayer) { if(thePlayer->GetIsRelevant() && (thePlayer->GetTeam() == this->GetTeamNumber()) && !thePlayer->GetIsBeingDigested()) { // Hive heals percentage of player health float theRegenPercentage = BALANCE_VAR(kHiveRegenerationPercentage); int theMaxHealth = AvHPlayerUpgrade::GetMaxHealth(thePlayer->pev->iuser4, (AvHUser3)thePlayer->pev->iuser3, thePlayer->GetExperienceLevel()); float theRegenAmount = (theRegenPercentage*theMaxHealth); thePlayer->Heal(theRegenAmount, true); } } } // Regenerate self bool theDidHeal = false; // If we aren't at full health, heal health if(this->pev->health < this->mMaxHitPoints) { float theHiveRegenAmount = BALANCE_VAR(kHiveRegenerationAmount); float theCombatModeScalar = /*GetGameRules()->GetIsCombatMode() ? (1.0f/BALANCE_VAR(kCombatModeTimeScalar)) :*/ 1.0f; this->pev->health = min((float)this->mMaxHitPoints, this->pev->health + theHiveRegenAmount*theCombatModeScalar); theDidHeal = true; } // Play regen event if(theDidHeal) { // Play regeneration event PLAYBACK_EVENT_FULL(0, this->edict(), gRegenerationEventID, 0, this->pev->origin, (float *)&g_vecZero, 1.0f, 0.0, /*theWeaponIndex*/ 0, 0, 0, 0 ); } }
void AvHHealingSpray::FireProjectiles(void) { #ifdef AVH_SERVER // Look for entities in cone CBaseEntity* theCurrentEntity = NULL; vec3_t theOriginatingPosition = this->m_pPlayer->GetGunPosition(); while((theCurrentEntity = UTIL_FindEntityInSphere(theCurrentEntity, theOriginatingPosition, kHealingSprayRange)) != NULL) { bool isSelf=(theCurrentEntity == this->m_pPlayer); // Can't affect self // if(theCurrentEntity != this->m_pPlayer) // { // If entity is in view cone, and within range if(isSelf || this->m_pPlayer->FInViewCone(&theCurrentEntity->pev->origin) ) { // UTIL_FindEntityInSphere doesn't seem to take height into account. Make sure the entity is within range. float theMaxEntitySize = max(Length(theCurrentEntity->pev->mins), Length(theCurrentEntity->pev->maxs)); vec3_t theVectorDiff; VectorSubtract(theCurrentEntity->pev->origin, theOriginatingPosition, theVectorDiff); float theDiff = Length(theVectorDiff) - theMaxEntitySize; if(theDiff < kHealingSprayRange/2) { // Make sure entity is in line of fire TraceResult tr; UTIL_TraceLine(theOriginatingPosition, theCurrentEntity->Center(), dont_ignore_monsters, dont_ignore_glass, ENT(pev)/*pentIgnore*/, &tr); CBaseEntity* theBlockedByEntity = CBaseEntity::Instance(tr.pHit); if((tr.flFraction == 1.0) || (theBlockedByEntity == theCurrentEntity)) { // Heal friendly player or building in range float theFocusAmount = 1.0f; if(AvHSHUGetIsWeaponFocusable(AvHWeaponID(this->m_iId))) { theFocusAmount = AvHPlayerUpgrade::GetFocusDamageUpgrade(this->m_pPlayer->pev->iuser4); } float theDamage = this->mDamage*theFocusAmount; AvHPlayer* thePlayer = dynamic_cast<AvHPlayer*>(theCurrentEntity); if(theCurrentEntity->pev->team == this->m_pPlayer->pev->team) { // Players and buildables heal armor too AvHBaseBuildable* theBuildable = dynamic_cast<AvHBaseBuildable*>(theCurrentEntity); const int theBuildableHealingSprayScalar = BALANCE_VAR(kHealingSprayBuildableScalar); if(thePlayer) { // Players heal by base amount, plus percentage of health float thePercentage = BALANCE_VAR(kHealingSprayPlayerPercent)/100.0f; theDamage += thePercentage*theCurrentEntity->pev->max_health; if ( isSelf ) theDamage *= 0.5f; thePlayer->Heal(theDamage, true); } else if(theBuildable) { // Structures heal base amount times scalar float theAmount = theDamage*(float)theBuildableHealingSprayScalar; if(theBuildable->Regenerate(theAmount, true)) { // Award experience for healing the hive. Might award a little more if barely wounded, but that seems OK. if(GetGameRules()->GetIsCombatMode() && (theBuildable->pev->iuser3 == AVH_USER3_HIVE)) { AvHPlayer* theHealsprayingPlayer = dynamic_cast<AvHPlayer*>(this->m_pPlayer); if(theHealsprayingPlayer && (theHealsprayingPlayer->pev->team == theBuildable->pev->team)) { float theCombatHealExperienceScalar = BALANCE_VAR(kCombatHealExperienceScalar); theHealsprayingPlayer->AwardExperienceForObjective(theAmount*theCombatHealExperienceScalar, theBuildable->GetMessageID()); } } } } else { theCurrentEntity->TakeHealth(theDamage, this->GetDamageType()); } } else if(thePlayer) { thePlayer->TakeDamage(this->pev, this->m_pPlayer->pev, theDamage, this->GetDamageType()); } } } } // } } #endif }