////////////////////////////////////////////////////////////////////////
// OpenTibia - an opensource roleplaying game
////////////////////////////////////////////////////////////////////////
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
////////////////////////////////////////////////////////////////////////
#ifndef __CONTAINER__
#define __CONTAINER__
#include "otsystem.h"
#include "cylinder.h"
#include "item.h"
class Depot;
class Container;
class ContainerIterator
{
public:
ContainerIterator();
ContainerIterator(const ContainerIterator& rhs);
virtual ~ContainerIterator() {}
ContainerIterator& operator=(const ContainerIterator& rhs);
bool operator==(const ContainerIterator& rhs);
bool operator!=(const ContainerIterator& rhs);
ContainerIterator& operator++();
ContainerIterator operator++(int32_t);
Item* operator*();
Item* operator->();
protected:
ContainerIterator(Container* _base);
Container* base;
std::queue over;
ItemList::iterator current;
friend class Container;
};
class Container : public Item, public Cylinder
{
public:
Container(uint16_t _type);
virtual ~Container();
virtual Item* clone() const;
virtual Container* getContainer() {return this;}
virtual const Container* getContainer() const {return this;}
virtual Depot* getDepot() {return NULL;}
virtual const Depot* getDepot() const {return NULL;}
Attr_ReadValue readAttr(AttrTypes_t attr, PropStream& propStream);
bool unserializeItemNode(FileLoader& f, NODE node, PropStream& propStream);
std::string getContentDescription() const;
uint32_t size() const {return (uint32_t)itemlist.size();}
bool full() const {return itemlist.size() >= maxSize;}
bool empty() const {return itemlist.empty();}
ContainerIterator begin();
ContainerIterator end();
ContainerIterator begin() const;
ContainerIterator end() const;
ItemList::const_iterator getItems() const {return itemlist.begin();}
ItemList::const_iterator getEnd() const {return itemlist.end();}
ItemList::const_reverse_iterator getReversedItems() const {return itemlist.rbegin();}
ItemList::const_reverse_iterator getReversedEnd() const {return itemlist.rend();}
void addItem(Item* item);
Item* getItem(uint32_t index);
bool isHoldingItem(const Item* item) const;
uint32_t capacity() const {return maxSize;}
uint32_t getItemHoldingCount() const;
virtual double getWeight() const;
//cylinder implementations
virtual ReturnValue __queryAdd(int32_t index, const Thing* thing, uint32_t count,
uint32_t flags) const;
virtual ReturnValue __queryMaxCount(int32_t index, const Thing* thing, uint32_t count, uint32_t& maxQueryCount,
uint32_t flags) const;
virtual ReturnValue __queryRemove(const Thing* thing, uint32_t count, uint32_t flags) const;
virtual Cylinder* __queryDestination(int32_t& index, const Thing* thing, Item** destItem,
uint32_t& flags);
virtual void __addThing(Creature* actor, Thing* thing);
virtual void __addThing(Creature* actor, int32_t index, Thing* thing);
virtual void __updateThing(Thing* thing, uint16_t itemId, uint32_t count);
virtual void __replaceThing(uint32_t index, Thing* thing);
virtual void __removeThing(Thing* thing, uint32_t count);
virtual int32_t __getIndexOfThing(const Thing* thing) const;
virtual Thing* __getThing(uint32_t index) const;
virtual int32_t __getFirstIndex() const;
virtual int32_t __getLastIndex() const;
virtual uint32_t __getItemTypeCount(uint16_t itemId, int32_t subType = -1,
bool itemCount = true) const;
virtual std::map& __getAllItemTypeCount(std::map& countMap, bool itemCount = true) const;
virtual void postAddNotification(Creature* actor, Thing* thing, const Cylinder* oldParent,
int32_t index, cylinderlink_t link = LINK_OWNER);
virtual void postRemoveNotification(Creature* actor, Thing* thing, const Cylinder* newParent,
int32_t index, bool isCompleteRemoval, cylinderlink_t link = LINK_OWNER);
virtual void __internalAddThing(Thing* thing);
virtual void __internalAddThing(uint32_t index, Thing* thing);
virtual void __startDecaying();
private:
void onAddContainerItem(Item* item);
void onUpdateContainerItem(uint32_t index, Item* oldItem, const ItemType& oldType,
Item* newItem, const ItemType& newType);
void onRemoveContainerItem(uint32_t index, Item* item);
Container* getParentContainer();
void updateItemWeight(double diff);
std::stringstream& getContentDescription(std::stringstream& s) const;
protected:
uint32_t maxSize, serializationCount;
double totalWeight;
ItemList itemlist;
friend class ContainerIterator;
friend class IOMapSerialize;
};
#endif