Files
TCPlayerbotCore/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
T

1493 lines
73 KiB
C++
Raw Normal View History

/*
2011-01-01 15:01:13 +01:00
* Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
2008-10-02 16:23:55 -05:00
*/
2009-10-17 15:51:44 -07:00
2009-06-04 21:41:07 +02:00
#include "ObjectMgr.h"
2010-06-08 13:05:47 -06:00
#include "WorldPacket.h"
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
#include "Battleground.h"
#include "BattlegroundAV.h"
2010-06-07 12:08:15 -06:00
#include "Miscellaneous/Formulas.h"
#include "GameObject.h"
2010-06-07 12:08:15 -06:00
#include "Miscellaneous/Language.h"
2009-06-04 21:41:07 +02:00
#include "Player.h"
#include "SpellAuras.h"
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
BattlegroundAV::BattlegroundAV()
2008-10-02 16:23:55 -05:00
{
m_BgObjects.resize(BG_AV_OBJECT_MAX);
m_BgCreatures.resize(AV_CPLACE_MAX+AV_STATICCPLACE_MAX);
2009-10-17 15:51:44 -07:00
2009-08-03 21:48:22 +02:00
m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_AV_START_TWO_MINUTES;
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_FOURTH] = LANG_BG_AV_HAS_BEGUN;
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
BattlegroundAV::~BattlegroundAV()
2008-10-02 16:23:55 -05:00
{
}
2009-10-17 15:51:44 -07:00
2010-08-30 15:25:15 +02:00
uint16 BattlegroundAV::GetBonusHonor(uint8 kills) //TODO: move this function to Battleground.cpp (needs to find a way to get m_MaxLevel)
{
return Trinity::Honor::hk_honor_at_level(m_MaxLevel, kills);
}
2009-10-17 15:51:44 -07:00
2011-06-12 01:47:45 +02:00
void BattlegroundAV::HandleKillPlayer(Player* player, Player* killer)
{
2010-04-07 19:14:10 +02:00
if (GetStatus() != STATUS_IN_PROGRESS)
return;
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
Battleground::HandleKillPlayer(player, killer);
2011-04-29 20:47:02 +02:00
UpdateScore(player->GetTeam(), -1);
}
2009-10-17 15:51:44 -07:00
2011-06-12 01:47:45 +02:00
void BattlegroundAV::HandleKillUnit(Creature* unit, Player* killer)
{
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "bg_av HandleKillUnit %i", unit->GetEntry());
2010-04-07 19:14:10 +02:00
if (GetStatus() != STATUS_IN_PROGRESS)
return;
uint32 entry = unit->GetEntry();
/*
uint32 triggerSpawnID = 0;
if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN][0])
triggerSpawnID = AV_CPLACE_TRIGGER16;
else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_BOSS][0])
triggerSpawnID = AV_CPLACE_TRIGGER17;
else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN][0])
triggerSpawnID = AV_CPLACE_TRIGGER18;
else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_BOSS][0])
triggerSpawnID = AV_CPLACE_TRIGGER19;
*/
2010-04-07 19:14:10 +02:00
if (entry == BG_AV_CreatureInfo[AV_NPC_A_BOSS][0])
{
2011-04-29 20:47:02 +02:00
CastSpellOnTeam(23658, HORDE); //this is a spell which finishes a quest where a player has to kill the boss
RewardReputationToTeam(729, BG_AV_REP_BOSS, HORDE);
RewardHonorToTeam(GetBonusHonor(BG_AV_KILL_BOSS), HORDE);
2010-08-08 04:37:24 +02:00
EndBattleground(HORDE);
DelCreature(AV_CPLACE_TRIGGER17);
}
2010-04-07 22:59:46 +02:00
else if (entry == BG_AV_CreatureInfo[AV_NPC_H_BOSS][0])
{
2011-04-29 20:47:02 +02:00
CastSpellOnTeam(23658, ALLIANCE); //this is a spell which finishes a quest where a player has to kill the boss
RewardReputationToTeam(730, BG_AV_REP_BOSS, ALLIANCE);
RewardHonorToTeam(GetBonusHonor(BG_AV_KILL_BOSS), ALLIANCE);
2010-08-08 04:37:24 +02:00
EndBattleground(ALLIANCE);
DelCreature(AV_CPLACE_TRIGGER19);
}
2010-04-07 19:14:10 +02:00
else if (entry == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN][0])
{
2010-04-07 19:14:10 +02:00
if (!m_CaptainAlive[0])
{
sLog->outError("Killed a Captain twice, please report this bug, if you haven't done \".respawn\"");
return;
}
m_CaptainAlive[0]=false;
2011-04-29 20:47:02 +02:00
RewardReputationToTeam(729, BG_AV_REP_CAPTAIN, HORDE);
RewardHonorToTeam(GetBonusHonor(BG_AV_KILL_CAPTAIN), HORDE);
UpdateScore(ALLIANCE, (-1)*BG_AV_RES_CAPTAIN);
//spawn destroyed aura
2010-04-07 23:56:35 +02:00
for (uint8 i=0; i <= 9; i++)
2011-04-29 20:47:02 +02:00
SpawnBGObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE+i, RESPAWN_IMMEDIATELY);
Creature* creature = GetBGCreature(AV_CPLACE_HERALD);
2010-04-07 19:14:10 +02:00
if (creature)
2011-04-29 20:47:02 +02:00
YellToAll(creature, GetTrinityString(LANG_BG_AV_A_CAPTAIN_DEAD), LANG_UNIVERSAL);
DelCreature(AV_CPLACE_TRIGGER16);
}
2010-04-07 22:59:46 +02:00
else if (entry == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN][0])
{
2010-04-07 19:14:10 +02:00
if (!m_CaptainAlive[1])
{
sLog->outError("Killed a Captain twice, please report this bug, if you haven't done \".respawn\"");
return;
}
m_CaptainAlive[1]=false;
2011-04-29 20:47:02 +02:00
RewardReputationToTeam(730, BG_AV_REP_CAPTAIN, ALLIANCE);
RewardHonorToTeam(GetBonusHonor(BG_AV_KILL_CAPTAIN), ALLIANCE);
UpdateScore(HORDE, (-1)*BG_AV_RES_CAPTAIN);
//spawn destroyed aura
2010-04-07 23:56:35 +02:00
for (uint8 i=0; i <= 9; i++)
2011-04-29 20:47:02 +02:00
SpawnBGObject(BG_AV_OBJECT_BURN_BUILDING_HORDE+i, RESPAWN_IMMEDIATELY);
Creature* creature = GetBGCreature(AV_CPLACE_HERALD);
2010-04-07 19:14:10 +02:00
if (creature)
2011-04-29 20:47:02 +02:00
YellToAll(creature, GetTrinityString(LANG_BG_AV_H_CAPTAIN_DEAD), LANG_UNIVERSAL);
DelCreature(AV_CPLACE_TRIGGER18);
}
2010-04-07 22:59:46 +02:00
else if (entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_N_4][0] || entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_A_4][0] || entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_H_4][0])
2011-04-29 20:47:02 +02:00
ChangeMineOwner(AV_NORTH_MINE, killer->GetTeam());
2010-04-07 22:59:46 +02:00
else if (entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_N_4][0] || entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_A_4][0] || entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_H_4][0])
2011-04-29 20:47:02 +02:00
ChangeMineOwner(AV_SOUTH_MINE, killer->GetTeam());
}
2009-10-17 15:51:44 -07:00
2011-06-12 01:47:45 +02:00
void BattlegroundAV::HandleQuestComplete(uint32 questid, Player* player)
{
if (GetStatus() != STATUS_IN_PROGRESS)
return;//maybe we should log this, cause this must be a cheater or a big bug
uint8 team = GetTeamIndexByTeamId(player->GetTeam());
//TODO add reputation, events (including quest not available anymore, next quest availabe, go/npc de/spawning)and maybe honor
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed", questid);
switch(questid)
{
case AV_QUEST_A_SCRAPS1:
case AV_QUEST_A_SCRAPS2:
case AV_QUEST_H_SCRAPS1:
case AV_QUEST_H_SCRAPS2:
m_Team_QuestStatus[team][0]+=20;
2011-04-29 20:47:02 +02:00
if (m_Team_QuestStatus[team][0] == 500 || m_Team_QuestStatus[team][0] == 1000 || m_Team_QuestStatus[team][0] == 1500) //25, 50, 75 turn ins
{
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed starting with unit upgrading..", questid);
for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i)
if (m_Nodes[i].Owner == player->GetTeam() && m_Nodes[i].State == POINT_CONTROLED)
{
DePopulateNode(i);
PopulateNode(i);
//maybe this is bad, because it will instantly respawn all creatures on every grave..
}
}
break;
case AV_QUEST_A_COMMANDER1:
case AV_QUEST_H_COMMANDER1:
m_Team_QuestStatus[team][1]++;
2011-04-29 20:47:02 +02:00
RewardReputationToTeam(team, 1, player->GetTeam());
2010-04-07 19:14:10 +02:00
if (m_Team_QuestStatus[team][1] == 30)
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed (need to implement some events here", questid);
break;
case AV_QUEST_A_COMMANDER2:
case AV_QUEST_H_COMMANDER2:
m_Team_QuestStatus[team][2]++;
2011-04-29 20:47:02 +02:00
RewardReputationToTeam(team, 1, player->GetTeam());
2010-04-07 19:14:10 +02:00
if (m_Team_QuestStatus[team][2] == 60)
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed (need to implement some events here", questid);
break;
case AV_QUEST_A_COMMANDER3:
case AV_QUEST_H_COMMANDER3:
m_Team_QuestStatus[team][3]++;
2011-04-29 20:47:02 +02:00
RewardReputationToTeam(team, 1, player->GetTeam());
2010-04-07 19:14:10 +02:00
if (m_Team_QuestStatus[team][1] == 120)
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed (need to implement some events here", questid);
break;
case AV_QUEST_A_BOSS1:
case AV_QUEST_H_BOSS1:
m_Team_QuestStatus[team][4] += 9; //you can turn in 10 or 1 item..
case AV_QUEST_A_BOSS2:
case AV_QUEST_H_BOSS2:
m_Team_QuestStatus[team][4]++;
2010-04-07 19:14:10 +02:00
if (m_Team_QuestStatus[team][4] >= 200)
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed (need to implement some events here", questid);
break;
case AV_QUEST_A_NEAR_MINE:
case AV_QUEST_H_NEAR_MINE:
m_Team_QuestStatus[team][5]++;
2010-04-07 19:14:10 +02:00
if (m_Team_QuestStatus[team][5] == 28)
{
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed (need to implement some events here", questid);
2010-04-07 19:14:10 +02:00
if (m_Team_QuestStatus[team][6] == 7)
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed (need to implement some events here - ground assault ready", questid);
}
break;
case AV_QUEST_A_OTHER_MINE:
case AV_QUEST_H_OTHER_MINE:
m_Team_QuestStatus[team][6]++;
2010-04-07 19:14:10 +02:00
if (m_Team_QuestStatus[team][6] == 7)
{
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed (need to implement some events here", questid);
2010-04-07 19:14:10 +02:00
if (m_Team_QuestStatus[team][5] == 20)
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed (need to implement some events here - ground assault ready", questid);
}
break;
case AV_QUEST_A_RIDER_HIDE:
case AV_QUEST_H_RIDER_HIDE:
m_Team_QuestStatus[team][7]++;
2010-04-07 19:14:10 +02:00
if (m_Team_QuestStatus[team][7] == 25)
{
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed (need to implement some events here", questid);
2010-04-07 19:14:10 +02:00
if (m_Team_QuestStatus[team][8] == 25)
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed (need to implement some events here - rider assault ready", questid);
}
break;
case AV_QUEST_A_RIDER_TAME:
case AV_QUEST_H_RIDER_TAME:
m_Team_QuestStatus[team][8]++;
2010-04-07 19:14:10 +02:00
if (m_Team_QuestStatus[team][8] == 25)
{
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed (need to implement some events here", questid);
2010-04-07 19:14:10 +02:00
if (m_Team_QuestStatus[team][7] == 25)
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed (need to implement some events here - rider assault ready", questid);
}
break;
default:
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV Quest %i completed but is not interesting at all", questid);
return; //was no interesting quest at all
break;
}
}
2010-08-08 04:37:24 +02:00
void BattlegroundAV::UpdateScore(uint16 team, int16 points)
{ //note: to remove reinforcementpoints points must be negative, for adding reinforcements points must be positive
ASSERT(team == ALLIANCE || team == HORDE);
uint8 teamindex = GetTeamIndexByTeamId(team); //0=ally 1=horde
m_Team_Scores[teamindex] += points;
2009-10-17 15:51:44 -07:00
2010-04-07 23:25:02 +02:00
UpdateWorldState(((teamindex == BG_TEAM_HORDE)?AV_Horde_Score:AV_Alliance_Score), m_Team_Scores[teamindex]);
2010-04-07 22:59:46 +02:00
if (points < 0)
{
2010-04-07 22:59:46 +02:00
if (m_Team_Scores[teamindex] < 1)
{
m_Team_Scores[teamindex]=0;
2010-08-08 04:37:24 +02:00
EndBattleground(((teamindex == BG_TEAM_HORDE)?ALLIANCE:HORDE));
}
2010-04-07 19:14:10 +02:00
else if (!m_IsInformedNearVictory[teamindex] && m_Team_Scores[teamindex] < SEND_MSG_NEAR_LOSE)
{
2010-04-07 23:25:02 +02:00
SendMessageToAll(teamindex == BG_TEAM_HORDE?LANG_BG_AV_H_NEAR_LOSE:LANG_BG_AV_A_NEAR_LOSE, teamindex == BG_TEAM_HORDE ? CHAT_MSG_BG_SYSTEM_HORDE : CHAT_MSG_BG_SYSTEM_ALLIANCE);
PlaySoundToAll(AV_SOUND_NEAR_VICTORY);
m_IsInformedNearVictory[teamindex] = true;
}
}
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
Creature* BattlegroundAV::AddAVCreature(uint16 cinfoid, uint16 type)
{
uint8 level;
bool isStatic = false;
Creature* creature = NULL;
ASSERT(type <= AV_CPLACE_MAX + AV_STATICCPLACE_MAX);
if (type >= AV_CPLACE_MAX) //static
{
type -= AV_CPLACE_MAX;
cinfoid=uint16(BG_AV_StaticCreaturePos[type][4]);
2011-04-29 20:47:02 +02:00
creature = AddCreature(BG_AV_StaticCreatureInfo[cinfoid][0], (type+AV_CPLACE_MAX), BG_AV_StaticCreatureInfo[cinfoid][1], BG_AV_StaticCreaturePos[type][0], BG_AV_StaticCreaturePos[type][1], BG_AV_StaticCreaturePos[type][2], BG_AV_StaticCreaturePos[type][3]);
level = (BG_AV_StaticCreatureInfo[cinfoid][2] == BG_AV_StaticCreatureInfo[cinfoid][3]) ? BG_AV_StaticCreatureInfo[cinfoid][2] : urand(BG_AV_StaticCreatureInfo[cinfoid][2], BG_AV_StaticCreatureInfo[cinfoid][3]);
isStatic = true;
}
else
{
2011-04-29 20:47:02 +02:00
creature = AddCreature(BG_AV_CreatureInfo[cinfoid][0], type, BG_AV_CreatureInfo[cinfoid][1], BG_AV_CreaturePos[type][0], BG_AV_CreaturePos[type][1], BG_AV_CreaturePos[type][2], BG_AV_CreaturePos[type][3]);
level = (BG_AV_CreatureInfo[cinfoid][2] == BG_AV_CreatureInfo[cinfoid][3]) ? BG_AV_CreatureInfo[cinfoid][2] : urand(BG_AV_CreatureInfo[cinfoid][2], BG_AV_CreatureInfo[cinfoid][3]);
}
if (!creature)
return NULL;
if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN][0] || creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN][0])
creature->SetRespawnDelay(RESPAWN_ONE_DAY); // TODO: look if this can be done by database + also add this for the wingcommanders
2009-10-17 15:51:44 -07:00
2010-04-07 23:56:35 +02:00
if ((isStatic && cinfoid >= 10 && cinfoid <= 14) || (!isStatic && ((cinfoid >= AV_NPC_A_GRAVEDEFENSE0 && cinfoid <= AV_NPC_A_GRAVEDEFENSE3) ||
(cinfoid >= AV_NPC_H_GRAVEDEFENSE0 && cinfoid <= AV_NPC_H_GRAVEDEFENSE3))))
{
2010-04-07 23:56:35 +02:00
if (!isStatic && ((cinfoid >= AV_NPC_A_GRAVEDEFENSE0 && cinfoid <= AV_NPC_A_GRAVEDEFENSE3)
|| (cinfoid >= AV_NPC_H_GRAVEDEFENSE0 && cinfoid <= AV_NPC_H_GRAVEDEFENSE3)))
{
CreatureData &data = sObjectMgr->NewOrExistCreatureData(creature->GetDBTableGUIDLow());
data.spawndist = 5;
}
//else spawndist will be 15, so creatures move maximum=10
//creature->SetDefaultMovementType(RANDOM_MOTION_TYPE);
creature->GetMotionMaster()->Initialize();
creature->setDeathState(JUST_DIED);
creature->Respawn();
//TODO: find a way to add a motionmaster without killing the creature (i
//just copied this code from a gm-command
}
2009-10-17 15:51:44 -07:00
if (level != 0)
level += m_MaxLevel - 60; //maybe we can do this more generic for custom level-range.. actually it's blizzlike
creature->SetLevel(level);
uint32 triggerSpawnID = 0;
uint32 newFaction = 0;
if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN][0])
{
triggerSpawnID = AV_CPLACE_TRIGGER16;
newFaction = 84;
}
else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_BOSS][0])
{
triggerSpawnID = AV_CPLACE_TRIGGER17;
newFaction = 84;
}
else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN][0])
{
triggerSpawnID = AV_CPLACE_TRIGGER18;
newFaction = 83;
}
else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_BOSS][0])
{
triggerSpawnID = AV_CPLACE_TRIGGER19;
newFaction = 83;
}
if (triggerSpawnID && newFaction)
{
2011-04-29 20:47:02 +02:00
if (Creature* trigger = AddCreature(WORLD_TRIGGER, triggerSpawnID, BG_AV_CreatureInfo[creature->GetEntry()][1], BG_AV_CreaturePos[triggerSpawnID][0], BG_AV_CreaturePos[triggerSpawnID][1], BG_AV_CreaturePos[triggerSpawnID][2], BG_AV_CreaturePos[triggerSpawnID][3]))
{
trigger->setFaction(newFaction);
trigger->CastSpell(trigger, SPELL_HONORABLE_DEFENDER_25Y, false);
}
}
return creature;
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::Update(uint32 diff)
2008-10-02 16:23:55 -05:00
{
2010-08-08 04:37:24 +02:00
Battleground::Update(diff);
2009-10-17 15:51:44 -07:00
2010-04-07 19:14:10 +02:00
if (GetStatus() == STATUS_IN_PROGRESS)
{
2010-04-07 23:56:35 +02:00
for (uint8 i=0; i <= 1; i++)//0=alliance, 1=horde
{
2010-04-07 19:14:10 +02:00
if (!m_CaptainAlive[i])
continue;
2010-04-07 19:14:10 +02:00
if (m_CaptainBuffTimer[i] > diff)
m_CaptainBuffTimer[i] -= diff;
else
{
2010-04-07 23:25:02 +02:00
if (i == 0)
{
2011-04-29 20:47:02 +02:00
CastSpellOnTeam(AV_BUFF_A_CAPTAIN, ALLIANCE);
Creature* creature = GetBGCreature(AV_CPLACE_MAX + 61);
2010-04-07 19:14:10 +02:00
if (creature)
2011-04-29 20:47:02 +02:00
YellToAll(creature, LANG_BG_AV_A_CAPTAIN_BUFF, LANG_COMMON);
}
else
{
2011-04-29 20:47:02 +02:00
CastSpellOnTeam(AV_BUFF_H_CAPTAIN, HORDE);
Creature* creature = GetBGCreature(AV_CPLACE_MAX + 59); //TODO: make the captains a dynamic creature
2010-04-07 19:14:10 +02:00
if (creature)
2011-04-29 20:47:02 +02:00
YellToAll(creature, LANG_BG_AV_H_CAPTAIN_BUFF, LANG_ORCISH);
}
2011-04-29 20:47:02 +02:00
m_CaptainBuffTimer[i] = 120000 + urand(0, 4)* 60000; //as far as i could see, the buff is randomly so i make 2minutes (thats the duration of the buff itself) + 0-4minutes TODO get the right times
}
}
//add points from mine owning, and look if he neutral team wanrts to reclaim the mine
m_Mine_Timer -=diff;
2009-10-17 16:20:24 -07:00
for (uint8 mine=0; mine <2; mine++)
{
2010-04-07 19:14:10 +02:00
if (m_Mine_Owner[mine] == ALLIANCE || m_Mine_Owner[mine] == HORDE)
{
2010-04-07 22:59:46 +02:00
if (m_Mine_Timer <= 0)
2011-04-29 20:47:02 +02:00
UpdateScore(m_Mine_Owner[mine], 1);
2009-10-17 15:51:44 -07:00
2010-04-07 19:14:10 +02:00
if (m_Mine_Reclaim_Timer[mine] > diff)
m_Mine_Reclaim_Timer[mine] -= diff;
else{ //we don't need to set this timer to 0 cause this codepart wont get called when this thing is 0
2011-04-29 20:47:02 +02:00
ChangeMineOwner(mine, AV_NEUTRAL_TEAM);
}
}
}
2010-04-07 22:59:46 +02:00
if (m_Mine_Timer <= 0)
m_Mine_Timer=AV_MINE_TICK_TIMER; //this is at the end, cause we need to update both mines
2009-10-17 15:51:44 -07:00
//looks for all timers of the nodes and destroy the building (for graveyards the building wont get destroyed, it goes just to the other team
2009-10-17 16:20:24 -07:00
for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i)
2010-04-07 19:14:10 +02:00
if (m_Nodes[i].State == POINT_ASSAULTED) //maybe remove this
{
2010-04-07 19:14:10 +02:00
if (m_Nodes[i].Timer > diff)
m_Nodes[i].Timer -= diff;
else
2010-04-07 22:59:46 +02:00
EventPlayerDestroyedPoint(i);
}
}
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::StartingEventCloseDoors()
{
2009-08-03 21:48:22 +02:00
DoorClose(BG_AV_OBJECT_DOOR_A);
DoorClose(BG_AV_OBJECT_DOOR_H);
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::StartingEventOpenDoors()
{
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV: start spawning mine stuff");
2010-04-07 23:56:35 +02:00
for (uint16 i= BG_AV_OBJECT_MINE_SUPPLY_N_MIN; i <= BG_AV_OBJECT_MINE_SUPPLY_N_MAX; i++)
2011-04-29 20:47:02 +02:00
SpawnBGObject(i, RESPAWN_IMMEDIATELY);
2010-04-07 23:56:35 +02:00
for (uint16 i= BG_AV_OBJECT_MINE_SUPPLY_S_MIN; i <= BG_AV_OBJECT_MINE_SUPPLY_S_MAX; i++)
2011-04-29 20:47:02 +02:00
SpawnBGObject(i, RESPAWN_IMMEDIATELY);
2009-10-17 16:20:24 -07:00
for (uint8 mine = AV_NORTH_MINE; mine <= AV_SOUTH_MINE; mine++) //mine population
2011-04-29 20:47:02 +02:00
ChangeMineOwner(mine, AV_NEUTRAL_TEAM, true);
2009-10-17 15:51:44 -07:00
2009-08-03 21:48:22 +02:00
UpdateWorldState(AV_SHOW_H_SCORE, 1);
UpdateWorldState(AV_SHOW_A_SCORE, 1);
2009-10-17 15:51:44 -07:00
2009-08-03 21:48:22 +02:00
DoorOpen(BG_AV_OBJECT_DOOR_H);
DoorOpen(BG_AV_OBJECT_DOOR_A);
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::AddPlayer(Player *plr)
2008-10-02 16:23:55 -05:00
{
2010-08-08 04:37:24 +02:00
Battleground::AddPlayer(plr);
2008-10-02 16:23:55 -05:00
//create score and add it to map, default values are set in constructor
2010-08-08 04:37:24 +02:00
BattlegroundAVScore* sc = new BattlegroundAVScore;
2008-10-02 16:23:55 -05:00
m_PlayerScores[plr->GetGUID()] = sc;
2010-04-07 23:25:02 +02:00
if (m_MaxLevel == 0)
m_MaxLevel=(plr->getLevel()%10 == 0)? plr->getLevel() : (plr->getLevel()-(plr->getLevel()%10))+10; //TODO: just look at the code \^_^/ --but queue-info should provide this information..
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::EndBattleground(uint32 winner)
2008-10-02 16:23:55 -05:00
{
//calculate bonuskills for both teams:
//first towers:
2011-04-29 20:47:02 +02:00
uint8 kills[2]={0, 0}; //0=ally 1=horde
uint8 rep[2]={0, 0}; //0=ally 1=horde
2009-10-17 16:20:24 -07:00
for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i)
{
2010-04-07 19:14:10 +02:00
if (m_Nodes[i].State == POINT_CONTROLED)
{
2010-04-07 19:14:10 +02:00
if (m_Nodes[i].Owner == ALLIANCE)
{
rep[0] += BG_AV_REP_SURVIVING_TOWER;
kills[0] += BG_AV_KILL_SURVIVING_TOWER;
}
else
{
rep[0] += BG_AV_KILL_SURVIVING_TOWER;
kills[1] += BG_AV_KILL_SURVIVING_TOWER;
}
}
}
2009-10-17 15:51:44 -07:00
2010-04-07 23:56:35 +02:00
for (int i=0; i <= 1; i++) //0=ally 1=horde
{
2010-04-07 19:14:10 +02:00
if (m_CaptainAlive[i])
{
kills[i] += BG_AV_KILL_SURVIVING_CAPTAIN;
rep[i] += BG_AV_REP_SURVIVING_CAPTAIN;
}
2010-04-07 19:14:10 +02:00
if (rep[i] != 0)
2011-04-29 20:47:02 +02:00
RewardReputationToTeam((i == 0)?730:729, rep[i], (i == 0)?ALLIANCE:HORDE);
2010-04-07 19:14:10 +02:00
if (kills[i] != 0)
2011-04-29 20:47:02 +02:00
RewardHonorToTeam(GetBonusHonor(kills[i]), (i == 0)?ALLIANCE:HORDE);
}
2009-10-17 15:51:44 -07:00
//TODO add enterevademode for all attacking creatures
2010-08-08 04:37:24 +02:00
Battleground::EndBattleground(winner);
}
2009-10-17 15:51:44 -07:00
void BattlegroundAV::RemovePlayer(Player* plr, uint64 /*guid*/, uint32 /*team*/)
{
2010-04-07 19:14:10 +02:00
if (!plr)
{
sLog->outError("bg_AV no player at remove");
return;
}
//TODO search more buffs
plr->RemoveAurasDueToSpell(AV_BUFF_ARMOR);
plr->RemoveAurasDueToSpell(AV_BUFF_A_CAPTAIN);
plr->RemoveAurasDueToSpell(AV_BUFF_H_CAPTAIN);
2008-10-02 16:23:55 -05:00
}
2010-08-08 04:37:24 +02:00
void BattlegroundAV::HandleAreaTrigger(Player *Source, uint32 Trigger)
2008-10-02 16:23:55 -05:00
{
// this is wrong way to implement these things. On official it done by gameobject spell cast.
if (GetStatus() != STATUS_IN_PROGRESS)
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
uint32 SpellId = 0;
switch(Trigger)
{
case 95:
case 2608:
2010-04-07 19:14:10 +02:00
if (Source->GetTeam() != ALLIANCE)
Source->GetSession()->SendAreaTriggerMessage("Only The Alliance can use that portal");
else
Source->LeaveBattleground();
break;
case 2606:
2010-04-07 19:14:10 +02:00
if (Source->GetTeam() != HORDE)
Source->GetSession()->SendAreaTriggerMessage("Only The Horde can use that portal");
else
Source->LeaveBattleground();
break;
2008-10-02 16:23:55 -05:00
case 3326:
case 3327:
case 3328:
case 3329:
case 3330:
case 3331:
2009-02-09 08:16:34 -05:00
//Source->Unmount();
2008-10-02 16:23:55 -05:00
break;
default:
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "WARNING: Unhandled AreaTrigger in Battleground: %u", Trigger);
// Source->GetSession()->SendAreaTriggerMessage("Warning: Unhandled AreaTrigger in Battleground: %u", Trigger);
2008-10-02 16:23:55 -05:00
break;
}
2009-10-17 15:51:44 -07:00
if (SpellId)
2008-10-02 16:23:55 -05:00
Source->CastSpell(Source, SpellId, true);
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor)
2008-10-02 16:23:55 -05:00
{
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
BattlegroundScoreMap::iterator itr = m_PlayerScores.find(Source->GetGUID());
2010-04-07 19:14:10 +02:00
if (itr == m_PlayerScores.end()) // player not found...
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
switch(type)
{
case SCORE_GRAVEYARDS_ASSAULTED:
2010-08-08 04:37:24 +02:00
((BattlegroundAVScore*)itr->second)->GraveyardsAssaulted += value;
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_GRAVEYARD);
2008-10-02 16:23:55 -05:00
break;
case SCORE_GRAVEYARDS_DEFENDED:
2010-08-08 04:37:24 +02:00
((BattlegroundAVScore*)itr->second)->GraveyardsDefended += value;
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_GRAVEYARD);
2008-10-02 16:23:55 -05:00
break;
case SCORE_TOWERS_ASSAULTED:
2010-08-08 04:37:24 +02:00
((BattlegroundAVScore*)itr->second)->TowersAssaulted += value;
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_TOWER);
2008-10-02 16:23:55 -05:00
break;
case SCORE_TOWERS_DEFENDED:
2010-08-08 04:37:24 +02:00
((BattlegroundAVScore*)itr->second)->TowersDefended += value;
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_TOWER);
2008-10-02 16:23:55 -05:00
break;
case SCORE_MINES_CAPTURED:
2010-08-08 04:37:24 +02:00
((BattlegroundAVScore*)itr->second)->MinesCaptured += value;
2008-10-02 16:23:55 -05:00
break;
case SCORE_LEADERS_KILLED:
2010-08-08 04:37:24 +02:00
((BattlegroundAVScore*)itr->second)->LeadersKilled += value;
2008-10-02 16:23:55 -05:00
break;
case SCORE_SECONDARY_OBJECTIVES:
2010-08-08 04:37:24 +02:00
((BattlegroundAVScore*)itr->second)->SecondaryObjectives += value;
2008-10-02 16:23:55 -05:00
break;
default:
2011-04-29 20:47:02 +02:00
Battleground::UpdatePlayerScore(Source, type, value, doAddHonor);
2008-10-02 16:23:55 -05:00
break;
}
}
2010-08-08 04:37:24 +02:00
void BattlegroundAV::EventPlayerDestroyedPoint(BG_AV_Nodes node)
{
2009-10-17 15:51:44 -07:00
uint32 object = GetObjectThroughNode(node);
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "bg_av: player destroyed point node %i object %i", node, object);
2009-10-17 15:51:44 -07:00
//despawn banner
SpawnBGObject(object, RESPAWN_ONE_DAY);
DestroyNode(node);
UpdateNodeWorldState(node);
2009-10-17 15:51:44 -07:00
uint32 owner = m_Nodes[node].Owner;
2010-04-07 22:59:46 +02:00
if (IsTower(node))
{
uint8 tmp = node-BG_AV_NODES_DUNBALDAR_SOUTH;
//despawn marshal
2010-04-07 19:14:10 +02:00
if (m_BgCreatures[AV_CPLACE_A_MARSHAL_SOUTH + tmp])
DelCreature(AV_CPLACE_A_MARSHAL_SOUTH + tmp);
else
2011-04-29 20:47:02 +02:00
sLog->outError("BG_AV: playerdestroyedpoint: marshal %i doesn't exist", AV_CPLACE_A_MARSHAL_SOUTH + tmp);
//spawn destroyed aura
2010-04-07 23:56:35 +02:00
for (uint8 i=0; i <= 9; i++)
2011-04-29 20:47:02 +02:00
SpawnBGObject(BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH + i + (tmp * 10), RESPAWN_IMMEDIATELY);
2009-10-17 15:51:44 -07:00
UpdateScore((owner == ALLIANCE) ? HORDE : ALLIANCE, (-1)*BG_AV_RES_TOWER);
2011-04-29 20:47:02 +02:00
RewardReputationToTeam((owner == ALLIANCE)?730:729, BG_AV_REP_TOWER, owner);
RewardHonorToTeam(GetBonusHonor(BG_AV_KILL_TOWER), owner);
2009-10-17 15:51:44 -07:00
2011-04-29 20:47:02 +02:00
SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+GetTeamIndexByTeamId(owner)+(2*tmp), RESPAWN_ONE_DAY);
SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+GetTeamIndexByTeamId(owner)+(2*tmp), RESPAWN_ONE_DAY);
}
else
{
2010-04-07 22:59:46 +02:00
if (owner == ALLIANCE)
SpawnBGObject(object-11, RESPAWN_IMMEDIATELY);
else
SpawnBGObject(object+11, RESPAWN_IMMEDIATELY);
2011-04-29 20:47:02 +02:00
SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node, RESPAWN_ONE_DAY);
SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+GetTeamIndexByTeamId(owner)+3*node, RESPAWN_IMMEDIATELY);
PopulateNode(node);
2010-04-07 19:14:10 +02:00
if (node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall eyecandy
{
2009-10-17 16:20:24 -07:00
for (uint8 i = 0; i < 4; i++)
{
2011-04-29 20:47:02 +02:00
SpawnBGObject(((owner == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_PH)+i, RESPAWN_ONE_DAY);
SpawnBGObject(((owner == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_A : BG_AV_OBJECT_SNOW_EYECANDY_H)+i, RESPAWN_IMMEDIATELY);
}
}
}
//send a nice message to all :)
char buf[256];
2010-04-07 19:14:10 +02:00
if (IsTower(node))
2011-04-29 20:47:02 +02:00
sprintf(buf, GetTrinityString(LANG_BG_AV_TOWER_TAKEN) , GetNodeName(node), (owner == ALLIANCE) ? GetTrinityString(LANG_BG_AV_ALLY) : GetTrinityString(LANG_BG_AV_HORDE));
else
2011-04-29 20:47:02 +02:00
sprintf(buf, GetTrinityString(LANG_BG_AV_GRAVE_TAKEN) , GetNodeName(node), (owner == ALLIANCE) ? GetTrinityString(LANG_BG_AV_ALLY) :GetTrinityString(LANG_BG_AV_HORDE));
2009-10-17 15:51:44 -07:00
Creature* creature = GetBGCreature(AV_CPLACE_HERALD);
2010-04-07 19:14:10 +02:00
if (creature)
2011-04-29 20:47:02 +02:00
YellToAll(creature, buf, LANG_UNIVERSAL);
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::ChangeMineOwner(uint8 mine, uint32 team, bool initial)
{ //mine=0 northmine mine=1 southmin
//changing the owner results in setting respawntim to infinite for current creatures, spawning new mine owners creatures and changing the chest-objects so that the current owning team can use them
ASSERT(mine == AV_NORTH_MINE || mine == AV_SOUTH_MINE);
2010-04-07 19:14:10 +02:00
if (team != ALLIANCE && team != HORDE)
team = AV_NEUTRAL_TEAM;
else
2010-04-07 23:25:02 +02:00
PlaySoundToAll((team == ALLIANCE)?AV_SOUND_ALLIANCE_GOOD:AV_SOUND_HORDE_GOOD);
2009-10-17 15:51:44 -07:00
2010-04-07 19:14:10 +02:00
if (m_Mine_Owner[mine] == team && !initial)
return;
m_Mine_PrevOwner[mine] = m_Mine_Owner[mine];
m_Mine_Owner[mine] = team;
2009-10-17 15:51:44 -07:00
2010-04-07 19:14:10 +02:00
if (!initial)
{
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "bg_av depopulating mine %i (0=north, 1=south)", mine);
2010-04-07 23:25:02 +02:00
if (mine == AV_SOUTH_MINE)
2009-10-17 16:20:24 -07:00
for (uint16 i=AV_CPLACE_MINE_S_S_MIN; i <= AV_CPLACE_MINE_S_S_MAX; i++)
2010-04-07 22:59:46 +02:00
if (m_BgCreatures[i])
DelCreature(i); //TODO just set the respawntime to 999999
2010-04-07 23:25:02 +02:00
for (uint16 i=((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_1_MIN:AV_CPLACE_MINE_S_1_MIN); i <= ((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_3:AV_CPLACE_MINE_S_3); i++)
2010-04-07 22:59:46 +02:00
if (m_BgCreatures[i])
DelCreature(i); //TODO here also
}
SendMineWorldStates(mine);
2009-10-17 15:51:44 -07:00
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "bg_av populating mine %i (0=north, 1=south)", mine);
uint16 miner;
//also neutral team exists.. after a big time, the neutral team tries to conquer the mine
2010-04-07 23:25:02 +02:00
if (mine == AV_NORTH_MINE)
{
2010-04-07 19:14:10 +02:00
if (team == ALLIANCE)
miner = AV_NPC_N_MINE_A_1;
else if (team == HORDE)
miner = AV_NPC_N_MINE_H_1;
else
miner = AV_NPC_N_MINE_N_1;
}
else
{
uint16 cinfo;
2010-04-07 19:14:10 +02:00
if (team == ALLIANCE)
miner = AV_NPC_S_MINE_A_1;
else if (team == HORDE)
miner = AV_NPC_S_MINE_H_1;
else
miner = AV_NPC_S_MINE_N_1;
//vermin
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "spawning vermin");
2010-04-07 19:14:10 +02:00
if (team == ALLIANCE)
cinfo = AV_NPC_S_MINE_A_3;
else if (team == HORDE)
cinfo = AV_NPC_S_MINE_H_3;
else
cinfo = AV_NPC_S_MINE_N_S;
2009-10-17 16:20:24 -07:00
for (uint16 i=AV_CPLACE_MINE_S_S_MIN; i <= AV_CPLACE_MINE_S_S_MAX; i++)
2011-04-29 20:47:02 +02:00
AddAVCreature(cinfo, i);
}
2010-04-07 23:25:02 +02:00
for (uint16 i=((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_1_MIN:AV_CPLACE_MINE_S_1_MIN); i <= ((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_1_MAX:AV_CPLACE_MINE_S_1_MAX); i++)
2011-04-29 20:47:02 +02:00
AddAVCreature(miner, i);
//the next chooses randomly between 2 cretures
2010-04-07 23:25:02 +02:00
for (uint16 i=((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_2_MIN:AV_CPLACE_MINE_S_2_MIN); i <= ((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_2_MAX:AV_CPLACE_MINE_S_2_MAX); i++)
2011-04-29 20:47:02 +02:00
AddAVCreature(miner+(urand(1, 2)), i);
AddAVCreature(miner+3, (mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_3:AV_CPLACE_MINE_S_3);
//because the gameobjects in this mine have changed, update all surrounding players:
2010-04-07 23:25:02 +02:00
// for (uint16 i = ((mine == AV_NORTH_MINE)?BG_AV_OBJECT_MINE_SUPPLY_N_MIN:BG_AV_OBJECT_MINE_SUPPLY_N_MIN); i <= ((mine == AV_NORTH_MINE)?BG_AV_OBJECT_MINE_SUPPLY_N_MAX:BG_AV_OBJECT_MINE_SUPPLY_N_MAX); i++)
// {
//TODO: add gameobject-update code
// }
2010-04-07 19:14:10 +02:00
if (team == ALLIANCE || team == HORDE)
{
m_Mine_Reclaim_Timer[mine]=AV_MINE_RECLAIM_TIMER;
char buf[256];
2010-04-07 22:59:46 +02:00
sprintf(buf, GetTrinityString(LANG_BG_AV_MINE_TAKEN), GetTrinityString((mine == AV_NORTH_MINE) ? LANG_BG_AV_MINE_NORTH : LANG_BG_AV_MINE_SOUTH), (team == ALLIANCE) ? GetTrinityString(LANG_BG_AV_ALLY) : GetTrinityString(LANG_BG_AV_HORDE));
Creature* creature = GetBGCreature(AV_CPLACE_HERALD);
2010-04-07 19:14:10 +02:00
if (creature)
2011-04-29 20:47:02 +02:00
YellToAll(creature, buf, LANG_UNIVERSAL);
}
else
{
2010-04-07 23:25:02 +02:00
if (mine == AV_SOUTH_MINE) //i think this gets called all the time
{
if (Creature* creature = GetBGCreature(AV_CPLACE_MINE_S_3))
YellToAll(creature, LANG_BG_AV_S_MINE_BOSS_CLAIMS, LANG_UNIVERSAL);
}
}
return;
}
2009-10-17 15:51:44 -07:00
2011-04-29 20:47:02 +02:00
bool BattlegroundAV::PlayerCanDoMineQuest(int32 GOId, uint32 team)
{
2010-04-07 19:14:10 +02:00
if (GOId == BG_AV_OBJECTID_MINE_N)
2010-04-07 23:25:02 +02:00
return (m_Mine_Owner[AV_NORTH_MINE] == team);
2010-04-07 19:14:10 +02:00
if (GOId == BG_AV_OBJECTID_MINE_S)
2010-04-07 23:25:02 +02:00
return (m_Mine_Owner[AV_SOUTH_MINE] == team);
return true; //cause it's no mine'object it is ok if this is true
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::PopulateNode(BG_AV_Nodes node)
{
uint32 owner = m_Nodes[node].Owner;
ASSERT(owner);
2009-10-17 15:51:44 -07:00
2010-04-07 22:59:46 +02:00
uint32 c_place = AV_CPLACE_DEFENSE_STORM_AID + (4 * node);
uint32 creatureid;
2010-04-07 19:14:10 +02:00
if (IsTower(node))
2010-04-07 23:25:02 +02:00
creatureid=(owner == ALLIANCE)?AV_NPC_A_TOWERDEFENSE:AV_NPC_H_TOWERDEFENSE;
else
{
uint8 team2 = GetTeamIndexByTeamId(owner);
2010-04-07 22:59:46 +02:00
if (m_Team_QuestStatus[team2][0] < 500)
creatureid = (owner == ALLIANCE)? AV_NPC_A_GRAVEDEFENSE0 : AV_NPC_H_GRAVEDEFENSE0;
else if (m_Team_QuestStatus[team2][0] < 1000)
creatureid = (owner == ALLIANCE)? AV_NPC_A_GRAVEDEFENSE1 : AV_NPC_H_GRAVEDEFENSE1;
else if (m_Team_QuestStatus[team2][0] < 1500)
creatureid = (owner == ALLIANCE)? AV_NPC_A_GRAVEDEFENSE2 : AV_NPC_H_GRAVEDEFENSE2;
else
2010-04-07 22:59:46 +02:00
creatureid = (owner == ALLIANCE)? AV_NPC_A_GRAVEDEFENSE3 : AV_NPC_H_GRAVEDEFENSE3;
//spiritguide
2010-04-07 22:59:46 +02:00
if (m_BgCreatures[node])
DelCreature(node);
2010-04-07 22:59:46 +02:00
if (!AddSpiritGuide(node, BG_AV_CreaturePos[node][0], BG_AV_CreaturePos[node][1], BG_AV_CreaturePos[node][2], BG_AV_CreaturePos[node][3], owner))
2011-04-29 20:47:02 +02:00
sLog->outError("AV: couldn't spawn spiritguide at node %i", node);
2009-10-17 15:51:44 -07:00
}
2009-10-17 16:20:24 -07:00
for (uint8 i=0; i<4; i++)
2011-04-29 20:47:02 +02:00
AddAVCreature(creatureid, c_place+i);
if (node >= BG_AV_NODES_MAX)//fail safe
return;
Creature* trigger = GetBGCreature(node + 302);//0-302 other creatures
if (!trigger)
2011-04-29 20:47:02 +02:00
trigger = AddCreature(WORLD_TRIGGER, node + 302, owner, BG_AV_CreaturePos[node + 302][0], BG_AV_CreaturePos[node + 302][1], BG_AV_CreaturePos[node + 302][2], BG_AV_CreaturePos[node + 302][3]);
//add bonus honor aura trigger creature when node is accupied
//cast bonus aura (+50% honor in 25yards)
//aura should only apply to players who have accupied the node, set correct faction for trigger
if (trigger)
{
if (owner != ALLIANCE && owner != HORDE)//node can be neutral, remove trigger
{
DelCreature(node + 302);
return;
}
trigger->setFaction(owner == ALLIANCE ? 84 : 83);
trigger->CastSpell(trigger, SPELL_HONORABLE_DEFENDER_25Y, false);
}
}
2010-08-08 04:37:24 +02:00
void BattlegroundAV::DePopulateNode(BG_AV_Nodes node)
{
2010-04-07 22:59:46 +02:00
uint32 c_place = AV_CPLACE_DEFENSE_STORM_AID + (4 * node);
2009-10-17 16:20:24 -07:00
for (uint8 i=0; i<4; i++)
2010-04-07 22:59:46 +02:00
if (m_BgCreatures[c_place+i])
DelCreature(c_place+i);
//spiritguide
2010-04-07 22:59:46 +02:00
if (!IsTower(node) && m_BgCreatures[node])
DelCreature(node);
//remove bonus honor aura trigger creature when node is lost
2011-06-12 02:30:32 +02:00
if (node < BG_AV_NODES_MAX)//fail safe
DelCreature(node + 302);//NULL checks are in DelCreature! 0-302 spirit guides
}
2010-08-30 15:25:15 +02:00
BG_AV_Nodes BattlegroundAV::GetNodeThroughObject(uint32 object)
{
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "bg_AV getnodethroughobject %i", object);
2010-04-07 22:59:46 +02:00
if (object <= BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER)
2009-02-09 08:16:34 -05:00
return BG_AV_Nodes(object);
2010-04-07 22:59:46 +02:00
if (object <= BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_HUT)
2009-02-09 08:16:34 -05:00
return BG_AV_Nodes(object - 11);
2010-04-07 22:59:46 +02:00
if (object <= BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_WTOWER)
2009-02-09 08:16:34 -05:00
return BG_AV_Nodes(object - 7);
2010-04-07 22:59:46 +02:00
if (object <= BG_AV_OBJECT_FLAG_C_H_STONEHEART_BUNKER)
2009-02-09 08:16:34 -05:00
return BG_AV_Nodes(object -22);
2010-04-07 22:59:46 +02:00
if (object <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT)
2009-02-09 08:16:34 -05:00
return BG_AV_Nodes(object - 33);
2010-04-07 22:59:46 +02:00
if (object <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER)
2009-02-09 08:16:34 -05:00
return BG_AV_Nodes(object - 29);
2010-04-07 22:59:46 +02:00
if (object == BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE)
2009-02-09 08:16:34 -05:00
return BG_AV_NODES_SNOWFALL_GRAVE;
sLog->outError("BattlegroundAV: ERROR! GetPlace got a wrong object :(");
ASSERT(false);
return BG_AV_Nodes(0);
}
2009-10-17 15:51:44 -07:00
2010-08-30 15:25:15 +02:00
uint32 BattlegroundAV::GetObjectThroughNode(BG_AV_Nodes node)
{ //this function is the counterpart to GetNodeThroughObject()
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "bg_AV GetObjectThroughNode %i", node);
2010-04-07 22:59:46 +02:00
if (m_Nodes[node].Owner == ALLIANCE)
{
2010-04-07 22:59:46 +02:00
if (m_Nodes[node].State == POINT_ASSAULTED)
{
2010-04-07 22:59:46 +02:00
if (node <= BG_AV_NODES_FROSTWOLF_HUT)
return node+11;
2010-04-07 22:59:46 +02:00
if (node >= BG_AV_NODES_ICEBLOOD_TOWER && node <= BG_AV_NODES_FROSTWOLF_WTOWER)
return node+7;
}
2010-04-07 22:59:46 +02:00
else if (m_Nodes[node].State == POINT_CONTROLED)
if (node <= BG_AV_NODES_STONEHEART_BUNKER)
return node;
}
2010-04-07 22:59:46 +02:00
else if (m_Nodes[node].Owner == HORDE)
{
2010-04-07 22:59:46 +02:00
if (m_Nodes[node].State == POINT_ASSAULTED)
2010-08-23 07:51:19 +02:00
{
2010-04-07 22:59:46 +02:00
if (node <= BG_AV_NODES_STONEHEART_BUNKER)
return node+22;
2010-08-23 07:51:19 +02:00
}
2010-04-07 22:59:46 +02:00
else if (m_Nodes[node].State == POINT_CONTROLED)
{
2010-04-07 22:59:46 +02:00
if (node <= BG_AV_NODES_FROSTWOLF_HUT)
return node+33;
2010-04-07 22:59:46 +02:00
if (node >= BG_AV_NODES_ICEBLOOD_TOWER && node <= BG_AV_NODES_FROSTWOLF_WTOWER)
return node+29;
}
}
2010-04-07 22:59:46 +02:00
else if (m_Nodes[node].Owner == AV_NEUTRAL_TEAM)
return BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE;
2011-04-29 20:47:02 +02:00
sLog->outError("BattlegroundAV: Error! GetPlaceNode couldn't resolve node %i", node);
ASSERT(false);
return 0;
}
//called when using banner
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::EventPlayerClickedOnFlag(Player *source, GameObject* target_obj)
{
2010-04-07 19:14:10 +02:00
if (GetStatus() != STATUS_IN_PROGRESS)
return;
int32 object = GetObjectType(target_obj->GetGUID());
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV using gameobject %i with type %i", target_obj->GetEntry(), object);
2010-04-07 19:14:10 +02:00
if (object < 0)
return;
switch(target_obj->GetEntry())
{
case BG_AV_OBJECTID_BANNER_A:
case BG_AV_OBJECTID_BANNER_A_B:
case BG_AV_OBJECTID_BANNER_H:
case BG_AV_OBJECTID_BANNER_H_B:
case BG_AV_OBJECTID_BANNER_SNOWFALL_N:
EventPlayerAssaultsPoint(source, object);
break;
case BG_AV_OBJECTID_BANNER_CONT_A:
case BG_AV_OBJECTID_BANNER_CONT_A_B:
case BG_AV_OBJECTID_BANNER_CONT_H:
case BG_AV_OBJECTID_BANNER_CONT_H_B:
EventPlayerDefendsPoint(source, object);
break;
default:
break;
}
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::EventPlayerDefendsPoint(Player* player, uint32 object)
{
ASSERT(GetStatus() == STATUS_IN_PROGRESS);
BG_AV_Nodes node = GetNodeThroughObject(object);
2009-10-17 15:51:44 -07:00
uint32 owner = m_Nodes[node].Owner; //maybe should name it prevowner
uint32 team = player->GetTeam();
2009-10-17 15:51:44 -07:00
2010-04-07 19:14:10 +02:00
if (owner == player->GetTeam() || m_Nodes[node].State != POINT_ASSAULTED)
return;
2010-04-07 19:14:10 +02:00
if (m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM)
{ //until snowfall doesn't belong to anyone it is better handled in assault-code
ASSERT(node == BG_AV_NODES_SNOWFALL_GRAVE); //currently the only neutral grave
2011-04-29 20:47:02 +02:00
EventPlayerAssaultsPoint(player, object);
return;
}
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "player defends point object: %i node: %i", object, node);
2010-04-07 19:14:10 +02:00
if (m_Nodes[node].PrevOwner != team)
{
2011-04-29 20:47:02 +02:00
sLog->outError("BG_AV: player defends point which doesn't belong to his team %i", node);
return;
}
//spawn new go :)
2010-04-07 19:14:10 +02:00
if (m_Nodes[node].Owner == ALLIANCE)
SpawnBGObject(object+22, RESPAWN_IMMEDIATELY); //spawn horde banner
else
SpawnBGObject(object-22, RESPAWN_IMMEDIATELY); //spawn alliance banner
2009-10-17 15:51:44 -07:00
2010-04-07 19:14:10 +02:00
if (!IsTower(node))
{
2011-04-29 20:47:02 +02:00
SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node, RESPAWN_ONE_DAY);
SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+GetTeamIndexByTeamId(team)+3*node, RESPAWN_IMMEDIATELY);
}
// despawn old go
SpawnBGObject(object, RESPAWN_ONE_DAY);
2009-10-17 15:51:44 -07:00
2011-04-29 20:47:02 +02:00
DefendNode(node, team);
2009-02-09 08:16:34 -05:00
PopulateNode(node);
UpdateNodeWorldState(node);
2009-10-17 15:51:44 -07:00
2010-04-07 19:14:10 +02:00
if (IsTower(node))
{
//spawn big flag+aura on top of tower
2011-04-29 20:47:02 +02:00
SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
SpawnBGObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
}
2010-04-07 19:14:10 +02:00
else if (node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall eyecandy
{
2009-10-17 16:20:24 -07:00
for (uint8 i = 0; i < 4; i++)
{
2011-04-29 20:47:02 +02:00
SpawnBGObject(((owner == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_PH)+i, RESPAWN_ONE_DAY);
SpawnBGObject(((team == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_A : BG_AV_OBJECT_SNOW_EYECANDY_H)+i, RESPAWN_IMMEDIATELY);
}
}
2009-02-09 08:16:34 -05:00
//send a nice message to all :)
char buf[256];
2011-04-29 20:47:02 +02:00
sprintf(buf, GetTrinityString((IsTower(node)) ? LANG_BG_AV_TOWER_DEFENDED : LANG_BG_AV_GRAVE_DEFENDED), GetNodeName(node), (team == ALLIANCE) ? GetTrinityString(LANG_BG_AV_ALLY) : GetTrinityString(LANG_BG_AV_HORDE));
Creature* creature = GetBGCreature(AV_CPLACE_HERALD);
2010-04-07 19:14:10 +02:00
if (creature)
2011-04-29 20:47:02 +02:00
YellToAll(creature, buf, LANG_UNIVERSAL);
2009-02-09 08:16:34 -05:00
//update the statistic for the defending player
2010-04-07 22:59:46 +02:00
UpdatePlayerScore(player, (IsTower(node)) ? SCORE_TOWERS_DEFENDED : SCORE_GRAVEYARDS_DEFENDED, 1);
2010-04-07 19:14:10 +02:00
if (IsTower(node))
PlaySoundToAll(AV_SOUND_BOTH_TOWER_DEFEND);
else
2010-04-07 23:25:02 +02:00
PlaySoundToAll((team == ALLIANCE)?AV_SOUND_ALLIANCE_GOOD:AV_SOUND_HORDE_GOOD);
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::EventPlayerAssaultsPoint(Player* player, uint32 object)
{
ASSERT(GetStatus() == STATUS_IN_PROGRESS);
2009-10-17 15:51:44 -07:00
BG_AV_Nodes node = GetNodeThroughObject(object);
uint32 owner = m_Nodes[node].Owner; //maybe name it prevowner
uint32 team = player->GetTeam();
2011-04-29 20:47:02 +02:00
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "bg_av: player assaults point object %i node %i", object, node);
2010-04-07 19:14:10 +02:00
if (owner == team || team == m_Nodes[node].TotalOwner)
return; //surely a gm used this object
2010-04-07 19:14:10 +02:00
if (node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall is a bit special in capping + it gets eyecandy stuff
{
2010-04-07 19:14:10 +02:00
if (object == BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE) //initial capping
{
ASSERT(owner == AV_NEUTRAL_TEAM && m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM);
2010-04-07 22:59:46 +02:00
if (team == ALLIANCE)
SpawnBGObject(BG_AV_OBJECT_FLAG_C_A_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY);
else
SpawnBGObject(BG_AV_OBJECT_FLAG_C_H_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY);
2011-04-29 20:47:02 +02:00
SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node, RESPAWN_IMMEDIATELY); //neutral aura spawn
}
2010-04-07 19:14:10 +02:00
else if (m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM) //recapping, when no team owns this node realy
{
ASSERT(m_Nodes[node].State != POINT_CONTROLED);
2010-04-07 19:14:10 +02:00
if (team == ALLIANCE)
SpawnBGObject(object-11, RESPAWN_IMMEDIATELY);
else
SpawnBGObject(object+11, RESPAWN_IMMEDIATELY);
}
//eyecandy
2011-04-29 20:47:02 +02:00
uint32 spawn, despawn;
2010-04-07 19:14:10 +02:00
if (team == ALLIANCE)
{
2010-04-07 22:59:46 +02:00
despawn = (m_Nodes[node].State == POINT_ASSAULTED)?BG_AV_OBJECT_SNOW_EYECANDY_PH : BG_AV_OBJECT_SNOW_EYECANDY_H;
spawn = BG_AV_OBJECT_SNOW_EYECANDY_PA;
}
else
{
2010-04-07 22:59:46 +02:00
despawn = (m_Nodes[node].State == POINT_ASSAULTED)?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_A;
spawn = BG_AV_OBJECT_SNOW_EYECANDY_PH;
}
2009-10-17 16:20:24 -07:00
for (uint8 i = 0; i < 4; i++)
{
2011-04-29 20:47:02 +02:00
SpawnBGObject(despawn+i, RESPAWN_ONE_DAY);
SpawnBGObject(spawn+i, RESPAWN_IMMEDIATELY);
}
}
2009-10-17 15:51:44 -07:00
//if snowfall gots capped it can be handled like all other graveyards
2010-04-07 22:59:46 +02:00
if (m_Nodes[node].TotalOwner != AV_NEUTRAL_TEAM)
{
ASSERT(m_Nodes[node].Owner != AV_NEUTRAL_TEAM);
2010-04-07 19:14:10 +02:00
if (team == ALLIANCE)
SpawnBGObject(object-22, RESPAWN_IMMEDIATELY);
else
SpawnBGObject(object+22, RESPAWN_IMMEDIATELY);
2010-04-07 19:14:10 +02:00
if (IsTower(node))
{ //spawning/despawning of bigflag+aura
2011-04-29 20:47:02 +02:00
SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
SpawnBGObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
}
else
{
//spawning/despawning of aura
2011-04-29 20:47:02 +02:00
SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node, RESPAWN_IMMEDIATELY); //neutral aura spawn
SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+GetTeamIndexByTeamId(owner)+3*node, RESPAWN_ONE_DAY); //teeamaura despawn
// Those who are waiting to resurrect at this object are taken to the closest own object's graveyard
std::vector<uint64> ghost_list = m_ReviveQueue[m_BgCreatures[node]];
2010-04-07 22:59:46 +02:00
if (!ghost_list.empty())
{
Player *plr;
WorldSafeLocsEntry const *ClosestGrave = NULL;
for (std::vector<uint64>::iterator itr = ghost_list.begin(); itr != ghost_list.end(); ++itr)
{
plr = sObjectMgr->GetPlayer(*ghost_list.begin());
2010-04-07 22:59:46 +02:00
if (!plr)
continue;
2010-04-07 19:14:10 +02:00
if (!ClosestGrave)
2009-08-28 15:48:33 +02:00
ClosestGrave = GetClosestGraveYard(plr);
else
plr->TeleportTo(GetMapId(), ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, plr->GetOrientation());
}
m_ReviveQueue[m_BgCreatures[node]].clear();
}
}
DePopulateNode(node);
}
2009-10-17 15:51:44 -07:00
SpawnBGObject(object, RESPAWN_ONE_DAY); //delete old banner
2011-04-29 20:47:02 +02:00
AssaultNode(node, team);
UpdateNodeWorldState(node);
2009-10-17 15:51:44 -07:00
//send a nice message to all :)
char buf[256];
2010-04-07 22:59:46 +02:00
sprintf(buf, (IsTower(node)) ? GetTrinityString(LANG_BG_AV_TOWER_ASSAULTED) : GetTrinityString(LANG_BG_AV_GRAVE_ASSAULTED), GetNodeName(node), (team == ALLIANCE) ? GetTrinityString(LANG_BG_AV_ALLY) : GetTrinityString(LANG_BG_AV_HORDE));
Creature* creature = GetBGCreature(AV_CPLACE_HERALD);
2010-04-07 19:14:10 +02:00
if (creature)
2011-04-29 20:47:02 +02:00
YellToAll(creature, buf, LANG_UNIVERSAL);
//update the statistic for the assaulting player
2010-04-07 22:59:46 +02:00
UpdatePlayerScore(player, (IsTower(node)) ? SCORE_TOWERS_ASSAULTED : SCORE_GRAVEYARDS_ASSAULTED, 1);
2010-04-07 23:25:02 +02:00
PlaySoundToAll((team == ALLIANCE)?AV_SOUND_ALLIANCE_ASSAULTS:AV_SOUND_HORDE_ASSAULTS);
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::FillInitialWorldStates(WorldPacket& data)
{
bool stateok;
//graveyards
for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; i++)
{
for (uint8 j =1; j <= 3; j+=2)
{//j=1=assaulted j=3=controled
stateok = (m_Nodes[i].State == j);
2011-04-29 20:47:02 +02:00
data << uint32(BG_AV_NodeWorldStates[i][GetWorldStateType(j, ALLIANCE)]) << uint32((m_Nodes[i].Owner == ALLIANCE && stateok)?1:0);
data << uint32(BG_AV_NodeWorldStates[i][GetWorldStateType(j, HORDE)]) << uint32((m_Nodes[i].Owner == HORDE && stateok)?1:0);
}
}
2009-10-17 15:51:44 -07:00
//towers
2011-07-27 11:00:39 +02:00
for (uint8 i = BG_AV_NODES_DUNBALDAR_SOUTH; i < BG_AV_NODES_MAX; ++i)
for (uint8 j =1; j <= 3; j+=2)
{//j=1=assaulted j=3=controled //i dont have j=2=destroyed cause destroyed is the same like enemy-team controll
2010-04-07 23:25:02 +02:00
stateok = (m_Nodes[i].State == j || (m_Nodes[i].State == POINT_DESTROYED && j == 3));
2011-04-29 20:47:02 +02:00
data << uint32(BG_AV_NodeWorldStates[i][GetWorldStateType(j, ALLIANCE)]) << uint32((m_Nodes[i].Owner == ALLIANCE && stateok)?1:0);
data << uint32(BG_AV_NodeWorldStates[i][GetWorldStateType(j, HORDE)]) << uint32((m_Nodes[i].Owner == HORDE && stateok)?1:0);
}
2010-04-07 19:14:10 +02:00
if (m_Nodes[BG_AV_NODES_SNOWFALL_GRAVE].Owner == AV_NEUTRAL_TEAM) //cause neutral teams aren't handled generic
data << uint32(AV_SNOWFALL_N) << uint32(1);
data << uint32(AV_Alliance_Score) << uint32(m_Team_Scores[0]);
data << uint32(AV_Horde_Score) << uint32(m_Team_Scores[1]);
2010-04-07 19:14:10 +02:00
if (GetStatus() == STATUS_IN_PROGRESS){ //only if game started the teamscores are displayed
data << uint32(AV_SHOW_A_SCORE) << uint32(1);
data << uint32(AV_SHOW_H_SCORE) << uint32(1);
}
else
{
data << uint32(AV_SHOW_A_SCORE) << uint32(0);
data << uint32(AV_SHOW_H_SCORE) << uint32(0);
}
SendMineWorldStates(AV_NORTH_MINE);
SendMineWorldStates(AV_SOUTH_MINE);
}
2009-10-17 15:51:44 -07:00
2010-08-30 15:25:15 +02:00
uint8 BattlegroundAV::GetWorldStateType(uint8 state, uint16 team) //this is used for node worldstates and returns values which fit good into the worldstatesarray
{
//neutral stuff cant get handled (currently its only snowfall)
ASSERT(team != AV_NEUTRAL_TEAM);
//a_c a_a h_c h_a the positions in worldstate-array
2010-04-07 19:14:10 +02:00
if (team == ALLIANCE)
{
2010-04-07 23:25:02 +02:00
if (state == POINT_CONTROLED || state == POINT_DESTROYED)
return 0;
2010-04-07 23:25:02 +02:00
if (state == POINT_ASSAULTED)
return 1;
}
2010-04-07 19:14:10 +02:00
if (team == HORDE)
{
2010-04-07 23:25:02 +02:00
if (state == POINT_DESTROYED || state == POINT_CONTROLED)
return 2;
2010-04-07 23:25:02 +02:00
if (state == POINT_ASSAULTED)
return 3;
}
2011-04-29 20:47:02 +02:00
sLog->outError("BG_AV: should update a strange worldstate state:%i team:%i", state, team);
return 5; //this will crash the game, but i want to know if something is wrong here
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::UpdateNodeWorldState(BG_AV_Nodes node)
{
2011-04-29 20:47:02 +02:00
UpdateWorldState(BG_AV_NodeWorldStates[node][GetWorldStateType(m_Nodes[node].State, m_Nodes[node].Owner)], 1);
2010-04-07 19:14:10 +02:00
if (m_Nodes[node].PrevOwner == AV_NEUTRAL_TEAM) //currently only snowfall is supported as neutral node (i don't want to make an extra row (neutral states) in worldstatesarray just for one node
2011-04-29 20:47:02 +02:00
UpdateWorldState(AV_SNOWFALL_N, 0);
else
2011-04-29 20:47:02 +02:00
UpdateWorldState(BG_AV_NodeWorldStates[node][GetWorldStateType(m_Nodes[node].PrevState, m_Nodes[node].PrevOwner)], 0);
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::SendMineWorldStates(uint32 mine)
{
ASSERT(mine == AV_NORTH_MINE || mine == AV_SOUTH_MINE);
// currently i'm sure, that this works (:
// ASSERT(m_Mine_PrevOwner[mine] == ALLIANCE || m_Mine_PrevOwner[mine] == HORDE || m_Mine_PrevOwner[mine] == AV_NEUTRAL_TEAM);
// ASSERT(m_Mine_Owner[mine] == ALLIANCE || m_Mine_Owner[mine] == HORDE || m_Mine_Owner[mine] == AV_NEUTRAL_TEAM);
2009-10-17 15:51:44 -07:00
2011-04-29 20:47:02 +02:00
uint8 owner, prevowner, mine2; //those variables are needed to access the right worldstate in the BG_AV_MineWorldStates array
2010-04-07 23:25:02 +02:00
mine2 = (mine == AV_NORTH_MINE)?0:1;
2010-04-07 19:14:10 +02:00
if (m_Mine_PrevOwner[mine] == ALLIANCE)
prevowner = 0;
2010-04-07 19:14:10 +02:00
else if (m_Mine_PrevOwner[mine] == HORDE)
prevowner = 2;
else
prevowner = 1;
2010-04-07 19:14:10 +02:00
if (m_Mine_Owner[mine] == ALLIANCE)
owner = 0;
2010-04-07 19:14:10 +02:00
else if (m_Mine_Owner[mine] == HORDE)
owner = 2;
else
owner = 1;
2009-10-17 15:51:44 -07:00
2011-04-29 20:47:02 +02:00
UpdateWorldState(BG_AV_MineWorldStates[mine2][owner], 1);
2010-04-07 22:59:46 +02:00
if (prevowner != owner)
2011-04-29 20:47:02 +02:00
UpdateWorldState(BG_AV_MineWorldStates[mine2][prevowner], 0);
}
2010-08-08 04:37:24 +02:00
WorldSafeLocsEntry const* BattlegroundAV::GetClosestGraveYard(Player* player)
{
WorldSafeLocsEntry const* pGraveyard = NULL;
WorldSafeLocsEntry const* entry = NULL;
float dist = 0;
float minDist = 0;
float x, y;
player->GetPosition(x, y);
pGraveyard = sWorldSafeLocsStore.LookupEntry(BG_AV_GraveyardIds[GetTeamIndexByTeamId(player->GetTeam())+7]);
minDist = (pGraveyard->x - x)*(pGraveyard->x - x)+(pGraveyard->y - y)*(pGraveyard->y - y);
for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i)
if (m_Nodes[i].Owner == player->GetTeam() && m_Nodes[i].State == POINT_CONTROLED)
{
entry = sWorldSafeLocsStore.LookupEntry(BG_AV_GraveyardIds[i]);
if (entry)
{
dist = (entry->x - x)*(entry->x - x)+(entry->y - y)*(entry->y - y);
if (dist < minDist)
{
minDist = dist;
pGraveyard = entry;
}
}
}
return pGraveyard;
}
2010-08-08 04:37:24 +02:00
bool BattlegroundAV::SetupBattleground()
{
// Create starting objects
2010-04-07 19:14:10 +02:00
if (
// alliance gates
2011-04-29 20:47:02 +02:00
!AddObject(BG_AV_OBJECT_DOOR_A, BG_AV_OBJECTID_GATE_A, BG_AV_DoorPositons[0][0], BG_AV_DoorPositons[0][1], BG_AV_DoorPositons[0][2], BG_AV_DoorPositons[0][3], 0, 0, sin(BG_AV_DoorPositons[0][3]/2), cos(BG_AV_DoorPositons[0][3]/2), RESPAWN_IMMEDIATELY)
// horde gates
2011-04-29 20:47:02 +02:00
|| !AddObject(BG_AV_OBJECT_DOOR_H, BG_AV_OBJECTID_GATE_H, BG_AV_DoorPositons[1][0], BG_AV_DoorPositons[1][1], BG_AV_DoorPositons[1][2], BG_AV_DoorPositons[1][3], 0, 0, sin(BG_AV_DoorPositons[1][3]/2), cos(BG_AV_DoorPositons[1][3]/2), RESPAWN_IMMEDIATELY))
{
sLog->outErrorDb("BatteGroundAV: Failed to spawn some object Battleground not created!1");
return false;
}
2009-10-17 15:51:44 -07:00
//spawn node-objects
for (uint8 i = BG_AV_NODES_FIRSTAID_STATION ; i < BG_AV_NODES_MAX; ++i)
{
2010-04-07 22:59:46 +02:00
if (i <= BG_AV_NODES_FROSTWOLF_HUT)
{
2011-04-29 20:47:02 +02:00
if (!AddObject(i, BG_AV_OBJECTID_BANNER_A_B, BG_AV_ObjectPos[i][0], BG_AV_ObjectPos[i][1], BG_AV_ObjectPos[i][2], BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(i+11, BG_AV_OBJECTID_BANNER_CONT_A_B, BG_AV_ObjectPos[i][0], BG_AV_ObjectPos[i][1], BG_AV_ObjectPos[i][2], BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(i+33, BG_AV_OBJECTID_BANNER_H_B, BG_AV_ObjectPos[i][0], BG_AV_ObjectPos[i][1], BG_AV_ObjectPos[i][2], BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(i+22, BG_AV_OBJECTID_BANNER_CONT_H_B, BG_AV_ObjectPos[i][0], BG_AV_ObjectPos[i][1], BG_AV_ObjectPos[i][2], BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2), RESPAWN_ONE_DAY)
//aura
2011-04-29 20:47:02 +02:00
|| !AddObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+i*3, BG_AV_OBJECTID_AURA_N, BG_AV_ObjectPos[i][0], BG_AV_ObjectPos[i][1], BG_AV_ObjectPos[i][2], BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+i*3, BG_AV_OBJECTID_AURA_A, BG_AV_ObjectPos[i][0], BG_AV_ObjectPos[i][1], BG_AV_ObjectPos[i][2], BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(BG_AV_OBJECT_AURA_H_FIRSTAID_STATION+i*3, BG_AV_OBJECTID_AURA_H, BG_AV_ObjectPos[i][0], BG_AV_ObjectPos[i][1], BG_AV_ObjectPos[i][2], BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2), RESPAWN_ONE_DAY))
{
sLog->outError("BatteGroundAV: Failed to spawn some object Battleground not created!2");
return false;
}
}
else //towers
{
2010-04-07 22:59:46 +02:00
if (i <= BG_AV_NODES_STONEHEART_BUNKER) //alliance towers
{
2011-04-29 20:47:02 +02:00
if (!AddObject(i, BG_AV_OBJECTID_BANNER_A, BG_AV_ObjectPos[i][0], BG_AV_ObjectPos[i][1], BG_AV_ObjectPos[i][2], BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(i+22, BG_AV_OBJECTID_BANNER_CONT_H, BG_AV_ObjectPos[i][0], BG_AV_ObjectPos[i][1], BG_AV_ObjectPos[i][2], BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_AURA_A, BG_AV_ObjectPos[i+8][0], BG_AV_ObjectPos[i+8][1], BG_AV_ObjectPos[i+8][2], BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_AURA_N, BG_AV_ObjectPos[i+8][0], BG_AV_ObjectPos[i+8][1], BG_AV_ObjectPos[i+8][2], BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_TOWER_BANNER_A, BG_AV_ObjectPos[i+8][0], BG_AV_ObjectPos[i+8][1], BG_AV_ObjectPos[i+8][2], BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_TOWER_BANNER_PH, BG_AV_ObjectPos[i+8][0], BG_AV_ObjectPos[i+8][1], BG_AV_ObjectPos[i+8][2], BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2), RESPAWN_ONE_DAY))
{
sLog->outError("BatteGroundAV: Failed to spawn some object Battleground not created!3");
return false;
}
}
else //horde towers
{
2011-04-29 20:47:02 +02:00
if (!AddObject(i+7, BG_AV_OBJECTID_BANNER_CONT_A, BG_AV_ObjectPos[i][0], BG_AV_ObjectPos[i][1], BG_AV_ObjectPos[i][2], BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(i+29, BG_AV_OBJECTID_BANNER_H, BG_AV_ObjectPos[i][0], BG_AV_ObjectPos[i][1], BG_AV_ObjectPos[i][2], BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_AURA_N, BG_AV_ObjectPos[i+8][0], BG_AV_ObjectPos[i+8][1], BG_AV_ObjectPos[i+8][2], BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_AURA_H, BG_AV_ObjectPos[i+8][0], BG_AV_ObjectPos[i+8][1], BG_AV_ObjectPos[i+8][2], BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_TOWER_BANNER_PA, BG_AV_ObjectPos[i+8][0], BG_AV_ObjectPos[i+8][1], BG_AV_ObjectPos[i+8][2], BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_TOWER_BANNER_H, BG_AV_ObjectPos[i+8][0], BG_AV_ObjectPos[i+8][1], BG_AV_ObjectPos[i+8][2], BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2), RESPAWN_ONE_DAY))
{
sLog->outError("BatteGroundAV: Failed to spawn some object Battleground not created!4");
return false;
}
}
2010-04-07 23:56:35 +02:00
for (uint8 j=0; j <= 9; j++) //burning aura
{
2011-04-29 20:47:02 +02:00
if (!AddObject(BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j, BG_AV_OBJECTID_FIRE, BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j][0], BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j][1], BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j][2], BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j][3]/2), RESPAWN_ONE_DAY))
{
2011-04-29 20:47:02 +02:00
sLog->outError("BatteGroundAV: Failed to spawn some object Battleground not created!5.%i", i);
return false;
}
}
}
}
2009-10-17 16:20:24 -07:00
for (uint8 i=0; i<2; i++) //burning aura for buildings
{
2010-04-07 23:56:35 +02:00
for (uint8 j=0; j <= 9; j++)
{
2010-04-07 19:14:10 +02:00
if (j<5)
{
2011-04-29 20:47:02 +02:00
if (!AddObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE+(i*10)+j, BG_AV_OBJECTID_SMOKE, BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][0], BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][1], BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][2], BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][3]/2), RESPAWN_ONE_DAY))
{
2011-04-29 20:47:02 +02:00
sLog->outError("BatteGroundAV: Failed to spawn some object Battleground not created!6.%i", i);
return false;
}
}
else
{
2011-04-29 20:47:02 +02:00
if (!AddObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE+(i*10)+j, BG_AV_OBJECTID_FIRE, BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][0], BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][1], BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][2], BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][3]/2), RESPAWN_ONE_DAY))
{
2011-04-29 20:47:02 +02:00
sLog->outError("BatteGroundAV: Failed to spawn some object Battleground not created!7.%i", i);
return false;
}
}
}
}
2010-04-07 23:56:35 +02:00
for (uint16 i= 0; i <= (BG_AV_OBJECT_MINE_SUPPLY_N_MAX-BG_AV_OBJECT_MINE_SUPPLY_N_MIN); i++)
{
2011-04-29 20:47:02 +02:00
if (!AddObject(BG_AV_OBJECT_MINE_SUPPLY_N_MIN+i, BG_AV_OBJECTID_MINE_N, BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i][0], BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i][1], BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i][2], BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i][3]/2), RESPAWN_ONE_DAY))
{
2011-04-29 20:47:02 +02:00
sLog->outError("BatteGroundAV: Failed to spawn some mine supplies Battleground not created!7.5.%i", i);
return false;
}
}
2010-04-07 23:56:35 +02:00
for (uint16 i= 0 ; i <= (BG_AV_OBJECT_MINE_SUPPLY_S_MAX-BG_AV_OBJECT_MINE_SUPPLY_S_MIN); i++)
{
2011-04-29 20:47:02 +02:00
if (!AddObject(BG_AV_OBJECT_MINE_SUPPLY_S_MIN+i, BG_AV_OBJECTID_MINE_S, BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][0], BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][1], BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][2], BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][3]/2), RESPAWN_ONE_DAY))
{
2011-04-29 20:47:02 +02:00
sLog->outError("BatteGroundAV: Failed to spawn some mine supplies Battleground not created!7.6.%i", i);
return false;
}
}
2009-10-17 15:51:44 -07:00
2011-04-29 20:47:02 +02:00
if (!AddObject(BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE, BG_AV_OBJECTID_BANNER_SNOWFALL_N , BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE][0], BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE][1], BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE][2], BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE][3], 0, 0, sin(BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE][3]/2), cos(BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE][3]/2), RESPAWN_ONE_DAY))
{
sLog->outError("BatteGroundAV: Failed to spawn some object Battleground not created!8");
return false;
}
2009-10-17 16:20:24 -07:00
for (uint8 i = 0; i < 4; i++)
{
2011-04-29 20:47:02 +02:00
if (!AddObject(BG_AV_OBJECT_SNOW_EYECANDY_A+i, BG_AV_OBJECTID_SNOWFALL_CANDY_A , BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][0], BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][1], BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][2], BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(BG_AV_OBJECT_SNOW_EYECANDY_PA+i, BG_AV_OBJECTID_SNOWFALL_CANDY_PA , BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][0], BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][1], BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][2], BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(BG_AV_OBJECT_SNOW_EYECANDY_H+i, BG_AV_OBJECTID_SNOWFALL_CANDY_H , BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][0], BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][1], BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][2], BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), RESPAWN_ONE_DAY)
|| !AddObject(BG_AV_OBJECT_SNOW_EYECANDY_PH+i, BG_AV_OBJECTID_SNOWFALL_CANDY_PH , BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][0], BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][1], BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][2], BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), RESPAWN_ONE_DAY))
{
2011-04-29 20:47:02 +02:00
sLog->outError("BatteGroundAV: Failed to spawn some object Battleground not created!9.%i", i);
return false;
}
}
2009-10-17 15:51:44 -07:00
2009-08-03 21:48:22 +02:00
uint16 i;
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Alterac Valley: entering state STATUS_WAIT_JOIN ...");
2009-08-03 21:48:22 +02:00
// Initial Nodes
2009-10-17 16:20:24 -07:00
for (i = 0; i < BG_AV_OBJECT_MAX; i++)
2009-08-03 21:48:22 +02:00
SpawnBGObject(i, RESPAWN_ONE_DAY);
2009-10-17 16:20:24 -07:00
for (i = BG_AV_OBJECT_FLAG_A_FIRSTAID_STATION; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_GRAVE ; i++){
2011-04-29 20:47:02 +02:00
SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+3*i, RESPAWN_IMMEDIATELY);
2009-08-03 21:48:22 +02:00
SpawnBGObject(i, RESPAWN_IMMEDIATELY);
}
2009-10-17 16:20:24 -07:00
for (i = BG_AV_OBJECT_FLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER ; i++)
2009-08-03 21:48:22 +02:00
SpawnBGObject(i, RESPAWN_IMMEDIATELY);
2009-10-17 16:20:24 -07:00
for (i = BG_AV_OBJECT_FLAG_H_ICEBLOOD_GRAVE; i <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER ; i++){
2009-08-03 21:48:22 +02:00
SpawnBGObject(i, RESPAWN_IMMEDIATELY);
2010-04-07 23:56:35 +02:00
if (i <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT)
2011-04-29 20:47:02 +02:00
SpawnBGObject(BG_AV_OBJECT_AURA_H_FIRSTAID_STATION+3*GetNodeThroughObject(i), RESPAWN_IMMEDIATELY);
2009-08-03 21:48:22 +02:00
}
2009-10-17 16:20:24 -07:00
for (i = BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_TFLAG_A_STONEHEART_BUNKER; i+=2)
2009-08-03 21:48:22 +02:00
{
SpawnBGObject(i, RESPAWN_IMMEDIATELY); //flag
SpawnBGObject(i+16, RESPAWN_IMMEDIATELY); //aura
}
2009-10-17 16:20:24 -07:00
for (i = BG_AV_OBJECT_TFLAG_H_ICEBLOOD_TOWER; i <= BG_AV_OBJECT_TFLAG_H_FROSTWOLF_WTOWER; i+=2)
2009-08-03 21:48:22 +02:00
{
SpawnBGObject(i, RESPAWN_IMMEDIATELY); //flag
SpawnBGObject(i+16, RESPAWN_IMMEDIATELY); //aura
}
//snowfall and the doors
2009-10-17 16:20:24 -07:00
for (i = BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE; i <= BG_AV_OBJECT_DOOR_A; i++)
2009-08-03 21:48:22 +02:00
SpawnBGObject(i, RESPAWN_IMMEDIATELY);
2011-04-29 20:47:02 +02:00
SpawnBGObject(BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY);
2009-10-17 15:51:44 -07:00
2009-08-03 21:48:22 +02:00
//creatures
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV start poputlating nodes");
2010-04-07 22:59:46 +02:00
for (BG_AV_Nodes i= BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i)
2009-08-03 21:48:22 +02:00
{
2010-04-07 19:14:10 +02:00
if (m_Nodes[i].Owner)
2009-08-03 21:48:22 +02:00
PopulateNode(i);
}
//all creatures which don't get despawned through the script are static
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV: start spawning static creatures");
2010-04-07 22:59:46 +02:00
for (i=0; i < AV_STATICCPLACE_MAX; i++)
2011-04-29 20:47:02 +02:00
AddAVCreature(0, i+AV_CPLACE_MAX);
2009-08-03 21:48:22 +02:00
//mainspiritguides:
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV: start spawning spiritguides creatures");
2009-08-03 21:48:22 +02:00
AddSpiritGuide(7, BG_AV_CreaturePos[7][0], BG_AV_CreaturePos[7][1], BG_AV_CreaturePos[7][2], BG_AV_CreaturePos[7][3], ALLIANCE);
AddSpiritGuide(8, BG_AV_CreaturePos[8][0], BG_AV_CreaturePos[8][1], BG_AV_CreaturePos[8][2], BG_AV_CreaturePos[8][3], HORDE);
//spawn the marshals (those who get deleted, if a tower gets destroyed)
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BG_AV: start spawning marshal creatures");
2010-04-07 23:56:35 +02:00
for (i=AV_NPC_A_MARSHAL_SOUTH; i <= AV_NPC_H_MARSHAL_WTOWER; i++)
2011-04-29 20:47:02 +02:00
AddAVCreature(i, AV_CPLACE_A_MARSHAL_SOUTH+(i-AV_NPC_A_MARSHAL_SOUTH));
AddAVCreature(AV_NPC_HERALD, AV_CPLACE_HERALD);
return true;
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
const char* BattlegroundAV::GetNodeName(BG_AV_Nodes node)
{
switch (node)
{
case BG_AV_NODES_FIRSTAID_STATION: return GetTrinityString(LANG_BG_AV_NODE_GRAVE_STORM_AID);
case BG_AV_NODES_DUNBALDAR_SOUTH: return GetTrinityString(LANG_BG_AV_NODE_TOWER_DUN_S);
case BG_AV_NODES_DUNBALDAR_NORTH: return GetTrinityString(LANG_BG_AV_NODE_TOWER_DUN_N);
case BG_AV_NODES_STORMPIKE_GRAVE: return GetTrinityString(LANG_BG_AV_NODE_GRAVE_STORMPIKE);
case BG_AV_NODES_ICEWING_BUNKER: return GetTrinityString(LANG_BG_AV_NODE_TOWER_ICEWING);
case BG_AV_NODES_STONEHEART_GRAVE: return GetTrinityString(LANG_BG_AV_NODE_GRAVE_STONE);
case BG_AV_NODES_STONEHEART_BUNKER: return GetTrinityString(LANG_BG_AV_NODE_TOWER_STONE);
case BG_AV_NODES_SNOWFALL_GRAVE: return GetTrinityString(LANG_BG_AV_NODE_GRAVE_SNOW);
case BG_AV_NODES_ICEBLOOD_TOWER: return GetTrinityString(LANG_BG_AV_NODE_TOWER_ICE);
case BG_AV_NODES_ICEBLOOD_GRAVE: return GetTrinityString(LANG_BG_AV_NODE_GRAVE_ICE);
case BG_AV_NODES_TOWER_POINT: return GetTrinityString(LANG_BG_AV_NODE_TOWER_POINT);
case BG_AV_NODES_FROSTWOLF_GRAVE: return GetTrinityString(LANG_BG_AV_NODE_GRAVE_FROST);
case BG_AV_NODES_FROSTWOLF_ETOWER: return GetTrinityString(LANG_BG_AV_NODE_TOWER_FROST_E);
case BG_AV_NODES_FROSTWOLF_WTOWER: return GetTrinityString(LANG_BG_AV_NODE_TOWER_FROST_W);
case BG_AV_NODES_FROSTWOLF_HUT: return GetTrinityString(LANG_BG_AV_NODE_GRAVE_FROST_HUT);
default:
2011-04-29 20:47:02 +02:00
sLog->outError("tried to get name for node %u", node);
break;
}
2010-11-11 13:40:52 +01:00
return "Unknown";
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::AssaultNode(BG_AV_Nodes node, uint16 team)
{
2009-06-26 20:25:05 +02:00
if (m_Nodes[node].TotalOwner == team)
{
sLog->outCrash("Assaulting team is TotalOwner of node");
ASSERT (false);
2009-06-26 20:25:05 +02:00
}
if (m_Nodes[node].Owner == team)
{
sLog->outCrash("Assaulting team is owner of node");
ASSERT (false);
2009-06-26 20:25:05 +02:00
}
if (m_Nodes[node].State == POINT_DESTROYED)
{
sLog->outCrash("Destroyed node is being assaulted");
ASSERT (false);
2009-06-26 20:25:05 +02:00
}
if (m_Nodes[node].State == POINT_ASSAULTED && m_Nodes[node].TotalOwner) //only assault an assaulted node if no totalowner exists
{
sLog->outCrash("Assault on an not assaulted node with total owner");
ASSERT (false);
2009-06-26 20:25:05 +02:00
}
2010-04-07 23:25:02 +02:00
//the timer gets another time, if the previous owner was 0 == Neutral
m_Nodes[node].Timer = (m_Nodes[node].PrevOwner)? BG_AV_CAPTIME : BG_AV_SNOWFALL_FIRSTCAP;
m_Nodes[node].PrevOwner = m_Nodes[node].Owner;
m_Nodes[node].Owner = team;
m_Nodes[node].PrevState = m_Nodes[node].State;
m_Nodes[node].State = POINT_ASSAULTED;
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::DestroyNode(BG_AV_Nodes node)
{
ASSERT(m_Nodes[node].State == POINT_ASSAULTED);
2009-10-17 15:51:44 -07:00
m_Nodes[node].TotalOwner = m_Nodes[node].Owner;
m_Nodes[node].PrevOwner = m_Nodes[node].Owner;
m_Nodes[node].PrevState = m_Nodes[node].State;
m_Nodes[node].State = (m_Nodes[node].Tower)? POINT_DESTROYED : POINT_CONTROLED;
m_Nodes[node].Timer = 0;
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::InitNode(BG_AV_Nodes node, uint16 team, bool tower)
{
m_Nodes[node].TotalOwner = team;
m_Nodes[node].Owner = team;
m_Nodes[node].PrevOwner = 0;
m_Nodes[node].State = POINT_CONTROLED;
m_Nodes[node].PrevState = m_Nodes[node].State;
m_Nodes[node].State = POINT_CONTROLED;
m_Nodes[node].Timer = 0;
m_Nodes[node].Tower = tower;
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::DefendNode(BG_AV_Nodes node, uint16 team)
{
ASSERT(m_Nodes[node].TotalOwner == team);
ASSERT(m_Nodes[node].Owner != team);
ASSERT(m_Nodes[node].State != POINT_CONTROLED && m_Nodes[node].State != POINT_DESTROYED);
m_Nodes[node].PrevOwner = m_Nodes[node].Owner;
m_Nodes[node].Owner = team;
m_Nodes[node].PrevState = m_Nodes[node].State;
m_Nodes[node].State = POINT_CONTROLED;
m_Nodes[node].Timer = 0;
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV::ResetBGSubclass()
{
m_MaxLevel=0;
2010-04-07 23:25:02 +02:00
for (uint8 i=0; i<2; i++) //forloop for both teams (it just make 0 == alliance and 1 == horde also for both mines 0=north 1=south
{
2009-10-17 16:20:24 -07:00
for (uint8 j=0; j<9; j++)
m_Team_QuestStatus[i][j]=0;
2009-02-09 08:16:34 -05:00
m_Team_Scores[i]=BG_AV_SCORE_INITIAL_POINTS;
m_IsInformedNearVictory[i]=false;
m_CaptainAlive[i] = true;
2011-04-29 20:47:02 +02:00
m_CaptainBuffTimer[i] = 120000 + urand(0, 4)* 60; //as far as i could see, the buff is randomly so i make 2minutes (thats the duration of the buff itself) + 0-4minutes TODO get the right times
m_Mine_Owner[i] = AV_NEUTRAL_TEAM;
m_Mine_PrevOwner[i] = m_Mine_Owner[i];
}
2009-10-17 16:20:24 -07:00
for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_STONEHEART_GRAVE; ++i) //alliance graves
2011-04-29 20:47:02 +02:00
InitNode(i, ALLIANCE, false);
2009-10-17 16:20:24 -07:00
for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) //alliance towers
2011-04-29 20:47:02 +02:00
InitNode(i, ALLIANCE, true);
2009-10-17 16:20:24 -07:00
for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_GRAVE; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) //horde graves
2011-04-29 20:47:02 +02:00
InitNode(i, HORDE, false);
2009-10-17 16:20:24 -07:00
for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) //horde towers
2011-04-29 20:47:02 +02:00
InitNode(i, HORDE, true);
InitNode(BG_AV_NODES_SNOWFALL_GRAVE, AV_NEUTRAL_TEAM, false); //give snowfall neutral owner
2009-10-17 15:51:44 -07:00
m_Mine_Timer=AV_MINE_TICK_TIMER;
2009-10-17 16:20:24 -07:00
for (uint16 i = 0; i < AV_CPLACE_MAX+AV_STATICCPLACE_MAX; i++)
2010-04-07 19:14:10 +02:00
if (m_BgCreatures[i])
DelCreature(i);
2009-10-17 15:51:44 -07:00
}