forked from teamnwah/openmw-tes3coop
Respect items belonging to a faction
This commit is contained in:
parent
3c0080d2c1
commit
0285d18fc2
20 changed files with 49 additions and 19 deletions
|
@ -96,7 +96,11 @@ namespace MWClass
|
|||
|
||||
std::string text;
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp())
|
||||
{
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
info.text = text;
|
||||
|
||||
return info;
|
||||
|
|
|
@ -128,6 +128,7 @@ namespace MWClass
|
|||
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp()) {
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
info.text = text;
|
||||
|
|
|
@ -252,6 +252,7 @@ namespace MWClass
|
|||
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp()) {
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
|
||||
|
|
|
@ -140,6 +140,7 @@ namespace MWClass
|
|||
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp()) {
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
|
||||
|
|
|
@ -195,6 +195,7 @@ namespace MWClass
|
|||
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp()) {
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ namespace MWClass
|
|||
ptr.get<ESM::Container>();
|
||||
|
||||
data->mContainerStore.fill(
|
||||
ref->mBase->mInventory, ptr.getCellRef().mOwner, MWBase::Environment::get().getWorld()->getStore());
|
||||
ref->mBase->mInventory, ptr.getCellRef().mOwner, ptr.getCellRef().mFaction, MWBase::Environment::get().getWorld()->getStore());
|
||||
|
||||
// store
|
||||
ptr.getRefData().setCustomData (data.release());
|
||||
|
@ -216,6 +216,7 @@ namespace MWClass
|
|||
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp()) {
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
|
||||
|
|
|
@ -95,9 +95,11 @@ namespace MWClass
|
|||
data->mCreatureStats.getSpells().add (*iter);
|
||||
|
||||
// inventory
|
||||
data->mContainerStore.fill(ref->mBase->mInventory, getId(ptr),
|
||||
data->mContainerStore.fill(ref->mBase->mInventory, getId(ptr), "",
|
||||
MWBase::Environment::get().getWorld()->getStore());
|
||||
|
||||
// TODO: this is not quite correct, in vanilla the merchant's gold pool is not available in his inventory.
|
||||
// (except for gold you gave him)
|
||||
data->mContainerStore.add("gold_001", ref->mBase->mData.mGold, ptr);
|
||||
|
||||
// store
|
||||
|
|
|
@ -149,6 +149,7 @@ namespace MWClass
|
|||
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp()) {
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
|
||||
|
|
|
@ -187,6 +187,7 @@ namespace MWClass
|
|||
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp()) {
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
|
||||
|
|
|
@ -145,6 +145,7 @@ namespace MWClass
|
|||
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp()) {
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
|
||||
|
|
|
@ -184,6 +184,7 @@ namespace MWClass
|
|||
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp()) {
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
|
||||
|
|
|
@ -320,12 +320,14 @@ namespace MWClass
|
|||
data->mNpcStats.getSpells().add (*iter);
|
||||
|
||||
// inventory
|
||||
data->mInventoryStore.fill(ref->mBase->mInventory, getId(ptr),
|
||||
data->mInventoryStore.fill(ref->mBase->mInventory, getId(ptr), "",
|
||||
MWBase::Environment::get().getWorld()->getStore());
|
||||
|
||||
// store
|
||||
ptr.getRefData().setCustomData (data.release());
|
||||
|
||||
// TODO: this is not quite correct, in vanilla the merchant's gold pool is not available in his inventory.
|
||||
// (except for gold you gave him)
|
||||
getContainerStore(ptr).add("gold_001", gold, ptr);
|
||||
|
||||
getInventoryStore(ptr).autoEquip(ptr);
|
||||
|
|
|
@ -153,6 +153,7 @@ namespace MWClass
|
|||
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp()) {
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
|
||||
|
|
|
@ -144,6 +144,7 @@ namespace MWClass
|
|||
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp()) {
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
|
||||
|
|
|
@ -148,6 +148,7 @@ namespace MWClass
|
|||
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp()) {
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
|
||||
|
|
|
@ -355,6 +355,7 @@ namespace MWClass
|
|||
|
||||
if (MWBase::Environment::get().getWindowManager()->getFullHelp()) {
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mOwner, "Owner");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mRef.mFaction, "Faction");
|
||||
text += MWGui::ToolTips::getMiscString(ref->mBase->mScript, "Script");
|
||||
}
|
||||
|
||||
|
|
|
@ -731,16 +731,23 @@ namespace MWMechanics
|
|||
void MechanicsManager::itemTaken(const MWWorld::Ptr &ptr, const MWWorld::Ptr &item, int count)
|
||||
{
|
||||
const std::string& owner = item.getCellRef().mOwner;
|
||||
if (owner.empty())
|
||||
return;
|
||||
bool isOwned = !owner.empty();
|
||||
|
||||
const std::string& faction = item.getCellRef().mFaction;
|
||||
if (faction.empty())
|
||||
return;
|
||||
const std::map<std::string, int>& factions = ptr.getClass().getNpcStats(ptr).getFactionRanks();
|
||||
if (factions.find(Misc::StringUtils::lowerCase(faction)) != factions.end())
|
||||
bool isFactionOwned = false;
|
||||
if (!faction.empty())
|
||||
{
|
||||
const std::map<std::string, int>& factions = ptr.getClass().getNpcStats(ptr).getFactionRanks();
|
||||
if (factions.find(Misc::StringUtils::lowerCase(faction)) == factions.end())
|
||||
isFactionOwned = true;
|
||||
}
|
||||
|
||||
if (!isOwned && !isFactionOwned)
|
||||
return;
|
||||
|
||||
MWWorld::Ptr victim = MWBase::Environment::get().getWorld()->getPtr(owner, true);
|
||||
MWWorld::Ptr victim;
|
||||
if (!owner.empty())
|
||||
victim = MWBase::Environment::get().getWorld()->getPtr(owner, true);
|
||||
|
||||
commitCrime(ptr, victim, OT_Theft, item.getClass().getValue(item) * count);
|
||||
}
|
||||
|
|
|
@ -279,19 +279,20 @@ int MWWorld::ContainerStore::remove(const Ptr& item, int count, const Ptr& actor
|
|||
return count - toRemove;
|
||||
}
|
||||
|
||||
void MWWorld::ContainerStore::fill (const ESM::InventoryList& items, const std::string& owner, const MWWorld::ESMStore& store)
|
||||
void MWWorld::ContainerStore::fill (const ESM::InventoryList& items, const std::string& owner, const std::string& faction, const MWWorld::ESMStore& store)
|
||||
{
|
||||
for (std::vector<ESM::ContItem>::const_iterator iter (items.mList.begin()); iter!=items.mList.end();
|
||||
++iter)
|
||||
{
|
||||
std::string id = iter->mItem.toString();
|
||||
addInitialItem(id, owner, iter->mCount);
|
||||
addInitialItem(id, owner, faction, iter->mCount);
|
||||
}
|
||||
|
||||
flagAsModified();
|
||||
}
|
||||
|
||||
void MWWorld::ContainerStore::addInitialItem (const std::string& id, const std::string& owner, int count, unsigned char failChance, bool topLevel)
|
||||
void MWWorld::ContainerStore::addInitialItem (const std::string& id, const std::string& owner, const std::string& faction,
|
||||
int count, unsigned char failChance, bool topLevel)
|
||||
{
|
||||
count = std::abs(count); /// \todo implement item restocking (indicated by negative count)
|
||||
|
||||
|
@ -312,7 +313,7 @@ void MWWorld::ContainerStore::addInitialItem (const std::string& id, const std::
|
|||
if (topLevel && count > 1 && levItem->mFlags & ESM::ItemLevList::Each)
|
||||
{
|
||||
for (int i=0; i<count; ++i)
|
||||
addInitialItem(id, owner, 1, failChance, false);
|
||||
addInitialItem(id, owner, faction, 1, failChance, false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -342,12 +343,13 @@ void MWWorld::ContainerStore::addInitialItem (const std::string& id, const std::
|
|||
if (candidates.empty())
|
||||
return;
|
||||
std::string item = candidates[std::rand()%candidates.size()];
|
||||
addInitialItem(item, owner, count, failChance, false);
|
||||
addInitialItem(item, owner, faction, count, failChance, false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ref.getPtr().getCellRef().mOwner = owner;
|
||||
ref.getPtr().getCellRef().mFaction = faction;
|
||||
addImp (ref.getPtr(), count);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@ namespace MWWorld
|
|||
mutable float mCachedWeight;
|
||||
mutable bool mWeightUpToDate;
|
||||
ContainerStoreIterator addImp (const Ptr& ptr, int count);
|
||||
void addInitialItem (const std::string& id, const std::string& owner, int count, unsigned char failChance=0, bool topLevel=true);
|
||||
void addInitialItem (const std::string& id, const std::string& owner, const std::string& faction, int count, unsigned char failChance=0, bool topLevel=true);
|
||||
|
||||
public:
|
||||
|
||||
|
@ -103,7 +103,7 @@ namespace MWWorld
|
|||
virtual bool stacks (const Ptr& ptr1, const Ptr& ptr2);
|
||||
///< @return true if the two specified objects can stack with each other
|
||||
|
||||
void fill (const ESM::InventoryList& items, const std::string& owner, const MWWorld::ESMStore& store);
|
||||
void fill (const ESM::InventoryList& items, const std::string& owner, const std::string& faction, const MWWorld::ESMStore& store);
|
||||
///< Insert items into *this.
|
||||
|
||||
void clear();
|
||||
|
|
|
@ -34,8 +34,8 @@ namespace ESM
|
|||
// ID of creature trapped in this soul gem (?)
|
||||
std::string mSoul;
|
||||
|
||||
// ?? CNAM has a faction name, might be for objects/beds etc
|
||||
// belonging to a faction.
|
||||
// The faction that owns this object (and will get angry if
|
||||
// you take it and are not a faction member)
|
||||
std::string mFaction;
|
||||
|
||||
// INDX might be PC faction rank required to use the item? Sometimes
|
||||
|
|
Loading…
Reference in a new issue