feat: use unique_ptr in skill repository

This commit is contained in:
k0t9i
2023-01-23 22:34:20 +04:00
parent c01d1c3549
commit 3ccdf1d9e4
9 changed files with 30 additions and 44 deletions

View File

@@ -10,27 +10,10 @@ namespace L2Bot::Domain::DTO
class EntityState class EntityState
{ {
public: public:
const uint32_t GetId() const const std::unique_ptr<Entities::EntityInterface>& GetEntity() const
{ {
return m_Entity->GetId(); return m_Entity;
} }
const std::vector<Serializers::Node> BuildSerializationNodes() const
{
return m_Entity->BuildSerializationNodes();
}
void SaveEntityState()
{
m_Entity->SaveState();
}
const bool IsEntityEqual(const Entities::EntityInterface* other) const
{
return m_Entity->IsEqual(other);
}
void UpdateEntity(const Entities::EntityInterface* other)
{
m_Entity->Update(other);
}
const Enums::EntityStateEnum GetState() const const Enums::EntityStateEnum GetState() const
{ {
return m_State; return m_State;

View File

@@ -33,7 +33,7 @@ namespace L2Bot::Domain::Serializers
result.push_back( result.push_back(
{ {
m_ContainerName, m_ContainerName,
std::vector<Serializers::Node>{ { operationName, kvp->BuildSerializationNodes() } } std::vector<Serializers::Node>{ { operationName, kvp->GetEntity()->BuildSerializationNodes() } }
} }
); );
} }

View File

@@ -22,20 +22,20 @@ public:
auto newObject = callback(item); auto newObject = callback(item);
if (m_Objects.contains(newObject->GetId())) if (m_Objects.contains(newObject->GetId()))
{ {
if (!m_Objects[kvp.first]->IsEntityEqual(newObject.get())) { if (!m_Objects[kvp.first]->GetEntity()->IsEqual(newObject.get())) {
m_Objects[kvp.first]->UpdateEntity(newObject.get()); m_Objects[kvp.first]->GetEntity()->Update(newObject.get());
m_Objects[kvp.first]->UpdateState(Enums::EntityStateEnum::updated); m_Objects[kvp.first]->UpdateState(Enums::EntityStateEnum::updated);
} }
else else
{ {
m_Objects[kvp.first]->UpdateState(Enums::EntityStateEnum::none); m_Objects[kvp.first]->UpdateState(Enums::EntityStateEnum::none);
} }
//delete newObject;
} }
else else
{ {
const auto objectId = newObject->GetId();
m_Objects.emplace( m_Objects.emplace(
newObject->GetId(), objectId,
new DTO::EntityState{ std::move(newObject), Enums::EntityStateEnum::created } new DTO::EntityState{ std::move(newObject), Enums::EntityStateEnum::created }
); );
} }
@@ -43,9 +43,9 @@ public:
for (auto& kvp : m_Objects) for (auto& kvp : m_Objects)
{ {
if (!items.contains(kvp.second->GetId())) if (!items.contains(kvp.second->GetEntity()->GetId()))
{ {
m_Objects[kvp.first]->SaveEntityState(); m_Objects[kvp.first]->GetEntity()->SaveState();
kvp.second->UpdateState(Enums::EntityStateEnum::deleted); kvp.second->UpdateState(Enums::EntityStateEnum::deleted);
} }
} }

View File

@@ -21,7 +21,7 @@ namespace Interlude
DropFactory() = delete; DropFactory() = delete;
virtual ~DropFactory() = default; virtual ~DropFactory() = default;
std::unique_ptr<Entities::EntityInterface> Create(const Item* item) const std::unique_ptr<Entities::Drop> Create(const Item* item) const
{ {
const auto itemData = m_L2GameData.GetItemData(item->itemId); const auto itemData = m_L2GameData.GetItemData(item->itemId);
const auto nameEntry = itemData ? m_FName.GetEntry(itemData->nameIndex) : nullptr; const auto nameEntry = itemData ? m_FName.GetEntry(itemData->nameIndex) : nullptr;

View File

@@ -13,7 +13,7 @@ namespace Interlude
HeroFactory() = default; HeroFactory() = default;
virtual ~HeroFactory() = default; virtual ~HeroFactory() = default;
std::unique_ptr<Entities::EntityInterface> Create(const User* item) const std::unique_ptr<Entities::Hero> Create(const User* item) const
{ {
const auto playerController = item->pawn ? item->pawn->lineagePlayerController : nullptr; const auto playerController = item->pawn ? item->pawn->lineagePlayerController : nullptr;

View File

@@ -12,7 +12,7 @@ namespace Interlude
NPCFactory() = default; NPCFactory() = default;
virtual ~NPCFactory() = default; virtual ~NPCFactory() = default;
std::unique_ptr<Entities::EntityInterface> Create(const User* item, const Enums::SpoilStateEnum spoiledState) const std::unique_ptr<Entities::NPC> Create(const User* item, const Enums::SpoilStateEnum spoiledState) const
{ {
return std::make_unique<Entities::NPC>( return std::make_unique<Entities::NPC>(
item->objectId, item->objectId,

View File

@@ -12,7 +12,7 @@ namespace Interlude
PlayerFactory() = default; PlayerFactory() = default;
virtual ~PlayerFactory() = default; virtual ~PlayerFactory() = default;
std::unique_ptr<Entities::EntityInterface> Create(const User* item) const std::unique_ptr<Entities::Player> Create(const User* item) const
{ {
return std::make_unique<Entities::Player>( return std::make_unique<Entities::Player>(
item->objectId, item->objectId,

View File

@@ -24,7 +24,7 @@ namespace Interlude
SkillFactory() = delete; SkillFactory() = delete;
virtual ~SkillFactory() = default; virtual ~SkillFactory() = default;
std::unique_ptr<Entities::EntityInterface> Create(const uint32_t skillId, const uint32_t level, const uint32_t isActive) const std::unique_ptr<Entities::Skill> Create(const uint32_t skillId, const uint32_t level, const uint32_t isActive) const
{ {
const auto data = m_L2GameData.GetMSData(skillId, level); const auto data = m_L2GameData.GetMSData(skillId, level);

View File

@@ -26,7 +26,13 @@ namespace Interlude
{ {
std::unique_lock<std::shared_timed_mutex>(m_Mutex); std::unique_lock<std::shared_timed_mutex>(m_Mutex);
const auto objects = m_EntityHandler.GetEntities<Entities::Skill*>(m_Skills, [this](Entities::Skill* item) { std::map<uint32_t, Entities::Skill*> skillPtrs;
for (const auto& kvp : m_Skills)
{
skillPtrs[kvp.first] = kvp.second.get();
}
const auto objects = m_EntityHandler.GetEntities<Entities::Skill*>(skillPtrs, [this](Entities::Skill* item) {
return std::make_unique<Entities::Skill>(item); return std::make_unique<Entities::Skill>(item);
}); });
@@ -72,10 +78,6 @@ namespace Interlude
void Reset() override void Reset() override
{ {
std::shared_lock<std::shared_timed_mutex>(m_Mutex); std::shared_lock<std::shared_timed_mutex>(m_Mutex);
for (const auto kvp : m_Skills)
{
delete kvp.second;
}
m_Skills.clear(); m_Skills.clear();
} }
@@ -106,8 +108,7 @@ namespace Interlude
skillInfo[0] skillInfo[0]
); );
auto test = static_cast<Entities::Skill*>(skill.get()); m_Skills.emplace(skill->GetId(), std::move(skill));
m_Skills.emplace(skill->GetId(), test);
} }
else else
{ {
@@ -130,7 +131,8 @@ namespace Interlude
return; return;
} }
auto skill = m_Skills[skillId]; const auto& skill = m_Skills[skillId];
skill->UpdateReloadingState(true); skill->UpdateReloadingState(true);
skill->UpdateCastingState(true); skill->UpdateCastingState(true);
@@ -162,12 +164,13 @@ namespace Interlude
//todo exception? //todo exception?
return; return;
} }
auto skill = m_Skills[m_UsedSkillId];
const auto& skill = m_Skills[m_UsedSkillId];
skill->UpdateCastingState(false); skill->UpdateCastingState(false);
m_CastingTimers.StopTimer(skill->GetId());
m_UsedSkillId = 0; m_UsedSkillId = 0;
m_CastingTimers.StopTimer(skill->GetId());
} }
} }
} }
@@ -188,7 +191,7 @@ namespace Interlude
for (auto it = m_Skills.begin(); it != m_Skills.end();) for (auto it = m_Skills.begin(); it != m_Skills.end();)
{ {
auto skill = it->second; const auto& skill = it->second;
const auto needToToggle = ids.find(skill->GetId()) != ids.end(); const auto needToToggle = ids.find(skill->GetId()) != ids.end();
// buff time less than zero means this is a aura // buff time less than zero means this is a aura
@@ -212,7 +215,7 @@ namespace Interlude
private: private:
const SkillFactory& m_Factory; const SkillFactory& m_Factory;
std::map<uint32_t, Entities::Skill*> m_Skills; std::map<uint32_t, std::unique_ptr<Entities::Skill>> m_Skills;
uint32_t m_UsedSkillId = 0; uint32_t m_UsedSkillId = 0;
const NetworkHandlerWrapper& m_NetworkHandler; const NetworkHandlerWrapper& m_NetworkHandler;
TimerMap m_ReloadingTimers; TimerMap m_ReloadingTimers;