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; }
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; }