feat: add armor item
This commit is contained in:
@ -6,7 +6,8 @@
|
||||
#include "../GameStructs/L2GameDataWrapper.h"
|
||||
#include "../GameStructs/FName.h"
|
||||
#include "../../../Common/Common.h"
|
||||
#include "Domain/Entities/BaseItem.h"
|
||||
#include "Domain/Entities/EtcItem.h"
|
||||
#include "Domain/Entities/ArmorItem.h"
|
||||
#include "../../../DTO/ItemData.h"
|
||||
|
||||
using namespace L2Bot::Domain;
|
||||
@ -30,19 +31,98 @@ namespace Interlude
|
||||
const auto data = m_L2GameData.GetItemData(itemInfo.itemId);
|
||||
|
||||
const auto nameEntry = data ? m_FName.GetEntry(data->nameIndex) : nullptr;
|
||||
const auto name = nameEntry ? ConvertFromWideChar(nameEntry->value) : "";
|
||||
const auto iconEntry = data ? m_FName.GetEntry(data->iconNameIndex) : nullptr;
|
||||
const auto description = data && data->description ? data->description : L"";
|
||||
const auto icon = iconEntry ? ConvertFromWideChar(iconEntry->value) : "";
|
||||
const auto description = data && data->description ? ConvertFromWideChar(data->description) : "";
|
||||
|
||||
return std::make_unique<Entities::BaseItem>(
|
||||
if (data)
|
||||
{
|
||||
switch (data->dataType)
|
||||
{
|
||||
case L2::ItemDataType::ARMOR:
|
||||
return CreateArmor(itemInfo, data, name, icon, description);
|
||||
case L2::ItemDataType::WEAPON:
|
||||
return CreateEtc(itemInfo, data, name, icon, description);
|
||||
}
|
||||
}
|
||||
|
||||
return CreateEtc(itemInfo, data, name, icon, description);
|
||||
}
|
||||
|
||||
std::unique_ptr<Entities::BaseItem> CreateFromPointer(const Entities::BaseItem* other) const
|
||||
{
|
||||
{
|
||||
const auto object = dynamic_cast<const Entities::EtcItem*>(other);
|
||||
if (object)
|
||||
{
|
||||
return std::make_unique<Entities::EtcItem>(object);
|
||||
}
|
||||
}
|
||||
{
|
||||
const auto object = dynamic_cast<const Entities::ArmorItem*>(other);
|
||||
if (object)
|
||||
{
|
||||
return std::make_unique<Entities::ArmorItem>(object);
|
||||
}
|
||||
}
|
||||
|
||||
return std::make_unique<Entities::BaseItem>(other);
|
||||
}
|
||||
|
||||
private:
|
||||
std::unique_ptr<Entities::BaseItem> CreateEtc(
|
||||
const ItemData& itemInfo,
|
||||
const FL2ItemDataBase* itemData,
|
||||
const std::string& name,
|
||||
const std::string& icon,
|
||||
const std::string& description
|
||||
) const
|
||||
{
|
||||
return std::make_unique<Entities::EtcItem>(
|
||||
itemInfo.objectId,
|
||||
itemInfo.itemId,
|
||||
itemInfo.mana,
|
||||
name,
|
||||
icon,
|
||||
description,
|
||||
itemData ? itemData->weight : 0,
|
||||
itemInfo.amount,
|
||||
itemInfo.isQuest
|
||||
);
|
||||
}
|
||||
|
||||
std::unique_ptr<Entities::BaseItem> CreateArmor(
|
||||
const ItemData& itemInfo,
|
||||
const FL2ItemDataBase* itemData,
|
||||
const std::string& name,
|
||||
const std::string& icon,
|
||||
const std::string& description
|
||||
) const
|
||||
{
|
||||
const auto casted = static_cast<const FL2ArmorItemData*>(itemData);
|
||||
|
||||
const auto setEffect = casted && casted->setEffect ? ConvertFromWideChar(casted->setEffect) : "";
|
||||
const auto addSetEffect = casted && casted->setEffect ? ConvertFromWideChar(casted->setEffect) : "";
|
||||
const auto enchantEffect = casted && casted->enchantEffect ? ConvertFromWideChar(casted->enchantEffect) : "";
|
||||
|
||||
return std::make_unique<Entities::ArmorItem>(
|
||||
itemInfo.objectId,
|
||||
itemInfo.itemId,
|
||||
itemInfo.mana,
|
||||
name,
|
||||
icon,
|
||||
description,
|
||||
itemData ? itemData->weight : 0,
|
||||
itemInfo.isEquipped > 0,
|
||||
itemInfo.enchantLevel,
|
||||
itemInfo.mana,
|
||||
nameEntry ? ConvertFromWideChar(nameEntry->value) : "",
|
||||
iconEntry ? ConvertFromWideChar(iconEntry->value) : "",
|
||||
ConvertFromWideChar(description),
|
||||
data ? data->weight : 0
|
||||
casted ? static_cast<Enums::ArmorType>(casted->armorType) : Enums::ArmorType::none,
|
||||
casted ? static_cast<Enums::CrystalType>(casted->crystalType) : Enums::CrystalType::none,
|
||||
casted ? casted->pDef : 0,
|
||||
casted ? casted->mDef : 0,
|
||||
setEffect,
|
||||
addSetEffect,
|
||||
enchantEffect
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -107,11 +107,13 @@ namespace Interlude
|
||||
{
|
||||
ItemData
|
||||
{
|
||||
itemInfo.objectId,
|
||||
itemInfo.itemId,
|
||||
itemInfo.amount,
|
||||
itemInfo.isEquipped,
|
||||
itemInfo.enchantLevel,
|
||||
itemInfo.mana,
|
||||
itemInfo.type2 == L2::ItemType2::QUEST
|
||||
}
|
||||
}
|
||||
);
|
||||
@ -122,11 +124,13 @@ namespace Interlude
|
||||
{
|
||||
const ItemData itemData
|
||||
{
|
||||
itemInfo.objectId,
|
||||
itemInfo.itemId,
|
||||
itemInfo.amount,
|
||||
itemInfo.isEquipped,
|
||||
itemInfo.enchantLevel,
|
||||
itemInfo.mana,
|
||||
itemInfo.type2 == L2::ItemType2::QUEST
|
||||
};
|
||||
|
||||
switch (actionType)
|
||||
@ -138,7 +142,7 @@ namespace Interlude
|
||||
EventDispatcher::GetInstance().Dispatch(ItemUpdatedEvent{ itemData });
|
||||
break;
|
||||
case UpdateItemListActionType::deleted:
|
||||
EventDispatcher::GetInstance().Dispatch(ItemDeletedEvent{ itemInfo.itemId });
|
||||
EventDispatcher::GetInstance().Dispatch(ItemDeletedEvent{ itemInfo.objectId });
|
||||
break;
|
||||
}
|
||||
(*__OnReceiveUpdateItemList)(This, actionType, itemInfo);
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "../../../Events/ItemCreatedEvent.h"
|
||||
#include "../../../Events/ItemUpdatedEvent.h"
|
||||
#include "../../../Events/ItemDeletedEvent.h"
|
||||
#include "../../../Events/HeroDeletedEvent.h"
|
||||
#include "../../../Events/EventDispatcher.h"
|
||||
|
||||
using namespace L2Bot::Domain;
|
||||
@ -30,7 +31,7 @@ namespace Interlude
|
||||
}
|
||||
|
||||
const auto objects = m_EntityHandler.GetEntities<Entities::BaseItem*>(itemPtrs, [this](Entities::BaseItem* item) {
|
||||
return std::make_unique<Entities::BaseItem>(item);
|
||||
return m_Factory.CreateFromPointer(item);
|
||||
});
|
||||
|
||||
auto result = std::vector<std::shared_ptr<DTO::EntityState>>();
|
||||
@ -57,6 +58,18 @@ namespace Interlude
|
||||
EventDispatcher::GetInstance().Subscribe(ItemDeletedEvent::name, [this](const Event& evt) {
|
||||
OnItemDeleted(evt);
|
||||
});
|
||||
EventDispatcher::GetInstance().Subscribe(HeroDeletedEvent::name, [this](const Event& evt) {
|
||||
OnHeroDeleted(evt);
|
||||
});
|
||||
}
|
||||
|
||||
void OnHeroDeleted(const Event& evt)
|
||||
{
|
||||
std::shared_lock<std::shared_timed_mutex>(m_Mutex);
|
||||
if (evt.GetName() == HeroDeletedEvent::name)
|
||||
{
|
||||
Reset();
|
||||
}
|
||||
}
|
||||
|
||||
void OnItemCreated(const Event& evt)
|
||||
@ -68,14 +81,14 @@ namespace Interlude
|
||||
const auto& data = casted.GetItemData();
|
||||
|
||||
auto item = m_Factory.Create(data);
|
||||
if (m_Items.find(data.itemId) == m_Items.end())
|
||||
if (m_Items.find(data.objectId) == m_Items.end())
|
||||
{
|
||||
m_Items.emplace(data.itemId, std::move(item));
|
||||
m_Items.emplace(data.objectId, std::move(item));
|
||||
}
|
||||
else
|
||||
{
|
||||
// When equip/unequip accessories
|
||||
m_Items[data.itemId]->Update(item.get());
|
||||
m_Items[data.objectId]->Update(item.get());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -89,16 +102,17 @@ namespace Interlude
|
||||
const auto& data = casted.GetItemData();
|
||||
|
||||
//todo exception?
|
||||
if (m_Items.find(data.itemId) == m_Items.end())
|
||||
if (m_Items.find(data.objectId) == m_Items.end())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
auto item = m_Factory.Create(data);
|
||||
m_Items[data.itemId]->Update(item.get());
|
||||
m_Items[data.objectId]->Update(item.get());
|
||||
}
|
||||
}
|
||||
|
||||
//todo deleted ehchant scroll
|
||||
void OnItemDeleted(const Event& evt)
|
||||
{
|
||||
//fixme may be a race condition
|
||||
@ -107,7 +121,7 @@ namespace Interlude
|
||||
{
|
||||
const auto casted = static_cast<const ItemDeletedEvent&>(evt);
|
||||
|
||||
m_Items.erase(casted.GetItemId());
|
||||
m_Items.erase(casted.GetObjectId());
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user