//-------------------------------- Update ------------------------------------- // void Raven_Bot::Update() { //process the currently active goal. Note this is required even if the bot //is under user control. This is because a goal is created whenever a user //clicks on an area of the map that necessitates a path planning request. m_pBrain->Process(); //Calculate the steering force and update the bot's velocity and position UpdateMovement(); //if the bot is under AI control but not scripted if (!isPossessed()) { //examine all the opponents in the bots sensory memory and select one //to be the current target if (m_pTargetSelectionRegulator->isReady()) { m_pTargSys->Update(); } //appraise and arbitrate between all possible high level goals if (m_pGoalArbitrationRegulator->isReady()) { m_pBrain->Arbitrate(); } //update the sensory memory with any visual stimulus if (m_pVisionUpdateRegulator->isReady()) { m_pSensoryMem->UpdateVision(); } //select the appropriate weapon to use from the weapons currently in //the inventory if (m_pWeaponSelectionRegulator->isReady()) { m_pWeaponSys->SelectWeapon(); } //this method aims the bot's current weapon at the current target //and takes a shot if a shot is possible m_pWeaponSys->TakeAimAndShoot(); } }
void Pet::Update(uint32 diff) { if (m_removed) // pet already removed, just wait in remove queue, no updates return; if (m_loading) return; switch (m_deathState) { case CORPSE: { if (getPetType() != HUNTER_PET || m_corpseRemoveTime <= time(NULL)) { Remove(PET_SAVE_NOT_IN_SLOT); //hunters' pets never get removed because of death, NEVER! return; } break; } case ALIVE: { // unsummon pet that lost owner Player* owner = GetOwner(); if (!owner || (!IsWithinDistInMap(owner, GetMap()->GetVisibilityRange()) && !isPossessed()) || (isControlled() && !owner->GetPetGUID())) //if (!owner || (!IsWithinDistInMap(owner, GetMap()->GetVisibilityDistance()) && (owner->GetCharmGUID() && (owner->GetCharmGUID() != GetGUID()))) || (isControlled() && !owner->GetPetGUID())) { Remove(PET_SAVE_NOT_IN_SLOT, true); return; } if (isControlled()) { if (owner->GetPetGUID() != GetGUID()) { sLog->outError("Pet %u is not pet of owner %s, removed", GetEntry(), m_owner->GetName()); Remove(getPetType() == HUNTER_PET?PET_SAVE_AS_DELETED:PET_SAVE_NOT_IN_SLOT); return; } } if (m_duration > 0) { if (uint32(m_duration) > diff) m_duration -= diff; else { Remove(getPetType() != SUMMON_PET ? PET_SAVE_AS_DELETED:PET_SAVE_NOT_IN_SLOT); return; } } //regenerate focus for hunter pets or energy for deathknight's ghoul if (m_regenTimer) { if (m_regenTimer > diff) m_regenTimer -= diff; else { switch (getPowerType()) { case POWER_FOCUS: Regenerate(POWER_FOCUS); m_regenTimer += PET_FOCUS_REGEN_INTERVAL - diff; if (!m_regenTimer) ++m_regenTimer; break; // in creature::update //case POWER_ENERGY: // Regenerate(POWER_ENERGY); // m_regenTimer += CREATURE_REGEN_INTERVAL - diff; // if (!m_regenTimer) ++m_regenTimer; // break; default: m_regenTimer = 0; break; } } } if (getPetType() != HUNTER_PET) break; if (m_happinessTimer <= diff) { LoseHappiness(); m_happinessTimer = 7500; } else m_happinessTimer -= diff; break; } default: break; } Creature::Update(diff); }