mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 20:26:43 +00:00 
			
		
		
		
	Merged pull request #1798
This commit is contained in:
		
						commit
						ee759effce
					
				
					 39 changed files with 116 additions and 85 deletions
				
			
		|  | @ -51,6 +51,7 @@ | |||
|     Bug #4457: Item without CanCarry flag prevents shield autoequipping in dark areas | ||||
|     Bug #4458: AiWander console command handles idle chances incorrectly | ||||
|     Bug #4459: NotCell dialogue condition doesn't support partial matches | ||||
|     Bug #4460: Script function "Equip" doesn't bypass beast restrictions | ||||
|     Bug #4461: "Open" spell from non-player caster isn't a crime | ||||
|     Bug #4464: OpenMW keeps AiState cached storages even after we cancel AI packages | ||||
|     Bug #4469: Abot Silt Striders – Model turn 90 degrees on horizontal | ||||
|  |  | |||
|  | @ -146,7 +146,7 @@ namespace MWBase | |||
|             virtual MWGui::TradeWindow* getTradeWindow() = 0; | ||||
| 
 | ||||
|             /// Make the player use an item, while updating GUI state accordingly
 | ||||
|             virtual void useItem(const MWWorld::Ptr& item) = 0; | ||||
|             virtual void useItem(const MWWorld::Ptr& item, bool force=false) = 0; | ||||
| 
 | ||||
|             virtual void updateSpellWindow() = 0; | ||||
| 
 | ||||
|  |  | |||
|  | @ -124,10 +124,9 @@ namespace MWClass | |||
|         return info; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     std::shared_ptr<MWWorld::Action> Apparatus::use (const MWWorld::Ptr& ptr) const | ||||
|     std::shared_ptr<MWWorld::Action> Apparatus::use (const MWWorld::Ptr& ptr, bool force) const | ||||
|     { | ||||
|         return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionAlchemy()); | ||||
|         return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionAlchemy(force)); | ||||
|     } | ||||
| 
 | ||||
|     MWWorld::Ptr Apparatus::copyToCellImpl(const MWWorld::ConstPtr &ptr, MWWorld::CellStore &cell) const | ||||
|  |  | |||
|  | @ -50,8 +50,7 @@ namespace MWClass | |||
|             virtual std::string getInventoryIcon (const MWWorld::ConstPtr& ptr) const; | ||||
|             ///< Return name of inventory icon.
 | ||||
| 
 | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr) | ||||
|                 const; | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr, bool force=false) const; | ||||
|             ///< Generate action for using via inventory menu
 | ||||
| 
 | ||||
|             virtual std::string getModel(const MWWorld::ConstPtr &ptr) const; | ||||
|  |  | |||
|  | @ -354,9 +354,9 @@ namespace MWClass | |||
|         return std::make_pair(1,""); | ||||
|     } | ||||
| 
 | ||||
|     std::shared_ptr<MWWorld::Action> Armor::use (const MWWorld::Ptr& ptr) const | ||||
|     std::shared_ptr<MWWorld::Action> Armor::use (const MWWorld::Ptr& ptr, bool force) const | ||||
|     { | ||||
|         std::shared_ptr<MWWorld::Action> action(new MWWorld::ActionEquip(ptr)); | ||||
|         std::shared_ptr<MWWorld::Action> action(new MWWorld::ActionEquip(ptr, force)); | ||||
| 
 | ||||
|         action->setSound(getUpSoundId(ptr)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -73,8 +73,7 @@ namespace MWClass | |||
|             ///< Return 0 if player cannot equip item. 1 if can equip. 2 if it's twohanded weapon. 3 if twohanded weapon conflicts with that. \n
 | ||||
|             ///  Second item in the pair specifies the error message
 | ||||
| 
 | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr) | ||||
|                 const; | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr, bool force=false) const; | ||||
|             ///< Generate action for using via inventory menu
 | ||||
| 
 | ||||
|             virtual std::string getModel(const MWWorld::ConstPtr &ptr) const; | ||||
|  |  | |||
|  | @ -162,7 +162,7 @@ namespace MWClass | |||
|         return record->mId; | ||||
|     } | ||||
| 
 | ||||
|     std::shared_ptr<MWWorld::Action> Book::use (const MWWorld::Ptr& ptr) const | ||||
|     std::shared_ptr<MWWorld::Action> Book::use (const MWWorld::Ptr& ptr, bool force) const | ||||
|     { | ||||
|         return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionRead(ptr)); | ||||
|     } | ||||
|  |  | |||
|  | @ -53,7 +53,7 @@ namespace MWClass | |||
|             virtual std::string applyEnchantment(const MWWorld::ConstPtr &ptr, const std::string& enchId, int enchCharge, const std::string& newName) const; | ||||
|             ///< Creates a new record using \a ptr as template, with the given name and the given enchantment applied to it.
 | ||||
| 
 | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr) const; | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr, bool force=false) const; | ||||
|             ///< Generate action for using via inventory menu
 | ||||
| 
 | ||||
|             virtual std::string getModel(const MWWorld::ConstPtr &ptr) const; | ||||
|  |  | |||
|  | @ -243,9 +243,9 @@ namespace MWClass | |||
|         return std::make_pair (1, ""); | ||||
|     } | ||||
| 
 | ||||
|     std::shared_ptr<MWWorld::Action> Clothing::use (const MWWorld::Ptr& ptr) const | ||||
|     std::shared_ptr<MWWorld::Action> Clothing::use (const MWWorld::Ptr& ptr, bool force) const | ||||
|     { | ||||
|         std::shared_ptr<MWWorld::Action> action(new MWWorld::ActionEquip(ptr)); | ||||
|         std::shared_ptr<MWWorld::Action> action(new MWWorld::ActionEquip(ptr, force)); | ||||
| 
 | ||||
|         action->setSound(getUpSoundId(ptr)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -65,8 +65,7 @@ namespace MWClass | |||
|             ///< Return 0 if player cannot equip item. 1 if can equip. 2 if it's twohanded weapon. 3 if twohanded weapon conflicts with that.
 | ||||
|             ///  Second item in the pair specifies the error message
 | ||||
| 
 | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr) | ||||
|                 const; | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr, bool force=false) const; | ||||
|             ///< Generate action for using via inventory menu
 | ||||
| 
 | ||||
|             virtual std::string getModel(const MWWorld::ConstPtr &ptr) const; | ||||
|  |  | |||
|  | @ -75,7 +75,7 @@ namespace MWClass | |||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     std::shared_ptr<MWWorld::Action> Ingredient::use (const MWWorld::Ptr& ptr) const | ||||
|     std::shared_ptr<MWWorld::Action> Ingredient::use (const MWWorld::Ptr& ptr, bool force) const | ||||
|     { | ||||
|         std::shared_ptr<MWWorld::Action> action (new MWWorld::ActionEat (ptr)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -36,8 +36,7 @@ namespace MWClass | |||
|             virtual int getValue (const MWWorld::ConstPtr& ptr) const; | ||||
|             ///< Return trade value of the object. Throws an exception, if the object can't be traded.
 | ||||
| 
 | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr) | ||||
|                 const; | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr, bool force=false) const; | ||||
|             ///< Generate action for using via inventory menu
 | ||||
|              | ||||
|             static void registerSelf(); | ||||
|  |  | |||
|  | @ -186,9 +186,9 @@ namespace MWClass | |||
|         return Class::showsInInventory(ptr); | ||||
|     } | ||||
| 
 | ||||
|     std::shared_ptr<MWWorld::Action> Light::use (const MWWorld::Ptr& ptr) const | ||||
|     std::shared_ptr<MWWorld::Action> Light::use (const MWWorld::Ptr& ptr, bool force) const | ||||
|     { | ||||
|         std::shared_ptr<MWWorld::Action> action(new MWWorld::ActionEquip(ptr)); | ||||
|         std::shared_ptr<MWWorld::Action> action(new MWWorld::ActionEquip(ptr, force)); | ||||
| 
 | ||||
|         action->setSound(getUpSoundId(ptr)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -55,8 +55,7 @@ namespace MWClass | |||
|             virtual std::string getInventoryIcon (const MWWorld::ConstPtr& ptr) const; | ||||
|             ///< Return name of inventory icon.
 | ||||
| 
 | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr) | ||||
|                 const; | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr, bool force=false) const; | ||||
|             ///< Generate action for using via inventory menu
 | ||||
| 
 | ||||
|             virtual void setRemainingUsageTime (const MWWorld::Ptr& ptr, float duration) const; | ||||
|  |  | |||
|  | @ -140,9 +140,9 @@ namespace MWClass | |||
|         return info; | ||||
|     } | ||||
| 
 | ||||
|     std::shared_ptr<MWWorld::Action> Lockpick::use (const MWWorld::Ptr& ptr) const | ||||
|     std::shared_ptr<MWWorld::Action> Lockpick::use (const MWWorld::Ptr& ptr, bool force) const | ||||
|     { | ||||
|         std::shared_ptr<MWWorld::Action> action(new MWWorld::ActionEquip(ptr)); | ||||
|         std::shared_ptr<MWWorld::Action> action(new MWWorld::ActionEquip(ptr, force)); | ||||
| 
 | ||||
|         action->setSound(getUpSoundId(ptr)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -53,8 +53,7 @@ namespace MWClass | |||
| 
 | ||||
|             virtual std::pair<int, std::string> canBeEquipped(const MWWorld::ConstPtr &ptr, const MWWorld::Ptr &npc) const; | ||||
| 
 | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr) | ||||
|                 const; | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr, bool force=false) const; | ||||
|             ///< Generate action for using via inventory menu
 | ||||
| 
 | ||||
|             virtual std::string getModel(const MWWorld::ConstPtr &ptr) const; | ||||
|  |  | |||
|  | @ -226,7 +226,7 @@ namespace MWClass | |||
|         return newPtr; | ||||
|     } | ||||
| 
 | ||||
|     std::shared_ptr<MWWorld::Action> Miscellaneous::use (const MWWorld::Ptr& ptr) const | ||||
|     std::shared_ptr<MWWorld::Action> Miscellaneous::use (const MWWorld::Ptr& ptr, bool force) const | ||||
|     { | ||||
|         if (ptr.getCellRef().getSoul().empty() || !MWBase::Environment::get().getWorld()->getStore().get<ESM::Creature>().search(ptr.getCellRef().getSoul())) | ||||
|             return std::shared_ptr<MWWorld::Action>(new MWWorld::NullAction()); | ||||
|  |  | |||
|  | @ -49,8 +49,7 @@ namespace MWClass | |||
| 
 | ||||
|             virtual std::string getModel(const MWWorld::ConstPtr &ptr) const; | ||||
| 
 | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr) | ||||
|                 const; | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr, bool force=false) const; | ||||
|             ///< Generate action for using via inventory menu
 | ||||
| 
 | ||||
|             virtual float getWeight (const MWWorld::ConstPtr& ptr) const; | ||||
|  |  | |||
|  | @ -139,7 +139,7 @@ namespace MWClass | |||
|         return info; | ||||
|     } | ||||
| 
 | ||||
|     std::shared_ptr<MWWorld::Action> Potion::use (const MWWorld::Ptr& ptr) const | ||||
|     std::shared_ptr<MWWorld::Action> Potion::use (const MWWorld::Ptr& ptr, bool force) const | ||||
|     { | ||||
|         MWWorld::LiveCellRef<ESM::Potion> *ref = | ||||
|             ptr.get<ESM::Potion>(); | ||||
|  |  | |||
|  | @ -36,7 +36,7 @@ namespace MWClass | |||
|             virtual int getValue (const MWWorld::ConstPtr& ptr) const; | ||||
|             ///< Return trade value of the object. Throws an exception, if the object can't be traded.
 | ||||
| 
 | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr) const; | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr, bool force=false) const; | ||||
|             ///< Generate action for using via inventory menu
 | ||||
| 
 | ||||
|             static void registerSelf(); | ||||
|  |  | |||
|  | @ -140,9 +140,9 @@ namespace MWClass | |||
|         return info; | ||||
|     } | ||||
| 
 | ||||
|     std::shared_ptr<MWWorld::Action> Probe::use (const MWWorld::Ptr& ptr) const | ||||
|     std::shared_ptr<MWWorld::Action> Probe::use (const MWWorld::Ptr& ptr, bool force) const | ||||
|     { | ||||
|         std::shared_ptr<MWWorld::Action> action(new MWWorld::ActionEquip(ptr)); | ||||
|         std::shared_ptr<MWWorld::Action> action(new MWWorld::ActionEquip(ptr, force)); | ||||
| 
 | ||||
|         action->setSound(getUpSoundId(ptr)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -53,8 +53,7 @@ namespace MWClass | |||
| 
 | ||||
|             virtual std::pair<int, std::string> canBeEquipped(const MWWorld::ConstPtr &ptr, const MWWorld::Ptr &npc) const; | ||||
| 
 | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr) | ||||
|                 const; | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr, bool force=false) const; | ||||
|             ///< Generate action for using via inventory menu
 | ||||
| 
 | ||||
|             virtual std::string getModel(const MWWorld::ConstPtr &ptr) const; | ||||
|  |  | |||
|  | @ -149,9 +149,9 @@ namespace MWClass | |||
|         return MWWorld::Ptr(cell.insert(ref), &cell); | ||||
|     } | ||||
| 
 | ||||
|     std::shared_ptr<MWWorld::Action> Repair::use (const MWWorld::Ptr& ptr) const | ||||
|     std::shared_ptr<MWWorld::Action> Repair::use (const MWWorld::Ptr& ptr, bool force) const | ||||
|     { | ||||
|         return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionRepair(ptr)); | ||||
|         return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionRepair(ptr, force)); | ||||
|     } | ||||
| 
 | ||||
|     bool Repair::canSell (const MWWorld::ConstPtr& item, int npcServices) const | ||||
|  |  | |||
|  | @ -49,7 +49,7 @@ namespace MWClass | |||
| 
 | ||||
|             virtual std::string getModel(const MWWorld::ConstPtr &ptr) const; | ||||
| 
 | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr) | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr, bool force=false) | ||||
|                 const; | ||||
|             ///< Generate action for using via inventory menu (default implementation: return a
 | ||||
|             /// null action).
 | ||||
|  |  | |||
|  | @ -401,9 +401,9 @@ namespace MWClass | |||
|         return std::make_pair(1, ""); | ||||
|     } | ||||
| 
 | ||||
|     std::shared_ptr<MWWorld::Action> Weapon::use (const MWWorld::Ptr& ptr) const | ||||
|     std::shared_ptr<MWWorld::Action> Weapon::use (const MWWorld::Ptr& ptr, bool force) const | ||||
|     { | ||||
|         std::shared_ptr<MWWorld::Action> action(new MWWorld::ActionEquip(ptr)); | ||||
|         std::shared_ptr<MWWorld::Action> action(new MWWorld::ActionEquip(ptr, force)); | ||||
| 
 | ||||
|         action->setSound(getUpSoundId(ptr)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -72,8 +72,7 @@ namespace MWClass | |||
|             ///< Return 0 if player cannot equip item. 1 if can equip. 2 if it's twohanded weapon. 3 if twohanded weapon conflicts with that.
 | ||||
|             ///  Second item in the pair specifies the error message
 | ||||
| 
 | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr) | ||||
|                 const; | ||||
|             virtual std::shared_ptr<MWWorld::Action> use (const MWWorld::Ptr& ptr, bool force=false) const; | ||||
|             ///< Generate action for using via inventory menu
 | ||||
| 
 | ||||
|             virtual std::string getModel(const MWWorld::ConstPtr &ptr) const; | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ | |||
| 
 | ||||
| #include "../mwworld/inventorystore.hpp" | ||||
| #include "../mwworld/class.hpp" | ||||
| #include "../mwworld/action.hpp" | ||||
| #include "../mwworld/actionequip.hpp" | ||||
| #include "../mwscript/interpretercontext.hpp" | ||||
| 
 | ||||
| #include "../mwmechanics/actorutil.hpp" | ||||
|  | @ -474,7 +474,7 @@ namespace MWGui | |||
|             MWBase::Environment::get().getWindowManager()->toggleVisible(GW_Inventory); | ||||
|     } | ||||
| 
 | ||||
|     void InventoryWindow::useItem(const MWWorld::Ptr &ptr) | ||||
|     void InventoryWindow::useItem(const MWWorld::Ptr &ptr, bool force) | ||||
|     { | ||||
|         const std::string& script = ptr.getClass().getScript(ptr); | ||||
| 
 | ||||
|  | @ -483,13 +483,24 @@ namespace MWGui | |||
|         // early-out for items that need to be equipped, but can't be equipped: we don't want to set OnPcEquip in that case
 | ||||
|         if (!ptr.getClass().getEquipmentSlots(ptr).first.empty()) | ||||
|         { | ||||
|             std::pair<int, std::string> canEquip = ptr.getClass().canBeEquipped(ptr, player); | ||||
|             if (canEquip.first == 0) | ||||
|             if (ptr.getClass().hasItemHealth(ptr) && ptr.getCellRef().getCharge() == 0) | ||||
|             { | ||||
|                 MWBase::Environment::get().getWindowManager()->messageBox(canEquip.second); | ||||
|                 MWBase::Environment::get().getWindowManager()->messageBox("#{sInventoryMessage1}"); | ||||
|                 updateItemView(); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             if (!force) | ||||
|             { | ||||
|                 std::pair<int, std::string> canEquip = ptr.getClass().canBeEquipped(ptr, player); | ||||
| 
 | ||||
|                 if (canEquip.first == 0) | ||||
|                 { | ||||
|                     MWBase::Environment::get().getWindowManager()->messageBox(canEquip.second); | ||||
|                     updateItemView(); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // If the item has a script, set its OnPcEquip to 1
 | ||||
|  | @ -512,9 +523,8 @@ namespace MWGui | |||
|         { | ||||
|             if (script.empty() || ptr.getRefData().getLocals().getIntVar(script, "pcskipequip") == 0) | ||||
|             { | ||||
|                 std::shared_ptr<MWWorld::Action> action = ptr.getClass().use(ptr); | ||||
| 
 | ||||
|                 action->execute (player); | ||||
|                 std::shared_ptr<MWWorld::Action> action = ptr.getClass().use(ptr, force); | ||||
|                 action->execute(player); | ||||
|             } | ||||
|             else | ||||
|                 mSkippedToEquip = ptr; | ||||
|  |  | |||
|  | @ -58,7 +58,7 @@ namespace MWGui | |||
| 
 | ||||
|             void clear(); | ||||
| 
 | ||||
|             void useItem(const MWWorld::Ptr& ptr); | ||||
|             void useItem(const MWWorld::Ptr& ptr, bool force=false); | ||||
| 
 | ||||
|             void setGuiMode(GuiMode mode); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1328,10 +1328,10 @@ namespace MWGui | |||
|     MWGui::ConfirmationDialog* WindowManager::getConfirmationDialog() { return mConfirmationDialog; } | ||||
|     MWGui::TradeWindow* WindowManager::getTradeWindow() { return mTradeWindow; } | ||||
| 
 | ||||
|     void WindowManager::useItem(const MWWorld::Ptr &item) | ||||
|     void WindowManager::useItem(const MWWorld::Ptr &item, bool bypassBeastRestrictions) | ||||
|     { | ||||
|         if (mInventoryWindow) | ||||
|             mInventoryWindow->useItem(item); | ||||
|             mInventoryWindow->useItem(item, bypassBeastRestrictions); | ||||
|     } | ||||
| 
 | ||||
|     bool WindowManager::isAllowed (GuiWindow wnd) const | ||||
|  |  | |||
|  | @ -185,7 +185,7 @@ namespace MWGui | |||
|     virtual MWGui::TradeWindow* getTradeWindow(); | ||||
| 
 | ||||
|     /// Make the player use an item, while updating GUI state accordingly
 | ||||
|     virtual void useItem(const MWWorld::Ptr& item); | ||||
|     virtual void useItem(const MWWorld::Ptr& item, bool bypassBeastRestrictions=false); | ||||
| 
 | ||||
|     virtual void updateSpellWindow(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -20,6 +20,7 @@ | |||
| #include "../mwbase/windowmanager.hpp" | ||||
| #include "../mwbase/world.hpp" | ||||
| 
 | ||||
| #include "../mwworld/actionequip.hpp" | ||||
| #include "../mwworld/class.hpp" | ||||
| #include "../mwworld/containerstore.hpp" | ||||
| #include "../mwworld/inventorystore.hpp" | ||||
|  | @ -193,12 +194,11 @@ namespace MWScript | |||
|                             "to fulfil requirements of Equip instruction" << std::endl; | ||||
|                     } | ||||
| 
 | ||||
|                     if (ptr == MWBase::Environment::get().getWorld()->getPlayerPtr()) | ||||
|                         MWBase::Environment::get().getWindowManager()->useItem(*it); | ||||
|                     if (ptr == MWMechanics::getPlayer()) | ||||
|                         MWBase::Environment::get().getWindowManager()->useItem(*it, true); | ||||
|                     else | ||||
|                     { | ||||
|                         std::shared_ptr<MWWorld::Action> action = it->getClass().use(*it); | ||||
|                         // No equip sound for actors other than the player
 | ||||
|                         std::shared_ptr<MWWorld::Action> action = it->getClass().use(*it, true); | ||||
|                         action->execute(ptr, true); | ||||
|                     } | ||||
|                 } | ||||
|  |  | |||
|  | @ -9,12 +9,19 @@ | |||
| 
 | ||||
| namespace MWWorld | ||||
| { | ||||
|     ActionAlchemy::ActionAlchemy(bool force) | ||||
|     : Action (false) | ||||
|     , mForce(force) | ||||
|     { | ||||
|     } | ||||
| 
 | ||||
|     void ActionAlchemy::executeImp (const Ptr& actor) | ||||
|     { | ||||
|         if (actor != MWMechanics::getPlayer()) | ||||
|             return; | ||||
| 
 | ||||
|         if(MWMechanics::isPlayerInCombat()) { //Ensure we're not in combat
 | ||||
|         if(!mForce && MWMechanics::isPlayerInCombat()) | ||||
|         { //Ensure we're not in combat
 | ||||
|             MWBase::Environment::get().getWindowManager()->messageBox("#{sInventoryMessage3}"); | ||||
|             return; | ||||
|         } | ||||
|  |  | |||
|  | @ -7,7 +7,11 @@ namespace MWWorld | |||
| { | ||||
|     class ActionAlchemy : public Action | ||||
|     { | ||||
|             virtual void executeImp (const Ptr& actor); | ||||
|         bool mForce; | ||||
|         virtual void executeImp (const Ptr& actor); | ||||
| 
 | ||||
|     public: | ||||
|         ActionAlchemy(bool force=false); | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -14,7 +14,9 @@ | |||
| 
 | ||||
| namespace MWWorld | ||||
| { | ||||
|     ActionEquip::ActionEquip (const MWWorld::Ptr& object) : Action (false, object) | ||||
|     ActionEquip::ActionEquip (const MWWorld::Ptr& object, bool force) | ||||
|     : Action (false, object) | ||||
|     , mForce(force) | ||||
|     { | ||||
|     } | ||||
| 
 | ||||
|  | @ -23,18 +25,29 @@ namespace MWWorld | |||
|         MWWorld::Ptr object = getTarget(); | ||||
|         MWWorld::InventoryStore& invStore = actor.getClass().getInventoryStore(actor); | ||||
| 
 | ||||
|         std::pair <int, std::string> result = object.getClass().canBeEquipped (object, actor); | ||||
| 
 | ||||
|         // display error message if the player tried to equip something
 | ||||
|         if (!result.second.empty() && actor == MWMechanics::getPlayer()) | ||||
|             MWBase::Environment::get().getWindowManager()->messageBox(result.second); | ||||
| 
 | ||||
|         switch(result.first) | ||||
|         if (object.getClass().hasItemHealth(object) && object.getCellRef().getCharge() == 0) | ||||
|         { | ||||
|             case 0: | ||||
|                 return; | ||||
|             default: | ||||
|                 break; | ||||
|             if (actor == MWMechanics::getPlayer()) | ||||
|                 MWBase::Environment::get().getWindowManager()->messageBox("#{sInventoryMessage1}"); | ||||
| 
 | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         if (!mForce) | ||||
|         { | ||||
|             std::pair <int, std::string> result = object.getClass().canBeEquipped (object, actor); | ||||
| 
 | ||||
|             // display error message if the player tried to equip something
 | ||||
|             if (!result.second.empty() && actor == MWMechanics::getPlayer()) | ||||
|                 MWBase::Environment::get().getWindowManager()->messageBox(result.second); | ||||
| 
 | ||||
|             switch(result.first) | ||||
|             { | ||||
|                 case 0: | ||||
|                     return; | ||||
|                 default: | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // slots that this item can be equipped in
 | ||||
|  |  | |||
|  | @ -2,17 +2,18 @@ | |||
| #define GAME_MWWORLD_ACTIONEQUIP_H | ||||
| 
 | ||||
| #include "action.hpp" | ||||
| #include "ptr.hpp" | ||||
| 
 | ||||
| namespace MWWorld | ||||
| { | ||||
|     class ActionEquip : public Action | ||||
|     { | ||||
|             virtual void executeImp (const Ptr& actor); | ||||
|         bool mForce; | ||||
| 
 | ||||
|         public: | ||||
|             /// @param item to equip
 | ||||
|             ActionEquip (const Ptr& object); | ||||
|         virtual void executeImp (const Ptr& actor); | ||||
| 
 | ||||
|     public: | ||||
|         /// @param item to equip
 | ||||
|         ActionEquip (const Ptr& object, bool force=false); | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -8,8 +8,9 @@ | |||
| 
 | ||||
| namespace MWWorld | ||||
| { | ||||
|     ActionRepair::ActionRepair(const Ptr &item) | ||||
|         : Action(false, item) | ||||
|     ActionRepair::ActionRepair(const Ptr& item, bool force) | ||||
|         : Action (false, item) | ||||
|         , mForce(force) | ||||
|     { | ||||
|     } | ||||
| 
 | ||||
|  | @ -18,7 +19,8 @@ namespace MWWorld | |||
|         if (actor != MWMechanics::getPlayer()) | ||||
|             return; | ||||
| 
 | ||||
|         if(MWMechanics::isPlayerInCombat()) { | ||||
|         if(!mForce && MWMechanics::isPlayerInCombat()) | ||||
|         { | ||||
|             MWBase::Environment::get().getWindowManager()->messageBox("#{sInventoryMessage2}"); | ||||
|             return; | ||||
|         } | ||||
|  |  | |||
|  | @ -7,10 +7,13 @@ namespace MWWorld | |||
| { | ||||
|     class ActionRepair : public Action | ||||
|     { | ||||
|             virtual void executeImp (const Ptr& actor); | ||||
|         bool mForce; | ||||
| 
 | ||||
|         virtual void executeImp (const Ptr& actor); | ||||
| 
 | ||||
|     public: | ||||
|         ActionRepair(const MWWorld::Ptr& item); | ||||
|         /// @param item repair hammer
 | ||||
|         ActionRepair(const Ptr& item, bool force=false); | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -113,7 +113,7 @@ namespace MWWorld | |||
|         return std::shared_ptr<Action> (new NullAction); | ||||
|     } | ||||
| 
 | ||||
|     std::shared_ptr<Action> Class::use (const Ptr& ptr) const | ||||
|     std::shared_ptr<Action> Class::use (const Ptr& ptr, bool force) const | ||||
|     { | ||||
|         return std::shared_ptr<Action> (new NullAction); | ||||
|     } | ||||
|  |  | |||
|  | @ -141,7 +141,7 @@ namespace MWWorld | |||
|             virtual std::shared_ptr<Action> activate (const Ptr& ptr, const Ptr& actor) const; | ||||
|             ///< Generate action for activation (default implementation: return a null action).
 | ||||
| 
 | ||||
|             virtual std::shared_ptr<Action> use (const Ptr& ptr) | ||||
|             virtual std::shared_ptr<Action> use (const Ptr& ptr, bool force=false) | ||||
|                 const; | ||||
|             ///< Generate action for using via inventory menu (default implementation: return a
 | ||||
|             /// null action).
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue