void EntertainerMissionObjectiveImplementation::clearLocationActiveAreaAndObservers() { Locker _lock(_this.getReferenceUnsafeStaticCast()); if (locationActiveArea != NULL) { Locker locationLocker(locationActiveArea, _this.getReferenceUnsafeStaticCast()); for (int i = 0; i < getObserverCount(); i++) { ManagedReference<MissionObserver*> observer = getObserver(i); if (i == 0) { locationActiveArea->dropObserver(ObserverEventType::ENTEREDAREA, observer); } else { locationActiveArea->dropObserver(ObserverEventType::EXITEDAREA, observer); } } removeAllObservers(); locationActiveArea->destroyObjectFromWorld(true); locationActiveArea->destroyObjectFromDatabase(true); } }
Object::~Object() { CLOG(TRACE, "EventSystem") << "Destroying Object " << *this; CLOG(TRACE, "EventSystem") << "Removing from observed Subjects"; while (!m_observations.empty()) { auto iter = m_observations.begin(); if (REGISTRY.contains(iter->first)) { CLOG(TRACE, "EventSystem") << "Removing from Subject " << *(iter->first); iter->first->removeObserver(*this); } else { CLOG(TRACE, "EventSystem") << "Subject " << *(iter->first) << " already deleted, skipping"; } } removeAllObservers(); REGISTRY.remove(this); }