mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-20 06:23:52 +00:00
Make PCSkipEquip and OnPCEquip behavior vanilla-like (bug #4141)
This commit is contained in:
parent
e1f0504557
commit
cfa877b109
3 changed files with 24 additions and 32 deletions
|
@ -23,6 +23,7 @@
|
||||||
Bug #3977: Non-ASCII characters in object ID's are not supported
|
Bug #3977: Non-ASCII characters in object ID's are not supported
|
||||||
Bug #4009: Launcher does not show data files on the first run after installing
|
Bug #4009: Launcher does not show data files on the first run after installing
|
||||||
Bug #4077: Enchanted items are not recharged if they are not in the player's inventory
|
Bug #4077: Enchanted items are not recharged if they are not in the player's inventory
|
||||||
|
Bug #4141: PCSkipEquip isn't set to 1 when reading books/scrolls
|
||||||
Bug #4202: Open .omwaddon files without needing toopen openmw-cs first
|
Bug #4202: Open .omwaddon files without needing toopen openmw-cs first
|
||||||
Bug #4240: Ash storm origin coordinates and hand shielding animation behavior are incorrect
|
Bug #4240: Ash storm origin coordinates and hand shielding animation behavior are incorrect
|
||||||
Bug #4262: Rain settings are hardcoded
|
Bug #4262: Rain settings are hardcoded
|
||||||
|
|
|
@ -21,12 +21,10 @@
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwbase/windowmanager.hpp"
|
#include "../mwbase/windowmanager.hpp"
|
||||||
#include "../mwbase/mechanicsmanager.hpp"
|
#include "../mwbase/mechanicsmanager.hpp"
|
||||||
#include "../mwbase/scriptmanager.hpp"
|
|
||||||
|
|
||||||
#include "../mwworld/inventorystore.hpp"
|
#include "../mwworld/inventorystore.hpp"
|
||||||
#include "../mwworld/class.hpp"
|
#include "../mwworld/class.hpp"
|
||||||
#include "../mwworld/actionequip.hpp"
|
#include "../mwworld/actionequip.hpp"
|
||||||
#include "../mwscript/interpretercontext.hpp"
|
|
||||||
|
|
||||||
#include "../mwmechanics/actorutil.hpp"
|
#include "../mwmechanics/actorutil.hpp"
|
||||||
#include "../mwmechanics/creaturestats.hpp"
|
#include "../mwmechanics/creaturestats.hpp"
|
||||||
|
@ -507,6 +505,16 @@ namespace MWGui
|
||||||
void InventoryWindow::useItem(const MWWorld::Ptr &ptr, bool force)
|
void InventoryWindow::useItem(const MWWorld::Ptr &ptr, bool force)
|
||||||
{
|
{
|
||||||
const std::string& script = ptr.getClass().getScript(ptr);
|
const std::string& script = ptr.getClass().getScript(ptr);
|
||||||
|
if (!script.empty())
|
||||||
|
{
|
||||||
|
// Don't try to equip the item if PCSkipEquip is set to 1
|
||||||
|
if (ptr.getRefData().getLocals().getIntVar(script, "pcskipequip") == 1)
|
||||||
|
{
|
||||||
|
ptr.getRefData().getLocals().setVarByInt(script, "onpcequip", 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ptr.getRefData().getLocals().setVarByInt(script, "onpcequip", 0);
|
||||||
|
}
|
||||||
|
|
||||||
MWWorld::Ptr player = MWMechanics::getPlayer();
|
MWWorld::Ptr player = MWMechanics::getPlayer();
|
||||||
|
|
||||||
|
@ -526,10 +534,6 @@ namespace MWGui
|
||||||
|
|
||||||
if (canEquip.first == 0)
|
if (canEquip.first == 0)
|
||||||
{
|
{
|
||||||
/// If PCSkipEquip is set, set OnPCEquip to 1 and don't message anything
|
|
||||||
if (!script.empty() && ptr.getRefData().getLocals().getIntVar(script, "pcskipequip") == 1)
|
|
||||||
ptr.getRefData().getLocals().setVarByInt(script, "onpcequip", 1);
|
|
||||||
else
|
|
||||||
MWBase::Environment::get().getWindowManager()->messageBox(canEquip.second);
|
MWBase::Environment::get().getWindowManager()->messageBox(canEquip.second);
|
||||||
updateItemView();
|
updateItemView();
|
||||||
return;
|
return;
|
||||||
|
@ -537,32 +541,21 @@ namespace MWGui
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the item has a script, set its OnPcEquip to 1
|
// If the item has a script, set OnPCEquip or PCSkipEquip to 1
|
||||||
if (!script.empty()
|
if (!script.empty())
|
||||||
// Another morrowind oddity: when an item has skipped equipping and pcskipequip is reset to 0 afterwards,
|
|
||||||
// the next time it is equipped will work normally, but will not set onpcequip
|
|
||||||
&& (ptr != mSkippedToEquip || ptr.getRefData().getLocals().getIntVar(script, "pcskipequip") == 1))
|
|
||||||
ptr.getRefData().getLocals().setVarByInt(script, "onpcequip", 1);
|
|
||||||
|
|
||||||
// Give the script a chance to run once before we do anything else
|
|
||||||
// this is important when setting pcskipequip as a reaction to onpcequip being set (bk_treasuryreport does this)
|
|
||||||
if (!force && !script.empty() && MWBase::Environment::get().getWorld()->getScriptsEnabled())
|
|
||||||
{
|
{
|
||||||
MWScript::InterpreterContext interpreterContext (&ptr.getRefData().getLocals(), ptr);
|
// Ingredients, books and repair hammers must not have OnPCEquip set to 1 here
|
||||||
MWBase::Environment::get().getScriptManager()->run (script, interpreterContext);
|
const std::string& type = ptr.getTypeName();
|
||||||
|
bool isBook = type == typeid(ESM::Book).name();
|
||||||
|
if (!isBook && type != typeid(ESM::Ingredient).name() && type != typeid(ESM::Repair).name())
|
||||||
|
ptr.getRefData().getLocals().setVarByInt(script, "onpcequip", 1);
|
||||||
|
// Books must have PCSkipEquip set to 1 instead
|
||||||
|
else if (isBook)
|
||||||
|
ptr.getRefData().getLocals().setVarByInt(script, "pcskipequip", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
mSkippedToEquip = MWWorld::Ptr();
|
|
||||||
if (ptr.getRefData().getCount()) // make sure the item is still there, the script might have removed it
|
|
||||||
{
|
|
||||||
if (script.empty() || ptr.getRefData().getLocals().getIntVar(script, "pcskipequip") == 0)
|
|
||||||
{
|
|
||||||
std::shared_ptr<MWWorld::Action> action = ptr.getClass().use(ptr, force);
|
std::shared_ptr<MWWorld::Action> action = ptr.getClass().use(ptr, force);
|
||||||
action->execute(player);
|
action->execute(player);
|
||||||
}
|
|
||||||
else
|
|
||||||
mSkippedToEquip = ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isVisible())
|
if (isVisible())
|
||||||
{
|
{
|
||||||
|
|
|
@ -93,8 +93,6 @@ namespace MWGui
|
||||||
MyGUI::Button* mFilterMagic;
|
MyGUI::Button* mFilterMagic;
|
||||||
MyGUI::Button* mFilterMisc;
|
MyGUI::Button* mFilterMisc;
|
||||||
|
|
||||||
MWWorld::Ptr mSkippedToEquip;
|
|
||||||
|
|
||||||
GuiMode mGuiMode;
|
GuiMode mGuiMode;
|
||||||
|
|
||||||
int mLastXSize;
|
int mLastXSize;
|
||||||
|
|
Loading…
Reference in a new issue