#pragma once #include #include "Domain/Repositories/EntityRepositoryInterface.h" #include "../Factories/HeroFactory.h" #include "Domain/Events/HeroCreatedEvent.h" #include "Domain/Events/HeroDeletedEvent.h" #include "../GameStructs/NetworkHandlerWrapper.h" #include "Domain/Services/ServiceLocator.h" using namespace L2Bot::Domain; namespace Interlude { class HeroRepository : public Repositories::EntityRepositoryInterface { public: const std::unordered_map> GetEntities() override { std::unique_lock(m_Mutex); const auto hero = m_NetworkHandler.GetHero(); std::unordered_map> result; if (hero) { if (!m_Hero) { m_Hero = m_Factory.Create(hero); Services::ServiceLocator::GetInstance().GetEventDispatcher()->Dispatch(Events::HeroCreatedEvent{}); Services::ServiceLocator::GetInstance().GetLogger()->App(L"{} enter in the world", m_Hero->GetFullName().GetNickname()); } else { m_Factory.Update(m_Hero, hero); } result[hero->objectId] = m_Hero; } else if (m_Hero) { Services::ServiceLocator::GetInstance().GetLogger()->App(L"{} leave the world", m_Hero->GetFullName().GetNickname()); m_Hero = nullptr; Services::ServiceLocator::GetInstance().GetEventDispatcher()->Dispatch(Events::HeroDeletedEvent{}); } return result; } void Reset() override { std::shared_lock(m_Mutex); m_Hero = nullptr; } HeroRepository(const NetworkHandlerWrapper& networkHandler, const HeroFactory& factory) : m_NetworkHandler(networkHandler), m_Factory(factory) { } HeroRepository() = delete; virtual ~HeroRepository() = default; private: const HeroFactory& m_Factory; const NetworkHandlerWrapper& m_NetworkHandler; std::shared_ptr m_Hero; }; }