void Player::UpdatePvPArea()
{
PvPArea * oldArea = currentPVPArea;
currentPVPArea = ObjectMgr::getSingleton().GetPvPArea(m_AreaID);
if(currentPVPArea == oldArea ||
currentPVPArea == 0 || !currentPVPArea->AreaId)
{
// Someone is too lazy to extract adt, or they haven't filled in the info in the table.
return;
}
// This is where all the magic happens :P
if(currentPVPArea->HomeFor(this))
{
if(IsPvPFlagged())
{
// I'm flagged and I just walked into a zone of my type. Start the 5min counter.
ResetPvPTimer();
}
}
else
{
// I just walked into either an enemies town, or a contested zone.
// Force flag me if i'm not already.
if(!IsPvPFlagged()) SetPvPFlag();
}
}
void Player::LoginPvPSetup()
{
// Make sure we know our area ID.
_EventExploration();
// Lazy bastards..
if(currentPVPArea == 0)
return;
// If we're not in the home area for our faction, add a honorless target
// buff to avoid ganking.
if(!currentPVPArea->HomeFor(this))
CastSpell(this, PLAYER_HONORLESS_TARGET_SPELL, true);
}
void Player::PvPToggle()
{
if(m_pvpTimer > 0)
{
// Means that we typed /pvp while we were "cooling down". Stop the timer.
StopPvPTimer();
}
else
{
uint32 AreaType = AREA_CONTESTED;
if(currentPVPArea)
AreaType = currentPVPArea->PvPType;
// Can't modify flags in a contested area.
if(AreaType == AREA_CONTESTED)
return;
if(IsPvPFlagged())
{
// Start the "cooldown" timer.
ResetPvPTimer();
}
else
{
// Move into PvP state.
StopPvPTimer();
SetPvPFlag();
}
}