mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-04 03:40:14 +00:00
Do not allow to loot fighting actors during death animation (bug #3528)
This commit is contained in:
parent
9bc24ab629
commit
dd919b9f2c
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include <components/esm/loadcrea.hpp>
|
#include <components/esm/loadcrea.hpp>
|
||||||
#include <components/esm/creaturestate.hpp>
|
#include <components/esm/creaturestate.hpp>
|
||||||
|
#include <components/settings/settings.hpp>
|
||||||
|
|
||||||
#include "../mwmechanics/creaturestats.hpp"
|
#include "../mwmechanics/creaturestats.hpp"
|
||||||
#include "../mwmechanics/magiceffects.hpp"
|
#include "../mwmechanics/magiceffects.hpp"
|
||||||
@ -448,10 +449,27 @@ namespace MWClass
|
|||||||
return action;
|
return action;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(getCreatureStats(ptr).isDead())
|
const MWMechanics::CreatureStats& stats = getCreatureStats(ptr);
|
||||||
return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionOpen(ptr, true));
|
|
||||||
if(ptr.getClass().getCreatureStats(ptr).getAiSequence().isInCombat())
|
if(stats.isDead())
|
||||||
|
{
|
||||||
|
bool canLoot = Settings::Manager::getBool ("can loot during death animation", "Game");
|
||||||
|
|
||||||
|
// by default user can loot friendly actors during death animation
|
||||||
|
if (canLoot && !stats.getAiSequence().isInCombat())
|
||||||
|
return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionOpen(ptr, true));
|
||||||
|
|
||||||
|
// otherwise wait until death animation
|
||||||
|
if(stats.isDeathAnimationFinished())
|
||||||
|
return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionOpen(ptr, true));
|
||||||
|
|
||||||
|
// death animation is not finished, do nothing
|
||||||
|
return std::shared_ptr<MWWorld::Action> (new MWWorld::FailedAction(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(stats.getAiSequence().isInCombat())
|
||||||
return std::shared_ptr<MWWorld::Action>(new MWWorld::FailedAction(""));
|
return std::shared_ptr<MWWorld::Action>(new MWWorld::FailedAction(""));
|
||||||
|
|
||||||
return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionTalk(ptr));
|
return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionTalk(ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -558,7 +576,11 @@ namespace MWClass
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
const CreatureCustomData& customData = ptr.getRefData().getCustomData()->asCreatureCustomData();
|
const CreatureCustomData& customData = ptr.getRefData().getCustomData()->asCreatureCustomData();
|
||||||
return !customData.mCreatureStats.getAiSequence().isInCombat() || customData.mCreatureStats.isDead();
|
|
||||||
|
if (customData.mCreatureStats.isDead() && customData.mCreatureStats.isDeathAnimationFinished())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return !customData.mCreatureStats.getAiSequence().isInCombat();
|
||||||
}
|
}
|
||||||
|
|
||||||
MWGui::ToolTipInfo Creature::getToolTipInfo (const MWWorld::ConstPtr& ptr, int count) const
|
MWGui::ToolTipInfo Creature::getToolTipInfo (const MWWorld::ConstPtr& ptr, int count) const
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <components/esm/loadmgef.hpp>
|
#include <components/esm/loadmgef.hpp>
|
||||||
#include <components/esm/loadnpc.hpp>
|
#include <components/esm/loadnpc.hpp>
|
||||||
#include <components/esm/npcstate.hpp>
|
#include <components/esm/npcstate.hpp>
|
||||||
|
#include <components/settings/settings.hpp>
|
||||||
|
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
@ -863,16 +864,27 @@ namespace MWClass
|
|||||||
return action;
|
return action;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(getCreatureStats(ptr).isDead())
|
const MWMechanics::CreatureStats& stats = getCreatureStats(ptr);
|
||||||
return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionOpen(ptr, true));
|
|
||||||
if(ptr.getClass().getCreatureStats(ptr).getAiSequence().isInCombat())
|
if(stats.isDead())
|
||||||
return std::shared_ptr<MWWorld::Action>(new MWWorld::FailedAction("#{sActorInCombat}"));
|
{
|
||||||
if(getCreatureStats(actor).getStance(MWMechanics::CreatureStats::Stance_Sneak)
|
bool canLoot = Settings::Manager::getBool ("can loot during death animation", "Game");
|
||||||
|| ptr.getClass().getCreatureStats(ptr).getKnockedDown())
|
|
||||||
return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionOpen(ptr)); // stealing
|
// by default user can loot friendly actors during death animation
|
||||||
// Can't talk to werewolfs
|
if (canLoot && !stats.getAiSequence().isInCombat())
|
||||||
if(ptr.getClass().isNpc() && ptr.getClass().getNpcStats(ptr).isWerewolf())
|
return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionOpen(ptr, true));
|
||||||
|
|
||||||
|
// otherwise wait until death animation
|
||||||
|
if(stats.isDeathAnimationFinished())
|
||||||
|
return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionOpen(ptr, true));
|
||||||
|
|
||||||
|
// death animation is not finished, do nothing
|
||||||
return std::shared_ptr<MWWorld::Action> (new MWWorld::FailedAction(""));
|
return std::shared_ptr<MWWorld::Action> (new MWWorld::FailedAction(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(stats.getAiSequence().isInCombat())
|
||||||
|
return std::shared_ptr<MWWorld::Action>(new MWWorld::FailedAction(""));
|
||||||
|
|
||||||
return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionTalk(ptr));
|
return std::shared_ptr<MWWorld::Action>(new MWWorld::ActionTalk(ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1019,7 +1031,11 @@ namespace MWClass
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
const NpcCustomData& customData = ptr.getRefData().getCustomData()->asNpcCustomData();
|
const NpcCustomData& customData = ptr.getRefData().getCustomData()->asNpcCustomData();
|
||||||
return !customData.mNpcStats.getAiSequence().isInCombat() || customData.mNpcStats.isDead();
|
|
||||||
|
if (customData.mNpcStats.isDead() && customData.mNpcStats.isDeathAnimationFinished())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return !customData.mNpcStats.getAiSequence().isInCombat();
|
||||||
}
|
}
|
||||||
|
|
||||||
MWGui::ToolTipInfo Npc::getToolTipInfo (const MWWorld::ConstPtr& ptr, int count) const
|
MWGui::ToolTipInfo Npc::getToolTipInfo (const MWWorld::ConstPtr& ptr, int count) const
|
||||||
|
@ -65,6 +65,22 @@ the type of attack is determined by the direction that the character is moving a
|
|||||||
The default value is false.
|
The default value is false.
|
||||||
This setting can be toggled with the Always Use Best Attack button in the Prefs panel of the Options menu.
|
This setting can be toggled with the Always Use Best Attack button in the Prefs panel of the Options menu.
|
||||||
|
|
||||||
|
can loot during death animation
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
:Type: boolean
|
||||||
|
:Range: True/False
|
||||||
|
:Default: True
|
||||||
|
|
||||||
|
If this setting is true, the player is allowed to loot actors (e.g. summoned creatures) during death animation, if they are not in combat.
|
||||||
|
However disposing corpses during death animation is not recommended - death counter may not be incremented, and this behaviour can break quests.
|
||||||
|
This is how original Morrowind behaves.
|
||||||
|
|
||||||
|
If this setting is false, player has to wait until end of death animation in all cases.
|
||||||
|
This case is more safe, but makes using of summoned creatures exploit (looting summoned Dremoras and Golden Saints for expensive weapons) a lot harder.
|
||||||
|
|
||||||
|
The default value is true. This setting can only be configured by editing the settings configuration file.
|
||||||
|
|
||||||
difficulty
|
difficulty
|
||||||
----------
|
----------
|
||||||
|
|
||||||
@ -110,4 +126,4 @@ followers attack on sight
|
|||||||
:Default: False
|
:Default: False
|
||||||
|
|
||||||
Makes player followers and escorters start combat with enemies who have started combat with them or the player.
|
Makes player followers and escorters start combat with enemies who have started combat with them or the player.
|
||||||
Otherwise they wait for the enemies or the player to do an attack first.
|
Otherwise they wait for the enemies or the player to do an attack first.
|
||||||
|
@ -180,6 +180,9 @@ prevent merchant equipping = false
|
|||||||
# or the player. Otherwise they wait for the enemies or the player to do an attack first.
|
# or the player. Otherwise they wait for the enemies or the player to do an attack first.
|
||||||
followers attack on sight = false
|
followers attack on sight = false
|
||||||
|
|
||||||
|
# Can loot non-fighting actors during death animation
|
||||||
|
can loot during death animation = true
|
||||||
|
|
||||||
[General]
|
[General]
|
||||||
|
|
||||||
# Anisotropy reduces distortion in textures at low angles (e.g. 0 to 16).
|
# Anisotropy reduces distortion in textures at low angles (e.g. 0 to 16).
|
||||||
|
Loading…
x
Reference in New Issue
Block a user