#include "UIObservable.h" #include "Entity.h" #include "Game.h" #include "NetworkMessage.h" void UIObservable::notifyObservers(NetworkMessage* msg) { cs.lock(); int index = 0; Framework::Array toDelete; for (auto observer : observers) { Entity* e = Game::INSTANCE->zEntity(observer.sourceEntiryId); if (e) { msg->addressUIElement( observer.uimlElementId, observer.networkApiProcessorId); Game::INSTANCE->sendMessage(msg->clone(), e); } else toDelete.add(index, 0); index++; } for (int i : toDelete) observers.remove(i); cs.unlock(); msg->release(); } void UIObservable::removeObserver( Entity* zSource, Framework::Text uimlElementId, int networkApiProcessorId) { cs.lock(); int index = 0; for (auto observer : observers) { if (observer.sourceEntiryId == zSource->getId() && observer.uimlElementId.istGleich(uimlElementId) && observer.networkApiProcessorId == networkApiProcessorId) { observers.remove(index); break; } index++; } cs.unlock(); } void UIObservable::addObserver( Entity* zSource, Framework::Text uimlElementId, int networkApiProcessorId) { cs.lock(); for (auto observer : observers) { if (observer.sourceEntiryId == zSource->getId() && observer.uimlElementId.istGleich(uimlElementId) && observer.networkApiProcessorId == networkApiProcessorId) { cs.unlock(); return; } } observers.add({zSource->getId(), uimlElementId, networkApiProcessorId}); for (auto call : onObserverAdded) { cs.unlock(); call(zSource, uimlElementId, networkApiProcessorId); cs.lock(); } cs.unlock(); } void UIObservable::registerOnObserverAddedCall(std::function call) { cs.lock(); onObserverAdded.add(call); cs.unlock(); }