Various fixes (#172)

* Add agility crit and dodge scaling from vmangos


Thanks to @killerwife 
c458698327

* Safeguard entering pvp honor halls against pvp rank (need DB update)
This commit is contained in:
Elmsroth 2022-01-02 13:12:43 +01:00 committed by GitHub
parent 89e63f3eee
commit ac4039ddeb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 88 additions and 40 deletions

View File

@ -5412,64 +5412,94 @@ uint32 Player::GetShieldBlockValue() const
float Player::GetMeleeCritFromAgility()
{
// from mangos 3462 for 1.12
float val = 0.0f, classrate = 0.0f, levelfactor = 0.0f, fg = 0.0f;
fg = (0.35f*(float) (getLevel())) + 5.55f;
levelfactor = (106.20f / fg) - 3;
float valLevel1 = 0.0f;
float valLevel60 = 0.0f;
// critical
switch (getClass())
{
case CLASS_PALADIN: classrate = 19.77f; break;
case CLASS_SHAMAN: classrate = 19.7f; break;
case CLASS_MAGE: classrate = 19.44f; break;
case CLASS_ROGUE: classrate = 29.0f; break;
case CLASS_HUNTER: classrate = 53.0f; break;
case CLASS_PRIEST:
case CLASS_WARLOCK:
case CLASS_DRUID:
case CLASS_WARRIOR:
default: classrate = 20.0f; break;
case CLASS_PALADIN:
case CLASS_SHAMAN:
case CLASS_DRUID:
valLevel1 = 4.6f;
valLevel60 = 20.0f;
break;
case CLASS_MAGE:
valLevel1 = 12.9f;
valLevel60 = 20.0f;
break;
case CLASS_ROGUE:
valLevel1 = 2.2f;
valLevel60 = 29.0f;
break;
case CLASS_HUNTER:
valLevel1 = 3.5f;
valLevel60 = 53.0f;
break;
case CLASS_PRIEST:
valLevel1 = 11.0f;
valLevel60 = 20.0f;
break;
case CLASS_WARLOCK:
valLevel1 = 8.4f;
valLevel60 = 20.0f;
break;
case CLASS_WARRIOR:
valLevel1 = 3.9f;
valLevel60 = 20.0f;
break;
default:
return 0.0f;
}
val = levelfactor * (GetStat(STAT_AGILITY) / classrate);
return val;
float classrate = valLevel1 * float(60.0f - getLevel()) / 59.0f + valLevel60 * float(getLevel() - 1.0f) / 59.0f;
return GetStat(STAT_AGILITY) / classrate;
}
float Player::GetDodgeFromAgility()
{
// from mangos 3462 for 1.12
float val = 0, classrate = 0, levelrate = 0;
float valLevel1 = 0.0f;
float valLevel60 = 0.0f;
levelrate = ((16.225f/((0.45f*(float)(getLevel()))+2.5f))-0.1f)/0.42f;
// dodge
// critical
switch (getClass())
{
case CLASS_ROGUE: classrate = 14.5; break;
case CLASS_HUNTER: classrate = 26.5f; break;
case CLASS_PALADIN:
case CLASS_SHAMAN:
case CLASS_MAGE:
case CLASS_PRIEST:
case CLASS_WARLOCK:
case CLASS_DRUID:
valLevel1 = 4.6f;
valLevel60 = 20.0f;
break;
case CLASS_MAGE:
valLevel1 = 12.9f;
valLevel60 = 20.0f;
break;
case CLASS_ROGUE:
valLevel1 = 1.1f;
valLevel60 = 14.5f;
break;
case CLASS_HUNTER:
valLevel1 = 1.8f;
valLevel60 = 26.5f;
break;
case CLASS_PRIEST:
valLevel1 = 11.0f;
valLevel60 = 20.0f;
break;
case CLASS_WARLOCK:
valLevel1 = 8.4f;
valLevel60 = 20.0f;
break;
case CLASS_WARRIOR:
default: classrate = 20.0f; break;
valLevel1 = 3.9f;
valLevel60 = 20.0f;
break;
default:
return 0.0f;
}
///*+(Defense*0,04);
if (getRace() == RACE_NIGHTELF)
{
val = (levelrate * (GetStat(STAT_AGILITY) / classrate)) + 1;
}
else
{
val = (levelrate * (GetStat(STAT_AGILITY) / classrate));
}
float classrate = valLevel1 * float(60.0f - getLevel()) / 59.0f + valLevel60 * float(getLevel() - 1.0f) / 59.0f;
return val;
return GetStat(STAT_AGILITY) / classrate;
}
float Player::GetSpellCritFromIntellect()
@ -20999,6 +21029,23 @@ void Player::SendTransferAbortedByLockStatus(MapEntry const* mapEntry, AreaLockS
case AREA_LOCKSTATUS_UNKNOWN_ERROR:
// ToDo: SendAreaTriggerMessage or Transfer Abort for these cases!
break;
case AREA_LOCKSTATUS_PVP_RANK:
{
std::string msg = "You cannot enter this zone";
switch (GetTeamId())
{
case TEAM_INDEX_ALLIANCE:
msg = "You must be a Knight or higher rank in order to enter the Champions Hall.";
break;
case TEAM_INDEX_HORDE:
msg = "You must be a Stone Guard or higher rank in order to enter the Hall of Legends.";
break;
}
// TODO : Rely on a a status_failed_text that could be localized, need a DB structure rework for later.
GetSession()->SendAreaTriggerMessage(msg.c_str());
break;
}
case AREA_LOCKSTATUS_OK:
sLog.outError("SendTransferAbortedByLockStatus: LockAreaStatus AREA_LOCKSTATUS_OK received for %s (mapId %u)", GetGuidStr().c_str(), mapEntry->MapID);
MANGOS_ASSERT(false);
@ -23116,7 +23163,7 @@ AreaLockStatus Player::GetAreaTriggerLockStatus(AreaTrigger const* at, uint32& m
case CONDITION_PVP_RANK:
{
miscRequirement = fault.param1;
return AREA_LOCKSTATUS_NOT_ALLOWED;
return AREA_LOCKSTATUS_PVP_RANK;
}
default:

View File

@ -2533,6 +2533,7 @@ enum AreaLockStatus
AREA_LOCKSTATUS_NOT_ALLOWED = 10,
AREA_LOCKSTATUS_HAS_BIND = 11,
AREA_LOCKSTATUS_WRONG_TEAM = 12,
AREA_LOCKSTATUS_PVP_RANK = 100
};
enum TrackedAuraType