Add support for random battlegrounds - port by n0n4me, original code by Vladimir and Griffonheart (Big thanks to all of you!)
--HG-- branch : trunk
This commit is contained in:
+48
-14
@@ -465,6 +465,8 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa
|
||||
// Honor System
|
||||
m_lastHonorUpdateTime = time(NULL);
|
||||
|
||||
m_IsBGRandomWinner = false;
|
||||
|
||||
// Player summoning
|
||||
m_summon_expire = 0;
|
||||
m_summon_mapid = 0;
|
||||
@@ -8060,7 +8062,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
|
||||
//TODO: fix this big hack
|
||||
if ((go->GetEntry() == BG_AV_OBJECTID_MINE_N || go->GetEntry() == BG_AV_OBJECTID_MINE_S))
|
||||
if (BattleGround *bg = GetBattleGround())
|
||||
if (bg->GetTypeID() == BATTLEGROUND_AV)
|
||||
if (bg->GetTypeID(true) == BATTLEGROUND_AV)
|
||||
if (!(((BattleGroundAV*)bg)->PlayerCanDoMineQuest(go->GetEntry(),GetTeam())))
|
||||
{
|
||||
SendLootRelease(guid);
|
||||
@@ -8188,7 +8190,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
|
||||
uint32 pLevel = bones->loot.gold;
|
||||
bones->loot.clear();
|
||||
if (BattleGround *bg = GetBattleGround())
|
||||
if (bg->GetTypeID() == BATTLEGROUND_AV)
|
||||
if (bg->GetTypeID(true) == BATTLEGROUND_AV)
|
||||
loot->FillLoot(1, LootTemplates_Creature, this, true);
|
||||
// It may need a better formula
|
||||
// Now it works like this: lvl10: ~6copper, lvl70: ~9silver
|
||||
@@ -8531,7 +8533,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
|
||||
data << uint32(2325) << uint32(0x0); // 13 sandworm E
|
||||
break;
|
||||
case 2597: // Alterac Valley
|
||||
if (bg && bg->GetTypeID() == BATTLEGROUND_AV)
|
||||
if (bg && bg->GetTypeID(true) == BATTLEGROUND_AV)
|
||||
bg->FillInitialWorldStates(data);
|
||||
else
|
||||
{
|
||||
@@ -8613,7 +8615,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
|
||||
}
|
||||
break;
|
||||
case 3277: // Warsong Gulch
|
||||
if (bg && bg->GetTypeID() == BATTLEGROUND_WS)
|
||||
if (bg && bg->GetTypeID(true) == BATTLEGROUND_WS)
|
||||
bg->FillInitialWorldStates(data);
|
||||
else
|
||||
{
|
||||
@@ -8628,7 +8630,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
|
||||
}
|
||||
break;
|
||||
case 3358: // Arathi Basin
|
||||
if (bg && bg->GetTypeID() == BATTLEGROUND_AB)
|
||||
if (bg && bg->GetTypeID(true) == BATTLEGROUND_AB)
|
||||
bg->FillInitialWorldStates(data);
|
||||
else
|
||||
{
|
||||
@@ -8667,7 +8669,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
|
||||
}
|
||||
break;
|
||||
case 3820: // Eye of the Storm
|
||||
if (bg && bg->GetTypeID() == BATTLEGROUND_EY)
|
||||
if (bg && bg->GetTypeID(true) == BATTLEGROUND_EY)
|
||||
bg->FillInitialWorldStates(data);
|
||||
else
|
||||
{
|
||||
@@ -8840,7 +8842,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
|
||||
}
|
||||
break;
|
||||
case 3698: // Nagrand Arena
|
||||
if (bg && bg->GetTypeID() == BATTLEGROUND_NA)
|
||||
if (bg && bg->GetTypeID(true) == BATTLEGROUND_NA)
|
||||
bg->FillInitialWorldStates(data);
|
||||
else
|
||||
{
|
||||
@@ -8850,7 +8852,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
|
||||
}
|
||||
break;
|
||||
case 3702: // Blade's Edge Arena
|
||||
if (bg && bg->GetTypeID() == BATTLEGROUND_BE)
|
||||
if (bg && bg->GetTypeID(true) == BATTLEGROUND_BE)
|
||||
bg->FillInitialWorldStates(data);
|
||||
else
|
||||
{
|
||||
@@ -8860,7 +8862,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
|
||||
}
|
||||
break;
|
||||
case 3968: // Ruins of Lordaeron
|
||||
if (bg && bg->GetTypeID() == BATTLEGROUND_RL)
|
||||
if (bg && bg->GetTypeID(true) == BATTLEGROUND_RL)
|
||||
bg->FillInitialWorldStates(data);
|
||||
else
|
||||
{
|
||||
@@ -8870,7 +8872,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
|
||||
}
|
||||
break;
|
||||
case 4378: // Dalaran Sewers
|
||||
if (bg && bg->GetTypeID() == BATTLEGROUND_DS)
|
||||
if (bg && bg->GetTypeID(true) == BATTLEGROUND_DS)
|
||||
bg->FillInitialWorldStates(data);
|
||||
else
|
||||
{
|
||||
@@ -8881,7 +8883,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
|
||||
break;
|
||||
case 3703: // Shattrath City
|
||||
case 4384: // Strand of the Ancients
|
||||
if (bg && bg->GetTypeID() == BATTLEGROUND_SA)
|
||||
if (bg && bg->GetTypeID(true) == BATTLEGROUND_SA)
|
||||
bg->FillInitialWorldStates(data);
|
||||
else
|
||||
{
|
||||
@@ -8916,7 +8918,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
|
||||
}
|
||||
break;
|
||||
case 4406: // Ring of Valor
|
||||
if (bg && bg->GetTypeID() == BATTLEGROUND_RV)
|
||||
if (bg && bg->GetTypeID(true) == BATTLEGROUND_RV)
|
||||
bg->FillInitialWorldStates(data);
|
||||
else
|
||||
{
|
||||
@@ -8933,6 +8935,22 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
|
||||
break;
|
||||
}
|
||||
GetSession()->SendPacket(&data);
|
||||
SendBGWeekendWorldStates();
|
||||
}
|
||||
|
||||
void Player::SendBGWeekendWorldStates()
|
||||
{
|
||||
for (uint32 i = 1; i < sBattlemasterListStore.GetNumRows(); ++i)
|
||||
{
|
||||
BattlemasterListEntry const * bl = sBattlemasterListStore.LookupEntry(i);
|
||||
if (bl && bl->HolidayWorldStateId)
|
||||
{
|
||||
if (BattleGroundMgr::IsBGWeekend((BattleGroundTypeId)bl->id))
|
||||
SendUpdateWorldState(bl->HolidayWorldStateId, 1);
|
||||
else
|
||||
SendUpdateWorldState(bl->HolidayWorldStateId, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint32 Player::GetXPRestBonus(uint32 xp)
|
||||
@@ -15886,10 +15904,10 @@ bool Player::LoadFromDB(uint32 guid, SqlQueryHolder *holder)
|
||||
|
||||
if (player_at_bg && currentBg->GetStatus() != STATUS_WAIT_LEAVE)
|
||||
{
|
||||
BattleGroundQueueTypeId bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(currentBg->GetTypeID(), currentBg->GetArenaType());
|
||||
BattleGroundQueueTypeId bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(currentBg->GetTypeID(true), currentBg->GetArenaType());
|
||||
AddBattleGroundQueueId(bgQueueTypeId);
|
||||
|
||||
m_bgData.bgTypeID = currentBg->GetTypeID();
|
||||
m_bgData.bgTypeID = currentBg->GetTypeID(true);
|
||||
|
||||
//join player to battleground group
|
||||
currentBg->EventPlayerLoggedIn(this, GetGUID());
|
||||
@@ -16214,6 +16232,7 @@ bool Player::LoadFromDB(uint32 guid, SqlQueryHolder *holder)
|
||||
_LoadQuestStatus(holder->GetResult(PLAYER_LOGIN_QUERY_LOADQUESTSTATUS));
|
||||
_LoadDailyQuestStatus(holder->GetResult(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS));
|
||||
_LoadWeeklyQuestStatus(holder->GetResult(PLAYER_LOGIN_QUERY_LOADWEKLYQUESTSTATUS));
|
||||
_LoadRandomBGStatus(holder->GetResult(PLAYER_LOGIN_QUERY_LOADRANDOMBG));
|
||||
|
||||
// after spell and quest load
|
||||
InitTalentForLevel();
|
||||
@@ -23908,3 +23927,18 @@ void Player::RefundItem(Item *item)
|
||||
ModifyArenaPoints(arenaRefund);
|
||||
|
||||
}
|
||||
|
||||
void Player::SetRandomWinner(bool isWinner)
|
||||
{
|
||||
m_IsBGRandomWinner = isWinner;
|
||||
if (m_IsBGRandomWinner)
|
||||
CharacterDatabase.PExecute("INSERT INTO character_battleground_random (guid) VALUES ('%u')", GetGUIDLow());
|
||||
}
|
||||
|
||||
void Player::_LoadRandomBGStatus(QueryResult_AutoPtr result)
|
||||
{
|
||||
//QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT guid FROM character_battleground_random WHERE guid = '%u'", GetGUIDLow());
|
||||
|
||||
if (result)
|
||||
m_IsBGRandomWinner = true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user