int LairObserverImplementation::notifyObserverEvent(unsigned int eventType, Observable* observable, ManagedObject* arg1, int64 arg2) { int ret = 1; int i = 0; Reference<LairAggroTask*> task = NULL; SceneObject* sourceObject = cast<SceneObject*>(arg1); AiAgent* agent = NULL; ManagedReference<LairObserver*> lairObserver = _this.get(); ManagedReference<TangibleObject*> lair = cast<TangibleObject*>(observable); ManagedReference<TangibleObject*> attacker = cast<TangibleObject*>(arg1); switch (eventType) { case ObserverEventType::OBJECTREMOVEDFROMZONE: despawnSpawns(); return 1; break; case ObserverEventType::OBJECTDESTRUCTION: notifyDestruction(lair, attacker, (int)arg2); return 1; break; case ObserverEventType::DAMAGERECEIVED: // if there are living creatures, make them aggro if(getLivingCreatureCount() > 0 ){ task = new LairAggroTask(lair, attacker.get(), _this.get(), false); task->execute(); } EXECUTE_TASK_3(lairObserver, lair, attacker, { Locker locker(lair_p); lairObserver_p->checkForNewSpawns(lair_p, attacker_p); }); checkForHeal(lair, attacker); break; case ObserverEventType::AIMESSAGE: if (sourceObject == NULL) { Logger::console.error("LairObserverImplemenation::notifyObserverEvent does not have a source object"); return 1; } for (i = 0; i < spawnedCreatures.size(); i++) { agent = cast<AiAgent*>(spawnedCreatures.get(i).get()); if (agent == NULL) continue; agent->activateInterrupt(sourceObject, arg2); } break; }
void LairObserverImplementation::checkForHeal(TangibleObject* lair, TangibleObject* attacker, bool forceNewUpdate) { if (lair->isDestroyed() || getMobType() == LairTemplate::NPC) return; if (!(getLivingCreatureCount() > 0 && lair->getConditionDamage() > 0)) return; if (healLairEvent == NULL) { healLairEvent = new HealLairObserverEvent(lair, attacker, _this.get()); healLairEvent->schedule(1000); } else if (!healLairEvent->isScheduled()) { healLairEvent->schedule(1000); } else if (attacker != NULL) healLairEvent->setAttacker(attacker); }
int LairObserverImplementation::notifyObserverEvent(unsigned int eventType, Observable* observable, ManagedObject* arg1, int64 arg2) { int ret = 1; int i = 0; Reference<LairAggroTask*> task = NULL; SceneObject* sourceObject = cast<SceneObject*>(arg1); AiAgent* agent = NULL; switch (eventType) { case ObserverEventType::OBJECTDESTRUCTION: notifyDestruction(cast<TangibleObject*>(observable), cast<TangibleObject*>(arg1), (int)arg2); return 1; break; case ObserverEventType::DAMAGERECEIVED: // if there are living creatures, make them aggro if(getLivingCreatureCount() > 0 ){ task = new LairAggroTask(cast<TangibleObject*>(observable), cast<TangibleObject*>(arg1), _this.get(), false); task->execute(); } // if new creatures have spawned or there are live creatures near the lair if( checkForNewSpawns(cast<TangibleObject*>(observable), cast<TangibleObject*>(arg1)) || getLivingCreatureCount() > 0 ) checkForHeal(cast<TangibleObject*>(observable), cast<TangibleObject*>(arg1)); break; case ObserverEventType::AIMESSAGE: if (sourceObject == NULL) { Logger::console.error("LairObserverImplemenation::notifyObserverEvent does not have a source object"); return 1; } for (i = 0; i < spawnedCreatures.size(); i++) { agent = cast<AiAgent*>(spawnedCreatures.get(i).get()); if (agent == NULL) continue; agent->activateInterrupt(sourceObject, arg2); } break; } return 0; }