forked from mirror/openmw-tes3mp
Merge pull request #1544 from rexelion/archerrangefix
use fProjectileMaxSpeed for ranged weapons distance (fixes #4192)
This commit is contained in:
commit
a7fd27f413
2 changed files with 25 additions and 28 deletions
|
@ -489,17 +489,8 @@ namespace MWMechanics
|
|||
}
|
||||
|
||||
void AiCombatStorage::startCombatMove(bool isDistantCombat, float distToTarget, float rangeAttack, const MWWorld::Ptr& actor, const MWWorld::Ptr& target)
|
||||
{
|
||||
if (mMovement.mPosition[0] || mMovement.mPosition[1])
|
||||
{
|
||||
mTimerCombatMove = 0.1f + 0.1f * Misc::Rng::rollClosedProbability();
|
||||
mCombatMove = true;
|
||||
}
|
||||
// dodge movements (for NPCs and bipedal creatures)
|
||||
else if (actor.getClass().isBipedal(actor))
|
||||
{
|
||||
// get the range of the target's weapon
|
||||
float rangeAttackOfTarget = 0.f;
|
||||
MWWorld::Ptr targetWeapon = MWWorld::Ptr();
|
||||
const MWWorld::Class& targetClass = target.getClass();
|
||||
|
||||
|
@ -512,14 +503,17 @@ namespace MWMechanics
|
|||
targetWeapon = *weaponSlot;
|
||||
}
|
||||
|
||||
std::shared_ptr<Action> targetWeaponAction (new ActionWeapon(targetWeapon));
|
||||
bool targetUsesRanged = false;
|
||||
float rangeAttackOfTarget = ActionWeapon(targetWeapon).getCombatRange(targetUsesRanged);
|
||||
|
||||
if (targetWeaponAction.get())
|
||||
if (mMovement.mPosition[0] || mMovement.mPosition[1])
|
||||
{
|
||||
bool isRangedCombat = false;
|
||||
rangeAttackOfTarget = targetWeaponAction->getCombatRange(isRangedCombat);
|
||||
mTimerCombatMove = 0.1f + 0.1f * Misc::Rng::rollClosedProbability();
|
||||
mCombatMove = true;
|
||||
}
|
||||
|
||||
// dodge movements (for NPCs and bipedal creatures)
|
||||
else if (actor.getClass().isBipedal(actor))
|
||||
{
|
||||
// apply sideway movement (kind of dodging) with some probability
|
||||
// if actor is within range of target's weapon
|
||||
if (distToTarget <= rangeAttackOfTarget && Misc::Rng::rollClosedProbability() < 0.25)
|
||||
|
@ -530,15 +524,17 @@ namespace MWMechanics
|
|||
}
|
||||
}
|
||||
|
||||
// Below behavior for backing up during ranged combat differs from vanilla.
|
||||
// Vanilla is observed as backing up only as far as fCombatDistance or
|
||||
// opponent's weapon range, or not backing up if opponent is also using a ranged weapon
|
||||
if (isDistantCombat && distToTarget < rangeAttack / 4)
|
||||
// Backing up behaviour
|
||||
// Actor backs up slightly further away than opponent's weapon range
|
||||
// (in vanilla - only as far as oponent's weapon range),
|
||||
// or not at all if opponent is using a ranged weapon
|
||||
if (isDistantCombat)
|
||||
{
|
||||
// actor should not back up into water
|
||||
if (MWBase::Environment::get().getWorld()->isUnderwater(MWWorld::ConstPtr(actor), 0.5f))
|
||||
return;
|
||||
|
||||
if (!targetUsesRanged && distToTarget <= rangeAttackOfTarget*1.5) // Don't back up if the target is wielding ranged weapon
|
||||
mMovement.mPosition[1] = -1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -115,6 +115,7 @@ namespace MWMechanics
|
|||
isRanged = false;
|
||||
|
||||
static const float fCombatDistance = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fCombatDistance")->getFloat();
|
||||
static const float fProjectileMaxSpeed = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fProjectileMaxSpeed")->getFloat();
|
||||
|
||||
if (mWeapon.isEmpty())
|
||||
{
|
||||
|
@ -128,7 +129,7 @@ namespace MWMechanics
|
|||
if (weapon->mData.mType >= ESM::Weapon::MarksmanBow)
|
||||
{
|
||||
isRanged = true;
|
||||
return 1000.f;
|
||||
return fProjectileMaxSpeed;
|
||||
}
|
||||
else
|
||||
return weapon->mData.mReach * fCombatDistance;
|
||||
|
|
Loading…
Reference in a new issue