#pragma once #include #include "Domain/Repositories/EntityRepositoryInterface.h" #include "../Factories/HeroFactory.h" #include "../../../Events/HeroCreatedEvent.h" #include "../../../Events/HeroDeletedEvent.h" #include "../GameStructs/NetworkHandlerWrapper.h" #include "../../../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); ServiceLocator::GetInstance().GetEventDispatcher()->Dispatch(HeroCreatedEvent{}); } else { m_Factory.Update(m_Hero, hero); } result[hero->objectId] = m_Hero; } else if (m_Hero) { m_Hero = nullptr; ServiceLocator::GetInstance().GetEventDispatcher()->Dispatch(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; }; }