mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
Merge remote branch 'origin/master' into 330
This commit is contained in:
commit
fe55f76a26
31 changed files with 400 additions and 387 deletions
|
|
@ -24,7 +24,7 @@ CREATE TABLE `db_version` (
|
||||||
`version` varchar(120) default NULL,
|
`version` varchar(120) default NULL,
|
||||||
`creature_ai_version` varchar(120) default NULL,
|
`creature_ai_version` varchar(120) default NULL,
|
||||||
`cache_id` int(10) default '0',
|
`cache_id` int(10) default '0',
|
||||||
`required_8803_02_mangos_playercreateinfo_action` bit(1) default NULL
|
`required_8818_01_mangos_mangos_string` bit(1) default NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -3338,12 +3338,10 @@ INSERT INTO `mangos_string` VALUES
|
||||||
(711,'Queue status for %s (Lvl: %u to %u)\nQueued alliances: %u (Need at least %u more)\nQueued hordes: %u (Need at least %u more)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(711,'Queue status for %s (Lvl: %u to %u)\nQueued alliances: %u (Need at least %u more)\nQueued hordes: %u (Need at least %u more)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(712,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] A: %u/%u, H: %u/%u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(712,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] A: %u/%u, H: %u/%u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(713,'You must be level %u to join an arena team!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(713,'You must be level %u to join an arena team!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(714,'%s is not high enough level to join your team',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
|
||||||
(715,'You don\'t meet Battleground level requirements',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(715,'You don\'t meet Battleground level requirements',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(716,'Your arena team is full, %s cannot join it.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
|
||||||
(717,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] Started!|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(717,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] Started!|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(718,'|cffff0000[Arena Queue Announcer]:|r %s -- Joined : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(718,'|cffff0000[Arena Queue Announcer]:|r All Arenas -- Joined : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(719,'|cffff0000[Arena Queue Announcer]:|r %s -- Exited : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(719,'|cffff0000[Arena Queue Announcer]:|r All Arenas -- Exited : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(720,'Your group is too large for this battleground. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(720,'Your group is too large for this battleground. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(721,'Your group is too large for this arena. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(721,'Your group is too large for this arena. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(722,'Your group has members not in your arena team. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(722,'Your group has members not in your arena team. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
|
@ -3372,15 +3370,12 @@ INSERT INTO `mangos_string` VALUES
|
||||||
(746,'Done flushing Arena points.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(746,'Done flushing Arena points.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(750,'Not enough players. This game will close in %u mins.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(750,'Not enough players. This game will close in %u mins.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(751,'Not enough players. This game will close in %u seconds.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(751,'Not enough players. This game will close in %u seconds.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(753,'The battle for Warsong Gulch begins in 2 minutes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(752,'Only the Alliance can use that portal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(754,'The battle for Arathi Basin begins in 2 minutes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(753,'Only the Horde can use that portal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(755,'The battle begins in 2 minutes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
|
||||||
(757,'Alliance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
|
||||||
(758,'Horde',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
|
||||||
(759,'%s was destroyed by the %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(759,'%s was destroyed by the %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(760,'The %s is under attack! If left unchecked, the %s will destroy it!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(760,'The %s is under attack! If left unchecked, the %s will destroy it!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(761,'The %s was taken by the %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(761,'The %s was taken by the %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(762,'The %s was taken by the %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(762,'The %s was taken by the %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), -- WTF? why 3 same strings?
|
||||||
(763,'The %s was taken by the %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(763,'The %s was taken by the %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(764,'The %s is under attack! If left unchecked, the %s will capture it!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(764,'The %s is under attack! If left unchecked, the %s will capture it!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(765,'The %s has taken the %s! Its supplies will now be used for reinforcements!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(765,'The %s has taken the %s! Its supplies will now be used for reinforcements!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
|
@ -3401,7 +3396,6 @@ INSERT INTO `mangos_string` VALUES
|
||||||
(780,'East Frostwolf Tower',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(780,'East Frostwolf Tower',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(781,'West Frostwolf Tower',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(781,'West Frostwolf Tower',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(782,'Frostwolf Relief Hut',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(782,'Frostwolf Relief Hut',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(783,'2 minutes until the battle for Alterac Valley begins.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
|
||||||
(784,'1 minute until the battle for Alterac Valley begins.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(784,'1 minute until the battle for Alterac Valley begins.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(785,'30 seconds until the battle for Alterac Valley begins. Prepare yourselves!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(785,'30 seconds until the battle for Alterac Valley begins. Prepare yourselves!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
(786,'The battle for Alterac Valley has begun!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
(786,'The battle for Alterac Valley has begun!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
|
||||||
|
|
|
||||||
8
sql/updates/8815_01_mangos_mangos_string.sql
Normal file
8
sql/updates/8815_01_mangos_mangos_string.sql
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
ALTER TABLE db_version CHANGE COLUMN required_8803_02_mangos_playercreateinfo_action required_8815_01_mangos_mangos_string bit;
|
||||||
|
|
||||||
|
-- this sql might delete some of your translated strings, if you translate them
|
||||||
|
|
||||||
|
DELETE FROM mangos_string WHERE entry in (718, 719);
|
||||||
|
|
||||||
|
INSERT INTO mangos_string VALUES (718,'|cffff0000[Arena Queue Announcer]:|r All Arenas -- Joined : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
|
||||||
|
INSERT INTO mangos_string VALUES (719,'|cffff0000[Arena Queue Announcer]:|r All Arenas -- Left : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
|
||||||
8
sql/updates/8818_01_mangos_mangos_string.sql
Normal file
8
sql/updates/8818_01_mangos_mangos_string.sql
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
ALTER TABLE db_version CHANGE COLUMN required_8815_01_mangos_mangos_string required_8818_01_mangos_mangos_string bit;
|
||||||
|
|
||||||
|
-- this sql might delete some of your translated strings, if you translated them
|
||||||
|
|
||||||
|
DELETE FROM mangos_string WHERE entry in (714, 716, 752, 753, 754, 755, 757, 758, 783);
|
||||||
|
|
||||||
|
INSERT INTO mangos_string VALUES (752,'Only the Alliance can use that portal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
|
||||||
|
INSERT INTO mangos_string VALUES (753,'Only the Horde can use that portal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
|
||||||
|
|
@ -156,6 +156,8 @@ pkgdata_DATA = \
|
||||||
8800_01_mangos_spell_elixir.sql \
|
8800_01_mangos_spell_elixir.sql \
|
||||||
8803_01_mangos_playercreateinfo_spell.sql \
|
8803_01_mangos_playercreateinfo_spell.sql \
|
||||||
8803_02_mangos_playercreateinfo_action.sql \
|
8803_02_mangos_playercreateinfo_action.sql \
|
||||||
|
8815_01_mangos_mangos_string.sql \
|
||||||
|
8818_01_mangos_mangos_string.sql \
|
||||||
README
|
README
|
||||||
|
|
||||||
## Additional files to include when running 'make dist'
|
## Additional files to include when running 'make dist'
|
||||||
|
|
@ -292,4 +294,6 @@ EXTRA_DIST = \
|
||||||
8800_01_mangos_spell_elixir.sql \
|
8800_01_mangos_spell_elixir.sql \
|
||||||
8803_01_mangos_playercreateinfo_spell.sql \
|
8803_01_mangos_playercreateinfo_spell.sql \
|
||||||
8803_02_mangos_playercreateinfo_action.sql \
|
8803_02_mangos_playercreateinfo_action.sql \
|
||||||
|
8815_01_mangos_mangos_string.sql \
|
||||||
|
8818_01_mangos_mangos_string.sql \
|
||||||
README
|
README
|
||||||
|
|
|
||||||
|
|
@ -270,7 +270,7 @@ BattleGround::BattleGround()
|
||||||
m_StartDelayTimes[BG_STARTING_EVENT_THIRD] = BG_START_DELAY_30S;
|
m_StartDelayTimes[BG_STARTING_EVENT_THIRD] = BG_START_DELAY_30S;
|
||||||
m_StartDelayTimes[BG_STARTING_EVENT_FOURTH] = BG_START_DELAY_NONE;
|
m_StartDelayTimes[BG_STARTING_EVENT_FOURTH] = BG_START_DELAY_NONE;
|
||||||
//we must set to some default existing values
|
//we must set to some default existing values
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_WS_START_TWO_MINUTES;
|
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = 0;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN;
|
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN;
|
||||||
|
|
@ -423,8 +423,9 @@ void BattleGround::Update(uint32 diff)
|
||||||
|
|
||||||
StartingEventCloseDoors();
|
StartingEventCloseDoors();
|
||||||
SetStartDelayTime(m_StartDelayTimes[BG_STARTING_EVENT_FIRST]);
|
SetStartDelayTime(m_StartDelayTimes[BG_STARTING_EVENT_FIRST]);
|
||||||
//first start warning - 2 or 1 minute
|
//first start warning - 2 or 1 minute, only if defined
|
||||||
SendMessageToAll(m_StartMessageIds[BG_STARTING_EVENT_FIRST], CHAT_MSG_BG_SYSTEM_NEUTRAL);
|
if (m_StartMessageIds[BG_STARTING_EVENT_FIRST])
|
||||||
|
SendMessageToAll(m_StartMessageIds[BG_STARTING_EVENT_FIRST], CHAT_MSG_BG_SYSTEM_NEUTRAL);
|
||||||
}
|
}
|
||||||
// After 1 minute or 30 seconds, warning is signalled
|
// After 1 minute or 30 seconds, warning is signalled
|
||||||
else if (GetStartDelayTime() <= m_StartDelayTimes[BG_STARTING_EVENT_SECOND] && !(m_Events & BG_STARTING_EVENT_2))
|
else if (GetStartDelayTime() <= m_StartDelayTimes[BG_STARTING_EVENT_SECOND] && !(m_Events & BG_STARTING_EVENT_2))
|
||||||
|
|
@ -1084,7 +1085,7 @@ void BattleGround::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac
|
||||||
{
|
{
|
||||||
// a player has left the battleground, so there are free slots -> add to queue
|
// a player has left the battleground, so there are free slots -> add to queue
|
||||||
AddToBGFreeSlotQueue();
|
AddToBGFreeSlotQueue();
|
||||||
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, GetQueueId());
|
sBattleGroundMgr.ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, GetQueueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Let others know
|
// Let others know
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ BattleGroundAB::BattleGroundAB()
|
||||||
m_BuffChange = true;
|
m_BuffChange = true;
|
||||||
m_BgObjects.resize(BG_AB_OBJECT_MAX);
|
m_BgObjects.resize(BG_AB_OBJECT_MAX);
|
||||||
|
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_AB_START_TWO_MINUTES;
|
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = 0;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_AB_START_ONE_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_AB_START_ONE_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_AB_START_HALF_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_AB_START_HALF_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_AB_HAS_BEGUN;
|
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_AB_HAS_BEGUN;
|
||||||
|
|
@ -85,12 +85,12 @@ void BattleGroundAB::Update(uint32 diff)
|
||||||
|
|
||||||
if (teamIndex == 0)
|
if (teamIndex == 0)
|
||||||
{
|
{
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_ALLIANCE,NULL,LANG_BG_AB_ALLY,_GetNodeNameId(node));
|
SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_ALLIANCE,NULL,LANG_BG_ALLY,_GetNodeNameId(node));
|
||||||
PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_ALLIANCE);
|
PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_ALLIANCE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_HORDE,NULL,LANG_BG_AB_HORDE,_GetNodeNameId(node));
|
SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_HORDE,NULL,LANG_BG_HORDE,_GetNodeNameId(node));
|
||||||
PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_HORDE);
|
PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_HORDE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -363,9 +363,9 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player *source, GameObject* target
|
||||||
m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME;
|
m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME;
|
||||||
|
|
||||||
if (teamIndex == 0)
|
if (teamIndex == 0)
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_CLAIMED,CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node), LANG_BG_AB_ALLY);
|
SendMessage2ToAll(LANG_BG_AB_NODE_CLAIMED,CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node), LANG_BG_ALLY);
|
||||||
else
|
else
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_CLAIMED,CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node), LANG_BG_AB_HORDE);
|
SendMessage2ToAll(LANG_BG_AB_NODE_CLAIMED,CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node), LANG_BG_HORDE);
|
||||||
|
|
||||||
sound = BG_AB_SOUND_NODE_CLAIMED;
|
sound = BG_AB_SOUND_NODE_CLAIMED;
|
||||||
}
|
}
|
||||||
|
|
@ -430,9 +430,9 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player *source, GameObject* target
|
||||||
if (m_Nodes[node] >= BG_AB_NODE_TYPE_OCCUPIED)
|
if (m_Nodes[node] >= BG_AB_NODE_TYPE_OCCUPIED)
|
||||||
{
|
{
|
||||||
if (teamIndex == BG_TEAM_ALLIANCE)
|
if (teamIndex == BG_TEAM_ALLIANCE)
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, LANG_BG_AB_ALLY, _GetNodeNameId(node));
|
SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, LANG_BG_ALLY, _GetNodeNameId(node));
|
||||||
else
|
else
|
||||||
SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_HORDE, NULL, LANG_BG_AB_HORDE, _GetNodeNameId(node));
|
SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_HORDE, NULL, LANG_BG_HORDE, _GetNodeNameId(node));
|
||||||
}
|
}
|
||||||
PlaySoundToAll(sound);
|
PlaySoundToAll(sound);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
BattleGroundABG::BattleGroundABG()
|
BattleGroundABG::BattleGroundABG()
|
||||||
{
|
{
|
||||||
//TODO FIX ME!
|
//TODO FIX ME!
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_WS_START_TWO_MINUTES;
|
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = 0;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN;
|
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN;
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
BattleGroundAV::BattleGroundAV()
|
BattleGroundAV::BattleGroundAV()
|
||||||
{
|
{
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_AV_START_TWO_MINUTES;
|
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = 0;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_AV_START_ONE_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_AV_START_ONE_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_AV_START_HALF_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_AV_START_HALF_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_AV_HAS_BEGUN;
|
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_AV_HAS_BEGUN;
|
||||||
|
|
@ -435,11 +435,11 @@ void BattleGroundAV::EventPlayerDestroyedPoint(BG_AV_Nodes node)
|
||||||
UpdateScore(BattleGroundTeamId(owner^0x1), (-1) * BG_AV_RES_TOWER);
|
UpdateScore(BattleGroundTeamId(owner^0x1), (-1) * BG_AV_RES_TOWER);
|
||||||
RewardReputationToTeam((owner == BG_TEAM_ALLIANCE) ? BG_AV_FACTION_A : BG_AV_FACTION_H, m_RepTowerDestruction, owner);
|
RewardReputationToTeam((owner == BG_TEAM_ALLIANCE) ? BG_AV_FACTION_A : BG_AV_FACTION_H, m_RepTowerDestruction, owner);
|
||||||
RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_TOWER), owner);
|
RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_TOWER), owner);
|
||||||
SendYell2ToAll(LANG_BG_AV_TOWER_TAKEN, LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0), GetNodeName(node), ( owner == BG_TEAM_ALLIANCE ) ? LANG_BG_AV_ALLY : LANG_BG_AV_HORDE);
|
SendYell2ToAll(LANG_BG_AV_TOWER_TAKEN, LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0), GetNodeName(node), ( owner == BG_TEAM_ALLIANCE ) ? LANG_BG_ALLY : LANG_BG_HORDE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SendYell2ToAll(LANG_BG_AV_GRAVE_TAKEN, LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0), GetNodeName(node), ( owner == BG_TEAM_ALLIANCE ) ? LANG_BG_AV_ALLY : LANG_BG_AV_HORDE);
|
SendYell2ToAll(LANG_BG_AV_GRAVE_TAKEN, LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0), GetNodeName(node), ( owner == BG_TEAM_ALLIANCE ) ? LANG_BG_ALLY : LANG_BG_HORDE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -469,7 +469,7 @@ void BattleGroundAV::ChangeMineOwner(uint8 mine, uint32 team)
|
||||||
PlaySoundToAll((team == BG_TEAM_ALLIANCE) ? BG_AV_SOUND_ALLIANCE_GOOD : BG_AV_SOUND_HORDE_GOOD);
|
PlaySoundToAll((team == BG_TEAM_ALLIANCE) ? BG_AV_SOUND_ALLIANCE_GOOD : BG_AV_SOUND_HORDE_GOOD);
|
||||||
m_Mine_Reclaim_Timer[mine] = BG_AV_MINE_RECLAIM_TIMER;
|
m_Mine_Reclaim_Timer[mine] = BG_AV_MINE_RECLAIM_TIMER;
|
||||||
SendYell2ToAll(LANG_BG_AV_MINE_TAKEN , LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0),
|
SendYell2ToAll(LANG_BG_AV_MINE_TAKEN , LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0),
|
||||||
(team == BG_TEAM_ALLIANCE ) ? LANG_BG_AV_ALLY : LANG_BG_AV_HORDE,
|
(team == BG_TEAM_ALLIANCE ) ? LANG_BG_ALLY : LANG_BG_HORDE,
|
||||||
(mine == BG_AV_NORTH_MINE) ? LANG_BG_AV_MINE_NORTH : LANG_BG_AV_MINE_SOUTH);
|
(mine == BG_AV_NORTH_MINE) ? LANG_BG_AV_MINE_NORTH : LANG_BG_AV_MINE_SOUTH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -562,7 +562,7 @@ void BattleGroundAV::EventPlayerDefendsPoint(Player* player, BG_AV_Nodes node)
|
||||||
{
|
{
|
||||||
SendYell2ToAll( LANG_BG_AV_TOWER_DEFENDED, LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0),
|
SendYell2ToAll( LANG_BG_AV_TOWER_DEFENDED, LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0),
|
||||||
GetNodeName(node),
|
GetNodeName(node),
|
||||||
( team == BG_TEAM_ALLIANCE ) ? LANG_BG_AV_ALLY:LANG_BG_AV_HORDE);
|
( team == BG_TEAM_ALLIANCE ) ? LANG_BG_ALLY:LANG_BG_HORDE);
|
||||||
UpdatePlayerScore(player, SCORE_TOWERS_DEFENDED, 1);
|
UpdatePlayerScore(player, SCORE_TOWERS_DEFENDED, 1);
|
||||||
PlaySoundToAll(BG_AV_SOUND_BOTH_TOWER_DEFEND);
|
PlaySoundToAll(BG_AV_SOUND_BOTH_TOWER_DEFEND);
|
||||||
}
|
}
|
||||||
|
|
@ -570,7 +570,7 @@ void BattleGroundAV::EventPlayerDefendsPoint(Player* player, BG_AV_Nodes node)
|
||||||
{
|
{
|
||||||
SendYell2ToAll(LANG_BG_AV_GRAVE_DEFENDED, LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0),
|
SendYell2ToAll(LANG_BG_AV_GRAVE_DEFENDED, LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0),
|
||||||
GetNodeName(node),
|
GetNodeName(node),
|
||||||
( team == BG_TEAM_ALLIANCE ) ? LANG_BG_AV_ALLY:LANG_BG_AV_HORDE);
|
( team == BG_TEAM_ALLIANCE ) ? LANG_BG_ALLY:LANG_BG_HORDE);
|
||||||
UpdatePlayerScore(player, SCORE_GRAVEYARDS_DEFENDED, 1);
|
UpdatePlayerScore(player, SCORE_GRAVEYARDS_DEFENDED, 1);
|
||||||
// update the statistic for the defending player
|
// update the statistic for the defending player
|
||||||
PlaySoundToAll((team == BG_TEAM_ALLIANCE)?BG_AV_SOUND_ALLIANCE_GOOD:BG_AV_SOUND_HORDE_GOOD);
|
PlaySoundToAll((team == BG_TEAM_ALLIANCE)?BG_AV_SOUND_ALLIANCE_GOOD:BG_AV_SOUND_HORDE_GOOD);
|
||||||
|
|
@ -593,14 +593,14 @@ void BattleGroundAV::EventPlayerAssaultsPoint(Player* player, BG_AV_Nodes node)
|
||||||
{
|
{
|
||||||
SendYell2ToAll(LANG_BG_AV_TOWER_ASSAULTED, LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0),
|
SendYell2ToAll(LANG_BG_AV_TOWER_ASSAULTED, LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0),
|
||||||
GetNodeName(node),
|
GetNodeName(node),
|
||||||
( team == BG_TEAM_ALLIANCE ) ? LANG_BG_AV_ALLY:LANG_BG_AV_HORDE);
|
( team == BG_TEAM_ALLIANCE ) ? LANG_BG_ALLY:LANG_BG_HORDE);
|
||||||
UpdatePlayerScore(player, SCORE_TOWERS_ASSAULTED, 1);
|
UpdatePlayerScore(player, SCORE_TOWERS_ASSAULTED, 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SendYell2ToAll(LANG_BG_AV_GRAVE_ASSAULTED, LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0),
|
SendYell2ToAll(LANG_BG_AV_GRAVE_ASSAULTED, LANG_UNIVERSAL, GetSingleCreatureGuid(BG_AV_HERALD, 0),
|
||||||
GetNodeName(node),
|
GetNodeName(node),
|
||||||
( team == BG_TEAM_ALLIANCE ) ? LANG_BG_AV_ALLY:LANG_BG_AV_HORDE);
|
( team == BG_TEAM_ALLIANCE ) ? LANG_BG_ALLY:LANG_BG_HORDE);
|
||||||
// update the statistic for the assaulting player
|
// update the statistic for the assaulting player
|
||||||
UpdatePlayerScore(player, SCORE_GRAVEYARDS_ASSAULTED, 1);
|
UpdatePlayerScore(player, SCORE_GRAVEYARDS_ASSAULTED, 1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ BattleGroundEY::BattleGroundEY()
|
||||||
m_Points_Trigger[DRAENEI_RUINS] = TR_DRAENEI_RUINS_BUFF;
|
m_Points_Trigger[DRAENEI_RUINS] = TR_DRAENEI_RUINS_BUFF;
|
||||||
m_Points_Trigger[MAGE_TOWER] = TR_MAGE_TOWER_BUFF;
|
m_Points_Trigger[MAGE_TOWER] = TR_MAGE_TOWER_BUFF;
|
||||||
|
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_EY_START_TWO_MINUTES;
|
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = 0;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_EY_START_ONE_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_EY_START_ONE_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_EY_START_HALF_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_EY_START_HALF_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_EY_HAS_BEGUN;
|
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_EY_HAS_BEGUN;
|
||||||
|
|
@ -245,16 +245,6 @@ void BattleGroundEY::UpdatePointStatuses()
|
||||||
void BattleGroundEY::UpdateTeamScore(uint32 Team)
|
void BattleGroundEY::UpdateTeamScore(uint32 Team)
|
||||||
{
|
{
|
||||||
uint32 score = GetTeamScore(Team);
|
uint32 score = GetTeamScore(Team);
|
||||||
//TODO there should be some sound played when one team is near victory!! - and define variables
|
|
||||||
/*if (!m_IsInformedNearVictory && score >= BG_EY_WARNING_NEAR_VICTORY_SCORE)
|
|
||||||
{
|
|
||||||
if (Team == ALLIANCE)
|
|
||||||
SendMessageToAll(LANG_BG_EY_A_NEAR_VICTORY, CHAT_MSG_BG_SYSTEM_NEUTRAL);
|
|
||||||
else
|
|
||||||
SendMessageToAll(LANG_BG_EY_H_NEAR_VICTORY, CHAT_MSG_BG_SYSTEM_NEUTRAL);
|
|
||||||
PlaySoundToAll(BG_EY_SOUND_NEAR_VICTORY);
|
|
||||||
m_IsInformedNearVictory = true;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if (score >= BG_EY_MAX_TEAM_SCORE)
|
if (score >= BG_EY_MAX_TEAM_SCORE)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -148,11 +148,12 @@ void WorldSession::HandleBattlemasterJoinOpcode( WorldPacket & recv_data )
|
||||||
// if we're here, then the conditions to join a bg are met. We can proceed in joining.
|
// if we're here, then the conditions to join a bg are met. We can proceed in joining.
|
||||||
|
|
||||||
// _player->GetGroup() was already checked, grp is already initialized
|
// _player->GetGroup() was already checked, grp is already initialized
|
||||||
GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, 0, false, isPremade, 0);
|
BattleGroundQueue& bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
|
||||||
uint32 avgTime = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].GetAverageQueueWaitTime(ginfo, _player->GetBattleGroundQueueIdFromLevel());
|
|
||||||
if (joinAsGroup /* && _player->GetGroup()*/)
|
if (joinAsGroup /* && _player->GetGroup()*/)
|
||||||
{
|
{
|
||||||
sLog.outDebug("Battleground: the following players are joining as group:");
|
sLog.outDebug("Battleground: the following players are joining as group:");
|
||||||
|
GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, 0, false, isPremade, 0);
|
||||||
|
uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, _player->GetBattleGroundQueueIdFromLevel());
|
||||||
for(GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
|
for(GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
|
||||||
{
|
{
|
||||||
Player *member = itr->getSource();
|
Player *member = itr->getSource();
|
||||||
|
|
@ -166,13 +167,14 @@ void WorldSession::HandleBattlemasterJoinOpcode( WorldPacket & recv_data )
|
||||||
member->GetSession()->SendPacket(&data);
|
member->GetSession()->SendPacket(&data);
|
||||||
sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, bgTypeId);
|
sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, bgTypeId);
|
||||||
member->GetSession()->SendPacket(&data);
|
member->GetSession()->SendPacket(&data);
|
||||||
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddPlayer(member, ginfo);
|
|
||||||
sLog.outDebug("Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,member->GetGUIDLow(), member->GetName());
|
sLog.outDebug("Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,member->GetGUIDLow(), member->GetName());
|
||||||
}
|
}
|
||||||
sLog.outDebug("Battleground: group end");
|
sLog.outDebug("Battleground: group end");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, NULL, bgTypeId, 0, false, isPremade, 0);
|
||||||
|
uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, _player->GetBattleGroundQueueIdFromLevel());
|
||||||
// already checked if queueSlot is valid, now just get it
|
// already checked if queueSlot is valid, now just get it
|
||||||
uint32 queueSlot = _player->AddBattleGroundQueueId(bgQueueTypeId);
|
uint32 queueSlot = _player->AddBattleGroundQueueId(bgQueueTypeId);
|
||||||
|
|
||||||
|
|
@ -180,13 +182,9 @@ void WorldSession::HandleBattlemasterJoinOpcode( WorldPacket & recv_data )
|
||||||
// send status packet (in queue)
|
// send status packet (in queue)
|
||||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, ginfo->ArenaType);
|
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, ginfo->ArenaType);
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
|
|
||||||
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddPlayer(_player, ginfo);
|
|
||||||
sLog.outDebug("Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,_player->GetGUIDLow(), _player->GetName());
|
sLog.outDebug("Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,_player->GetGUIDLow(), _player->GetName());
|
||||||
}
|
}
|
||||||
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel());
|
sBattleGroundMgr.ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, _player->GetBattleGroundQueueIdFromLevel());
|
||||||
if (!ginfo->IsInvitedToBGInstanceGUID)
|
|
||||||
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AnnounceWorld(ginfo, _player->GetGUID(), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldSession::HandleBattleGroundPlayerPositionsOpcode( WorldPacket & /*recv_data*/ )
|
void WorldSession::HandleBattleGroundPlayerPositionsOpcode( WorldPacket & /*recv_data*/ )
|
||||||
|
|
@ -303,7 +301,6 @@ void WorldSession::HandleBattleFieldPortOpcode( WorldPacket &recv_data )
|
||||||
|
|
||||||
uint8 type; // arenatype if arena
|
uint8 type; // arenatype if arena
|
||||||
uint8 unk2; // unk, can be 0x0 (may be if was invited?) and 0x1
|
uint8 unk2; // unk, can be 0x0 (may be if was invited?) and 0x1
|
||||||
uint32 instanceId;
|
|
||||||
uint32 bgTypeId_; // type id from dbc
|
uint32 bgTypeId_; // type id from dbc
|
||||||
uint16 unk; // 0x1F90 constant?
|
uint16 unk; // 0x1F90 constant?
|
||||||
uint8 action; // enter battle 0x1, leave queue 0x0
|
uint8 action; // enter battle 0x1, leave queue 0x0
|
||||||
|
|
@ -312,182 +309,131 @@ void WorldSession::HandleBattleFieldPortOpcode( WorldPacket &recv_data )
|
||||||
|
|
||||||
if (!sBattlemasterListStore.LookupEntry(bgTypeId_))
|
if (!sBattlemasterListStore.LookupEntry(bgTypeId_))
|
||||||
{
|
{
|
||||||
sLog.outError("Battleground: invalid bgtype (%u) received.", bgTypeId_);
|
sLog.outError("BattlegroundHandler: invalid bgtype (%u) received.", bgTypeId_);
|
||||||
// update battleground slots for the player to fix his UI and sent data.
|
return;
|
||||||
// this is a HACK, I don't know why the client starts sending invalid packets in the first place.
|
}
|
||||||
// it usually happens with extremely high latency (if debugging / stepping in the code for example)
|
if (!_player->InBattleGroundQueue())
|
||||||
if (_player->InBattleGroundQueue())
|
{
|
||||||
{
|
sLog.outError("BattlegroundHandler: Invalid CMSG_BATTLEFIELD_PORT received from player (%u), he is not in bg_queue.", _player->GetGUIDLow());
|
||||||
// update all queues, send invitation info if player is invited, queue info if queued
|
|
||||||
for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
|
|
||||||
{
|
|
||||||
BattleGroundQueueTypeId bgQueueTypeId = _player->GetBattleGroundQueueTypeId(i);
|
|
||||||
if (!bgQueueTypeId)
|
|
||||||
continue;
|
|
||||||
BattleGroundTypeId bgTypeId = BattleGroundMgr::BGTemplateId(bgQueueTypeId);
|
|
||||||
BattleGroundQueue::QueuedPlayersMap& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers;
|
|
||||||
BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = qpMap.find(_player->GetGUID());
|
|
||||||
// if the player is not in queue, continue or no group information - this should never happen
|
|
||||||
if (itrPlayerStatus == qpMap.end() || !itrPlayerStatus->second.GroupInfo)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
BattleGround * bg = NULL;
|
|
||||||
// get possibly needed data from groupinfo
|
|
||||||
uint8 arenatype = itrPlayerStatus->second.GroupInfo->ArenaType;
|
|
||||||
uint8 status = 0;
|
|
||||||
|
|
||||||
if (!itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID)
|
|
||||||
{
|
|
||||||
// not invited to bg, get template
|
|
||||||
bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
|
|
||||||
status = STATUS_WAIT_QUEUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// get the bg we're invited to
|
|
||||||
bg = sBattleGroundMgr.GetBattleGround(itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID, bgTypeId);
|
|
||||||
status = STATUS_WAIT_JOIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if bg not found, then continue, don't invite if already in the instance
|
|
||||||
if (!bg || (_player->InBattleGround() && _player->GetBattleGround() && _player->GetBattleGround()->GetInstanceID() == bg->GetInstanceID()))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// re - invite player with proper data
|
|
||||||
WorldPacket data;
|
|
||||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, i, status, INVITE_ACCEPT_WAIT_TIME, 0, arenatype);
|
|
||||||
SendPacket(&data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//get GroupQueueInfo from BattleGroundQueue
|
//get GroupQueueInfo from BattleGroundQueue
|
||||||
BattleGroundTypeId bgTypeId = BattleGroundTypeId(bgTypeId_);
|
BattleGroundTypeId bgTypeId = BattleGroundTypeId(bgTypeId_);
|
||||||
BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bgTypeId, type);
|
BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bgTypeId, type);
|
||||||
BattleGroundQueue::QueuedPlayersMap& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers;
|
BattleGroundQueue& bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
|
||||||
BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = qpMap.find(_player->GetGUID());
|
//we must use temporary variable, because GroupQueueInfo pointer can be deleted in BattleGroundQueue::RemovePlayer() function
|
||||||
if (itrPlayerStatus == qpMap.end())
|
GroupQueueInfo ginfo;
|
||||||
|
if (!bgQueue.GetPlayerGroupInfoData(_player->GetGUID(), &ginfo))
|
||||||
{
|
{
|
||||||
sLog.outError("Battleground: itrplayerstatus not found.");
|
sLog.outError("BattlegroundHandler: itrplayerstatus not found.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
instanceId = itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID;
|
|
||||||
// if action == 1, then instanceId is required
|
// if action == 1, then instanceId is required
|
||||||
if (!instanceId && action == 1)
|
if (!ginfo.IsInvitedToBGInstanceGUID && action == 1)
|
||||||
{
|
{
|
||||||
sLog.outError("Battleground: instance not found.");
|
sLog.outError("BattlegroundHandler: instance not found.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BattleGround *bg = sBattleGroundMgr.GetBattleGround(instanceId, bgTypeId);
|
BattleGround *bg = sBattleGroundMgr.GetBattleGround(ginfo.IsInvitedToBGInstanceGUID, bgTypeId);
|
||||||
|
|
||||||
// bg template might and must be used in case of leaving queue, when instance is not created yet
|
// bg template might and must be used in case of leaving queue, when instance is not created yet
|
||||||
if (!bg && action == 0)
|
if (!bg && action == 0)
|
||||||
bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
|
bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
|
||||||
if (!bg)
|
if (!bg)
|
||||||
{
|
{
|
||||||
sLog.outError("Battleground: bg_template not found for type id %u.", bgTypeId);
|
sLog.outError("BattlegroundHandler: bg_template not found for type id %u.", bgTypeId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_player->InBattleGroundQueue())
|
//some checks if player isn't cheating - it is not exactly cheating, but we cannot allow it
|
||||||
|
if (action == 1 && ginfo.ArenaType == 0)
|
||||||
{
|
{
|
||||||
//we must use temporary variables, because GroupQueueInfo pointer can be deleted in BattleGroundQueue::RemovePlayer() function!
|
//if player is trying to enter battleground (not arena!) and he has deserter debuff, we must just remove him from queue
|
||||||
uint32 team = itrPlayerStatus->second.GroupInfo->Team;
|
if (!_player->CanJoinToBattleground())
|
||||||
uint32 arenaType = itrPlayerStatus->second.GroupInfo->ArenaType;
|
|
||||||
uint32 isRated = itrPlayerStatus->second.GroupInfo->IsRated;
|
|
||||||
uint32 rating = itrPlayerStatus->second.GroupInfo->ArenaTeamRating;
|
|
||||||
uint32 opponentsRating = itrPlayerStatus->second.GroupInfo->OpponentsTeamRating;
|
|
||||||
|
|
||||||
//some checks if player isn't cheating - it is not exactly cheating, but we cannot allow it
|
|
||||||
if (action == 1 && arenaType == 0)
|
|
||||||
{
|
{
|
||||||
//if player is trying to enter battleground (not arena!) and he has deserter debuff, we must just remove him from queue
|
//send bg command result to show nice message
|
||||||
if (!_player->CanJoinToBattleground())
|
WorldPacket data2(SMSG_GROUP_JOINED_BATTLEGROUND, 4);
|
||||||
{
|
data2 << uint32(0xFFFFFFFE);
|
||||||
//send bg command result to show nice message
|
_player->GetSession()->SendPacket(&data2);
|
||||||
WorldPacket data2(SMSG_GROUP_JOINED_BATTLEGROUND, 4);
|
action = 0;
|
||||||
data2 << uint32(0xFFFFFFFE);
|
sLog.outDebug("Battleground: player %s (%u) has a deserter debuff, do not port him to battleground!", _player->GetName(), _player->GetGUIDLow());
|
||||||
_player->GetSession()->SendPacket(&data2);
|
|
||||||
action = 0;
|
|
||||||
sLog.outDebug("Battleground: player %s (%u) has a deserter debuff, do not port him to battleground!", _player->GetName(), _player->GetGUIDLow());
|
|
||||||
}
|
|
||||||
//if player don't match battleground max level, then do not allow him to enter! (this might happen when player leveled up during his waiting in queue
|
|
||||||
if (_player->getLevel() > bg->GetMaxLevel())
|
|
||||||
{
|
|
||||||
sLog.outError("Battleground: Player %s (%u) has level higher than maxlevel of battleground! Do not port him to battleground!", _player->GetName(), _player->GetGUIDLow());
|
|
||||||
action = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
uint32 queueSlot = _player->GetBattleGroundQueueIndex(bgQueueTypeId);
|
//if player don't match battleground max level, then do not allow him to enter! (this might happen when player leveled up during his waiting in queue
|
||||||
WorldPacket data;
|
if (_player->getLevel() > bg->GetMaxLevel())
|
||||||
switch( action )
|
|
||||||
{
|
{
|
||||||
case 1: // port to battleground
|
sLog.outError("Battleground: Player %s (%u) has level higher than maxlevel of battleground! Do not port him to battleground!", _player->GetName(), _player->GetGUIDLow());
|
||||||
if (!_player->IsInvitedForBattleGroundQueueType(bgQueueTypeId))
|
action = 0;
|
||||||
return; // cheating?
|
}
|
||||||
|
}
|
||||||
|
uint32 queueSlot = _player->GetBattleGroundQueueIndex(bgQueueTypeId);
|
||||||
|
WorldPacket data;
|
||||||
|
switch( action )
|
||||||
|
{
|
||||||
|
case 1: // port to battleground
|
||||||
|
if (!_player->IsInvitedForBattleGroundQueueType(bgQueueTypeId))
|
||||||
|
return; // cheating?
|
||||||
|
|
||||||
|
if (!_player->InBattleGround())
|
||||||
_player->SetBattleGroundEntryPoint();
|
_player->SetBattleGroundEntryPoint();
|
||||||
|
|
||||||
// resurrect the player
|
// resurrect the player
|
||||||
if (!_player->isAlive())
|
if (!_player->isAlive())
|
||||||
{
|
{
|
||||||
_player->ResurrectPlayer(1.0f);
|
_player->ResurrectPlayer(1.0f);
|
||||||
_player->SpawnCorpseBones();
|
_player->SpawnCorpseBones();
|
||||||
}
|
}
|
||||||
// stop taxi flight at port
|
// stop taxi flight at port
|
||||||
if (_player->isInFlight())
|
if (_player->isInFlight())
|
||||||
{
|
{
|
||||||
_player->GetMotionMaster()->MovementExpired();
|
_player->GetMotionMaster()->MovementExpired();
|
||||||
_player->m_taxi.ClearTaxiDestinations();
|
_player->m_taxi.ClearTaxiDestinations();
|
||||||
}
|
}
|
||||||
|
|
||||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_IN_PROGRESS, 0, bg->GetStartTime(), bg->GetArenaType());
|
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_IN_PROGRESS, 0, bg->GetStartTime(), bg->GetArenaType());
|
||||||
_player->GetSession()->SendPacket(&data);
|
_player->GetSession()->SendPacket(&data);
|
||||||
// remove battleground queue status from BGmgr
|
// remove battleground queue status from BGmgr
|
||||||
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].RemovePlayer(_player->GetGUID(), false);
|
bgQueue.RemovePlayer(_player->GetGUID(), false);
|
||||||
// this is still needed here if battleground "jumping" shouldn't add deserter debuff
|
// this is still needed here if battleground "jumping" shouldn't add deserter debuff
|
||||||
// also this is required to prevent stuck at old battleground after SetBattleGroundId set to new
|
// also this is required to prevent stuck at old battleground after SetBattleGroundId set to new
|
||||||
if (BattleGround *currentBg = _player->GetBattleGround())
|
if (BattleGround *currentBg = _player->GetBattleGround())
|
||||||
currentBg->RemovePlayerAtLeave(_player->GetGUID(), false, true);
|
currentBg->RemovePlayerAtLeave(_player->GetGUID(), false, true);
|
||||||
|
|
||||||
// set the destination instance id
|
// set the destination instance id
|
||||||
_player->SetBattleGroundId(bg->GetInstanceID(), bgTypeId);
|
_player->SetBattleGroundId(bg->GetInstanceID(), bgTypeId);
|
||||||
// set the destination team
|
// set the destination team
|
||||||
_player->SetBGTeam(team);
|
_player->SetBGTeam(ginfo.Team);
|
||||||
// bg->HandleBeforeTeleportToBattleGround(_player);
|
// bg->HandleBeforeTeleportToBattleGround(_player);
|
||||||
sBattleGroundMgr.SendToBattleGround(_player, instanceId, bgTypeId);
|
sBattleGroundMgr.SendToBattleGround(_player, ginfo.IsInvitedToBGInstanceGUID, bgTypeId);
|
||||||
// add only in HandleMoveWorldPortAck()
|
// add only in HandleMoveWorldPortAck()
|
||||||
// bg->AddPlayer(_player,team);
|
// bg->AddPlayer(_player,team);
|
||||||
sLog.outDebug("Battleground: player %s (%u) joined battle for bg %u, bgtype %u, queue type %u.", _player->GetName(), _player->GetGUIDLow(), bg->GetInstanceID(), bg->GetTypeID(), bgQueueTypeId);
|
sLog.outDebug("Battleground: player %s (%u) joined battle for bg %u, bgtype %u, queue type %u.", _player->GetName(), _player->GetGUIDLow(), bg->GetInstanceID(), bg->GetTypeID(), bgQueueTypeId);
|
||||||
break;
|
break;
|
||||||
case 0: // leave queue
|
case 0: // leave queue
|
||||||
// if player leaves rated arena match before match start, it is counted as he played but he lost
|
// if player leaves rated arena match before match start, it is counted as he played but he lost
|
||||||
if (isRated)
|
if (ginfo.IsRated)
|
||||||
|
{
|
||||||
|
ArenaTeam * at = sObjectMgr.GetArenaTeamById(ginfo.Team);
|
||||||
|
if (at)
|
||||||
{
|
{
|
||||||
ArenaTeam * at = sObjectMgr.GetArenaTeamById(team);
|
sLog.outDebug("UPDATING memberLost's personal arena rating for %u by opponents rating: %u, because he has left queue!", GUID_LOPART(_player->GetGUID()), ginfo.OpponentsTeamRating);
|
||||||
if (at)
|
at->MemberLost(_player, ginfo.OpponentsTeamRating);
|
||||||
{
|
at->SaveToDB();
|
||||||
sLog.outDebug("UPDATING memberLost's personal arena rating for %u by opponents rating: %u, because he has left queue!", GUID_LOPART(_player->GetGUID()), opponentsRating);
|
|
||||||
at->MemberLost(_player, opponentsRating);
|
|
||||||
at->SaveToDB();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
_player->RemoveBattleGroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to queue->removeplayer, it causes bugs
|
}
|
||||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_NONE, 0, 0, 0);
|
_player->RemoveBattleGroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to queue->removeplayer, it causes bugs
|
||||||
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].RemovePlayer(_player->GetGUID(), true);
|
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_NONE, 0, 0, 0);
|
||||||
// player left queue, we should update it - do not update Arena Queue
|
bgQueue.RemovePlayer(_player->GetGUID(), true);
|
||||||
if (!arenaType)
|
// player left queue, we should update it - do not update Arena Queue
|
||||||
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(), arenaType, isRated, rating);
|
if (!ginfo.ArenaType)
|
||||||
SendPacket(&data);
|
sBattleGroundMgr.ScheduleQueueUpdate(ginfo.ArenaTeamRating, ginfo.ArenaType, bgQueueTypeId, bgTypeId, _player->GetBattleGroundQueueIdFromLevel());
|
||||||
sLog.outDebug("Battleground: player %s (%u) left queue for bgtype %u, queue type %u.", _player->GetName(), _player->GetGUIDLow(), bg->GetTypeID(), bgQueueTypeId);
|
SendPacket(&data);
|
||||||
break;
|
sLog.outDebug("Battleground: player %s (%u) left queue for bgtype %u, queue type %u.", _player->GetName(), _player->GetGUIDLow(), bg->GetTypeID(), bgQueueTypeId);
|
||||||
default:
|
break;
|
||||||
sLog.outError("Battleground port: unknown action %u", action);
|
default:
|
||||||
break;
|
sLog.outError("Battleground port: unknown action %u", action);
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -544,16 +490,16 @@ void WorldSession::HandleBattlefieldStatusOpcode( WorldPacket & /*recv_data*/ )
|
||||||
}
|
}
|
||||||
//we are sending update to player about queue - he can be invited there!
|
//we are sending update to player about queue - he can be invited there!
|
||||||
//get GroupQueueInfo for queue status
|
//get GroupQueueInfo for queue status
|
||||||
BattleGroundQueue::QueuedPlayersMap& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers;
|
BattleGroundQueue& bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
|
||||||
BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = qpMap.find(_player->GetGUID());
|
GroupQueueInfo ginfo;
|
||||||
if (itrPlayerStatus == qpMap.end())
|
if (!bgQueue.GetPlayerGroupInfoData(_player->GetGUID(), &ginfo))
|
||||||
continue;
|
continue;
|
||||||
if (itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID)
|
if (ginfo.IsInvitedToBGInstanceGUID)
|
||||||
{
|
{
|
||||||
bg = sBattleGroundMgr.GetBattleGround(itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID, bgTypeId);
|
bg = sBattleGroundMgr.GetBattleGround(ginfo.IsInvitedToBGInstanceGUID, bgTypeId);
|
||||||
if (!bg)
|
if (!bg)
|
||||||
continue;
|
continue;
|
||||||
uint32 remainingTime = getMSTimeDiff(getMSTime(), itrPlayerStatus->second.GroupInfo->RemoveInviteTime);
|
uint32 remainingTime = getMSTimeDiff(getMSTime(), ginfo.RemoveInviteTime);
|
||||||
// send status invited to BattleGround
|
// send status invited to BattleGround
|
||||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, i, STATUS_WAIT_JOIN, remainingTime, 0, arenaType);
|
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, i, STATUS_WAIT_JOIN, remainingTime, 0, arenaType);
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
|
|
@ -563,9 +509,9 @@ void WorldSession::HandleBattlefieldStatusOpcode( WorldPacket & /*recv_data*/ )
|
||||||
bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
|
bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
|
||||||
if (!bg)
|
if (!bg)
|
||||||
continue;
|
continue;
|
||||||
uint32 avgTime = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].GetAverageQueueWaitTime(itrPlayerStatus->second.GroupInfo, _player->GetBattleGroundQueueIdFromLevel());
|
uint32 avgTime = bgQueue.GetAverageQueueWaitTime(&ginfo, _player->GetBattleGroundQueueIdFromLevel());
|
||||||
// send status in BattleGround Queue
|
// send status in BattleGround Queue
|
||||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, i, STATUS_WAIT_QUEUE, avgTime, getMSTimeDiff(itrPlayerStatus->second.GroupInfo->JoinTime, getMSTime()), arenaType);
|
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, i, STATUS_WAIT_QUEUE, avgTime, getMSTimeDiff(ginfo.JoinTime, getMSTime()), arenaType);
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -725,13 +671,15 @@ void WorldSession::HandleBattlemasterJoinArena( WorldPacket & recv_data )
|
||||||
arenaRating = avg_pers_rating;
|
arenaRating = avg_pers_rating;
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, arenatype, isRated, false, arenaRating, ateamId);
|
BattleGroundQueue &bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
|
||||||
uint32 avgTime = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].GetAverageQueueWaitTime(ginfo, _player->GetBattleGroundQueueIdFromLevel());
|
|
||||||
if (asGroup)
|
if (asGroup)
|
||||||
{
|
{
|
||||||
sLog.outDebug("Battleground: arena join as group start");
|
sLog.outDebug("Battleground: arena join as group start");
|
||||||
if (isRated)
|
if (isRated)
|
||||||
sLog.outDebug("Battleground: arena team id %u, leader %s queued with rating %u for type %u",_player->GetArenaTeamId(arenaslot),_player->GetName(),arenaRating,arenatype);
|
sLog.outDebug("Battleground: arena team id %u, leader %s queued with rating %u for type %u",_player->GetArenaTeamId(arenaslot),_player->GetName(),arenaRating,arenatype);
|
||||||
|
|
||||||
|
GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, arenatype, isRated, false, arenaRating, ateamId);
|
||||||
|
uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, _player->GetBattleGroundQueueIdFromLevel());
|
||||||
for(GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
|
for(GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
|
||||||
{
|
{
|
||||||
Player *member = itr->getSource();
|
Player *member = itr->getSource();
|
||||||
|
|
@ -745,25 +693,24 @@ void WorldSession::HandleBattlemasterJoinArena( WorldPacket & recv_data )
|
||||||
member->GetSession()->SendPacket(&data);
|
member->GetSession()->SendPacket(&data);
|
||||||
sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, bgTypeId);
|
sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, bgTypeId);
|
||||||
member->GetSession()->SendPacket(&data);
|
member->GetSession()->SendPacket(&data);
|
||||||
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddPlayer(member, ginfo);
|
|
||||||
sLog.outDebug("Battleground: player joined queue for arena as group bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,member->GetGUIDLow(), member->GetName());
|
sLog.outDebug("Battleground: player joined queue for arena as group bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,member->GetGUIDLow(), member->GetName());
|
||||||
}
|
}
|
||||||
sLog.outDebug("Battleground: arena join as group end");
|
sLog.outDebug("Battleground: arena join as group end");
|
||||||
if (isRated)
|
//announce to world ... removed
|
||||||
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AnnounceWorld(ginfo, _player->GetGUID(), true);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, NULL, bgTypeId, arenatype, isRated, false, arenaRating, ateamId);
|
||||||
|
uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, _player->GetBattleGroundQueueIdFromLevel());
|
||||||
uint32 queueSlot = _player->AddBattleGroundQueueId(bgQueueTypeId);
|
uint32 queueSlot = _player->AddBattleGroundQueueId(bgQueueTypeId);
|
||||||
|
|
||||||
WorldPacket data;
|
WorldPacket data;
|
||||||
// send status packet (in queue)
|
// send status packet (in queue)
|
||||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype);
|
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype);
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddPlayer(_player, ginfo);
|
|
||||||
sLog.outDebug("Battleground: player joined queue for arena, skirmish, bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,_player->GetGUIDLow(), _player->GetName());
|
sLog.outDebug("Battleground: player joined queue for arena, skirmish, bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,_player->GetGUIDLow(), _player->GetName());
|
||||||
}
|
}
|
||||||
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(), arenatype, isRated, arenaRating);
|
sBattleGroundMgr.ScheduleQueueUpdate(arenaRating, arenatype, bgQueueTypeId, bgTypeId, _player->GetBattleGroundQueueIdFromLevel());
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldSession::HandleReportPvPAFK( WorldPacket & recv_data )
|
void WorldSession::HandleReportPvPAFK( WorldPacket & recv_data )
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
BattleGroundIC::BattleGroundIC()
|
BattleGroundIC::BattleGroundIC()
|
||||||
{
|
{
|
||||||
//TODO FIX ME!
|
//TODO FIX ME!
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_WS_START_TWO_MINUTES;
|
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = 0;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN;
|
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN;
|
||||||
|
|
|
||||||
|
|
@ -147,14 +147,12 @@ bool BattleGroundQueue::SelectionPool::AddGroup(GroupQueueInfo *ginfo, uint32 de
|
||||||
/*** BATTLEGROUND QUEUES ***/
|
/*** BATTLEGROUND QUEUES ***/
|
||||||
/*********************************************************/
|
/*********************************************************/
|
||||||
|
|
||||||
// add group to bg queue with the given leader and bg specifications
|
// add group or player (grp == NULL) to bg queue with the given leader and bg specifications
|
||||||
GroupQueueInfo * BattleGroundQueue::AddGroup(Player *leader, BattleGroundTypeId BgTypeId, uint8 ArenaType, bool isRated, bool isPremade, uint32 arenaRating, uint32 arenateamid)
|
GroupQueueInfo * BattleGroundQueue::AddGroup(Player *leader, Group* grp, BattleGroundTypeId BgTypeId, uint8 ArenaType, bool isRated, bool isPremade, uint32 arenaRating, uint32 arenateamid)
|
||||||
{
|
{
|
||||||
BGQueueIdBasedOnLevel queue_id = leader->GetBattleGroundQueueIdFromLevel();
|
BGQueueIdBasedOnLevel queue_id = leader->GetBattleGroundQueueIdFromLevel();
|
||||||
|
|
||||||
// create new ginfo
|
// create new ginfo
|
||||||
// cannot use the method like in addplayer, because that could modify an in-queue group's stats
|
|
||||||
// (e.g. leader leaving queue then joining as individual again)
|
|
||||||
GroupQueueInfo* ginfo = new GroupQueueInfo;
|
GroupQueueInfo* ginfo = new GroupQueueInfo;
|
||||||
ginfo->BgTypeId = BgTypeId;
|
ginfo->BgTypeId = BgTypeId;
|
||||||
ginfo->ArenaType = ArenaType;
|
ginfo->ArenaType = ArenaType;
|
||||||
|
|
@ -177,24 +175,81 @@ GroupQueueInfo * BattleGroundQueue::AddGroup(Player *leader, BattleGroundTypeId
|
||||||
index++;
|
index++;
|
||||||
sLog.outDebug("Adding Group to BattleGroundQueue bgTypeId : %u, queue_id : %u, index : %u", BgTypeId, queue_id, index);
|
sLog.outDebug("Adding Group to BattleGroundQueue bgTypeId : %u, queue_id : %u, index : %u", BgTypeId, queue_id, index);
|
||||||
|
|
||||||
m_QueuedGroups[queue_id][index].push_back(ginfo);
|
uint32 lastOnlineTime = getMSTime();
|
||||||
|
|
||||||
|
//announce world (this don't need mutex)
|
||||||
|
if (isRated && sWorld.getConfig(CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE))
|
||||||
|
{
|
||||||
|
sWorld.SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN, ginfo->ArenaType, ginfo->ArenaType, ginfo->ArenaTeamRating);
|
||||||
|
}
|
||||||
|
|
||||||
|
//add players from group to ginfo
|
||||||
|
{
|
||||||
|
//ACE_Guard<ACE_Recursive_Thread_Mutex> guard(m_Lock);
|
||||||
|
if (grp)
|
||||||
|
{
|
||||||
|
for(GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
|
||||||
|
{
|
||||||
|
Player *member = itr->getSource();
|
||||||
|
if(!member)
|
||||||
|
continue; // this should never happen
|
||||||
|
PlayerQueueInfo& pl_info = m_QueuedPlayers[member->GetGUID()];
|
||||||
|
pl_info.LastOnlineTime = lastOnlineTime;
|
||||||
|
pl_info.GroupInfo = ginfo;
|
||||||
|
// add the pinfo to ginfo's list
|
||||||
|
ginfo->Players[member->GetGUID()] = &pl_info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PlayerQueueInfo& pl_info = m_QueuedPlayers[leader->GetGUID()];
|
||||||
|
pl_info.LastOnlineTime = lastOnlineTime;
|
||||||
|
pl_info.GroupInfo = ginfo;
|
||||||
|
ginfo->Players[leader->GetGUID()] = &pl_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
//add GroupInfo to m_QueuedGroups
|
||||||
|
m_QueuedGroups[queue_id][index].push_back(ginfo);
|
||||||
|
|
||||||
|
//announce to world, this code needs mutex
|
||||||
|
if (!isRated && !isPremade && sWorld.getConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE))
|
||||||
|
{
|
||||||
|
BattleGround* bg = sBattleGroundMgr.GetBattleGroundTemplate(ginfo->BgTypeId);
|
||||||
|
if (bg)
|
||||||
|
{
|
||||||
|
char const* bgName = bg->GetName();
|
||||||
|
uint32 MinPlayers = bg->GetMinPlayersPerTeam();
|
||||||
|
uint32 qHorde = 0;
|
||||||
|
uint32 qAlliance = 0;
|
||||||
|
uint32 q_min_level = (queue_id + 1) * 10;
|
||||||
|
GroupsQueueType::const_iterator itr;
|
||||||
|
for(itr = m_QueuedGroups[queue_id][BG_QUEUE_NORMAL_ALLIANCE].begin(); itr != m_QueuedGroups[queue_id][BG_QUEUE_NORMAL_ALLIANCE].end(); ++itr)
|
||||||
|
if (!(*itr)->IsInvitedToBGInstanceGUID)
|
||||||
|
qAlliance += (*itr)->Players.size();
|
||||||
|
for(itr = m_QueuedGroups[queue_id][BG_QUEUE_NORMAL_HORDE].begin(); itr != m_QueuedGroups[queue_id][BG_QUEUE_NORMAL_HORDE].end(); ++itr)
|
||||||
|
if (!(*itr)->IsInvitedToBGInstanceGUID)
|
||||||
|
qHorde += (*itr)->Players.size();
|
||||||
|
|
||||||
|
// Show queue status to player only (when joining queue)
|
||||||
|
if (sWorld.getConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY))
|
||||||
|
{
|
||||||
|
ChatHandler(leader).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_SELF, bgName, q_min_level, q_min_level + 10,
|
||||||
|
qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (uint32)0);
|
||||||
|
}
|
||||||
|
// System message
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sWorld.SendWorldText(LANG_BG_QUEUE_ANNOUNCE_WORLD, bgName, q_min_level, q_min_level + 10,
|
||||||
|
qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (uint32)0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//release mutex
|
||||||
|
}
|
||||||
|
|
||||||
// return ginfo, because it is needed to add players to this group info
|
|
||||||
return ginfo;
|
return ginfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
//add player to playermap
|
|
||||||
void BattleGroundQueue::AddPlayer(Player *plr, GroupQueueInfo *ginfo)
|
|
||||||
{
|
|
||||||
//if player isn't in queue, he is added, if already is, then values are overwritten, no memory leak
|
|
||||||
PlayerQueueInfo& info = m_QueuedPlayers[plr->GetGUID()];
|
|
||||||
info.LastOnlineTime = getMSTime();
|
|
||||||
info.GroupInfo = ginfo;
|
|
||||||
|
|
||||||
// add the pinfo to ginfo's list
|
|
||||||
ginfo->Players[plr->GetGUID()] = &info;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BattleGroundQueue::PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo, BGQueueIdBasedOnLevel queue_id)
|
void BattleGroundQueue::PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo, BGQueueIdBasedOnLevel queue_id)
|
||||||
{
|
{
|
||||||
uint32 timeInQueue = getMSTimeDiff(ginfo->JoinTime, getMSTime());
|
uint32 timeInQueue = getMSTimeDiff(ginfo->JoinTime, getMSTime());
|
||||||
|
|
@ -248,6 +303,7 @@ uint32 BattleGroundQueue::GetAverageQueueWaitTime(GroupQueueInfo* ginfo, BGQueue
|
||||||
void BattleGroundQueue::RemovePlayer(const uint64& guid, bool decreaseInvitedCount)
|
void BattleGroundQueue::RemovePlayer(const uint64& guid, bool decreaseInvitedCount)
|
||||||
{
|
{
|
||||||
//Player *plr = sObjectMgr.GetPlayer(guid);
|
//Player *plr = sObjectMgr.GetPlayer(guid);
|
||||||
|
//ACE_Guard<ACE_Recursive_Thread_Mutex> guard(m_Lock);
|
||||||
|
|
||||||
int32 queue_id = -1; // signed for proper for-loop finish
|
int32 queue_id = -1; // signed for proper for-loop finish
|
||||||
QueuedPlayersMap::iterator itr;
|
QueuedPlayersMap::iterator itr;
|
||||||
|
|
@ -315,9 +371,9 @@ void BattleGroundQueue::RemovePlayer(const uint64& guid, bool decreaseInvitedCou
|
||||||
// remove player queue info
|
// remove player queue info
|
||||||
m_QueuedPlayers.erase(itr);
|
m_QueuedPlayers.erase(itr);
|
||||||
|
|
||||||
//if we left BG queue(not porting) OR if arena team left queue for rated match
|
// announce to world if arena team left queue for rated match, show only once
|
||||||
if ((decreaseInvitedCount && !group->ArenaType) || (group->ArenaType && group->IsRated && group->Players.empty()))
|
if (group->ArenaType && group->IsRated && group->Players.empty() && sWorld.getConfig(CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE))
|
||||||
AnnounceWorld(group, guid, false);
|
sWorld.SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT, group->ArenaType, group->ArenaType, group->ArenaTeamRating);
|
||||||
|
|
||||||
//if player leaves queue and he is invited to rated arena match, then he have to loose
|
//if player leaves queue and he is invited to rated arena match, then he have to loose
|
||||||
if (group->IsInvitedToBGInstanceGUID && group->IsRated && decreaseInvitedCount)
|
if (group->IsInvitedToBGInstanceGUID && group->IsRated && decreaseInvitedCount)
|
||||||
|
|
@ -364,61 +420,24 @@ void BattleGroundQueue::RemovePlayer(const uint64& guid, bool decreaseInvitedCou
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Announce world message
|
//returns true when player pl_guid is in queue and is invited to bgInstanceGuid
|
||||||
void BattleGroundQueue::AnnounceWorld(GroupQueueInfo *ginfo, const uint64& playerGUID, bool isAddedToQueue)
|
bool BattleGroundQueue::IsPlayerInvited(const uint64& pl_guid, const uint32 bgInstanceGuid, const uint32 removeTime)
|
||||||
{
|
{
|
||||||
if(ginfo->ArenaType) //if Arena
|
//ACE_Guard<ACE_Recursive_Thread_Mutex> g(m_Lock);
|
||||||
{
|
QueuedPlayersMap::const_iterator qItr = m_QueuedPlayers.find(pl_guid);
|
||||||
if (sWorld.getConfig(CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE) && ginfo->IsRated)
|
return ( qItr != m_QueuedPlayers.end()
|
||||||
{
|
&& qItr->second.GroupInfo->IsInvitedToBGInstanceGUID == bgInstanceGuid
|
||||||
BattleGround* bg = sBattleGroundMgr.GetBattleGroundTemplate(ginfo->BgTypeId);
|
&& qItr->second.GroupInfo->RemoveInviteTime == removeTime );
|
||||||
if (!bg)
|
}
|
||||||
return;
|
|
||||||
|
|
||||||
char const* bgName = bg->GetName();
|
bool BattleGroundQueue::GetPlayerGroupInfoData(const uint64& guid, GroupQueueInfo* ginfo)
|
||||||
if (isAddedToQueue)
|
{
|
||||||
sWorld.SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN, bgName, ginfo->ArenaType, ginfo->ArenaType, ginfo->ArenaTeamRating);
|
//ACE_Guard<ACE_Recursive_Thread_Mutex> g(m_Lock);
|
||||||
else
|
QueuedPlayersMap::const_iterator qItr = m_QueuedPlayers.find(guid);
|
||||||
sWorld.SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT, bgName, ginfo->ArenaType, ginfo->ArenaType, ginfo->ArenaTeamRating);
|
if (qItr == m_QueuedPlayers.end())
|
||||||
}
|
return false;
|
||||||
}
|
*ginfo = *(qItr->second.GroupInfo);
|
||||||
else //if BG
|
return true;
|
||||||
{
|
|
||||||
if (sWorld.getConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE))
|
|
||||||
{
|
|
||||||
Player *plr = sObjectMgr.GetPlayer(playerGUID);
|
|
||||||
BattleGround* bg = sBattleGroundMgr.GetBattleGroundTemplate(ginfo->BgTypeId);
|
|
||||||
if (!bg || !plr)
|
|
||||||
return;
|
|
||||||
|
|
||||||
BGQueueIdBasedOnLevel queue_id = plr->GetBattleGroundQueueIdFromLevel();
|
|
||||||
char const* bgName = bg->GetName();
|
|
||||||
uint32 MinPlayers = bg->GetMinPlayersPerTeam();
|
|
||||||
uint32 qHorde = 0;
|
|
||||||
uint32 qAlliance = 0;
|
|
||||||
uint32 q_min_level = (queue_id + 1) * 10;
|
|
||||||
GroupsQueueType::const_iterator itr;
|
|
||||||
for(itr = m_QueuedGroups[queue_id][BG_QUEUE_NORMAL_ALLIANCE].begin(); itr != m_QueuedGroups[queue_id][BG_QUEUE_NORMAL_ALLIANCE].end(); ++itr)
|
|
||||||
if (!(*itr)->IsInvitedToBGInstanceGUID)
|
|
||||||
qAlliance += (*itr)->Players.size();
|
|
||||||
for(itr = m_QueuedGroups[queue_id][BG_QUEUE_NORMAL_HORDE].begin(); itr != m_QueuedGroups[queue_id][BG_QUEUE_NORMAL_HORDE].end(); ++itr)
|
|
||||||
if (!(*itr)->IsInvitedToBGInstanceGUID)
|
|
||||||
qHorde += (*itr)->Players.size();
|
|
||||||
|
|
||||||
// Show queue status to player only (when joining queue)
|
|
||||||
if (sWorld.getConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY))
|
|
||||||
{
|
|
||||||
ChatHandler(plr).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_SELF,
|
|
||||||
bgName, q_min_level, q_min_level + 10, qAlliance, MinPlayers, qHorde, MinPlayers);
|
|
||||||
}
|
|
||||||
// System message
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sWorld.SendWorldText(LANG_BG_QUEUE_ANNOUNCE_WORLD,
|
|
||||||
bgName, q_min_level, q_min_level + 10, qAlliance, MinPlayers, qHorde, MinPlayers);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BattleGroundQueue::InviteGroupToBG(GroupQueueInfo * ginfo, BattleGround * bg, uint32 side)
|
bool BattleGroundQueue::InviteGroupToBG(GroupQueueInfo * ginfo, BattleGround * bg, uint32 side)
|
||||||
|
|
@ -461,7 +480,7 @@ bool BattleGroundQueue::InviteGroupToBG(GroupQueueInfo * ginfo, BattleGround * b
|
||||||
plr->SetInviteForBattleGroundQueueType(bgQueueTypeId, ginfo->IsInvitedToBGInstanceGUID);
|
plr->SetInviteForBattleGroundQueueType(bgQueueTypeId, ginfo->IsInvitedToBGInstanceGUID);
|
||||||
|
|
||||||
// create remind invite events
|
// create remind invite events
|
||||||
BGQueueInviteEvent* inviteEvent = new BGQueueInviteEvent(plr->GetGUID(), ginfo->IsInvitedToBGInstanceGUID, bgTypeId, ginfo->RemoveInviteTime);
|
BGQueueInviteEvent* inviteEvent = new BGQueueInviteEvent(plr->GetGUID(), ginfo->IsInvitedToBGInstanceGUID, bgTypeId, ginfo->ArenaType, ginfo->RemoveInviteTime);
|
||||||
plr->m_Events.AddEvent(inviteEvent, plr->m_Events.CalculateTime(INVITATION_REMIND_TIME));
|
plr->m_Events.AddEvent(inviteEvent, plr->m_Events.CalculateTime(INVITATION_REMIND_TIME));
|
||||||
// create automatic remove events
|
// create automatic remove events
|
||||||
BGQueueRemoveEvent* removeEvent = new BGQueueRemoveEvent(plr->GetGUID(), ginfo->IsInvitedToBGInstanceGUID, bgTypeId, bgQueueTypeId, ginfo->RemoveInviteTime);
|
BGQueueRemoveEvent* removeEvent = new BGQueueRemoveEvent(plr->GetGUID(), ginfo->IsInvitedToBGInstanceGUID, bgTypeId, bgQueueTypeId, ginfo->RemoveInviteTime);
|
||||||
|
|
@ -732,6 +751,7 @@ should be called from BattleGround::RemovePlayer function in some cases
|
||||||
*/
|
*/
|
||||||
void BattleGroundQueue::Update(BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id, uint8 arenaType, bool isRated, uint32 arenaRating)
|
void BattleGroundQueue::Update(BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id, uint8 arenaType, bool isRated, uint32 arenaRating)
|
||||||
{
|
{
|
||||||
|
//ACE_Guard<ACE_Recursive_Thread_Mutex> guard(m_Lock);
|
||||||
//if no players in queue - do nothing
|
//if no players in queue - do nothing
|
||||||
if( m_QueuedGroups[queue_id][BG_QUEUE_PREMADE_ALLIANCE].empty() &&
|
if( m_QueuedGroups[queue_id][BG_QUEUE_PREMADE_ALLIANCE].empty() &&
|
||||||
m_QueuedGroups[queue_id][BG_QUEUE_PREMADE_HORDE].empty() &&
|
m_QueuedGroups[queue_id][BG_QUEUE_PREMADE_HORDE].empty() &&
|
||||||
|
|
@ -1021,17 +1041,15 @@ bool BGQueueInviteEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
|
||||||
|
|
||||||
BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType());
|
BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType());
|
||||||
uint32 queueSlot = plr->GetBattleGroundQueueIndex(bgQueueTypeId);
|
uint32 queueSlot = plr->GetBattleGroundQueueIndex(bgQueueTypeId);
|
||||||
if( queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES ) // player is in queue or in battleground
|
if (queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) // player is in queue or in battleground
|
||||||
{
|
{
|
||||||
// check if player is invited to this bg
|
// check if player is invited to this bg
|
||||||
BattleGroundQueue::QueuedPlayersMap const& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers;
|
BattleGroundQueue &bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
|
||||||
BattleGroundQueue::QueuedPlayersMap::const_iterator qItr = qpMap.find(m_PlayerGuid);
|
if (bgQueue.IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime))
|
||||||
if( qItr != qpMap.end() && qItr->second.GroupInfo->IsInvitedToBGInstanceGUID == m_BgInstanceGUID
|
|
||||||
&& qItr->second.GroupInfo->RemoveInviteTime == m_RemoveTime )
|
|
||||||
{
|
{
|
||||||
WorldPacket data;
|
WorldPacket data;
|
||||||
//we must send remaining time in queue
|
//we must send remaining time in queue
|
||||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME - INVITATION_REMIND_TIME, 0, qItr->second.GroupInfo->ArenaType);
|
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME - INVITATION_REMIND_TIME, 0, m_ArenaType);
|
||||||
plr->GetSession()->SendPacket(&data);
|
plr->GetSession()->SendPacket(&data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1064,22 +1082,19 @@ bool BGQueueRemoveEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
|
||||||
//bg pointer can be NULL! so use it carefully!
|
//bg pointer can be NULL! so use it carefully!
|
||||||
|
|
||||||
uint32 queueSlot = plr->GetBattleGroundQueueIndex(m_BgQueueTypeId);
|
uint32 queueSlot = plr->GetBattleGroundQueueIndex(m_BgQueueTypeId);
|
||||||
if( queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES ) // player is in queue, or in Battleground
|
if (queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) // player is in queue, or in Battleground
|
||||||
{
|
{
|
||||||
// check if player is in queue for this BG and if we are removing his invite event
|
// check if player is in queue for this BG and if we are removing his invite event
|
||||||
BattleGroundQueue::QueuedPlayersMap& qpMap = sBattleGroundMgr.m_BattleGroundQueues[m_BgQueueTypeId].m_QueuedPlayers;
|
BattleGroundQueue &bgQueue = sBattleGroundMgr.m_BattleGroundQueues[m_BgQueueTypeId];
|
||||||
BattleGroundQueue::QueuedPlayersMap::iterator qMapItr = qpMap.find(m_PlayerGuid);
|
if (bgQueue.IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime))
|
||||||
if( qMapItr != qpMap.end() && qMapItr->second.GroupInfo
|
|
||||||
&& qMapItr->second.GroupInfo->IsInvitedToBGInstanceGUID == m_BgInstanceGUID
|
|
||||||
&& qMapItr->second.GroupInfo->RemoveInviteTime == m_RemoveTime )
|
|
||||||
{
|
{
|
||||||
sLog.outDebug("Battleground: removing player %u from bg queue for instance %u because of not pressing enter battle in time.",plr->GetGUIDLow(),m_BgInstanceGUID);
|
sLog.outDebug("Battleground: removing player %u from bg queue for instance %u because of not pressing enter battle in time.",plr->GetGUIDLow(),m_BgInstanceGUID);
|
||||||
|
|
||||||
plr->RemoveBattleGroundQueueId(m_BgQueueTypeId);
|
plr->RemoveBattleGroundQueueId(m_BgQueueTypeId);
|
||||||
sBattleGroundMgr.m_BattleGroundQueues[m_BgQueueTypeId].RemovePlayer(m_PlayerGuid, true);
|
bgQueue.RemovePlayer(m_PlayerGuid, true);
|
||||||
//update queues if battleground isn't ended
|
//update queues if battleground isn't ended
|
||||||
if (bg)
|
if (bg && bg->isBattleGround() && bg->GetStatus() != STATUS_WAIT_LEAVE)
|
||||||
sBattleGroundMgr.ScheduleQueueUpdate(m_BgQueueTypeId, m_BgTypeId, bg->GetQueueId());
|
sBattleGroundMgr.ScheduleQueueUpdate(0, 0, m_BgQueueTypeId, m_BgTypeId, bg->GetQueueId());
|
||||||
|
|
||||||
WorldPacket data;
|
WorldPacket data;
|
||||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_NONE, 0, 0, 0);
|
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_NONE, 0, 0, 0);
|
||||||
|
|
@ -1167,18 +1182,24 @@ void BattleGroundMgr::Update(uint32 diff)
|
||||||
// update scheduled queues
|
// update scheduled queues
|
||||||
if (!m_QueueUpdateScheduler.empty())
|
if (!m_QueueUpdateScheduler.empty())
|
||||||
{
|
{
|
||||||
//copy vector and clear the other
|
std::vector<uint64> scheduled;
|
||||||
// TODO add lock
|
{
|
||||||
// TODO maybe std::list would be better and then unlock after end of cycle
|
//create mutex
|
||||||
std::vector<uint32> scheduled(m_QueueUpdateScheduler);
|
//ACE_Guard<ACE_Thread_Mutex> guard(SchedulerLock);
|
||||||
m_QueueUpdateScheduler.clear();
|
//copy vector and clear the other
|
||||||
// TODO drop lock
|
scheduled = std::vector<uint64>(m_QueueUpdateScheduler);
|
||||||
|
m_QueueUpdateScheduler.clear();
|
||||||
|
//release lock
|
||||||
|
}
|
||||||
|
|
||||||
for (uint8 i = 0; i < scheduled.size(); i++)
|
for (uint8 i = 0; i < scheduled.size(); i++)
|
||||||
{
|
{
|
||||||
BattleGroundQueueTypeId bgQueueTypeId = BattleGroundQueueTypeId(scheduled[i] >> 16);
|
uint32 arenaRating = scheduled[i] >> 32;
|
||||||
|
uint8 arenaType = scheduled[i] >> 24 & 255;
|
||||||
|
BattleGroundQueueTypeId bgQueueTypeId = BattleGroundQueueTypeId(scheduled[i] >> 16 & 255);
|
||||||
BattleGroundTypeId bgTypeId = BattleGroundTypeId((scheduled[i] >> 8) & 255);
|
BattleGroundTypeId bgTypeId = BattleGroundTypeId((scheduled[i] >> 8) & 255);
|
||||||
BGQueueIdBasedOnLevel queue_id = BGQueueIdBasedOnLevel(scheduled[i] & 255);
|
BGQueueIdBasedOnLevel queue_id = BGQueueIdBasedOnLevel(scheduled[i] & 255);
|
||||||
m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, queue_id);
|
m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, queue_id, arenaType, arenaRating > 0, arenaRating);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2009,11 +2030,11 @@ void BattleGroundMgr::ToggleArenaTesting()
|
||||||
sWorld.SendWorldText(LANG_DEBUG_ARENA_OFF);
|
sWorld.SendWorldText(LANG_DEBUG_ARENA_OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BattleGroundMgr::ScheduleQueueUpdate(BattleGroundQueueTypeId bgQueueTypeId, BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id)
|
void BattleGroundMgr::ScheduleQueueUpdate(uint32 arenaRating, uint8 arenaType, BattleGroundQueueTypeId bgQueueTypeId, BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id)
|
||||||
{
|
{
|
||||||
//This method must be atomic, TODO add mutex
|
//ACE_Guard<ACE_Thread_Mutex> guard(SchedulerLock);
|
||||||
//we will use only 1 number created of bgTypeId and queue_id
|
//we will use only 1 number created of bgTypeId and queue_id
|
||||||
uint32 schedule_id = (bgQueueTypeId << 16) | (bgTypeId << 8) | queue_id;
|
uint64 schedule_id = ((uint64)arenaRating << 32) | (arenaType << 24) | (bgQueueTypeId << 16) | (bgTypeId << 8) | queue_id;
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (uint8 i = 0; i < m_QueueUpdateScheduler.size(); i++)
|
for (uint8 i = 0; i < m_QueueUpdateScheduler.size(); i++)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@
|
||||||
#include "Policies/Singleton.h"
|
#include "Policies/Singleton.h"
|
||||||
#include "Utilities/EventProcessor.h"
|
#include "Utilities/EventProcessor.h"
|
||||||
#include "BattleGround.h"
|
#include "BattleGround.h"
|
||||||
|
#include "ace/Recursive_Thread_Mutex.h"
|
||||||
|
|
||||||
typedef std::map<uint32, BattleGround*> BattleGroundSet;
|
typedef std::map<uint32, BattleGround*> BattleGroundSet;
|
||||||
|
|
||||||
|
|
@ -80,14 +81,17 @@ class BattleGroundQueue
|
||||||
bool CheckPremadeMatch(BGQueueIdBasedOnLevel queue_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam);
|
bool CheckPremadeMatch(BGQueueIdBasedOnLevel queue_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam);
|
||||||
bool CheckNormalMatch(BattleGround* bg_template, BGQueueIdBasedOnLevel queue_id, uint32 minPlayers, uint32 maxPlayers);
|
bool CheckNormalMatch(BattleGround* bg_template, BGQueueIdBasedOnLevel queue_id, uint32 minPlayers, uint32 maxPlayers);
|
||||||
bool CheckSkirmishForSameFaction(BGQueueIdBasedOnLevel queue_id, uint32 minPlayersPerTeam);
|
bool CheckSkirmishForSameFaction(BGQueueIdBasedOnLevel queue_id, uint32 minPlayersPerTeam);
|
||||||
GroupQueueInfo * AddGroup(Player * leader, BattleGroundTypeId bgTypeId, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 ArenaTeamId = 0);
|
GroupQueueInfo * AddGroup(Player* leader, Group* group, BattleGroundTypeId bgTypeId, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 ArenaTeamId = 0);
|
||||||
void AddPlayer(Player *plr, GroupQueueInfo *ginfo);
|
|
||||||
void RemovePlayer(const uint64& guid, bool decreaseInvitedCount);
|
void RemovePlayer(const uint64& guid, bool decreaseInvitedCount);
|
||||||
|
bool IsPlayerInvited(const uint64& pl_guid, const uint32 bgInstanceGuid, const uint32 removeTime);
|
||||||
|
bool GetPlayerGroupInfoData(const uint64& guid, GroupQueueInfo* ginfo);
|
||||||
void PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo, BGQueueIdBasedOnLevel queue_id);
|
void PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo, BGQueueIdBasedOnLevel queue_id);
|
||||||
uint32 GetAverageQueueWaitTime(GroupQueueInfo* ginfo, BGQueueIdBasedOnLevel queue_id);
|
uint32 GetAverageQueueWaitTime(GroupQueueInfo* ginfo, BGQueueIdBasedOnLevel queue_id);
|
||||||
|
|
||||||
void DecreaseGroupLength(uint32 queueId, uint32 AsGroup);
|
private:
|
||||||
void AnnounceWorld(GroupQueueInfo *ginfo, const uint64& playerGUID, bool isAddedToQueue);
|
//mutex that should not allow changing private data, nor allowing to update Queue during private data change.
|
||||||
|
ACE_Recursive_Thread_Mutex m_Lock;
|
||||||
|
|
||||||
|
|
||||||
typedef std::map<uint64, PlayerQueueInfo> QueuedPlayersMap;
|
typedef std::map<uint64, PlayerQueueInfo> QueuedPlayersMap;
|
||||||
QueuedPlayersMap m_QueuedPlayers;
|
QueuedPlayersMap m_QueuedPlayers;
|
||||||
|
|
@ -123,8 +127,6 @@ class BattleGroundQueue
|
||||||
//one selection pool for horde, other one for alliance
|
//one selection pool for horde, other one for alliance
|
||||||
SelectionPool m_SelectionPools[BG_TEAMS_COUNT];
|
SelectionPool m_SelectionPools[BG_TEAMS_COUNT];
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
bool InviteGroupToBG(GroupQueueInfo * ginfo, BattleGround * bg, uint32 side);
|
bool InviteGroupToBG(GroupQueueInfo * ginfo, BattleGround * bg, uint32 side);
|
||||||
uint32 m_WaitTimes[BG_TEAMS_COUNT][MAX_BATTLEGROUND_QUEUES][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME];
|
uint32 m_WaitTimes[BG_TEAMS_COUNT][MAX_BATTLEGROUND_QUEUES][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME];
|
||||||
uint32 m_WaitTimeLastPlayer[BG_TEAMS_COUNT][MAX_BATTLEGROUND_QUEUES];
|
uint32 m_WaitTimeLastPlayer[BG_TEAMS_COUNT][MAX_BATTLEGROUND_QUEUES];
|
||||||
|
|
@ -138,8 +140,8 @@ class BattleGroundQueue
|
||||||
class BGQueueInviteEvent : public BasicEvent
|
class BGQueueInviteEvent : public BasicEvent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BGQueueInviteEvent(const uint64& pl_guid, uint32 BgInstanceGUID, BattleGroundTypeId BgTypeId, uint32 removeTime) :
|
BGQueueInviteEvent(const uint64& pl_guid, uint32 BgInstanceGUID, BattleGroundTypeId BgTypeId, uint8 arenaType, uint32 removeTime) :
|
||||||
m_PlayerGuid(pl_guid), m_BgInstanceGUID(BgInstanceGUID), m_BgTypeId(BgTypeId), m_RemoveTime(removeTime)
|
m_PlayerGuid(pl_guid), m_BgInstanceGUID(BgInstanceGUID), m_BgTypeId(BgTypeId), m_ArenaType(arenaType), m_RemoveTime(removeTime)
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
virtual ~BGQueueInviteEvent() {};
|
virtual ~BGQueueInviteEvent() {};
|
||||||
|
|
@ -150,6 +152,7 @@ class BGQueueInviteEvent : public BasicEvent
|
||||||
uint64 m_PlayerGuid;
|
uint64 m_PlayerGuid;
|
||||||
uint32 m_BgInstanceGUID;
|
uint32 m_BgInstanceGUID;
|
||||||
BattleGroundTypeId m_BgTypeId;
|
BattleGroundTypeId m_BgTypeId;
|
||||||
|
uint8 m_ArenaType;
|
||||||
uint32 m_RemoveTime;
|
uint32 m_RemoveTime;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -219,7 +222,7 @@ class BattleGroundMgr
|
||||||
|
|
||||||
BGFreeSlotQueueType BGFreeSlotQueue[MAX_BATTLEGROUND_TYPE_ID];
|
BGFreeSlotQueueType BGFreeSlotQueue[MAX_BATTLEGROUND_TYPE_ID];
|
||||||
|
|
||||||
void ScheduleQueueUpdate(BattleGroundQueueTypeId bgQueueTypeId, BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id);
|
void ScheduleQueueUpdate(uint32 arenaRating, uint8 arenaType, BattleGroundQueueTypeId bgQueueTypeId, BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id);
|
||||||
uint32 GetMaxRatingDifference() const;
|
uint32 GetMaxRatingDifference() const;
|
||||||
uint32 GetRatingDiscardTimer() const;
|
uint32 GetRatingDiscardTimer() const;
|
||||||
uint32 GetPrematureFinishTime() const;
|
uint32 GetPrematureFinishTime() const;
|
||||||
|
|
@ -265,13 +268,14 @@ class BattleGroundMgr
|
||||||
|
|
||||||
static bool IsBGWeekend(BattleGroundTypeId bgTypeId);
|
static bool IsBGWeekend(BattleGroundTypeId bgTypeId);
|
||||||
private:
|
private:
|
||||||
|
ACE_Thread_Mutex SchedulerLock;
|
||||||
BattleMastersMap mBattleMastersMap;
|
BattleMastersMap mBattleMastersMap;
|
||||||
CreatureBattleEventIndexesMap m_CreatureBattleEventIndexMap;
|
CreatureBattleEventIndexesMap m_CreatureBattleEventIndexMap;
|
||||||
GameObjectBattleEventIndexesMap m_GameObjectBattleEventIndexMap;
|
GameObjectBattleEventIndexesMap m_GameObjectBattleEventIndexMap;
|
||||||
|
|
||||||
/* Battlegrounds */
|
/* Battlegrounds */
|
||||||
BattleGroundSet m_BattleGrounds[MAX_BATTLEGROUND_TYPE_ID];
|
BattleGroundSet m_BattleGrounds[MAX_BATTLEGROUND_TYPE_ID];
|
||||||
std::vector<uint32>m_QueueUpdateScheduler;
|
std::vector<uint64> m_QueueUpdateScheduler;
|
||||||
std::set<uint32> m_ClientBattleGroundIds[MAX_BATTLEGROUND_TYPE_ID][MAX_BATTLEGROUND_QUEUES]; //the instanceids just visible for the client
|
std::set<uint32> m_ClientBattleGroundIds[MAX_BATTLEGROUND_TYPE_ID][MAX_BATTLEGROUND_QUEUES]; //the instanceids just visible for the client
|
||||||
uint32 m_NextRatingDiscardUpdate;
|
uint32 m_NextRatingDiscardUpdate;
|
||||||
time_t m_NextAutoDistributionTime;
|
time_t m_NextAutoDistributionTime;
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
BattleGroundSA::BattleGroundSA()
|
BattleGroundSA::BattleGroundSA()
|
||||||
{
|
{
|
||||||
//TODO FIX ME!
|
//TODO FIX ME!
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_WS_START_TWO_MINUTES;
|
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = 0;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN;
|
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN;
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
BattleGroundWS::BattleGroundWS()
|
BattleGroundWS::BattleGroundWS()
|
||||||
{
|
{
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_WS_START_TWO_MINUTES;
|
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = 0;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE;
|
m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE;
|
||||||
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN;
|
m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN;
|
||||||
|
|
|
||||||
|
|
@ -571,7 +571,6 @@ enum MangosStrings
|
||||||
LANG_BG_A_WINS = 600,
|
LANG_BG_A_WINS = 600,
|
||||||
LANG_BG_H_WINS = 601,
|
LANG_BG_H_WINS = 601,
|
||||||
|
|
||||||
LANG_BG_WS_START_TWO_MINUTES = 753,
|
|
||||||
LANG_BG_WS_START_ONE_MINUTE = 602,
|
LANG_BG_WS_START_ONE_MINUTE = 602,
|
||||||
LANG_BG_WS_START_HALF_MINUTE = 603,
|
LANG_BG_WS_START_HALF_MINUTE = 603,
|
||||||
LANG_BG_WS_HAS_BEGUN = 604,
|
LANG_BG_WS_HAS_BEGUN = 604,
|
||||||
|
|
@ -587,14 +586,14 @@ enum MangosStrings
|
||||||
LANG_BG_WS_F_PLACED = 613,
|
LANG_BG_WS_F_PLACED = 613,
|
||||||
LANG_BG_WS_ALLIANCE_FLAG_RESPAWNED = 614,
|
LANG_BG_WS_ALLIANCE_FLAG_RESPAWNED = 614,
|
||||||
LANG_BG_WS_HORDE_FLAG_RESPAWNED = 615,
|
LANG_BG_WS_HORDE_FLAG_RESPAWNED = 615,
|
||||||
|
// 616 - 635 not used
|
||||||
LANG_BG_EY_START_TWO_MINUTES = 755,
|
|
||||||
LANG_BG_EY_START_ONE_MINUTE = 636,
|
LANG_BG_EY_START_ONE_MINUTE = 636,
|
||||||
LANG_BG_EY_START_HALF_MINUTE = 637,
|
LANG_BG_EY_START_HALF_MINUTE = 637,
|
||||||
LANG_BG_EY_HAS_BEGUN = 638,
|
LANG_BG_EY_HAS_BEGUN = 638,
|
||||||
|
// 639 - 649 not used
|
||||||
|
LANG_BG_ALLY = 650,
|
||||||
|
LANG_BG_HORDE = 651,
|
||||||
|
|
||||||
LANG_BG_AB_ALLY = 650,
|
|
||||||
LANG_BG_AB_HORDE = 651,
|
|
||||||
LANG_BG_AB_NODE_STABLES = 652,
|
LANG_BG_AB_NODE_STABLES = 652,
|
||||||
LANG_BG_AB_NODE_BLACKSMITH = 653,
|
LANG_BG_AB_NODE_BLACKSMITH = 653,
|
||||||
LANG_BG_AB_NODE_FARM = 654,
|
LANG_BG_AB_NODE_FARM = 654,
|
||||||
|
|
@ -605,7 +604,6 @@ enum MangosStrings
|
||||||
LANG_BG_AB_NODE_ASSAULTED = 659,
|
LANG_BG_AB_NODE_ASSAULTED = 659,
|
||||||
LANG_BG_AB_NODE_CLAIMED = 660,
|
LANG_BG_AB_NODE_CLAIMED = 660,
|
||||||
|
|
||||||
LANG_BG_AB_START_TWO_MINUTES = 754,
|
|
||||||
LANG_BG_AB_START_ONE_MINUTE = 661,
|
LANG_BG_AB_START_ONE_MINUTE = 661,
|
||||||
LANG_BG_AB_START_HALF_MINUTE = 662,
|
LANG_BG_AB_START_HALF_MINUTE = 662,
|
||||||
LANG_BG_AB_HAS_BEGUN = 663,
|
LANG_BG_AB_HAS_BEGUN = 663,
|
||||||
|
|
@ -634,7 +632,7 @@ enum MangosStrings
|
||||||
LANG_BG_EY_CAPTURED_FLAG_H = 685,
|
LANG_BG_EY_CAPTURED_FLAG_H = 685,
|
||||||
LANG_BG_EY_DROPPED_FLAG = 686,
|
LANG_BG_EY_DROPPED_FLAG = 686,
|
||||||
LANG_BG_EY_RESETED_FLAG = 687,
|
LANG_BG_EY_RESETED_FLAG = 687,
|
||||||
|
// 688 - 699 not used
|
||||||
LANG_ARENA_ONE_TOOLOW = 700,
|
LANG_ARENA_ONE_TOOLOW = 700,
|
||||||
LANG_ARENA_ONE_MINUTE = 701,
|
LANG_ARENA_ONE_MINUTE = 701,
|
||||||
LANG_ARENA_THIRTY_SECONDS = 702,
|
LANG_ARENA_THIRTY_SECONDS = 702,
|
||||||
|
|
@ -686,14 +684,18 @@ enum MangosStrings
|
||||||
LANG_DIST_ARENA_POINTS_TEAM_START = 744,
|
LANG_DIST_ARENA_POINTS_TEAM_START = 744,
|
||||||
LANG_DIST_ARENA_POINTS_TEAM_END = 745,
|
LANG_DIST_ARENA_POINTS_TEAM_END = 745,
|
||||||
LANG_DIST_ARENA_POINTS_END = 746,
|
LANG_DIST_ARENA_POINTS_END = 746,
|
||||||
|
// = 747, not used
|
||||||
LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING = 750, // "Not enough players. This game will close in %u mins."
|
// = 748, not used
|
||||||
|
// = 749, not used
|
||||||
|
LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING = 750, // "Not enough players. This game will close in %u mins."
|
||||||
LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS = 751, // "Not enough players. This game will close in %u seconds."
|
LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS = 751, // "Not enough players. This game will close in %u seconds."
|
||||||
LANG_BATTLEGROUND_ONLY_ALLIANCE_USE = 752, // "Only The Alliance can use that portal"
|
LANG_BATTLEGROUND_ONLY_ALLIANCE_USE = 752, // "Only The Alliance can use that portal"
|
||||||
LANG_BATTLEGROUND_ONLY_HORDE_USE = 753, // "Only The Horde can use that portal"
|
LANG_BATTLEGROUND_ONLY_HORDE_USE = 753, // "Only The Horde can use that portal"
|
||||||
|
// = 754, not used
|
||||||
LANG_BG_AV_ALLY = 757,
|
// = 755, not used
|
||||||
LANG_BG_AV_HORDE = 758,
|
// = 756, not used
|
||||||
|
// = 757, not used
|
||||||
|
// = 758, not used
|
||||||
LANG_BG_AV_TOWER_TAKEN = 759,
|
LANG_BG_AV_TOWER_TAKEN = 759,
|
||||||
LANG_BG_AV_TOWER_ASSAULTED = 760,
|
LANG_BG_AV_TOWER_ASSAULTED = 760,
|
||||||
LANG_BG_AV_TOWER_DEFENDED = 761,
|
LANG_BG_AV_TOWER_DEFENDED = 761,
|
||||||
|
|
@ -720,7 +722,7 @@ enum MangosStrings
|
||||||
LANG_BG_AV_NODE_TOWER_FROST_W = 781,
|
LANG_BG_AV_NODE_TOWER_FROST_W = 781,
|
||||||
LANG_BG_AV_NODE_GRAVE_FROST_HUT = 782,
|
LANG_BG_AV_NODE_GRAVE_FROST_HUT = 782,
|
||||||
|
|
||||||
LANG_BG_AV_START_TWO_MINUTES = 783,
|
// = 783, not used
|
||||||
LANG_BG_AV_START_ONE_MINUTE = 784,
|
LANG_BG_AV_START_ONE_MINUTE = 784,
|
||||||
LANG_BG_AV_START_HALF_MINUTE = 785,
|
LANG_BG_AV_START_HALF_MINUTE = 785,
|
||||||
LANG_BG_AV_HAS_BEGUN = 786,
|
LANG_BG_AV_HAS_BEGUN = 786,
|
||||||
|
|
@ -730,7 +732,7 @@ enum MangosStrings
|
||||||
LANG_BG_AV_A_GENERAL_DEAD = 790,
|
LANG_BG_AV_A_GENERAL_DEAD = 790,
|
||||||
|
|
||||||
|
|
||||||
// Room for batleground/arena strings 790-799 not used
|
// Room for batleground/arena strings 791-799 not used
|
||||||
|
|
||||||
// in game strings
|
// in game strings
|
||||||
// = 800, not used
|
// = 800, not used
|
||||||
|
|
|
||||||
|
|
@ -646,8 +646,6 @@ void WorldSession::HandleReclaimCorpseOpcode(WorldPacket &recv_data)
|
||||||
|
|
||||||
// spawn bones
|
// spawn bones
|
||||||
GetPlayer()->SpawnCorpseBones();
|
GetPlayer()->SpawnCorpseBones();
|
||||||
|
|
||||||
GetPlayer()->SaveToDB();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldSession::HandleResurrectResponseOpcode(WorldPacket & recv_data)
|
void WorldSession::HandleResurrectResponseOpcode(WorldPacket & recv_data)
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,6 @@ void WorldSession::HandleMoveWorldportAckOpcode()
|
||||||
{
|
{
|
||||||
GetPlayer()->ResurrectPlayer(0.5f);
|
GetPlayer()->ResurrectPlayer(0.5f);
|
||||||
GetPlayer()->SpawnCorpseBones();
|
GetPlayer()->SpawnCorpseBones();
|
||||||
GetPlayer()->SaveToDB();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -377,8 +377,6 @@ void WorldSession::SendSpiritResurrect()
|
||||||
// or update at original position
|
// or update at original position
|
||||||
else
|
else
|
||||||
_player->UpdateVisibilityForPlayer();
|
_player->UpdateVisibilityForPlayer();
|
||||||
|
|
||||||
_player->SaveToDB();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldSession::HandleBinderActivateOpcode( WorldPacket & recv_data )
|
void WorldSession::HandleBinderActivateOpcode( WorldPacket & recv_data )
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,10 @@ ObjectAccessor::ObjectAccessor() {}
|
||||||
ObjectAccessor::~ObjectAccessor()
|
ObjectAccessor::~ObjectAccessor()
|
||||||
{
|
{
|
||||||
for(Player2CorpsesMapType::const_iterator itr = i_player2corpse.begin(); itr != i_player2corpse.end(); ++itr)
|
for(Player2CorpsesMapType::const_iterator itr = i_player2corpse.begin(); itr != i_player2corpse.end(); ++itr)
|
||||||
|
{
|
||||||
|
itr->second->RemoveFromWorld();
|
||||||
delete itr->second;
|
delete itr->second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Unit*
|
Unit*
|
||||||
|
|
|
||||||
|
|
@ -1879,7 +1879,6 @@ void Player::RemoveFromWorld()
|
||||||
if(IsInWorld())
|
if(IsInWorld())
|
||||||
{
|
{
|
||||||
///- Release charmed creatures, unsummon totems and remove pets/guardians
|
///- Release charmed creatures, unsummon totems and remove pets/guardians
|
||||||
Uncharm();
|
|
||||||
UnsummonAllTotems();
|
UnsummonAllTotems();
|
||||||
RemoveMiniPet();
|
RemoveMiniPet();
|
||||||
}
|
}
|
||||||
|
|
@ -3469,6 +3468,10 @@ void Player::_SaveSpellCooldowns()
|
||||||
time_t curTime = time(NULL);
|
time_t curTime = time(NULL);
|
||||||
time_t infTime = curTime + infinityCooldownDelayCheck;
|
time_t infTime = curTime + infinityCooldownDelayCheck;
|
||||||
|
|
||||||
|
/* copied following sql-code partly from achievementmgr */
|
||||||
|
bool first_round = true;
|
||||||
|
std::ostringstream ss;
|
||||||
|
|
||||||
// remove outdated and save active
|
// remove outdated and save active
|
||||||
for(SpellCooldowns::iterator itr = m_spellCooldowns.begin();itr != m_spellCooldowns.end();)
|
for(SpellCooldowns::iterator itr = m_spellCooldowns.begin();itr != m_spellCooldowns.end();)
|
||||||
{
|
{
|
||||||
|
|
@ -3476,12 +3479,24 @@ void Player::_SaveSpellCooldowns()
|
||||||
m_spellCooldowns.erase(itr++);
|
m_spellCooldowns.erase(itr++);
|
||||||
else if(itr->second.end <= infTime) // not save locked cooldowns, it will be reset or set at reload
|
else if(itr->second.end <= infTime) // not save locked cooldowns, it will be reset or set at reload
|
||||||
{
|
{
|
||||||
CharacterDatabase.PExecute("INSERT INTO character_spell_cooldown (guid,spell,item,time) VALUES ('%u', '%u', '%u', '" UI64FMTD "')", GetGUIDLow(), itr->first, itr->second.itemid, uint64(itr->second.end));
|
if (first_round)
|
||||||
|
{
|
||||||
|
ss << "INSERT INTO character_spell_cooldown (guid,spell,item,time) VALUES ";
|
||||||
|
first_round = false;
|
||||||
|
}
|
||||||
|
// next new/changed record prefix
|
||||||
|
else
|
||||||
|
ss << ", ";
|
||||||
|
ss << "(" << GetGUIDLow() << "," << itr->first << "," << itr->second.itemid << "," << uint64(itr->second.end) << ")";
|
||||||
++itr;
|
++itr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
++itr;
|
++itr;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
// if something changed execute
|
||||||
|
if (!first_round)
|
||||||
|
CharacterDatabase.Execute( ss.str().c_str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Player::resetTalentsCost() const
|
uint32 Player::resetTalentsCost() const
|
||||||
|
|
@ -15793,6 +15808,9 @@ void Player::_SaveAuras()
|
||||||
spellEffectPair lastEffectPair = auras.begin()->first;
|
spellEffectPair lastEffectPair = auras.begin()->first;
|
||||||
uint32 stackCounter = 1;
|
uint32 stackCounter = 1;
|
||||||
|
|
||||||
|
/* copied following sql-code partly from achievementmgr */
|
||||||
|
bool first_round = true;
|
||||||
|
std::ostringstream ss;
|
||||||
for(AuraMap::const_iterator itr = auras.begin(); ; ++itr)
|
for(AuraMap::const_iterator itr = auras.begin(); ; ++itr)
|
||||||
{
|
{
|
||||||
if(itr == auras.end() || lastEffectPair != itr->first)
|
if(itr == auras.end() || lastEffectPair != itr->first)
|
||||||
|
|
@ -15805,9 +15823,20 @@ void Player::_SaveAuras()
|
||||||
//do not save single target auras (unless they were cast by the player)
|
//do not save single target auras (unless they were cast by the player)
|
||||||
if (!itr2->second->IsPassive() && (itr2->second->GetCasterGUID() == GetGUID() || !itr2->second->IsSingleTarget()))
|
if (!itr2->second->IsPassive() && (itr2->second->GetCasterGUID() == GetGUID() || !itr2->second->IsSingleTarget()))
|
||||||
{
|
{
|
||||||
CharacterDatabase.PExecute("INSERT INTO character_aura (guid,caster_guid,spell,effect_index,stackcount,amount,maxduration,remaintime,remaincharges) "
|
if (first_round)
|
||||||
"VALUES ('%u', '" UI64FMTD "' ,'%u', '%u', '%u', '%d', '%d', '%d', '%d')",
|
{
|
||||||
GetGUIDLow(), itr2->second->GetCasterGUID(), (uint32)itr2->second->GetId(), (uint32)itr2->second->GetEffIndex(), stackCounter, itr2->second->GetModifier()->m_amount,int(itr2->second->GetAuraMaxDuration()),int(itr2->second->GetAuraDuration()),int(itr2->second->GetAuraCharges()));
|
ss << "INSERT INTO character_aura (guid,caster_guid,spell,effect_index,stackcount,amount,maxduration,remaintime,remaincharges)VALUES ";
|
||||||
|
first_round = false;
|
||||||
|
}
|
||||||
|
// next new/changed record prefix
|
||||||
|
else
|
||||||
|
ss << ", ";
|
||||||
|
|
||||||
|
ss << "("<< GetGUIDLow() << "," << itr2->second->GetCasterGUID() << ","
|
||||||
|
<< (uint32)itr2->second->GetId() << "," << (uint32)itr2->second->GetEffIndex() << ","
|
||||||
|
<< stackCounter << "," << itr2->second->GetModifier()->m_amount << ","
|
||||||
|
<<int(itr2->second->GetAuraMaxDuration()) << "," << int(itr2->second->GetAuraDuration()) << ","
|
||||||
|
<< int(itr2->second->GetAuraCharges()) << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
if(itr == auras.end())
|
if(itr == auras.end())
|
||||||
|
|
@ -15822,6 +15851,10 @@ void Player::_SaveAuras()
|
||||||
stackCounter = 1;
|
stackCounter = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if something changed execute
|
||||||
|
if (!first_round)
|
||||||
|
CharacterDatabase.Execute( ss.str().c_str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::_SaveInventory()
|
void Player::_SaveInventory()
|
||||||
|
|
@ -16446,16 +16479,6 @@ Pet* Player::GetMiniPet()
|
||||||
return GetMap()->GetPet(m_miniPet);
|
return GetMap()->GetPet(m_miniPet);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::Uncharm()
|
|
||||||
{
|
|
||||||
Unit* charm = GetCharm();
|
|
||||||
if(!charm)
|
|
||||||
return;
|
|
||||||
|
|
||||||
charm->RemoveSpellsCausingAura(SPELL_AURA_MOD_CHARM);
|
|
||||||
charm->RemoveSpellsCausingAura(SPELL_AURA_MOD_POSSESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Player::BuildPlayerChat(WorldPacket *data, uint8 msgtype, const std::string& text, uint32 language) const
|
void Player::BuildPlayerChat(WorldPacket *data, uint8 msgtype, const std::string& text, uint32 language) const
|
||||||
{
|
{
|
||||||
*data << (uint8)msgtype;
|
*data << (uint8)msgtype;
|
||||||
|
|
|
||||||
|
|
@ -1124,7 +1124,6 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
void RemoveMiniPet();
|
void RemoveMiniPet();
|
||||||
Pet* GetMiniPet();
|
Pet* GetMiniPet();
|
||||||
void SetMiniPet(Pet* pet) { m_miniPet = pet->GetGUID(); }
|
void SetMiniPet(Pet* pet) { m_miniPet = pet->GetGUID(); }
|
||||||
void Uncharm();
|
|
||||||
uint32 GetPhaseMaskForSpawn() const; // used for proper set phase for DB at GM-mode creature/GO spawn
|
uint32 GetPhaseMaskForSpawn() const; // used for proper set phase for DB at GM-mode creature/GO spawn
|
||||||
|
|
||||||
void Say(const std::string& text, const uint32 language);
|
void Say(const std::string& text, const uint32 language);
|
||||||
|
|
|
||||||
|
|
@ -2476,11 +2476,8 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
|
||||||
m_target->PlayDirectSound(14972, (Player *)m_target);
|
m_target->PlayDirectSound(14972, (Player *)m_target);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
case 10848:
|
|
||||||
case 36978:
|
|
||||||
case 40131:
|
case 40131:
|
||||||
case 27978:
|
case 27978:
|
||||||
case 33900:
|
|
||||||
if (apply)
|
if (apply)
|
||||||
m_target->m_AuraFlags |= UNIT_AURAFLAG_ALIVE_INVISIBLE;
|
m_target->m_AuraFlags |= UNIT_AURAFLAG_ALIVE_INVISIBLE;
|
||||||
else
|
else
|
||||||
|
|
@ -3490,6 +3487,12 @@ void Aura::HandleModCharm(bool apply, bool Real)
|
||||||
|
|
||||||
if( apply )
|
if( apply )
|
||||||
{
|
{
|
||||||
|
if (m_target->GetCharmerGUID())
|
||||||
|
{
|
||||||
|
m_target->RemoveSpellsCausingAura(SPELL_AURA_MOD_CHARM);
|
||||||
|
m_target->RemoveSpellsCausingAura(SPELL_AURA_MOD_POSSESS);
|
||||||
|
}
|
||||||
|
|
||||||
m_target->SetCharmerGUID(GetCasterGUID());
|
m_target->SetCharmerGUID(GetCasterGUID());
|
||||||
m_target->setFaction(caster->getFaction());
|
m_target->setFaction(caster->getFaction());
|
||||||
m_target->CastStop(m_target == caster ? GetId() : 0);
|
m_target->CastStop(m_target == caster ? GetId() : 0);
|
||||||
|
|
|
||||||
|
|
@ -6210,8 +6210,6 @@ void Spell::EffectSelfResurrect(uint32 i)
|
||||||
plr->SetPower(POWER_ENERGY, plr->GetMaxPower(POWER_ENERGY) );
|
plr->SetPower(POWER_ENERGY, plr->GetMaxPower(POWER_ENERGY) );
|
||||||
|
|
||||||
plr->SpawnCorpseBones();
|
plr->SpawnCorpseBones();
|
||||||
|
|
||||||
plr->SaveToDB();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Spell::EffectSkinning(uint32 /*i*/)
|
void Spell::EffectSkinning(uint32 /*i*/)
|
||||||
|
|
|
||||||
|
|
@ -169,10 +169,12 @@ Unit::~Unit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RemoveAllGameObjects();
|
if (m_charmInfo)
|
||||||
RemoveAllDynObjects();
|
delete m_charmInfo;
|
||||||
|
|
||||||
if(m_charmInfo) delete m_charmInfo;
|
// those should be already removed at "RemoveFromWorld()" call
|
||||||
|
assert(m_gameObj.size() == 0);
|
||||||
|
assert(m_dynObjGUIDs.size() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unit::Update( uint32 p_time )
|
void Unit::Update( uint32 p_time )
|
||||||
|
|
@ -7977,7 +7979,7 @@ Pet* Unit::GetPet() const
|
||||||
|
|
||||||
Unit* Unit::GetCharm() const
|
Unit* Unit::GetCharm() const
|
||||||
{
|
{
|
||||||
if(uint64 charm_guid = GetCharmGUID())
|
if (uint64 charm_guid = GetCharmGUID())
|
||||||
{
|
{
|
||||||
if(Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid))
|
if(Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid))
|
||||||
return pet;
|
return pet;
|
||||||
|
|
@ -7989,6 +7991,15 @@ Unit* Unit::GetCharm() const
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Unit::Uncharm()
|
||||||
|
{
|
||||||
|
if (Unit* charm = GetCharm())
|
||||||
|
{
|
||||||
|
charm->RemoveSpellsCausingAura(SPELL_AURA_MOD_CHARM);
|
||||||
|
charm->RemoveSpellsCausingAura(SPELL_AURA_MOD_POSSESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
float Unit::GetCombatDistance( const Unit* target ) const
|
float Unit::GetCombatDistance( const Unit* target ) const
|
||||||
{
|
{
|
||||||
float radius = target->GetFloatValue(UNIT_FIELD_COMBATREACH) + GetFloatValue(UNIT_FIELD_COMBATREACH);
|
float radius = target->GetFloatValue(UNIT_FIELD_COMBATREACH) + GetFloatValue(UNIT_FIELD_COMBATREACH);
|
||||||
|
|
@ -11088,10 +11099,13 @@ void Unit::AddToWorld()
|
||||||
void Unit::RemoveFromWorld()
|
void Unit::RemoveFromWorld()
|
||||||
{
|
{
|
||||||
// cleanup
|
// cleanup
|
||||||
if(IsInWorld())
|
if (IsInWorld())
|
||||||
{
|
{
|
||||||
|
Uncharm();
|
||||||
RemoveNotOwnSingleTargetAuras();
|
RemoveNotOwnSingleTargetAuras();
|
||||||
RemoveGuardians();
|
RemoveGuardians();
|
||||||
|
RemoveAllGameObjects();
|
||||||
|
RemoveAllDynObjects();
|
||||||
}
|
}
|
||||||
|
|
||||||
Object::RemoveFromWorld();
|
Object::RemoveFromWorld();
|
||||||
|
|
@ -11108,8 +11122,6 @@ void Unit::CleanupsBeforeDelete()
|
||||||
DeleteThreatList();
|
DeleteThreatList();
|
||||||
getHostileRefManager().setOnlineOfflineState(false);
|
getHostileRefManager().setOnlineOfflineState(false);
|
||||||
RemoveAllAuras(AURA_REMOVE_BY_DELETE);
|
RemoveAllAuras(AURA_REMOVE_BY_DELETE);
|
||||||
RemoveAllGameObjects();
|
|
||||||
RemoveAllDynObjects();
|
|
||||||
GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
|
GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
|
||||||
}
|
}
|
||||||
WorldObject::CleanupsBeforeDelete();
|
WorldObject::CleanupsBeforeDelete();
|
||||||
|
|
|
||||||
|
|
@ -1194,6 +1194,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
Pet* GetPet() const;
|
Pet* GetPet() const;
|
||||||
Unit* GetCharmer() const;
|
Unit* GetCharmer() const;
|
||||||
Unit* GetCharm() const;
|
Unit* GetCharm() const;
|
||||||
|
void Uncharm();
|
||||||
Unit* GetCharmerOrOwner() const { return GetCharmerGUID() ? GetCharmer() : GetOwner(); }
|
Unit* GetCharmerOrOwner() const { return GetCharmerGUID() ? GetCharmer() : GetOwner(); }
|
||||||
Unit* GetCharmerOrOwnerOrSelf()
|
Unit* GetCharmerOrOwnerOrSelf()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -2053,10 +2053,6 @@ void World::UpdateSessions( uint32 diff )
|
||||||
{
|
{
|
||||||
next = itr;
|
next = itr;
|
||||||
++next;
|
++next;
|
||||||
|
|
||||||
if(!itr->second)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
///- and remove not active sessions from the list
|
///- and remove not active sessions from the list
|
||||||
if(!itr->second->Update(diff)) // As interval = 0
|
if(!itr->second->Update(diff)) // As interval = 0
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -379,15 +379,15 @@ bool AuthSocket::_HandleLogonChallenge()
|
||||||
|
|
||||||
///- Verify that this IP is not in the ip_banned table
|
///- Verify that this IP is not in the ip_banned table
|
||||||
// No SQL injection possible (paste the IP address as passed by the socket)
|
// No SQL injection possible (paste the IP address as passed by the socket)
|
||||||
loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
|
|
||||||
|
|
||||||
std::string address = GetRemoteAddress();
|
std::string address = GetRemoteAddress();
|
||||||
loginDatabase.escape_string(address);
|
loginDatabase.escape_string(address);
|
||||||
QueryResult *result = loginDatabase.PQuery( "SELECT * FROM ip_banned WHERE ip = '%s'",address.c_str());
|
QueryResult *result = loginDatabase.PQuery("SELECT unbandate FROM ip_banned WHERE "
|
||||||
if(result)
|
// permanent still banned
|
||||||
|
"(unbandate = bandate OR unbandate > UNIX_TIMESTAMP()) AND ip = '%s'", address.c_str());
|
||||||
|
if (result)
|
||||||
{
|
{
|
||||||
pkt << (uint8)REALM_AUTH_ACCOUNT_BANNED;
|
pkt << (uint8)REALM_AUTH_ACCOUNT_BANNED;
|
||||||
sLog.outBasic("[AuthChallenge] Banned ip %s tries to login!",GetRemoteAddress().c_str ());
|
sLog.outBasic("[AuthChallenge] Banned ip %s tries to login!", GetRemoteAddress().c_str());
|
||||||
delete result;
|
delete result;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -422,13 +422,12 @@ bool AuthSocket::_HandleLogonChallenge()
|
||||||
|
|
||||||
if (!locked)
|
if (!locked)
|
||||||
{
|
{
|
||||||
//set expired bans to inactive
|
|
||||||
loginDatabase.Execute("UPDATE account_banned SET active = 0 WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
|
|
||||||
///- If the account is banned, reject the logon attempt
|
///- If the account is banned, reject the logon attempt
|
||||||
QueryResult *banresult = loginDatabase.PQuery("SELECT bandate,unbandate FROM account_banned WHERE id = %u AND active = 1", (*result)[1].GetUInt32());
|
QueryResult *banresult = loginDatabase.PQuery("SELECT bandate,unbandate FROM account_banned WHERE "
|
||||||
|
"id = %u AND active = 1 AND (unbandate > UNIX_TIMESTAMP() OR unbandate = bandate)", (*result)[1].GetUInt32());
|
||||||
if(banresult)
|
if(banresult)
|
||||||
{
|
{
|
||||||
if((*banresult)[0].GetUInt64() == (*banresult)[1].GetUInt64())
|
if((*banresult)[0].GetUInt64() != (*banresult)[1].GetUInt64())
|
||||||
{
|
{
|
||||||
pkt << (uint8) REALM_AUTH_ACCOUNT_BANNED;
|
pkt << (uint8) REALM_AUTH_ACCOUNT_BANNED;
|
||||||
sLog.outBasic("[AuthChallenge] Banned account %s tries to login!",_login.c_str ());
|
sLog.outBasic("[AuthChallenge] Banned account %s tries to login!",_login.c_str ());
|
||||||
|
|
|
||||||
|
|
@ -209,6 +209,11 @@ extern int main(int argc, char **argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cleanup query
|
||||||
|
//set expired bans to inactive
|
||||||
|
loginDatabase.Execute("UPDATE account_banned SET active = 0 WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
|
||||||
|
loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
|
||||||
|
|
||||||
h.Add(&authListenSocket);
|
h.Add(&authListenSocket);
|
||||||
|
|
||||||
///- Catch termination signals
|
///- Catch termination signals
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8812"
|
#define REVISION_NR "8823"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef __REVISION_SQL_H__
|
#ifndef __REVISION_SQL_H__
|
||||||
#define __REVISION_SQL_H__
|
#define __REVISION_SQL_H__
|
||||||
#define REVISION_DB_CHARACTERS "required_8721_01_characters_guild"
|
#define REVISION_DB_CHARACTERS "required_8721_01_characters_guild"
|
||||||
#define REVISION_DB_MANGOS "required_8803_02_mangos_playercreateinfo_action"
|
#define REVISION_DB_MANGOS "required_8818_01_mangos_mangos_string"
|
||||||
#define REVISION_DB_REALMD "required_8728_01_realmd_account"
|
#define REVISION_DB_REALMD "required_8728_01_realmd_account"
|
||||||
#endif // __REVISION_SQL_H__
|
#endif // __REVISION_SQL_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue