mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-31 13:16:39 +00:00
Get/Put item implementation + tests
This commit is contained in:
@@ -17,9 +17,52 @@
|
||||
*/
|
||||
|
||||
#include "inventory.h"
|
||||
#include "data_verification.h"
|
||||
#include <map>
|
||||
|
||||
struct EQEmu::Inventory::impl
|
||||
{
|
||||
std::map<int, ItemContainer> containers_;
|
||||
};
|
||||
|
||||
EQEmu::Inventory::Inventory() {
|
||||
impl_ = new impl;
|
||||
}
|
||||
|
||||
EQEmu::Inventory::~Inventory() {
|
||||
delete impl_;
|
||||
}
|
||||
|
||||
std::shared_ptr<EQEmu::ItemInstance> EQEmu::Inventory::Get(int container_id, int slot_id) {
|
||||
auto iter = impl_->containers_.find(container_id);
|
||||
if(iter != impl_->containers_.end()) {
|
||||
return iter->second.Get(slot_id);
|
||||
}
|
||||
|
||||
return std::shared_ptr<ItemInstance>(nullptr);
|
||||
}
|
||||
|
||||
std::shared_ptr<EQEmu::ItemInstance> EQEmu::Inventory::Get(int container_id, int slot_id, int bag_idx) {
|
||||
auto iter = impl_->containers_.find(container_id);
|
||||
if(iter != impl_->containers_.end()) {
|
||||
auto item = iter->second.Get(slot_id);
|
||||
if(item) {
|
||||
return item->GetItem(bag_idx);
|
||||
}
|
||||
}
|
||||
|
||||
return std::shared_ptr<ItemInstance>(nullptr);
|
||||
}
|
||||
|
||||
bool EQEmu::Inventory::Put(int container_id, int slot_id, std::shared_ptr<ItemInstance> inst) {
|
||||
if(impl_->containers_.count(container_id) == 0) {
|
||||
auto &container = impl_->containers_[container_id];
|
||||
return container.Put(slot_id, inst);
|
||||
} else {
|
||||
ItemContainer container;
|
||||
bool v = container.Put(slot_id, inst);
|
||||
impl_->containers_[container_id] = container;
|
||||
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
||||
+5
-3
@@ -21,8 +21,6 @@
|
||||
|
||||
#include "item_container.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace EQEmu
|
||||
{
|
||||
enum InventoryType : int
|
||||
@@ -44,8 +42,12 @@ namespace EQEmu
|
||||
Inventory();
|
||||
~Inventory();
|
||||
|
||||
std::shared_ptr<ItemInstance> Get(int container_id, int slot_id);
|
||||
std::shared_ptr<ItemInstance> Get(int container_id, int slot_id, int bag_idx);
|
||||
bool Put(int container_id, int slot_id, std::shared_ptr<ItemInstance> inst);
|
||||
private:
|
||||
std::map<int, ItemContainer> containers_;
|
||||
struct impl;
|
||||
impl *impl_;
|
||||
};
|
||||
|
||||
} // EQEmu
|
||||
|
||||
@@ -33,7 +33,7 @@ bool EQEmu::ItemContainer::Put(int slot_id, std::shared_ptr<ItemInstance> inst)
|
||||
auto iter = impl_->items.find(slot_id);
|
||||
if(iter == impl_->items.end()) {
|
||||
impl_->items[slot_id] = inst;
|
||||
//trigger put in slot_id
|
||||
//trigger insert in slot_id
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
+91
-33
@@ -18,53 +18,111 @@
|
||||
|
||||
#include "item_instance.h"
|
||||
#include "data_verification.h"
|
||||
#include "item_container.h"
|
||||
|
||||
struct EQEmu::ItemInstance::impl {
|
||||
const ItemData *base_item_;
|
||||
ItemData *modified_item_;
|
||||
int16 charges_;
|
||||
uint32 color_;
|
||||
bool attuned_;
|
||||
std::string custom_data_;
|
||||
uint32 ornament_idfile_;
|
||||
uint32 ornament_icon_;
|
||||
uint32 ornament_hero_model_;
|
||||
uint64 tracking_id_;
|
||||
ItemContainer contents_;
|
||||
};
|
||||
|
||||
EQEmu::ItemInstance::ItemInstance() {
|
||||
base_item_ = nullptr;
|
||||
modified_item_ = nullptr;
|
||||
charges_ = -1;
|
||||
color_ = 0;
|
||||
attuned_ = false;
|
||||
ornament_idfile_ = 0;
|
||||
ornament_icon_ = 0;
|
||||
ornament_hero_model_ = 0;
|
||||
tracking_id_ = 0;
|
||||
impl_ = new impl;
|
||||
impl_->base_item_ = nullptr;
|
||||
impl_->modified_item_ = nullptr;
|
||||
impl_->charges_ = -1;
|
||||
impl_->color_ = 0;
|
||||
impl_->attuned_ = false;
|
||||
impl_->ornament_idfile_ = 0;
|
||||
impl_->ornament_icon_ = 0;
|
||||
impl_->ornament_hero_model_ = 0;
|
||||
impl_->tracking_id_ = 0;
|
||||
}
|
||||
|
||||
EQEmu::ItemInstance::ItemInstance(const ItemData* idata) {
|
||||
base_item_ = idata;
|
||||
modified_item_ = nullptr;
|
||||
charges_ = -1;
|
||||
color_ = 0;
|
||||
attuned_ = false;
|
||||
ornament_idfile_ = 0;
|
||||
ornament_icon_ = 0;
|
||||
ornament_hero_model_ = 0;
|
||||
tracking_id_ = 0;
|
||||
impl_ = new impl;
|
||||
impl_->base_item_ = idata;
|
||||
impl_->modified_item_ = nullptr;
|
||||
impl_->charges_ = -1;
|
||||
impl_->color_ = 0;
|
||||
impl_->attuned_ = false;
|
||||
impl_->ornament_idfile_ = 0;
|
||||
impl_->ornament_icon_ = 0;
|
||||
impl_->ornament_hero_model_ = 0;
|
||||
impl_->tracking_id_ = 0;
|
||||
}
|
||||
|
||||
EQEmu::ItemInstance::ItemInstance(const ItemData* idata, int16 charges) {
|
||||
base_item_ = idata;
|
||||
modified_item_ = nullptr;
|
||||
charges_ = charges;
|
||||
color_ = 0;
|
||||
attuned_ = false;
|
||||
ornament_idfile_ = 0;
|
||||
ornament_icon_ = 0;
|
||||
ornament_hero_model_ = 0;
|
||||
tracking_id_ = 0;
|
||||
impl_ = new impl;
|
||||
impl_->base_item_ = idata;
|
||||
impl_->modified_item_ = nullptr;
|
||||
impl_->charges_ = charges;
|
||||
impl_->color_ = 0;
|
||||
impl_->attuned_ = false;
|
||||
impl_->ornament_idfile_ = 0;
|
||||
impl_->ornament_icon_ = 0;
|
||||
impl_->ornament_hero_model_ = 0;
|
||||
impl_->tracking_id_ = 0;
|
||||
}
|
||||
|
||||
EQEmu::ItemInstance::~ItemInstance() {
|
||||
delete impl_;
|
||||
}
|
||||
|
||||
const ItemData *EQEmu::ItemInstance::GetItem() {
|
||||
return impl_->modified_item_ ? impl_->modified_item_ : impl_->base_item_;
|
||||
}
|
||||
|
||||
std::shared_ptr<EQEmu::ItemInstance> EQEmu::ItemInstance::GetItem(int index) {
|
||||
if(EQEmu::ValueWithin(index, 0, 200)) {
|
||||
auto iter = contents_.find(index);
|
||||
if(iter != contents_.end()) {
|
||||
return iter->second;
|
||||
}
|
||||
if(EQEmu::ValueWithin(index, 0, 255)) {
|
||||
return impl_->contents_.Get(index);
|
||||
}
|
||||
|
||||
|
||||
return std::shared_ptr<EQEmu::ItemInstance>(nullptr);
|
||||
}
|
||||
|
||||
bool EQEmu::ItemInstance::PutItem(int index, std::shared_ptr<ItemInstance> inst) {
|
||||
if(!inst || !inst->GetItem()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!impl_->base_item_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto *item = impl_->base_item_;
|
||||
if(item->ItemClass == ItemClassContainer) { // Bag
|
||||
if(!EQEmu::ValueWithin(index, 0, (int)item->BagSlots)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return impl_->contents_.Put(index, inst);
|
||||
}
|
||||
else if(item->ItemClass == ItemClassCommon) { // Augment
|
||||
if(!EQEmu::ValueWithin(index, 0, (int)EmuConstants::ITEM_COMMON_SIZE)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!item->AugSlotVisible[index]) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto *aug_item = inst->GetItem();
|
||||
int aug_type = aug_item->AugType;
|
||||
if(aug_type == -1 || (1 << (item->AugSlotType[index] - 1)) & aug_type) {
|
||||
return impl_->contents_.Put(index, inst);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
+4
-17
@@ -20,13 +20,10 @@
|
||||
#define COMMON_ITEM_INSTANCE_H
|
||||
|
||||
#include "item_data.h"
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include <map>
|
||||
|
||||
namespace EQEmu
|
||||
{
|
||||
class ItemContainer;
|
||||
class ItemInstance
|
||||
{
|
||||
public:
|
||||
@@ -35,22 +32,12 @@ namespace EQEmu
|
||||
ItemInstance(const ItemData* idata, int16 charges);
|
||||
~ItemInstance();
|
||||
|
||||
const ItemData *GetItem();
|
||||
std::shared_ptr<ItemInstance> GetItem(int index);
|
||||
void SetContainer(ItemContainer *parent) { parent_ = parent; }
|
||||
bool PutItem(int index, std::shared_ptr<ItemInstance> inst);
|
||||
private:
|
||||
const ItemData *base_item_;
|
||||
ItemData *modified_item_;
|
||||
int16 charges_;
|
||||
uint32 color_;
|
||||
bool attuned_;
|
||||
std::string custom_data_;
|
||||
uint32 ornament_idfile_;
|
||||
uint32 ornament_icon_;
|
||||
uint32 ornament_hero_model_;
|
||||
uint64 tracking_id_;
|
||||
|
||||
std::map<int, std::shared_ptr<ItemInstance>> contents_;
|
||||
ItemContainer *parent_;
|
||||
struct impl;
|
||||
impl *impl_;
|
||||
};
|
||||
|
||||
} // EQEmu
|
||||
|
||||
Reference in New Issue
Block a user