OpenMW
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
inventorystore.hpp
Go to the documentation of this file.
1 #ifndef GAME_MWWORLD_INVENTORYSTORE_H
2 #define GAME_MWWORLD_INVENTORYSTORE_H
3 
4 #include "containerstore.hpp"
5 
6 #include "../mwmechanics/magiceffects.hpp"
7 
8 namespace ESM
9 {
10  struct MagicEffect;
11 }
12 
13 namespace MWMechanics
14 {
15  class NpcStats;
16 }
17 
18 namespace MWWorld
19 {
21  {
22  public:
26  virtual void equipmentChanged () {}
27 
35  virtual void permanentEffectAdded (const ESM::MagicEffect *magicEffect, bool isNew) {}
36 
37  };
38 
41  {
42  public:
43 
44  static const int Slot_Helmet = 0;
45  static const int Slot_Cuirass = 1;
46  static const int Slot_Greaves = 2;
47  static const int Slot_LeftPauldron = 3;
48  static const int Slot_RightPauldron = 4;
49  static const int Slot_LeftGauntlet = 5;
50  static const int Slot_RightGauntlet = 6;
51  static const int Slot_Boots = 7;
52  static const int Slot_Shirt = 8;
53  static const int Slot_Pants = 9;
54  static const int Slot_Skirt = 10;
55  static const int Slot_Robe = 11;
56  static const int Slot_LeftRing = 12;
57  static const int Slot_RightRing = 13;
58  static const int Slot_Amulet = 14;
59  static const int Slot_Belt = 15;
60  static const int Slot_CarriedRight = 16;
61  static const int Slot_CarriedLeft = 17;
62  static const int Slot_Ammunition = 18;
63 
64  static const int Slots = 19;
65 
66  static const int Slot_NoSlot = -1;
67 
68  private:
69 
71 
73 
74  // Enables updates of magic effects and actor model whenever items are equipped or unequipped.
75  // This is disabled during autoequip to avoid excessive updates
77 
79 
80  // Vanilla allows permanent effects with a random magnitude, so it needs to be stored here.
81  // We also need this to only play sounds and particle effects when the item is equipped, rather than on every update.
82  struct EffectParams
83  {
84  // Modifier to scale between min and max magnitude
85  float mRandom;
86  // Multiplier for when an effect was fully or partially resisted
87  float mMultiplier;
88  };
89 
90  typedef std::map<std::string, std::vector<EffectParams> > TEffectMagnitudes;
92 
93  typedef std::vector<ContainerStoreIterator> TSlots;
94 
96 
97  // selected magic item (for using enchantments of type "Cast once" or "Cast when used")
99 
100  // (item, max charge)
101  typedef std::vector<std::pair<ContainerStoreIterator, float> > TRechargingItems;
103 
105 
106  void copySlots (const InventoryStore& store);
107 
108  void initSlots (TSlots& slots_);
109 
110  void updateMagicEffects(const Ptr& actor);
111  void updateRechargingItems();
112 
113  void fireEquipmentChangedEvent(const Ptr& actor);
114 
115  virtual void storeEquipmentState (const MWWorld::LiveCellRefBase& ref, int index, ESM::InventoryState& inventory) const;
116  virtual void readEquipmentState (const MWWorld::ContainerStoreIterator& iter, int index, const ESM::InventoryState& inventory);
117 
118  bool canActorAutoEquip(const MWWorld::Ptr& actor, const MWWorld::Ptr& item);
119  ContainerStoreIterator findSlot (int slot) const;
120 
121  public:
122 
123  InventoryStore();
124 
125  InventoryStore (const InventoryStore& store);
126 
128 
129  virtual InventoryStore* clone() { return new InventoryStore(*this); }
130 
131  virtual ContainerStoreIterator add (const Ptr& itemPtr, int count, const Ptr& actorPtr, bool setOwner=false);
143 
144  void equip (int slot, const ContainerStoreIterator& iterator, const Ptr& actor);
146 
147  bool isEquipped(const MWWorld::ConstPtr& item);
149 
150  void setSelectedEnchantItem(const ContainerStoreIterator& iterator);
153 
157 
158  ContainerStoreIterator getSlot (int slot);
159  ConstContainerStoreIterator getSlot(int slot) const;
160 
161  void unequipAll(const MWWorld::Ptr& actor);
163 
164  void autoEquip (const MWWorld::Ptr& actor);
166 
167  void autoEquipShield(const MWWorld::Ptr& actor);
169 
172 
173  virtual void flagAsModified();
176 
177  virtual bool stacks (const ConstPtr& ptr1, const ConstPtr& ptr2) const;
179 
180  virtual int remove(const std::string& itemId, int count, const Ptr& actor);
181  virtual int remove(const std::string& itemId, int count, const Ptr& actor, bool equipReplacement);
182 
183  virtual int remove(const Ptr& item, int count, const Ptr& actor);
184  virtual int remove(const Ptr& item, int count, const Ptr& actor, bool equipReplacement);
188 
189  ContainerStoreIterator unequipSlot(int slot, const Ptr& actor);
193 
194  ContainerStoreIterator unequipItem(const Ptr& item, const Ptr& actor);
201 
202  ContainerStoreIterator unequipItemQuantity(const Ptr& item, const Ptr& actor, int count);
210 
211  void setInvListener (InventoryStoreListener* listener, const Ptr& actor);
213 
215 
217 
218  void rechargeItems (float duration);
220 
221  void purgeEffect (short effectId);
223 
224  void purgeEffect (short effectId, const std::string& sourceId);
226 
227  virtual void clear();
229 
230  virtual void writeState (ESM::InventoryState& state) const;
231 
232  virtual void readState (const ESM::InventoryState& state);
233  };
234 }
235 
236 #endif
Definition: magiceffects.hpp:73
static const int Slot_RightPauldron
Definition: inventorystore.hpp:48
static const int Slot_LeftPauldron
Definition: inventorystore.hpp:47
static const int Slot_NoSlot
Definition: inventorystore.hpp:66
virtual void equipmentChanged()
Definition: inventorystore.hpp:26
Used to create pointers to hold any type of LiveCellRef<> object.
Definition: livecellref.hpp:22
std::vector< std::pair< ContainerStoreIterator, float > > TRechargingItems
Definition: inventorystore.hpp:101
static const int Slot_Amulet
Definition: inventorystore.hpp:58
void initSlots(TSlots &slots_)
Definition: inventorystore.cpp:52
Effects currently affecting a NPC or creature.
Definition: magiceffects.hpp:83
TRechargingItems mRechargingItems
Definition: inventorystore.hpp:102
virtual void flagAsModified()
Definition: inventorystore.cpp:642
static const int Slots
Definition: inventorystore.hpp:64
virtual void writeState(ESM::InventoryState &state) const
Definition: inventorystore.cpp:1009
static const int Slot_Boots
Definition: inventorystore.hpp:51
static const int Slot_CarriedRight
Definition: inventorystore.hpp:60
static const int Slot_RightRing
Definition: inventorystore.hpp:57
static const int Slot_Ammunition
Definition: inventorystore.hpp:62
ContainerStoreIterator unequipItemQuantity(const Ptr &item, const Ptr &actor, int count)
Definition: inventorystore.cpp:797
TEffectMagnitudes mPermanentMagicEffectMagnitudes
Definition: inventorystore.hpp:91
Definition: inventorystore.hpp:40
void updateRechargingItems()
Definition: inventorystore.cpp:887
static const int Slot_Helmet
Definition: inventorystore.hpp:44
bool mFirstAutoEquip
Definition: inventorystore.hpp:78
Definition: inventorystore.hpp:82
static const int Slot_LeftRing
Definition: inventorystore.hpp:56
TSlots mSlots
Definition: inventorystore.hpp:95
static const int Slot_LeftGauntlet
Definition: inventorystore.hpp:49
const MWMechanics::MagicEffects & getMagicEffects() const
Return magic effects from worn items.
Definition: inventorystore.cpp:524
float mRandom
Definition: inventorystore.hpp:85
virtual void storeEquipmentState(const MWWorld::LiveCellRefBase &ref, int index, ESM::InventoryState &inventory) const
Definition: inventorystore.cpp:58
void autoEquipShield(const MWWorld::Ptr &actor)
Auto-equip the shield with most health.
Definition: inventorystore.cpp:480
std::map< std::string, std::vector< EffectParams > > TEffectMagnitudes
Definition: inventorystore.hpp:90
void rechargeItems(float duration)
Restore charge on enchanted items. Note this should only be done for the player.
Definition: inventorystore.cpp:910
ContainerStoreIterator unequipSlot(int slot, const Ptr &actor)
Definition: inventorystore.cpp:744
static const int Slot_Belt
Definition: inventorystore.hpp:59
void purgeEffect(short effectId)
Remove a magic effect.
Definition: inventorystore.cpp:938
virtual InventoryStore * clone()
Definition: inventorystore.hpp:129
static const int Slot_Cuirass
Definition: inventorystore.hpp:45
InventoryStore & operator=(const InventoryStore &store)
Definition: inventorystore.cpp:124
Variant of the ContainerStore for NPCs.
Definition: inventorystore.hpp:20
void fireEquipmentChangedEvent(const Ptr &actor)
Definition: inventorystore.cpp:835
ContainerStoreIterator getSelectedEnchantItem()
Definition: inventorystore.cpp:674
virtual void permanentEffectAdded(const ESM::MagicEffect *magicEffect, bool isNew)
Definition: inventorystore.hpp:35
void autoEquip(const MWWorld::Ptr &actor)
Auto equip items according to stats and item value.
Definition: inventorystore.cpp:249
MWMechanics::MagicEffects mMagicEffects
Definition: inventorystore.hpp:70
bool isEquipped(const MWWorld::ConstPtr &item)
Utility function, returns true if the given item is equipped in any slot.
Definition: inventorystore.cpp:999
static const int Slot_RightGauntlet
Definition: inventorystore.hpp:50
InventoryStoreListener * getInvListener()
Definition: inventorystore.cpp:824
ContainerStoreIterator unequipItem(const Ptr &item, const Ptr &actor)
Definition: inventorystore.cpp:785
static const int Slot_Greaves
Definition: inventorystore.hpp:46
Pointer to a const LiveCellRef.
Definition: ptr.hpp:90
Definition: loadmgef.hpp:13
State for inventories and containers.
Definition: inventorystate.hpp:16
Definition: containerstore.hpp:48
virtual void readEquipmentState(const MWWorld::ContainerStoreIterator &iter, int index, const ESM::InventoryState &inventory)
Definition: inventorystore.cpp:70
bool mRechargingItemsUpToDate
Definition: inventorystore.hpp:104
ContainerStoreIterator getSlot(int slot)
Definition: inventorystore.cpp:201
std::vector< ContainerStoreIterator > TSlots
Definition: inventorystore.hpp:93
void setInvListener(InventoryStoreListener *listener, const Ptr &actor)
Set a listener for various events, see InventoryStoreListener.
Definition: inventorystore.cpp:829
void equip(int slot, const ContainerStoreIterator &iterator, const Ptr &actor)
Definition: inventorystore.cpp:153
virtual bool stacks(const ConstPtr &ptr1, const ConstPtr &ptr2) const
Definition: inventorystore.cpp:648
virtual void readState(const ESM::InventoryState &state)
Definition: inventorystore.cpp:1025
virtual ContainerStoreIterator add(const Ptr &itemPtr, int count, const Ptr &actorPtr, bool setOwner=false)
Definition: inventorystore.cpp:137
static const int Slot_Skirt
Definition: inventorystore.hpp:54
void setSelectedEnchantItem(const ContainerStoreIterator &iterator)
Definition: inventorystore.cpp:669
InventoryStore()
Definition: inventorystore.cpp:101
static const int Slot_Robe
Definition: inventorystore.hpp:55
void unequipAll(const MWWorld::Ptr &actor)
Unequip all currently equipped items.
Definition: inventorystore.cpp:189
ContainerStoreIterator mSelectedEnchantItem
Definition: inventorystore.hpp:98
InventoryStoreListener * mListener
Definition: inventorystore.hpp:72
Pointer to a LiveCellRef.
Definition: ptr.hpp:19
void copySlots(const InventoryStore &store)
Definition: inventorystore.cpp:27
bool canActorAutoEquip(const MWWorld::Ptr &actor, const MWWorld::Ptr &item)
Definition: inventorystore.cpp:211
static const int Slot_Shirt
Definition: inventorystore.hpp:52
float mMultiplier
Definition: inventorystore.hpp:87
virtual void clear()
Empty container.
Definition: inventorystore.cpp:992
void updateMagicEffects(const Ptr &actor)
Definition: inventorystore.cpp:529
void visitEffectSources(MWMechanics::EffectSourceVisitor &visitor)
Definition: inventorystore.cpp:851
static const int Slot_CarriedLeft
Definition: inventorystore.hpp:61
int count(const std::string &id)
Definition: containerstore.cpp:151
ContainerStoreIterator findSlot(int slot) const
Definition: inventorystore.cpp:231
bool mUpdatesEnabled
Definition: inventorystore.hpp:76
static const int Slot_Pants
Definition: inventorystore.hpp:53