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() float Player::GetMeleeCritFromAgility()
{ {
// from mangos 3462 for 1.12 float valLevel1 = 0.0f;
float val = 0.0f, classrate = 0.0f, levelfactor = 0.0f, fg = 0.0f; float valLevel60 = 0.0f;
fg = (0.35f*(float) (getLevel())) + 5.55f;
levelfactor = (106.20f / fg) - 3;
// critical // critical
switch (getClass()) switch (getClass())
{ {
case CLASS_PALADIN: classrate = 19.77f; break; case CLASS_PALADIN:
case CLASS_SHAMAN: classrate = 19.7f; break; case CLASS_SHAMAN:
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_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: case CLASS_WARRIOR:
default: classrate = 20.0f; break; valLevel1 = 3.9f;
valLevel60 = 20.0f;
break;
default:
return 0.0f;
} }
float classrate = valLevel1 * float(60.0f - getLevel()) / 59.0f + valLevel60 * float(getLevel() - 1.0f) / 59.0f;
val = levelfactor * (GetStat(STAT_AGILITY) / classrate); return GetStat(STAT_AGILITY) / classrate;
return val;
} }
float Player::GetDodgeFromAgility() float Player::GetDodgeFromAgility()
{ {
// from mangos 3462 for 1.12 float valLevel1 = 0.0f;
float val = 0, classrate = 0, levelrate = 0; float valLevel60 = 0.0f;
levelrate = ((16.225f/((0.45f*(float)(getLevel()))+2.5f))-0.1f)/0.42f; // critical
// dodge
switch (getClass()) switch (getClass())
{ {
case CLASS_ROGUE: classrate = 14.5; break;
case CLASS_HUNTER: classrate = 26.5f; break;
case CLASS_PALADIN: case CLASS_PALADIN:
case CLASS_SHAMAN: case CLASS_SHAMAN:
case CLASS_MAGE:
case CLASS_PRIEST:
case CLASS_WARLOCK:
case CLASS_DRUID: 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: case CLASS_WARRIOR:
default: classrate = 20.0f; break; valLevel1 = 3.9f;
valLevel60 = 20.0f;
break;
default:
return 0.0f;
} }
///*+(Defense*0,04); float classrate = valLevel1 * float(60.0f - getLevel()) / 59.0f + valLevel60 * float(getLevel() - 1.0f) / 59.0f;
if (getRace() == RACE_NIGHTELF)
{
val = (levelrate * (GetStat(STAT_AGILITY) / classrate)) + 1;
}
else
{
val = (levelrate * (GetStat(STAT_AGILITY) / classrate));
}
return val; return GetStat(STAT_AGILITY) / classrate;
} }
float Player::GetSpellCritFromIntellect() float Player::GetSpellCritFromIntellect()
@ -20999,6 +21029,23 @@ void Player::SendTransferAbortedByLockStatus(MapEntry const* mapEntry, AreaLockS
case AREA_LOCKSTATUS_UNKNOWN_ERROR: case AREA_LOCKSTATUS_UNKNOWN_ERROR:
// ToDo: SendAreaTriggerMessage or Transfer Abort for these cases! // ToDo: SendAreaTriggerMessage or Transfer Abort for these cases!
break; 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: case AREA_LOCKSTATUS_OK:
sLog.outError("SendTransferAbortedByLockStatus: LockAreaStatus AREA_LOCKSTATUS_OK received for %s (mapId %u)", GetGuidStr().c_str(), mapEntry->MapID); sLog.outError("SendTransferAbortedByLockStatus: LockAreaStatus AREA_LOCKSTATUS_OK received for %s (mapId %u)", GetGuidStr().c_str(), mapEntry->MapID);
MANGOS_ASSERT(false); MANGOS_ASSERT(false);
@ -23116,7 +23163,7 @@ AreaLockStatus Player::GetAreaTriggerLockStatus(AreaTrigger const* at, uint32& m
case CONDITION_PVP_RANK: case CONDITION_PVP_RANK:
{ {
miscRequirement = fault.param1; miscRequirement = fault.param1;
return AREA_LOCKSTATUS_NOT_ALLOWED; return AREA_LOCKSTATUS_PVP_RANK;
} }
default: default:

View File

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