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);
	}
}
Exemplo n.º 2
0
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);
}