2010-10-07 15:35:36 +02:00
/*
* Copyright (C) 2008-2010 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"
2009-03-08 13:05:56 -06:00
#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
{
2008-11-21 19:45:49 -06: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
{
2008-11-21 19:45:49 -06: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)
2008-11-21 19:45:49 -06:00
{
return Trinity :: Honor :: hk_honor_at_level ( m_MaxLevel , kills );
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV :: HandleKillPlayer ( Player * player , Player * killer )
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( GetStatus () != STATUS_IN_PROGRESS )
2008-11-21 19:45:49 -06:00
return ;
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
Battleground :: HandleKillPlayer ( player , killer );
2009-02-09 08:16:34 -05:00
UpdateScore ( player -> GetTeam (), - 1 );
2008-11-21 19:45:49 -06:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV :: HandleKillUnit ( Creature * unit , Player * killer )
2008-11-21 19:45:49 -06:00
{
sLog . outDebug ( "bg_av HandleKillUnit %i" , unit -> GetEntry ());
2010-04-07 19:14:10 +02:00
if ( GetStatus () != STATUS_IN_PROGRESS )
2008-11-21 19:45:49 -06:00
return ;
uint32 entry = unit -> GetEntry ();
2010-05-12 21:34:07 +02:00
/*
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 ])
2008-11-21 19:45:49 -06: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 );
2010-05-12 21:34:07 +02:00
DelCreature ( AV_CPLACE_TRIGGER17 );
2008-11-21 19:45:49 -06:00
}
2010-04-07 22:59:46 +02:00
else if ( entry == BG_AV_CreatureInfo [ AV_NPC_H_BOSS ][ 0 ])
2008-11-21 19:45:49 -06: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 );
2010-05-12 21:34:07 +02:00
DelCreature ( AV_CPLACE_TRIGGER19 );
2008-11-21 19:45:49 -06:00
}
2010-04-07 19:14:10 +02:00
else if ( entry == BG_AV_CreatureInfo [ AV_NPC_A_CAPTAIN ][ 0 ])
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( ! m_CaptainAlive [ 0 ])
2008-11-21 19:45:49 -06:00
{
sLog . outError ( "Killed a Captain twice, please report this bug, if you haven't done \" .respawn \" " );
return ;
}
m_CaptainAlive [ 0 ] = false ;
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 ++ )
2008-11-21 19:45:49 -06: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 )
2008-11-21 19:45:49 -06:00
YellToAll ( creature , GetTrinityString ( LANG_BG_AV_A_CAPTAIN_DEAD ), LANG_UNIVERSAL );
2010-05-12 21:34:07 +02:00
DelCreature ( AV_CPLACE_TRIGGER16 );
2008-11-21 19:45:49 -06:00
}
2010-04-07 22:59:46 +02:00
else if ( entry == BG_AV_CreatureInfo [ AV_NPC_H_CAPTAIN ][ 0 ])
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( ! m_CaptainAlive [ 1 ])
2008-11-21 19:45:49 -06:00
{
sLog . outError ( "Killed a Captain twice, please report this bug, if you haven't done \" .respawn \" " );
return ;
}
m_CaptainAlive [ 1 ] = false ;
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 ++ )
2008-11-21 19:45:49 -06: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 )
2008-11-21 19:45:49 -06:00
YellToAll ( creature , GetTrinityString ( LANG_BG_AV_H_CAPTAIN_DEAD ), LANG_UNIVERSAL );
2010-05-12 21:34:07 +02:00
DelCreature ( AV_CPLACE_TRIGGER18 );
2008-11-21 19:45:49 -06:00
}
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 ])
2008-11-21 19:45:49 -06: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 ])
2008-11-21 19:45:49 -06:00
ChangeMineOwner ( AV_SOUTH_MINE , killer -> GetTeam ());
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV :: HandleQuestComplete ( uint32 questid , Player * player )
2008-11-21 19:45:49 -06:00
{
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
2009-01-15 22:01:47 -05:00
sLog . outDebug ( "BG_AV Quest %i completed" , questid );
2008-11-21 19:45:49 -06:00
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 ;
2010-04-07 19:14:10 +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
2008-11-21 19:45:49 -06:00
{
sLog . outDebug ( "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 ] ++ ;
RewardReputationToTeam ( team , 1 , player -> GetTeam ());
2010-04-07 19:14:10 +02:00
if ( m_Team_QuestStatus [ team ][ 1 ] == 30 )
2008-11-21 19:45:49 -06:00
sLog . outDebug ( "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 ] ++ ;
RewardReputationToTeam ( team , 1 , player -> GetTeam ());
2010-04-07 19:14:10 +02:00
if ( m_Team_QuestStatus [ team ][ 2 ] == 60 )
2008-11-21 19:45:49 -06:00
sLog . outDebug ( "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 ] ++ ;
RewardReputationToTeam ( team , 1 , player -> GetTeam ());
2010-04-07 19:14:10 +02:00
if ( m_Team_QuestStatus [ team ][ 1 ] == 120 )
2008-11-21 19:45:49 -06:00
sLog . outDebug ( "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 )
2008-11-21 19:45:49 -06:00
sLog . outDebug ( "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 )
2008-11-21 19:45:49 -06:00
{
sLog . outDebug ( "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 )
2008-11-21 19:45:49 -06:00
sLog . outDebug ( "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 )
2008-11-21 19:45:49 -06:00
{
sLog . outDebug ( "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 )
2008-11-21 19:45:49 -06:00
sLog . outDebug ( "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 )
2008-11-21 19:45:49 -06:00
{
sLog . outDebug ( "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 )
2008-11-21 19:45:49 -06:00
sLog . outDebug ( "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 )
2008-11-21 19:45:49 -06:00
{
sLog . outDebug ( "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 )
2008-11-21 19:45:49 -06:00
sLog . outDebug ( "BG_AV Quest %i completed (need to implement some events here - rider assault ready" , questid );
}
break ;
default :
sLog . outDebug ( "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 )
2008-11-21 19:45:49 -06:00
{ //note: to remove reinforcementpoints points must be negative, for adding reinforcements points must be positive
2010-07-30 20:04:28 +02:00
ASSERT ( team == ALLIANCE || team == HORDE );
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
{
2010-04-07 22:59:46 +02:00
if ( m_Team_Scores [ teamindex ] < 1 )
2008-11-21 19:45:49 -06:00
{
m_Team_Scores [ teamindex ] = 0 ;
2010-08-08 04:37:24 +02:00
EndBattleground ((( teamindex == BG_TEAM_HORDE ) ? ALLIANCE : HORDE ));
2008-11-21 19:45:49 -06:00
}
2010-04-07 19:14:10 +02:00
else if ( ! m_IsInformedNearVictory [ teamindex ] && m_Team_Scores [ teamindex ] < SEND_MSG_NEAR_LOSE )
2008-11-21 19:45:49 -06:00
{
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 );
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
{
2009-11-01 17:53:07 -08:00
uint8 level ;
bool isStatic = false ;
2008-11-21 19:45:49 -06:00
Creature * creature = NULL ;
2010-07-30 20:04:28 +02:00
ASSERT ( type <= AV_CPLACE_MAX + AV_STATICCPLACE_MAX );
2009-11-01 17:53:07 -08:00
if ( type >= AV_CPLACE_MAX ) //static
2008-11-21 19:45:49 -06:00
{
2009-11-01 17:53:07 -08:00
type -= AV_CPLACE_MAX ;
cinfoid = uint16 ( BG_AV_StaticCreaturePos [ type ][ 4 ]);
2008-11-21 19:45:49 -06: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 ]);
2009-11-01 17:53:07 -08:00
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 ;
2008-11-21 19:45:49 -06:00
}
else
{
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 ]);
2009-11-01 17:53:07 -08:00
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 ]);
2008-11-21 19:45:49 -06:00
}
2009-11-01 17:53:07 -08:00
if ( ! creature )
2008-11-21 19:45:49 -06:00
return NULL ;
2009-11-01 17:53:07 -08:00
if ( creature -> GetEntry () == BG_AV_CreatureInfo [ AV_NPC_A_CAPTAIN ][ 0 ] || creature -> GetEntry () == BG_AV_CreatureInfo [ AV_NPC_H_CAPTAIN ][ 0 ])
2008-11-21 19:45:49 -06:00
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 ) ||
2009-11-01 17:53:07 -08:00
( cinfoid >= AV_NPC_H_GRAVEDEFENSE0 && cinfoid <= AV_NPC_H_GRAVEDEFENSE3 ))))
2008-11-21 19:45:49 -06:00
{
2010-04-07 23:56:35 +02:00
if ( ! isStatic && (( cinfoid >= AV_NPC_A_GRAVEDEFENSE0 && cinfoid <= AV_NPC_A_GRAVEDEFENSE3 )
2009-11-01 17:53:07 -08:00
|| ( cinfoid >= AV_NPC_H_GRAVEDEFENSE0 && cinfoid <= AV_NPC_H_GRAVEDEFENSE3 )))
2008-11-21 19:45:49 -06:00
{
2010-08-08 05:25:45 +02:00
CreatureData & data = sObjectMgr . NewOrExistCreatureData ( creature -> GetDBTableGUIDLow ());
2009-11-01 17:53:07 -08:00
data . spawndist = 5 ;
2008-11-21 19:45:49 -06:00
}
//else spawndist will be 15, so creatures move maximum=10
2008-12-19 16:05:13 -06:00
//creature->SetDefaultMovementType(RANDOM_MOTION_TYPE);
2008-11-21 19:45:49 -06:00
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
2009-11-01 17:53:07 -08:00
if ( level != 0 )
level += m_MaxLevel - 60 ; //maybe we can do this more generic for custom level-range.. actually it's blizzlike
2008-11-21 19:45:49 -06:00
creature -> SetLevel ( level );
2010-05-12 21:34:07 +02:00
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 ;
}
2010-08-08 19:45:53 +02:00
else if ( creature -> GetEntry () == BG_AV_CreatureInfo [ AV_NPC_H_CAPTAIN ][ 0 ])
2010-05-12 21:34:07 +02:00
{
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 )
{
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 );
2010-08-08 19:45:53 +02:00
}
2010-05-12 21:34:07 +02:00
}
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
{
2010-04-07 23:56:35 +02:00
for ( uint8 i = 0 ; i <= 1 ; i ++ ) //0=alliance, 1=horde
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( ! m_CaptainAlive [ i ])
2008-11-21 19:45:49 -06:00
continue ;
2010-04-07 19:14:10 +02:00
if ( m_CaptainBuffTimer [ i ] > diff )
2008-11-21 19:45:49 -06:00
m_CaptainBuffTimer [ i ] -= diff ;
else
{
2010-04-07 23:25:02 +02:00
if ( i == 0 )
2008-11-21 19:45:49 -06:00
{
CastSpellOnTeam ( AV_BUFF_A_CAPTAIN , ALLIANCE );
Creature * creature = GetBGCreature ( AV_CPLACE_MAX + 61 );
2010-04-07 19:14:10 +02:00
if ( creature )
2008-11-21 19:45:49 -06:00
YellToAll ( creature , LANG_BG_AV_A_CAPTAIN_BUFF , LANG_COMMON );
}
else
{
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 )
2008-11-21 19:45:49 -06:00
YellToAll ( creature , LANG_BG_AV_H_CAPTAIN_BUFF , LANG_ORCISH );
}
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 ++ )
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( m_Mine_Owner [ mine ] == ALLIANCE || m_Mine_Owner [ mine ] == HORDE )
2008-11-21 19:45:49 -06:00
{
2010-04-07 22:59:46 +02:00
if ( m_Mine_Timer <= 0 )
2008-11-21 19:45:49 -06: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 )
2008-11-21 19:45:49 -06:00
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
ChangeMineOwner ( mine , AV_NEUTRAL_TEAM );
}
}
}
2010-04-07 22:59:46 +02:00
if ( m_Mine_Timer <= 0 )
2008-11-21 19:45:49 -06:00
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
2008-11-21 19:45:49 -06: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
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( m_Nodes [ i ]. Timer > diff )
2008-11-21 19:45:49 -06:00
m_Nodes [ i ]. Timer -= diff ;
else
2010-04-07 22:59:46 +02:00
EventPlayerDestroyedPoint ( i );
2008-11-21 19:45:49 -06: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 :: StartingEventCloseDoors ()
2009-03-07 12:05:30 -06:00
{
2009-08-03 21:48:22 +02:00
DoorClose ( BG_AV_OBJECT_DOOR_A );
DoorClose ( BG_AV_OBJECT_DOOR_H );
2009-03-07 12:05:30 -06:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV :: StartingEventOpenDoors ()
2009-03-07 12:05:30 -06:00
{
2009-08-03 21:48:22 +02:00
sLog . outDebug ( "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 ++ )
2009-08-03 21:48:22 +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 ++ )
2009-08-03 21:48:22 +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
2009-08-03 21:48:22 +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-03-07 12:05:30 -06:00
}
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 )
2008-11-21 19:45:49 -06:00
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
{
2008-11-21 19:45:49 -06:00
//calculate bonuskills for both teams:
//first towers:
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 )
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( m_Nodes [ i ]. State == POINT_CONTROLED )
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( m_Nodes [ i ]. Owner == ALLIANCE )
2008-11-21 19:45:49 -06:00
{
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
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( m_CaptainAlive [ i ])
2008-11-21 19:45:49 -06:00
{
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 )
2008-11-21 19:45:49 -06:00
RewardReputationToTeam (( i == 0 ) ? 730 : 729 , rep [ i ],( i == 0 ) ? ALLIANCE : HORDE );
2010-04-07 19:14:10 +02:00
if ( kills [ i ] != 0 )
2008-11-21 19:45:49 -06:00
RewardHonorToTeam ( GetBonusHonor ( kills [ i ]),( i == 0 ) ? ALLIANCE : HORDE );
}
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06:00
//TODO add enterevademode for all attacking creatures
2010-08-08 04:37:24 +02:00
Battleground :: EndBattleground ( winner );
2008-11-21 19:45:49 -06:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV :: RemovePlayer ( Player * plr , uint64 /*guid*/ )
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( ! plr )
2008-11-21 19:45:49 -06:00
{
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.
2009-04-08 16:33:46 -05:00
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 )
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
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 :
2008-11-21 19:45:49 -06:00
sLog . outDebug ( "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
2009-04-08 16:33:46 -05: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 ;
2010-08-07 18:31:06 +02:00
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 ;
2010-08-07 18:31:06 +02:00
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 ;
2010-08-07 18:31:06 +02:00
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 ;
2010-08-07 18:31:06 +02:00
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 :
2010-08-08 04:37:24 +02:00
Battleground :: UpdatePlayerScore ( Source , type , value , doAddHonor );
2008-10-02 16:23:55 -05:00
break ;
}
}
2008-11-21 19:45:49 -06:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV :: EventPlayerDestroyedPoint ( BG_AV_Nodes node )
2008-11-21 19:45:49 -06:00
{
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06:00
uint32 object = GetObjectThroughNode ( node );
sLog . outDebug ( "bg_av: player destroyed point node %i object %i" , node , object );
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06:00
//despawn banner
SpawnBGObject ( object , RESPAWN_ONE_DAY );
DestroyNode ( node );
UpdateNodeWorldState ( node );
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06:00
uint32 owner = m_Nodes [ node ]. Owner ;
2010-04-07 22:59:46 +02:00
if ( IsTower ( node ))
2008-11-21 19:45:49 -06:00
{
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 ])
2008-11-21 19:45:49 -06:00
DelCreature ( AV_CPLACE_A_MARSHAL_SOUTH + tmp );
else
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 ++ )
2008-11-21 19:45:49 -06:00
SpawnBGObject ( BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH + i + ( tmp * 10 ), RESPAWN_IMMEDIATELY );
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06:00
UpdateScore (( owner == ALLIANCE ) ? HORDE : ALLIANCE , ( - 1 ) * BG_AV_RES_TOWER );
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
2008-11-21 19:45:49 -06: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 )
2008-11-21 19:45:49 -06:00
SpawnBGObject ( object - 11 , RESPAWN_IMMEDIATELY );
else
SpawnBGObject ( object + 11 , RESPAWN_IMMEDIATELY );
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
2008-11-21 19:45:49 -06:00
{
2009-10-17 16:20:24 -07:00
for ( uint8 i = 0 ; i < 4 ; i ++ )
2008-11-21 19:45:49 -06:00
{
2010-04-07 23:25: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 );
2008-11-21 19:45:49 -06:00
}
}
}
//send a nice message to all :)
char buf [ 256 ];
2010-04-07 19:14:10 +02:00
if ( IsTower ( node ))
2010-04-07 22:59:46 +02:00
sprintf ( buf , GetTrinityString ( LANG_BG_AV_TOWER_TAKEN ) , GetNodeName ( node ),( owner == ALLIANCE ) ? GetTrinityString ( LANG_BG_AV_ALLY ) : GetTrinityString ( LANG_BG_AV_HORDE ));
2008-11-21 19:45:49 -06:00
else
2010-04-07 22:59:46 +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
2008-11-21 19:45:49 -06:00
Creature * creature = GetBGCreature ( AV_CPLACE_HERALD );
2010-04-07 19:14:10 +02:00
if ( creature )
2008-11-21 19:45:49 -06: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 )
2008-11-21 19:45:49 -06:00
{ //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
2010-07-30 20:04:28 +02:00
ASSERT ( mine == AV_NORTH_MINE || mine == AV_SOUTH_MINE );
2010-04-07 19:14:10 +02:00
if ( team != ALLIANCE && team != HORDE )
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
{
sLog . outDebug ( "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 ])
2008-11-21 19:45:49 -06:00
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 ])
2008-11-21 19:45:49 -06:00
DelCreature ( i ); //TODO here also
}
SendMineWorldStates ( mine );
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06:00
sLog . outDebug ( "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 )
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( team == ALLIANCE )
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
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 ( "spawning vermin" );
2010-04-07 19:14:10 +02:00
if ( team == ALLIANCE )
2008-11-21 19:45:49 -06:00
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 ++ )
2008-11-21 19:45:49 -06: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 ++ )
2008-11-21 19:45:49 -06: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 ++ )
2008-11-21 19:45:49 -06:00
AddAVCreature ( miner + ( urand ( 1 , 2 )), i );
2010-04-07 23:25:02 +02:00
AddAVCreature ( miner + 3 ,( mine == AV_NORTH_MINE ) ? AV_CPLACE_MINE_N_3 : AV_CPLACE_MINE_S_3 );
2008-11-21 19:45:49 -06:00
//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++)
2008-11-21 19:45:49 -06:00
// {
//TODO: add gameobject-update code
// }
2010-04-07 19:14:10 +02:00
if ( team == ALLIANCE || team == HORDE )
2008-11-21 19:45:49 -06:00
{
m_Mine_Reclaim_Timer [ mine ] = AV_MINE_RECLAIM_TIMER ;
2009-02-09 08:16:34 -05:00
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 ));
2008-11-21 19:45:49 -06:00
Creature * creature = GetBGCreature ( AV_CPLACE_HERALD );
2010-04-07 19:14:10 +02:00
if ( creature )
2008-11-21 19:45:49 -06: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
2008-11-21 19:45:49 -06:00
{
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
2010-08-08 04:37:24 +02:00
bool BattlegroundAV :: PlayerCanDoMineQuest ( int32 GOId , uint32 team )
2008-11-21 19:45:49 -06:00
{
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 );
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
{
uint32 owner = m_Nodes [ node ]. Owner ;
2010-07-30 20:04:28 +02:00
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 );
2008-11-21 19:45:49 -06:00
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 ;
2008-11-21 19:45:49 -06:00
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 ;
2008-11-21 19:45:49 -06:00
else
2010-04-07 22:59:46 +02:00
creatureid = ( owner == ALLIANCE ) ? AV_NPC_A_GRAVEDEFENSE3 : AV_NPC_H_GRAVEDEFENSE3 ;
2008-11-21 19:45:49 -06:00
//spiritguide
2010-04-07 22:59:46 +02:00
if ( m_BgCreatures [ node ])
2008-11-21 19:45:49 -06:00
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 ))
2008-11-21 19:45:49 -06:00
sLog . outError ( "AV: couldn't spawn spiritguide at node %i" , node );
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06:00
}
2009-10-17 16:20:24 -07:00
for ( uint8 i = 0 ; i < 4 ; i ++ )
2010-04-19 09:26:37 +02:00
AddAVCreature ( creatureid , c_place + i );
2010-05-12 21:34:07 +02:00
if ( node >= BG_AV_NODES_MAX ) //fail safe
return ;
Creature * trigger = GetBGCreature ( node + 302 ); //0-302 other creatures
if ( ! trigger )
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 );
}
2008-11-21 19:45:49 -06:00
}
2010-08-08 04:37:24 +02:00
void BattlegroundAV :: DePopulateNode ( BG_AV_Nodes node )
2008-11-21 19:45:49 -06:00
{
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 ])
2008-11-21 19:45:49 -06:00
DelCreature ( c_place + i );
//spiritguide
2010-04-07 22:59:46 +02:00
if ( ! IsTower ( node ) && m_BgCreatures [ node ])
2008-11-21 19:45:49 -06:00
DelCreature ( node );
2010-05-12 21:34:07 +02:00
2010-08-08 19:45:53 +02:00
//remove bonus honor aura trigger creature when node is lost
2010-05-12 21:34:07 +02:00
if ( node < BG_AV_NODES_MAX ) //fail safe
DelCreature ( node + 302 ); //NULL checks are in DelCreature! 0-302 spirit guides
2008-11-21 19:45:49 -06:00
}
2010-08-30 15:25:15 +02:00
BG_AV_Nodes BattlegroundAV :: GetNodeThroughObject ( uint32 object )
2008-11-21 19:45:49 -06:00
{
sLog . outDebug ( "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 ;
2010-08-08 04:37:24 +02:00
sLog . outError ( "BattlegroundAV: ERROR! GetPlace got a wrong object :(" );
2010-07-30 20:04:28 +02:00
ASSERT ( false );
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
{ //this function is the counterpart to GetNodeThroughObject()
sLog . outDebug ( "bg_AV GetObjectThroughNode %i" , node );
2010-04-07 22:59:46 +02:00
if ( m_Nodes [ node ]. Owner == ALLIANCE )
2008-11-21 19:45:49 -06:00
{
2010-04-07 22:59:46 +02:00
if ( m_Nodes [ node ]. State == POINT_ASSAULTED )
2008-11-21 19:45:49 -06:00
{
2010-04-07 22:59:46 +02:00
if ( node <= BG_AV_NODES_FROSTWOLF_HUT )
2008-11-21 19:45:49 -06:00
return node + 11 ;
2010-04-07 22:59:46 +02:00
if ( node >= BG_AV_NODES_ICEBLOOD_TOWER && node <= BG_AV_NODES_FROSTWOLF_WTOWER )
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
return node ;
}
2010-04-07 22:59:46 +02:00
else if ( m_Nodes [ node ]. Owner == HORDE )
2008-11-21 19:45:49 -06:00
{
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 )
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
{
2010-04-07 22:59:46 +02:00
if ( node <= BG_AV_NODES_FROSTWOLF_HUT )
2008-11-21 19:45:49 -06:00
return node + 33 ;
2010-04-07 22:59:46 +02:00
if ( node >= BG_AV_NODES_ICEBLOOD_TOWER && node <= BG_AV_NODES_FROSTWOLF_WTOWER )
2008-11-21 19:45:49 -06:00
return node + 29 ;
}
}
2010-04-07 22:59:46 +02:00
else if ( m_Nodes [ node ]. Owner == AV_NEUTRAL_TEAM )
2008-11-21 19:45:49 -06:00
return BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE ;
2010-08-08 04:37:24 +02:00
sLog . outError ( "BattlegroundAV: Error! GetPlaceNode couldn't resolve node %i" , node );
2010-07-30 20:04:28 +02:00
ASSERT ( false );
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( GetStatus () != STATUS_IN_PROGRESS )
2008-11-21 19:45:49 -06:00
return ;
int32 object = GetObjectType ( target_obj -> GetGUID ());
sLog . outDebug ( "BG_AV using gameobject %i with type %i" , target_obj -> GetEntry (), object );
2010-04-07 19:14:10 +02:00
if ( object < 0 )
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
{
2010-07-30 20:04:28 +02:00
ASSERT ( GetStatus () == STATUS_IN_PROGRESS );
2008-11-21 19:45:49 -06:00
BG_AV_Nodes node = GetNodeThroughObject ( object );
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06: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 )
2008-11-21 19:45:49 -06:00
return ;
2010-04-07 19:14:10 +02:00
if ( m_Nodes [ node ]. TotalOwner == AV_NEUTRAL_TEAM )
2008-11-21 19:45:49 -06:00
{ //until snowfall doesn't belong to anyone it is better handled in assault-code
2010-07-30 20:04:28 +02:00
ASSERT ( node == BG_AV_NODES_SNOWFALL_GRAVE ); //currently the only neutral grave
2008-11-21 19:45:49 -06:00
EventPlayerAssaultsPoint ( player , object );
return ;
}
sLog . outDebug ( "player defends point object: %i node: %i" , object , node );
2010-04-07 19:14:10 +02:00
if ( m_Nodes [ node ]. PrevOwner != team )
2008-11-21 19:45:49 -06: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 )
2008-11-21 19:45:49 -06:00
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 ))
2008-11-21 19:45:49 -06: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
2008-11-21 19:45:49 -06:00
DefendNode ( node , team );
2009-02-09 08:16:34 -05:00
PopulateNode ( node );
2008-11-21 19:45:49 -06:00
UpdateNodeWorldState ( node );
2009-10-17 15:51:44 -07:00
2010-04-07 19:14:10 +02:00
if ( IsTower ( node ))
2008-11-21 19:45:49 -06:00
{
//spawn big flag+aura on top of tower
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
2008-11-21 19:45:49 -06:00
{
2009-10-17 16:20:24 -07:00
for ( uint8 i = 0 ; i < 4 ; i ++ )
2008-11-21 19:45:49 -06:00
{
2010-04-07 23:25: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 );
2008-11-21 19:45:49 -06:00
}
}
2009-02-09 08:16:34 -05:00
//send a nice message to all :)
char buf [ 256 ];
2010-04-07 22:59:46 +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 ));
2008-11-21 19:45:49 -06:00
Creature * creature = GetBGCreature ( AV_CPLACE_HERALD );
2010-04-07 19:14:10 +02:00
if ( creature )
2008-11-21 19:45:49 -06: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 ))
2008-11-21 19:45:49 -06:00
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 );
2008-11-21 19:45:49 -06:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV :: EventPlayerAssaultsPoint ( Player * player , uint32 object )
2008-11-21 19:45:49 -06:00
{
2010-07-30 20:04:28 +02:00
ASSERT ( GetStatus () == STATUS_IN_PROGRESS );
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06:00
BG_AV_Nodes node = GetNodeThroughObject ( object );
uint32 owner = m_Nodes [ node ]. Owner ; //maybe name it prevowner
uint32 team = player -> GetTeam ();
sLog . outDebug ( "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 )
2008-11-21 19:45:49 -06:00
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
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( object == BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE ) //initial capping
2008-11-21 19:45:49 -06:00
{
2010-07-30 20:04:28 +02:00
ASSERT ( owner == AV_NEUTRAL_TEAM && m_Nodes [ node ]. TotalOwner == AV_NEUTRAL_TEAM );
2010-04-07 22:59:46 +02:00
if ( team == ALLIANCE )
2008-11-21 19:45:49 -06:00
SpawnBGObject ( BG_AV_OBJECT_FLAG_C_A_SNOWFALL_GRAVE , RESPAWN_IMMEDIATELY );
else
SpawnBGObject ( BG_AV_OBJECT_FLAG_C_H_SNOWFALL_GRAVE , RESPAWN_IMMEDIATELY );
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
2008-11-21 19:45:49 -06:00
{
2010-07-30 20:04:28 +02:00
ASSERT ( m_Nodes [ node ]. State != POINT_CONTROLED );
2010-04-07 19:14:10 +02:00
if ( team == ALLIANCE )
2008-11-21 19:45:49 -06:00
SpawnBGObject ( object - 11 , RESPAWN_IMMEDIATELY );
else
SpawnBGObject ( object + 11 , RESPAWN_IMMEDIATELY );
}
//eyecandy
uint32 spawn , despawn ;
2010-04-07 19:14:10 +02:00
if ( team == ALLIANCE )
2008-11-21 19:45:49 -06:00
{
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 ;
2008-11-21 19:45:49 -06:00
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 ;
2008-11-21 19:45:49 -06:00
spawn = BG_AV_OBJECT_SNOW_EYECANDY_PH ;
}
2009-10-17 16:20:24 -07:00
for ( uint8 i = 0 ; i < 4 ; i ++ )
2008-11-21 19:45:49 -06:00
{
SpawnBGObject ( despawn + i , RESPAWN_ONE_DAY );
SpawnBGObject ( spawn + i , RESPAWN_IMMEDIATELY );
}
}
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06: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 )
2008-11-21 19:45:49 -06:00
{
2010-07-30 20:04:28 +02:00
ASSERT ( m_Nodes [ node ]. Owner != AV_NEUTRAL_TEAM );
2010-04-07 19:14:10 +02:00
if ( team == ALLIANCE )
2008-11-21 19:45:49 -06:00
SpawnBGObject ( object - 22 , RESPAWN_IMMEDIATELY );
else
SpawnBGObject ( object + 22 , RESPAWN_IMMEDIATELY );
2010-04-07 19:14:10 +02:00
if ( IsTower ( node ))
2008-11-21 19:45:49 -06:00
{ //spawning/despawning of bigflag+aura
2010-04-07 23:25: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 );
2008-11-21 19:45:49 -06:00
}
else
{
//spawning/despawning of aura
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 ())
2008-11-21 19:45:49 -06:00
{
Player * plr ;
WorldSafeLocsEntry const * ClosestGrave = NULL ;
for ( std :: vector < uint64 >:: iterator itr = ghost_list . begin (); itr != ghost_list . end (); ++ itr )
{
2010-08-08 05:25:45 +02:00
plr = sObjectMgr . GetPlayer ( * ghost_list . begin ());
2010-04-07 22:59:46 +02:00
if ( ! plr )
2008-11-21 19:45:49 -06:00
continue ;
2010-04-07 19:14:10 +02:00
if ( ! ClosestGrave )
2009-08-28 15:48:33 +02:00
ClosestGrave = GetClosestGraveYard ( plr );
2008-11-21 19:45:49 -06:00
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
2008-11-21 19:45:49 -06:00
SpawnBGObject ( object , RESPAWN_ONE_DAY ); //delete old banner
AssaultNode ( node , team );
UpdateNodeWorldState ( node );
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06: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 ));
2008-11-21 19:45:49 -06:00
Creature * creature = GetBGCreature ( AV_CPLACE_HERALD );
2010-04-07 19:14:10 +02:00
if ( creature )
2008-11-21 19:45:49 -06: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 );
2008-11-21 19:45:49 -06:00
}
2009-10-17 15:51:44 -07:00
2010-08-08 04:37:24 +02:00
void BattlegroundAV :: FillInitialWorldStates ( WorldPacket & data )
2008-11-21 19:45:49 -06:00
{
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 );
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
2008-11-21 19:45:49 -06:00
//towers
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 ));
2008-11-21 19:45:49 -06: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
2008-11-21 19:45:49 -06:00
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
2008-11-21 19:45:49 -06:00
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
2008-11-21 19:45:49 -06:00
{
//neutral stuff cant get handled (currently its only snowfall)
2010-07-30 20:04:28 +02:00
ASSERT ( team != AV_NEUTRAL_TEAM );
2010-04-11 20:13:53 +02:00
//a_c a_a h_c h_a the positions in worldstate-array
2010-04-07 19:14:10 +02:00
if ( team == ALLIANCE )
2008-11-21 19:45:49 -06:00
{
2010-04-07 23:25:02 +02:00
if ( state == POINT_CONTROLED || state == POINT_DESTROYED )
2008-11-21 19:45:49 -06:00
return 0 ;
2010-04-07 23:25:02 +02:00
if ( state == POINT_ASSAULTED )
2008-11-21 19:45:49 -06:00
return 1 ;
}
2010-04-07 19:14:10 +02:00
if ( team == HORDE )
2008-11-21 19:45:49 -06:00
{
2010-04-07 23:25:02 +02:00
if ( state == POINT_DESTROYED || state == POINT_CONTROLED )
2008-11-21 19:45:49 -06:00
return 2 ;
2010-04-07 23:25:02 +02:00
if ( state == POINT_ASSAULTED )
2008-11-21 19:45:49 -06:00
return 3 ;
}
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 )
2008-11-21 19:45:49 -06: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
2008-11-21 19:45:49 -06:00
UpdateWorldState ( AV_SNOWFALL_N , 0 );
else
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 )
2008-11-21 19:45:49 -06:00
{
2010-07-30 20:04:28 +02:00
ASSERT ( mine == AV_NORTH_MINE || mine == AV_SOUTH_MINE );
2008-11-21 19:45:49 -06:00
// currently i'm sure, that this works (:
2010-07-30 20:04:28 +02:00
// 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
2008-11-21 19:45:49 -06: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 )
2008-11-21 19:45:49 -06:00
prevowner = 0 ;
2010-04-07 19:14:10 +02:00
else if ( m_Mine_PrevOwner [ mine ] == HORDE )
2008-11-21 19:45:49 -06:00
prevowner = 2 ;
else
prevowner = 1 ;
2010-04-07 19:14:10 +02:00
if ( m_Mine_Owner [ mine ] == ALLIANCE )
2008-11-21 19:45:49 -06:00
owner = 0 ;
2010-04-07 19:14:10 +02:00
else if ( m_Mine_Owner [ mine ] == HORDE )
2008-11-21 19:45:49 -06:00
owner = 2 ;
else
owner = 1 ;
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06:00
UpdateWorldState ( BG_AV_MineWorldStates [ mine2 ][ owner ], 1 );
2010-04-07 22:59:46 +02:00
if ( prevowner != owner )
2008-11-21 19:45:49 -06:00
UpdateWorldState ( BG_AV_MineWorldStates [ mine2 ][ prevowner ], 0 );
}
2010-08-08 04:37:24 +02:00
WorldSafeLocsEntry const * BattlegroundAV :: GetClosestGraveYard ( Player * player )
2008-11-21 19:45:49 -06:00
{
2010-04-11 20:13:53 +02:00
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 )
2010-04-19 17:03:10 +02:00
{
entry = sWorldSafeLocsStore . LookupEntry ( BG_AV_GraveyardIds [ i ]);
if ( entry )
2008-11-21 19:45:49 -06:00
{
2010-04-11 20:13:53 +02:00
dist = ( entry -> x - x ) * ( entry -> x - x ) + ( entry -> y - y ) * ( entry -> y - y );
if ( dist < minDist )
{
minDist = dist ;
pGraveyard = entry ;
}
2008-11-21 19:45:49 -06:00
}
2010-04-19 17:03:10 +02:00
}
2010-04-11 20:13:53 +02:00
return pGraveyard ;
2008-11-21 19:45:49 -06:00
}
2010-08-08 04:37:24 +02:00
bool BattlegroundAV :: SetupBattleground ()
2008-11-21 19:45:49 -06:00
{
// Create starting objects
2010-04-07 19:14:10 +02:00
if (
2008-11-21 19:45:49 -06:00
// alliance gates
! 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
|| ! 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 ))
{
2010-08-08 04:37:24 +02:00
sLog . outErrorDb ( "BatteGroundAV: Failed to spawn some object Battleground not created!1" );
2008-11-21 19:45:49 -06:00
return false ;
}
2009-10-17 15:51:44 -07:00
2009-08-03 19:48:28 +02:00
//spawn node-objects
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
{
2010-04-07 22:59:46 +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 )
2008-11-21 19:45:49 -06:00
|| ! 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
|| ! 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 ))
{
2010-08-08 04:37:24 +02:00
sLog . outError ( "BatteGroundAV: Failed to spawn some object Battleground not created!2" );
2008-11-21 19:45:49 -06:00
return false ;
}
}
else //towers
{
2010-04-07 22:59:46 +02:00
if ( i <= BG_AV_NODES_STONEHEART_BUNKER ) //alliance towers
2008-11-21 19:45:49 -06:00
{
2010-04-07 22:59:46 +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 )
2008-11-21 19:45:49 -06:00
|| ! 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 ))
{
2010-08-08 04:37:24 +02:00
sLog . outError ( "BatteGroundAV: Failed to spawn some object Battleground not created!3" );
2008-11-21 19:45:49 -06:00
return false ;
}
}
else //horde towers
{
2010-04-07 22:59:46 +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 )
2008-11-21 19:45:49 -06:00
|| ! 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 ))
{
2010-08-08 04:37:24 +02:00
sLog . outError ( "BatteGroundAV: Failed to spawn some object Battleground not created!4" );
2008-11-21 19:45:49 -06:00
return false ;
}
}
2010-04-07 23:56:35 +02:00
for ( uint8 j = 0 ; j <= 9 ; j ++ ) //burning aura
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +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 ))
2008-11-21 19:45:49 -06:00
{
2010-08-08 04:37:24 +02:00
sLog . outError ( "BatteGroundAV: Failed to spawn some object Battleground not created!5.%i" , i );
2008-11-21 19:45:49 -06:00
return false ;
}
}
}
}
2009-10-17 16:20:24 -07:00
for ( uint8 i = 0 ; i < 2 ; i ++ ) //burning aura for buildings
2008-11-21 19:45:49 -06:00
{
2010-04-07 23:56:35 +02:00
for ( uint8 j = 0 ; j <= 9 ; j ++ )
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +02:00
if ( j < 5 )
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +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 ))
2008-11-21 19:45:49 -06:00
{
2010-08-08 04:37:24 +02:00
sLog . outError ( "BatteGroundAV: Failed to spawn some object Battleground not created!6.%i" , i );
2008-11-21 19:45:49 -06:00
return false ;
}
}
else
{
2010-04-07 19:14:10 +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 ))
2008-11-21 19:45:49 -06:00
{
2010-08-08 04:37:24 +02:00
sLog . outError ( "BatteGroundAV: Failed to spawn some object Battleground not created!7.%i" , i );
2008-11-21 19:45:49 -06:00
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 ++ )
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +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 ))
2008-11-21 19:45:49 -06:00
{
2010-08-08 04:37:24 +02:00
sLog . outError ( "BatteGroundAV: Failed to spawn some mine supplies Battleground not created!7.5.%i" , i );
2008-11-21 19:45:49 -06:00
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 ++ )
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +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 ))
2008-11-21 19:45:49 -06:00
{
2010-08-08 04:37:24 +02:00
sLog . outError ( "BatteGroundAV: Failed to spawn some mine supplies Battleground not created!7.6.%i" , i );
2008-11-21 19:45:49 -06:00
return false ;
}
}
2009-10-17 15:51:44 -07:00
2010-04-07 19:14:10 +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 ))
2008-11-21 19:45:49 -06:00
{
2010-08-08 04:37:24 +02:00
sLog . outError ( "BatteGroundAV: Failed to spawn some object Battleground not created!8" );
2008-11-21 19:45:49 -06:00
return false ;
}
2009-10-17 16:20:24 -07:00
for ( uint8 i = 0 ; i < 4 ; i ++ )
2008-11-21 19:45:49 -06:00
{
2010-04-07 19:14:10 +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 )
2008-11-21 19:45:49 -06:00
|| ! 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 ))
{
2010-08-08 04:37:24 +02:00
sLog . outError ( "BatteGroundAV: Failed to spawn some object Battleground not created!9.%i" , i );
2008-11-21 19:45:49 -06:00
return false ;
}
}
2009-10-17 15:51:44 -07:00
2009-08-03 21:48:22 +02:00
uint16 i ;
sLog . outDebug ( "Alterac Valley: entering state STATUS_WAIT_JOIN ..." );
// 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 ++ ){
2009-08-03 21:48:22 +02:00
SpawnBGObject ( BG_AV_OBJECT_AURA_A_FIRSTAID_STATION + 3 * i , RESPAWN_IMMEDIATELY );
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 )
2009-08-03 21:48:22 +02:00
SpawnBGObject ( BG_AV_OBJECT_AURA_H_FIRSTAID_STATION + 3 * GetNodeThroughObject ( i ), RESPAWN_IMMEDIATELY );
}
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 );
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 ( "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 ( "BG_AV: start spawning static creatures" );
2010-04-07 22:59:46 +02:00
for ( i = 0 ; i < AV_STATICCPLACE_MAX ; i ++ )
2009-08-03 21:48:22 +02:00
AddAVCreature ( 0 , i + AV_CPLACE_MAX );
//mainspiritguides:
sLog . outDebug ( "BG_AV: start spawning spiritguides creatures" );
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 ( "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 ++ )
2009-08-03 21:48:22 +02:00
AddAVCreature ( i , AV_CPLACE_A_MARSHAL_SOUTH + ( i - AV_NPC_A_MARSHAL_SOUTH ));
AddAVCreature ( AV_NPC_HERALD , AV_CPLACE_HERALD );
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
{
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 :
{
2010-08-23 07:51:19 +02:00
sLog . outError ( "tried to get name for node %u" , node );
2008-11-21 19:45:49 -06:00
return "Unknown" ;
break ;
}
}
}
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 )
2008-11-21 19:45:49 -06:00
{
2009-06-26 20:25:05 +02:00
if ( m_Nodes [ node ]. TotalOwner == team )
{
sLog . outCrash ( "Assaulting team is TotalOwner of node" );
2010-07-30 20:04:28 +02:00
ASSERT ( false );
2009-06-26 20:25:05 +02:00
}
if ( m_Nodes [ node ]. Owner == team )
{
sLog . outCrash ( "Assaulting team is owner of node" );
2010-07-30 20:04:28 +02:00
ASSERT ( false );
2009-06-26 20:25:05 +02:00
}
if ( m_Nodes [ node ]. State == POINT_DESTROYED )
{
sLog . outCrash ( "Destroyed node is being assaulted" );
2010-07-30 20:04:28 +02:00
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" );
2010-07-30 20:04:28 +02:00
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
2008-11-21 19:45:49 -06:00
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 )
2008-11-21 19:45:49 -06:00
{
2010-07-30 20:04:28 +02:00
ASSERT ( m_Nodes [ node ]. State == POINT_ASSAULTED );
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06: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 )
2008-11-21 19:45:49 -06:00
{
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 )
2008-11-21 19:45:49 -06:00
{
2010-07-30 20:04:28 +02:00
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 );
2008-11-21 19:45:49 -06:00
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 ()
2008-11-21 19:45:49 -06:00
{
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
2008-11-21 19:45:49 -06:00
{
2009-10-17 16:20:24 -07:00
for ( uint8 j = 0 ; j < 9 ; j ++ )
2008-11-21 19:45:49 -06:00
m_Team_QuestStatus [ i ][ j ] = 0 ;
2009-02-09 08:16:34 -05:00
m_Team_Scores [ i ] = BG_AV_SCORE_INITIAL_POINTS ;
2008-11-21 19:45:49 -06:00
m_IsInformedNearVictory [ i ] = false ;
m_CaptainAlive [ i ] = true ;
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
2008-11-21 19:45:49 -06: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
2008-11-21 19:45:49 -06: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
2008-11-21 19:45:49 -06: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
2008-11-21 19:45:49 -06: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
2008-11-21 19:45:49 -06: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 ])
2008-11-21 19:45:49 -06:00
DelCreature ( i );
2009-10-17 15:51:44 -07:00
2008-11-21 19:45:49 -06:00
}
2009-10-17 15:51:44 -07:00