mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-04-16 08:42:23 +00:00
Move onTakeItem() to item models
This commit is contained in:
parent
d94235e3a7
commit
3604b73d60
@ -8,13 +8,13 @@
|
|||||||
#include "../mwbase/windowmanager.hpp"
|
#include "../mwbase/windowmanager.hpp"
|
||||||
#include "../mwbase/dialoguemanager.hpp"
|
#include "../mwbase/dialoguemanager.hpp"
|
||||||
#include "../mwbase/mechanicsmanager.hpp"
|
#include "../mwbase/mechanicsmanager.hpp"
|
||||||
#include "../mwmechanics/actorutil.hpp"
|
|
||||||
|
|
||||||
#include "../mwworld/class.hpp"
|
#include "../mwworld/class.hpp"
|
||||||
#include "../mwworld/inventorystore.hpp"
|
#include "../mwworld/inventorystore.hpp"
|
||||||
|
|
||||||
#include "../mwmechanics/pickpocket.hpp"
|
#include "../mwmechanics/pickpocket.hpp"
|
||||||
#include "../mwmechanics/creaturestats.hpp"
|
#include "../mwmechanics/creaturestats.hpp"
|
||||||
|
#include "../mwmechanics/actorutil.hpp"
|
||||||
|
|
||||||
#include "countdialog.hpp"
|
#include "countdialog.hpp"
|
||||||
#include "inventorywindow.hpp"
|
#include "inventorywindow.hpp"
|
||||||
@ -142,8 +142,7 @@ namespace MWGui
|
|||||||
if (mPtr.getClass().isNpc() && !loot)
|
if (mPtr.getClass().isNpc() && !loot)
|
||||||
{
|
{
|
||||||
// we are stealing stuff
|
// we are stealing stuff
|
||||||
MWWorld::Ptr player = MWMechanics::getPlayer();
|
mModel = new PickpocketItemModel(mPtr, new InventoryItemModel(container),
|
||||||
mModel = new PickpocketItemModel(player, new InventoryItemModel(container),
|
|
||||||
!mPtr.getClass().getCreatureStats(mPtr).getKnockedDown());
|
!mPtr.getClass().getCreatureStats(mPtr).getKnockedDown());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -271,32 +270,8 @@ namespace MWGui
|
|||||||
|
|
||||||
bool ContainerWindow::onTakeItem(const ItemStack &item, int count)
|
bool ContainerWindow::onTakeItem(const ItemStack &item, int count)
|
||||||
{
|
{
|
||||||
MWWorld::Ptr player = MWMechanics::getPlayer();
|
// TODO: mPickpocketDetected = true;
|
||||||
// TODO: move to ItemModels
|
return mModel->onTakeItem(item.mBase, count);
|
||||||
if (dynamic_cast<PickpocketItemModel*>(mModel)
|
|
||||||
&& !mPtr.getClass().getCreatureStats(mPtr).getKnockedDown())
|
|
||||||
{
|
|
||||||
MWMechanics::Pickpocket pickpocket(player, mPtr);
|
|
||||||
if (pickpocket.pick(item.mBase, count))
|
|
||||||
{
|
|
||||||
MWBase::Environment::get().getMechanicsManager()->commitCrime(
|
|
||||||
player, mPtr, MWBase::MechanicsManager::OT_Pickpocket, 0, true);
|
|
||||||
MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_Container);
|
|
||||||
mPickpocketDetected = true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
player.getClass().skillUsageSucceeded(player, ESM::Skill::Sneak, 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Looting a dead corpse is considered OK
|
|
||||||
if (mPtr.getClass().isActor() && mPtr.getClass().getCreatureStats(mPtr).isDead())
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
MWBase::Environment::get().getMechanicsManager()->itemTaken(player, item.mBase, mPtr, count);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,12 +2,15 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include "../mwmechanics/creaturestats.hpp"
|
||||||
|
#include "../mwmechanics/actorutil.hpp"
|
||||||
|
|
||||||
#include "../mwworld/containerstore.hpp"
|
#include "../mwworld/containerstore.hpp"
|
||||||
#include "../mwworld/class.hpp"
|
#include "../mwworld/class.hpp"
|
||||||
|
|
||||||
#include "../mwbase/world.hpp"
|
|
||||||
#include "../mwbase/mechanicsmanager.hpp"
|
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
|
#include "../mwbase/mechanicsmanager.hpp"
|
||||||
|
#include "../mwbase/world.hpp"
|
||||||
|
|
||||||
#include "../mwmechanics/actorutil.hpp"
|
#include "../mwmechanics/actorutil.hpp"
|
||||||
|
|
||||||
@ -183,4 +186,21 @@ void ContainerItemModel::update()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ContainerItemModel::onTakeItem(const MWWorld::Ptr &item, int count)
|
||||||
|
{
|
||||||
|
if (mItemSources.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
MWWorld::Ptr target = mItemSources[0];
|
||||||
|
|
||||||
|
// Looting a dead corpse is considered OK
|
||||||
|
if (target.getClass().isActor() && target.getClass().getCreatureStats(target).isDead())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
MWWorld::Ptr player = MWMechanics::getPlayer();
|
||||||
|
MWBase::Environment::get().getMechanicsManager()->itemTaken(player, item, target, count);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ namespace MWGui
|
|||||||
virtual void removeItem (const ItemStack& item, size_t count);
|
virtual void removeItem (const ItemStack& item, size_t count);
|
||||||
|
|
||||||
virtual void update();
|
virtual void update();
|
||||||
|
virtual bool onTakeItem(const MWWorld::Ptr &item, int count);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<MWWorld::Ptr> mItemSources;
|
std::vector<MWWorld::Ptr> mItemSources;
|
||||||
|
@ -9,6 +9,9 @@
|
|||||||
#include "../mwworld/class.hpp"
|
#include "../mwworld/class.hpp"
|
||||||
#include "../mwworld/inventorystore.hpp"
|
#include "../mwworld/inventorystore.hpp"
|
||||||
|
|
||||||
|
#include "../mwbase/environment.hpp"
|
||||||
|
#include "../mwbase/mechanicsmanager.hpp"
|
||||||
|
|
||||||
namespace MWGui
|
namespace MWGui
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -116,4 +119,16 @@ void InventoryItemModel::update()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool InventoryItemModel::onTakeItem(const MWWorld::Ptr &item, int count) const
|
||||||
|
{
|
||||||
|
// Looting a dead corpse is considered OK
|
||||||
|
if (mActor.getClass().isActor() && mActor.getClass().getCreatureStats(mActor).isDead())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
MWWorld::Ptr player = MWMechanics::getPlayer();
|
||||||
|
MWBase::Environment::get().getMechanicsManager()->itemTaken(player, item, mActor, count);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ namespace MWGui
|
|||||||
virtual MWWorld::Ptr moveItem (const ItemStack& item, size_t count, ItemModel* otherModel);
|
virtual MWWorld::Ptr moveItem (const ItemStack& item, size_t count, ItemModel* otherModel);
|
||||||
|
|
||||||
virtual void update();
|
virtual void update();
|
||||||
|
virtual bool onTakeItem(const MWWorld::Ptr &item, int count) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MWWorld::Ptr mActor;
|
MWWorld::Ptr mActor;
|
||||||
|
@ -129,6 +129,11 @@ namespace MWGui
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ItemModel::onTakeItem(const MWWorld::Ptr &item, int count)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ProxyItemModel::ProxyItemModel()
|
ProxyItemModel::ProxyItemModel()
|
||||||
: mSourceModel(NULL)
|
: mSourceModel(NULL)
|
||||||
@ -198,4 +203,8 @@ namespace MWGui
|
|||||||
mSourceModel = sourceModel;
|
mSourceModel = sourceModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ProxyItemModel::onTakeItem(const MWWorld::Ptr &item, int count)
|
||||||
|
{
|
||||||
|
return mSourceModel->onTakeItem (item, count);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,6 +75,7 @@ namespace MWGui
|
|||||||
|
|
||||||
/// Is the player allowed to insert items into this model? (default true)
|
/// Is the player allowed to insert items into this model? (default true)
|
||||||
virtual bool allowedToInsertItems() const;
|
virtual bool allowedToInsertItems() const;
|
||||||
|
virtual bool onTakeItem(const MWWorld::Ptr &item, int count);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ItemModel(const ItemModel&);
|
ItemModel(const ItemModel&);
|
||||||
@ -94,6 +95,7 @@ namespace MWGui
|
|||||||
virtual MWWorld::Ptr copyItem (const ItemStack& item, size_t count, bool setNewOwner=false);
|
virtual MWWorld::Ptr copyItem (const ItemStack& item, size_t count, bool setNewOwner=false);
|
||||||
virtual void removeItem (const ItemStack& item, size_t count);
|
virtual void removeItem (const ItemStack& item, size_t count);
|
||||||
virtual ModelIndex getIndex (ItemStack item);
|
virtual ModelIndex getIndex (ItemStack item);
|
||||||
|
virtual bool onTakeItem(const MWWorld::Ptr &item, int count);
|
||||||
|
|
||||||
/// @note Takes ownership of the passed pointer.
|
/// @note Takes ownership of the passed pointer.
|
||||||
void setSourceModel(ItemModel* sourceModel);
|
void setSourceModel(ItemModel* sourceModel);
|
||||||
|
@ -3,15 +3,24 @@
|
|||||||
#include <components/misc/rng.hpp>
|
#include <components/misc/rng.hpp>
|
||||||
#include <components/esm/loadskil.hpp>
|
#include <components/esm/loadskil.hpp>
|
||||||
|
|
||||||
|
#include "../mwmechanics/actorutil.hpp"
|
||||||
|
#include "../mwmechanics/pickpocket.hpp"
|
||||||
|
|
||||||
#include "../mwworld/class.hpp"
|
#include "../mwworld/class.hpp"
|
||||||
|
|
||||||
|
#include "../mwbase/environment.hpp"
|
||||||
|
#include "../mwbase/mechanicsmanager.hpp"
|
||||||
|
#include "../mwbase/windowmanager.hpp"
|
||||||
|
|
||||||
namespace MWGui
|
namespace MWGui
|
||||||
{
|
{
|
||||||
|
|
||||||
PickpocketItemModel::PickpocketItemModel(const MWWorld::Ptr& thief, ItemModel *sourceModel, bool hideItems)
|
PickpocketItemModel::PickpocketItemModel(const MWWorld::Ptr& actor, ItemModel *sourceModel, bool hideItems)
|
||||||
|
: mActor(actor)
|
||||||
{
|
{
|
||||||
|
MWWorld::Ptr player = MWMechanics::getPlayer();
|
||||||
mSourceModel = sourceModel;
|
mSourceModel = sourceModel;
|
||||||
int chance = thief.getClass().getSkill(thief, ESM::Skill::Sneak);
|
int chance = player.getClass().getSkill(player, ESM::Skill::Sneak);
|
||||||
|
|
||||||
mSourceModel->update();
|
mSourceModel->update();
|
||||||
|
|
||||||
@ -75,4 +84,20 @@ namespace MWGui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PickpocketItemModel::onTakeItem(const MWWorld::Ptr &item, int count) const
|
||||||
|
{
|
||||||
|
MWWorld::Ptr player = MWMechanics::getPlayer();
|
||||||
|
MWMechanics::Pickpocket pickpocket(player, mActor);
|
||||||
|
if (pickpocket.pick(item, count))
|
||||||
|
{
|
||||||
|
MWBase::Environment::get().getMechanicsManager()->commitCrime(
|
||||||
|
player, mActor, MWBase::MechanicsManager::OT_Pickpocket, 0, true);
|
||||||
|
MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_Container);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
player.getClass().skillUsageSucceeded(player, ESM::Skill::Sneak, 1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,10 @@ namespace MWGui
|
|||||||
virtual void update();
|
virtual void update();
|
||||||
virtual void removeItem (const ItemStack& item, size_t count);
|
virtual void removeItem (const ItemStack& item, size_t count);
|
||||||
virtual bool allowedToInsertItems() const;
|
virtual bool allowedToInsertItems() const;
|
||||||
|
virtual bool onTakeItem(const MWWorld::Ptr &item, int count) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
MWWorld::Ptr mActor;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<ItemStack> mHiddenItems;
|
std::vector<ItemStack> mHiddenItems;
|
||||||
|
@ -311,4 +311,8 @@ namespace MWGui
|
|||||||
std::sort(mItems.begin(), mItems.end(), cmp);
|
std::sort(mItems.begin(), mItems.end(), cmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SortFilterItemModel::onTakeItem(const MWWorld::Ptr &item, int count)
|
||||||
|
{
|
||||||
|
return mSourceModel->onTakeItem (item, count);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,8 @@ namespace MWGui
|
|||||||
/// Use ItemStack::Type for sorting?
|
/// Use ItemStack::Type for sorting?
|
||||||
void setSortByType(bool sort) { mSortByType = sort; }
|
void setSortByType(bool sort) { mSortByType = sort; }
|
||||||
|
|
||||||
|
bool onTakeItem(const MWWorld::Ptr &item, int count);
|
||||||
|
|
||||||
static const int Category_Weapon = (1<<1);
|
static const int Category_Weapon = (1<<1);
|
||||||
static const int Category_Apparel = (1<<2);
|
static const int Category_Apparel = (1<<2);
|
||||||
static const int Category_Misc = (1<<3);
|
static const int Category_Misc = (1<<3);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user