Get/Put item implementation + tests

This commit is contained in:
KimLS
2015-02-20 16:24:32 -08:00
parent 551c0ef368
commit 2d617f0ea7
8 changed files with 328 additions and 55 deletions
+43
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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