diff options
19 files changed, 2138 insertions, 47 deletions
diff --git a/sql/base/world_database.sql b/sql/base/world_database.sql index e845959fc68..4c11db78192 100644 --- a/sql/base/world_database.sql +++ b/sql/base/world_database.sql @@ -18130,6 +18130,11 @@ INSERT INTO `spell_linked_spell` (`spell_trigger`,`spell_effect`,`type`,`comment ( 71480, 71483, 1, 'Blood-Queen: Bloodbolt Splash'), ( 71952, 70995, 1, 'Blood-Queen: Presence of the Darkfallen'), ( 71390, 71341, 0, 'Blood-Queen: Pact of the Darkfallen'), +--- Isle of Conquest +( 66548, 66550, 0, 'Isle of Conquest (IN>OUT)'), +( 66549, 66551, 0, 'Isle of Conquest (OUT>IN)'), +( 66551, -66548, 2, 'Isle of Conquest Teleport (OUT>IN) Debuff limit'), +( 66550, -66549, 2, 'Isle of Conquest Teleport (IN>OUT) Debuff limit'), -- Warsong Gulch ( 54861,-23335, 0, 'Drop Flag on Nitro Boost WSG'), ( 54861,-23333, 0, 'Drop Flag on Nitro Boost WSG'), @@ -27480,6 +27485,26 @@ INSERT INTO `trinity_string` (`entry`,`content_default`,`content_loc1`,`content_ (1133, '| Character | BanDate | UnbanDate | Banned By | Ban Reason |', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), (1200, 'You try to view cinemitic %u but it doesn''t exist.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), (1201, 'You try to view movie %u but it doesn''t exist.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1205, 'The battle will begin in two minutes.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1206, 'The battle will begin in 1 minute.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1208, 'The battle has begun!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),, +(1207, 'The battle will begin in 30 seconds!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1209, 'the alliance keep', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1210, 'the horde keep', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1211, '%s wins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1212, 'The west gate of %s is destroyed!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1213, 'The east gate of %s is destroyed!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1214, 'The south gate of %s is destroyed!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1215, 'The north gate of %s is destroyed!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1216, '$n has assaulted the %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1217, '$n has defended the %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1218, '$n claims the %s! If left unchallenged, the %s will control it in 1 minute!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1219, 'The %s has taken the %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1220, 'Workshop', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1221, 'Docks', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1222, 'Refinery', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1223, 'Quarry', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(1224, 'Hangar', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), (1300, 'Alliance', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), (1301, 'Horde', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), (1302, '%s was destroyed by the %s!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), diff --git a/sql/scripts/world_scripts_full.sql b/sql/scripts/world_scripts_full.sql index d1d1c7d2dae..10c751218ee 100644 --- a/sql/scripts/world_scripts_full.sql +++ b/sql/scripts/world_scripts_full.sql @@ -867,6 +867,9 @@ UPDATE `creature_template` SET `ScriptName`='boss_blood_queen_lana_thel' WHERE ` /* IRONFORGE */ UPDATE `creature_template` SET `ScriptName`='npc_royal_historian_archesonus' WHERE `entry`=8879; +/* ISLE OF CONQUEST */ +UPDATE `creature_template` SET `ScriptName`='npc_four_car_garage' WHERE `entry` IN (34802,34793,34775,35069,34776); + /* ISLE OF QUEL'DANAS */ UPDATE `creature_template` SET `ScriptName`='npc_converted_sentry' WHERE `entry`=24981; UPDATE `creature_template` SET `ScriptName`='npc_greengill_slave' WHERE `entry`=25084; @@ -1748,7 +1751,7 @@ UPDATE `outdoorpvp_template` SET `ScriptName`='outdoorpvp_si' WHERE `TypeId`=5; UPDATE `outdoorpvp_template` SET `ScriptName`='outdoorpvp_ep' WHERE `TypeId`=6; /* ACHIEVEMENTS */ -DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (3693,6641,6642,6643,6644,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,1234,1239,5605,5606,12778,13036,13035,13037,12977,12967,12986,12982,12993,12780,13012,13011,13013) AND `type` IN (0,11); +DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (3693,6641,6642,6643,6644,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,1234,1239,5605,5606,12778,13036,13035,13037,12977,12967,12986,12982,12993,12780,13012,13011,13013,12062,12063,12064,12065,12183,12068,12060,12061) AND `type` IN (0,11); INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`) VALUES (3693,11,0,0, 'achievement_storm_glory'), (6641,11,0,0, 'achievement_school_of_hard_knocks'), @@ -1781,7 +1784,16 @@ INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`, (12780,11,0,0, 'achievement_once_bitten_twice_shy_n'), (13012,11,0,0, 'achievement_once_bitten_twice_shy_n'), (13011,11,0,0, 'achievement_once_bitten_twice_shy_v'), -(13013,11,0,0, 'achievement_once_bitten_twice_shy_v'); +(13013,11,0,0, 'achievement_once_bitten_twice_shy_v'), +(12062,11,0,0, 'achievement_bg_control_all_nodes'), +(12063,11,0,0, 'achievement_bg_control_all_nodes'), +(12064,11,0,0, 'achievement_bg_control_all_nodes'), +(12065,11,0,0, 'achievement_bg_control_all_nodes'), +(12183,11,0,0, 'achievement_bg_ic_glaive_grave'), +(12068,11,0,0, 'achievement_bg_ic_mowed_down'), +(12060,11,0,0, 'achievement_bg_ic_resource_glut'), +(12061,11,0,0, 'achievement_bg_ic_resource_glut'); + /* SPELLS */ INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES @@ -1939,6 +1951,10 @@ INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES ( 71900, 'spell_blood_queen_bloodbolt'), ( 71901, 'spell_blood_queen_bloodbolt'), ( 71902, 'spell_blood_queen_bloodbolt'), +-- Isle of Conquest +( 66630, 'spell_gen_gunship_portal'), +( 66637, 'spell_gen_gunship_portal'), +( 66656, 'spell_gen_parachute_ic'), -- Trial of Crusader ( 66118, 'spell_gen_leeching_swarm'), ( 67630, 'spell_gen_leeching_swarm'), diff --git a/sql/updates/2011_01_08_2_world_scriptname.sql b/sql/updates/2011_01_08_2_world_scriptname.sql new file mode 100644 index 00000000000..8c35e0d3712 --- /dev/null +++ b/sql/updates/2011_01_08_2_world_scriptname.sql @@ -0,0 +1,30 @@ +DELETE FROM spell_script_names WHERE spell_id IN (66630,66637,66656); +INSERT INTO spell_script_names (spell_id,ScriptName) VALUES +(66630,'spell_gen_gunship_portal'), +(66637,'spell_gen_gunship_portal'), +(66656,'spell_gen_parachute_ic'); + +-- Achievement Mine +DELETE FROM `achievement_criteria_data` WHERE criteria_id IN (12062,12063,12064,12065); +INSERT INTO `achievement_criteria_data` (criteria_id,type,ScriptName) VALUES +(12062,11,'achievement_bg_control_all_nodes'), +(12063,11,'achievement_bg_control_all_nodes'), +(12064,11,'achievement_bg_control_all_nodes'), +(12065,11,'achievement_bg_control_all_nodes'); + +-- Achievement Four Car Garage +UPDATE `creature_template` SET `ScriptName`='npc_four_car_garage' WHERE `entry` IN (34802,34793,34775,35069,34776); + +-- Achievement Glaive Grave +DELETE FROM `achievement_criteria_data` WHERE `criteria_id`=12183; +INSERT INTO `achievement_criteria_data` (criteria_id,type,ScriptName) VALUES (12183,11,'achievement_bg_ic_glaive_grave'); + +-- Achievement Mowed Down +DELETE FROM `achievement_criteria_data` WHERE `criteria_id`=12068; +INSERT INTO `achievement_criteria_data` (criteria_id,type,ScriptName) VALUES (12068,11,'achievement_bg_ic_mowed_down'); + +-- Achievement Resource Glut +DELETE FROM `achievement_criteria_data` WHERE criteria_id IN (12060,12061); +INSERT INTO `achievement_criteria_data` (criteria_id,type,ScriptName) VALUES +(12060,11,'achievement_bg_ic_resource_glut'), +(12061,11,'achievement_bg_ic_resource_glut');
\ No newline at end of file diff --git a/sql/updates/2011_01_08_3_world_trinity_strings.sql b/sql/updates/2011_01_08_3_world_trinity_strings.sql new file mode 100644 index 00000000000..39c66ba9e41 --- /dev/null +++ b/sql/updates/2011_01_08_3_world_trinity_strings.sql @@ -0,0 +1,23 @@ +-- strings used by the BG +DELETE FROM trinity_string WHERE entry > 1204 AND entry <1225; +INSERT INTO trinity_string (`entry`,`content_default`) VALUES +(1205,'The battle will begin in two minutes.'), +(1206,'The battle will begin in 1 minute.'), +(1208,'The battle has begun!'), +(1207,'The battle will begin in 30 seconds!'), +(1209,'the alliance keep'), +(1210,'the horde keep'), +(1211,'%s wins!'), +(1212,'The west gate of %s is destroyed!'), +(1213,'The east gate of %s is destroyed!'), +(1214,'The south gate of %s is destroyed!'), +(1215,'The north gate of %s is destroyed!'), +(1216,'$n has assaulted the %s'), +(1217,'$n has defended the %s'), +(1218,'$n claims the %s! If left unchallenged, the %s will control it in 1 minute!'), +(1219,'The %s has taken the %s'), +(1220,'Workshop'), +(1221,'Docks'), +(1222,'Refinery'), +(1223,'Quarry'), +(1224,'Hangar');
\ No newline at end of file diff --git a/sql/updates/2011_1_08_4_world_spell_linked_spell.sql b/sql/updates/2011_1_08_4_world_spell_linked_spell.sql new file mode 100644 index 00000000000..958d533c14c --- /dev/null +++ b/sql/updates/2011_1_08_4_world_spell_linked_spell.sql @@ -0,0 +1,7 @@ +-- Spells from teleporters +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (66548, 66549, 66550, 66551); +INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES +(66548, 66550, 0, 'Isle of Conquest (IN>OUT)'), +(66549, 66551, 0, 'Isle of Conquest (OUT>IN)'), +(66551, -66548, 2, 'Isle of Conquest Teleport (OUT>IN) Debuff limit'), +(66550, -66549, 2, 'Isle of Conquest Teleport (IN>OUT) Debuff limit');
\ No newline at end of file diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 581a1192cca..a372f0800d5 100755 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -612,6 +612,28 @@ void Battleground::CastSpellOnTeam(uint32 SpellID, uint32 TeamID) } } +void Battleground::RemoveAuraOnTeam(uint32 SpellID, uint32 TeamID) +{ + for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) + { + if (itr->second.OfflineRemoveTime) + continue; + Player *plr = sObjectMgr->GetPlayer(itr->first); + + if (!plr) + { + sLog->outError("Battleground:RemoveAuraOnTeam: Player (GUID: %u) not found!", GUID_LOPART(itr->first)); + continue; + } + + uint32 team = itr->second.Team; + if (!team) team = plr->GetTeam(); + + if (team == TeamID) + plr->RemoveAura(SpellID); + } +} + void Battleground::YellToAll(Creature* creature, const char* text, uint32 language) { for (std::map<uint64, BattlegroundPlayer>::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) @@ -1405,6 +1427,9 @@ void Battleground::RemovePlayerFromResurrectQueue(uint64 player_guid) bool Battleground::AddObject(uint32 type, uint32 entry, float x, float y, float z, float o, float rotation0, float rotation1, float rotation2, float rotation3, uint32 /*respawnTime*/) { + // If the assert is called, means that m_BgObjects must be resized! + ASSERT(type < m_BgObjects.size()); + Map *map = GetBgMap(); if (!map) return false; @@ -1531,6 +1556,9 @@ void Battleground::SpawnBGObject(uint32 type, uint32 respawntime) Creature* Battleground::AddCreature(uint32 entry, uint32 type, uint32 teamval, float x, float y, float z, float o, uint32 respawntime) { + // If the assert is called, means that m_BgCreatures must be resized! + ASSERT(type < m_BgCreatures.size()); + Map * map = GetBgMap(); if (!map) return NULL; diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 4dba8a8e4af..09cc975f4b3 100755 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -208,7 +208,10 @@ enum ScoreType SCORE_SECONDARY_OBJECTIVES = 17, //SOTA SCORE_DESTROYED_DEMOLISHER = 18, - SCORE_DESTROYED_WALL = 19 + SCORE_DESTROYED_WALL = 19, + //IC + SCORE_BASE_ASSAULTED = 20, + SCORE_BASE_DEFENDED = 21 }; enum ArenaType @@ -476,6 +479,7 @@ class Battleground void PlaySoundToTeam(uint32 SoundID, uint32 TeamID); void PlaySoundToAll(uint32 SoundID); void CastSpellOnTeam(uint32 SpellID, uint32 TeamID); + void RemoveAuraOnTeam(uint32 SpellID, uint32 TeamID); void RewardHonorToTeam(uint32 Honor, uint32 TeamID); void RewardReputationToTeam(uint32 faction_id, uint32 Reputation, uint32 TeamID); void UpdateWorldState(uint32 Field, uint32 Value); @@ -534,6 +538,11 @@ class Battleground virtual void EventPlayerDamagedGO(Player* /*plr*/, GameObject* /*go*/, uint8 /*hitType*/, uint32 /*destroyedEvent*/) {} virtual void EventPlayerUsedGO(Player* /*player*/, GameObject* /*go*/){} + // this function can be used by spell to interact with the BG map + virtual void DoAction(uint32 action, uint64 var) {} + + virtual void HandlePlayerResurrect(Player* player) {} + /* Death related */ virtual WorldSafeLocsEntry const* GetClosestGraveYard(Player* player); diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 807aabdad07..284702de012 100755 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -331,6 +331,10 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket *data, Battleground *bg) *data << uint32(((BattlegroundSAScore*)itr2->second)->demolishers_destroyed); *data << uint32(((BattlegroundSAScore*)itr2->second)->gates_destroyed); break; + case 628: // IC + *data << uint32(0x00000002); // count of next fields + *data << uint32(((BattlegroundICScore*)itr2->second)->BasesAssaulted); // bases asssulted + *data << uint32(((BattlegroundICScore*)itr2->second)->BasesDefended); // bases defended default: *data << uint32(0); break; @@ -362,13 +366,17 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket *data, Battleground *bg) *data << uint32(((BattlegroundSAScore*)itr2->second)->demolishers_destroyed); *data << uint32(((BattlegroundSAScore*)itr2->second)->gates_destroyed); break; + case BATTLEGROUND_IC: // wotlk + *data << uint32(0x00000002); // count of next fields + *data << uint32(((BattlegroundICScore*)itr2->second)->BasesAssaulted); // bases asssulted + *data << uint32(((BattlegroundICScore*)itr2->second)->BasesDefended); // bases defended + break; case BATTLEGROUND_NA: case BATTLEGROUND_BE: case BATTLEGROUND_AA: case BATTLEGROUND_RL: case BATTLEGROUND_DS: // wotlk case BATTLEGROUND_RV: // wotlk - case BATTLEGROUND_IC: // wotlk *data << uint32(0); break; default: diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp index f072e16457d..61d82317477 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp @@ -20,16 +20,39 @@ #include "Battleground.h" #include "BattlegroundIC.h" #include "Language.h" +#include "WorldPacket.h" +#include "GameObject.h" +#include "ObjectMgr.h" +#include "Vehicle.h" +#include "Transport.h" BattlegroundIC::BattlegroundIC() { - m_BgCreatures.resize(2); - m_BgObjects.resize(5); - //TODO FIX ME! - m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_WS_START_TWO_MINUTES; - m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE; - m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE; - m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN; + m_BgObjects.resize(GAMEOBJECT_MAX_SPAWNS + MAX_AIRSHIPS + MAX_HANGAR_TELEPORTERS + MAX_TELEPORTERS_SPAWNS); + m_BgCreatures.resize(NPCS_MAX_SPAWNS + MAX_WORKSHOP_SPAWNS + MAX_DOCKS_SPAWNS + MAX_SPIRIT_GUIDES); + + m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_IC_START_TWO_MINUTES; + m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_IC_START_ONE_MINUTE; + m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_IC_START_HALF_MINUTE; + m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_IC_HAS_BEGUN; + + for (uint8 i = 0; i < 2; i++) + factionReinforcements[i] = 300; + + for (uint8 i = 0; i < BG_IC_MAXDOOR; i++) + GateStatus[i] = BG_IC_GATE_OK; + + closeFortressDoors = 20000; // the doors are closed again... in a special way + doorsClosed = false; + resourceTimer = IC_RESOURCE_TIME; + + for (uint8 i = 0; i < 7; i++) + nodePoint[i] = nodePointInitial[i]; + + siegeEngineWorkshopTimer = WORKSHOP_UPDATE_TIMER; + + gunshipHorde = NULL; + gunshipAlliance = NULL; } BattlegroundIC::~BattlegroundIC() @@ -37,17 +60,235 @@ BattlegroundIC::~BattlegroundIC() } +void BattlegroundIC::HandlePlayerResurrect(Player* player) +{ + if (nodePoint[NODE_TYPE_QUARRY].nodeState == (player->GetTeamId() == TEAM_ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H)) + player->CastSpell(player,SPELL_QUARRY,true); + + if (nodePoint[NODE_TYPE_REFINERY].nodeState == (player->GetTeamId() == TEAM_ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H)) + player->CastSpell(player,SPELL_OIL_REFINERY,true); +} + +void BattlegroundIC::SendTransportInit(Player* player) +{ + if (!gunshipAlliance || !gunshipHorde) + return; + + UpdateData transData; + + gunshipAlliance->BuildCreateUpdateBlockForPlayer(&transData, player); + gunshipHorde->BuildCreateUpdateBlockForPlayer(&transData, player); + + WorldPacket packet; + + transData.BuildPacket(&packet); + player->GetSession()->SendPacket(&packet); +} + +void BattlegroundIC::DoAction(uint32 action, uint64 var) +{ + if (action != 1) + return; + + Player* plr = sObjectMgr->GetPlayer(var); + + if (!plr || !gunshipAlliance || !gunshipHorde) + return; + + plr->CastSpell(plr,SPELL_PARACHUTE,true); + plr->CastSpell(plr,SPELL_SLOW_FALL,true); + + plr->SetTransport(plr->GetTeamId() == TEAM_ALLIANCE ? gunshipAlliance : gunshipHorde); + plr->m_movementInfo.t_pos.m_positionX = 7.305609f; + plr->m_movementInfo.t_pos.m_positionY = -0.095246f; + plr->m_movementInfo.t_pos.m_positionZ = 34.51022f; + plr->m_movementInfo.t_guid = (plr->GetTeamId() == TEAM_ALLIANCE ? gunshipAlliance : gunshipHorde)->GetGUID(); + plr->TeleportTo(GetMapId(),661,-1244,288,0,TELE_TO_NOT_LEAVE_TRANSPORT); +} + void BattlegroundIC::Update(uint32 diff) { Battleground::Update(diff); + + if (GetStatus() != STATUS_IN_PROGRESS) + return; + + if (!doorsClosed) + { + if (closeFortressDoors <= diff) + { + GetBGObject(BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01)->RemoveFromWorld(); + GetBGObject(BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01)->RemoveFromWorld(); + + GetBGObject(BG_IC_GO_ALLIANCE_GATE_3)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED); // Alliance door + GetBGObject(BG_IC_GO_HORDE_GATE_1)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED); // Horde door + + doorsClosed = true; + } else closeFortressDoors -= diff; + } + + for (uint8 i = 0; i < MAX_NODE_TYPES; i++) + { + if (nodePoint[i].nodeType == NODE_TYPE_DOCKS) + { + if (nodePoint[i].nodeState == NODE_STATE_CONTROLLED_A || + nodePoint[i].nodeState == NODE_STATE_CONTROLLED_H) + { + if (nodePoint[i].timer <= diff) + { + // we need to confirm this, i am not sure if this every 3 minutes + for (uint8 u = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_1_A : BG_IC_NPC_CATAPULT_1_H); u < (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_4_A : BG_IC_NPC_CATAPULT_4_H); u++) + { + if (Creature* catapult = GetBGCreature(u)) + { + if (!catapult->isAlive()) + catapult->Respawn(true); + } + } + + // we need to confirm this is blizzlike,not sure if it is every 3 minutes + for (uint8 u = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_1_A : BG_IC_NPC_GLAIVE_THROWER_1_H); u < (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_2_A : BG_IC_NPC_GLAIVE_THROWER_2_H); u++) + { + if (Creature* glaiveThrower = GetBGCreature(u)) + { + if (!glaiveThrower->isAlive()) + glaiveThrower->Respawn(true); + } + } + + docksTimer = DOCKS_UPDATE_TIMER; + } else nodePoint[i].timer -= diff; + } + } + + if (nodePoint[i].nodeType == NODE_TYPE_WORKSHOP) + { + if (nodePoint[i].nodeState == NODE_STATE_CONTROLLED_A || + nodePoint[i].nodeState == NODE_STATE_CONTROLLED_H) + { + if (siegeEngineWorkshopTimer <= diff) + { + uint8 siegeType = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_SIEGE_ENGINE_A : BG_IC_NPC_SIEGE_ENGINE_H); + + if (Creature* siege = GetBGCreature(siegeType)) // this always should be true + { + if (siege->isAlive()) + { + if (siege->HasFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_UNK_14|UNIT_FLAG_OOC_NOT_ATTACKABLE)) + // following sniffs the vehicle always has UNIT_FLAG_UNK_14 + siege->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_OOC_NOT_ATTACKABLE); + else + siege->SetHealth(siege->GetMaxHealth()); + } + else + siege->Respawn(true); + } + + // we need to confirm this, i am not sure if this every 3 minutes + for (uint8 u = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_1_A : BG_IC_NPC_DEMOLISHER_1_H); u < (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_4_A : BG_IC_NPC_DEMOLISHER_4_H); u++) + { + if (Creature* demolisher = GetBGCreature(u)) + { + if (!demolisher->isAlive()) + demolisher->Respawn(true); + } + } + siegeEngineWorkshopTimer = WORKSHOP_UPDATE_TIMER; + } else siegeEngineWorkshopTimer -= diff; + } + } + + // the point is waiting for a change on his banner + if (nodePoint[i].needChange) + { + if (nodePoint[i].timer <= diff) + { + uint32 nextBanner = GetNextBanner(&nodePoint[i],nodePoint[i].faction,true); + + nodePoint[i].last_entry = nodePoint[i].gameobject_entry; + nodePoint[i].gameobject_entry = nextBanner; + // nodePoint[i].faction = the faction should be the same one... + + GameObject* banner = GetBGObject(nodePoint[i].gameobject_type); + + if (!banner) // this should never happen + return; + + float cords[4] = {banner->GetPositionX(), banner->GetPositionY(), banner->GetPositionZ(), banner->GetOrientation() }; + + DelObject(nodePoint[i].gameobject_type); + AddObject(nodePoint[i].gameobject_type,nodePoint[i].gameobject_entry,cords[0],cords[1],cords[2],cords[3],0,0,0,0,RESPAWN_ONE_DAY); + + GetBGObject(nodePoint[i].gameobject_type)->SetUInt32Value(GAMEOBJECT_FACTION, nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_Factions[1] : BG_IC_Factions[0]); + + UpdateNodeWorldState(&nodePoint[i]); + HandleCapturedNodes(&nodePoint[i],false); + + SendMessage2ToAll(LANG_BG_IC_TEAM_HAS_TAKEN_NODE,CHAT_MSG_BG_SYSTEM_NEUTRAL,NULL,(nodePoint[i].faction == TEAM_ALLIANCE ? LANG_BG_IC_ALLIANCE : LANG_BG_IC_HORDE),nodePoint[i].string); + + nodePoint[i].needChange = false; + nodePoint[i].timer = 60000; + } else nodePoint[i].timer -= diff; + } + } + + if (resourceTimer <= diff) + { + for (uint8 i = 0; i < NODE_TYPE_DOCKS; i++) + { + if (nodePoint[i].nodeState == NODE_STATE_CONTROLLED_A || + nodePoint[i].nodeState == NODE_STATE_CONTROLLED_H) + { + factionReinforcements[nodePoint[i].faction] += 1; + RewardHonorToTeam(12,nodePoint[i].faction == TEAM_ALLIANCE ? ALLIANCE : HORDE); + UpdateWorldState((nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_ALLIANCE_RENFORT : BG_IC_HORDE_RENFORT), factionReinforcements[nodePoint[i].faction]); + } + } + resourceTimer = IC_RESOURCE_TIME; + } else resourceTimer -= diff; } void BattlegroundIC::StartingEventCloseDoors() { + // Show Full Gate Displays + GetBGObject(BG_IC_GO_ALLIANCE_GATE_1)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED); // Alliance door + GetBGObject(BG_IC_GO_ALLIANCE_GATE_2)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED); // Alliance door + GetBGObject(BG_IC_GO_HORDE_GATE_2)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED); // Horde door + GetBGObject(BG_IC_GO_HORDE_GATE_3)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED); // Horde door } void BattlegroundIC::StartingEventOpenDoors() { + //after 20 seconds they should be despawned + DoorOpen(BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01); + DoorOpen(BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01); + + DoorOpen(BG_IC_GO_DOODAD_HU_PORTCULLIS01_1); + DoorOpen(BG_IC_GO_DOODAD_HU_PORTCULLIS01_2); + DoorOpen(BG_IC_GO_DOODAD_VR_PORTCULLIS01_1); + DoorOpen(BG_IC_GO_DOODAD_VR_PORTCULLIS01_2); + + for (uint8 i = 0; i < MAX_TELEPORTERS_SPAWNS; i++) + { + if (!AddObject(BG_IC_Teleporters[i].type,BG_IC_Teleporters[i].entry, + BG_IC_Teleporters[i].x,BG_IC_Teleporters[i].y, + BG_IC_Teleporters[i].z,BG_IC_Teleporters[i].o, + 0,0,0,0,RESPAWN_ONE_DAY)) + sLog->outError("Isle of Conquest | Starting Event Open Doors: There was an error spawning gameobject %u",BG_IC_Teleporters[i].entry); + } +} + +bool BattlegroundIC::IsAllNodesConrolledByTeam(uint32 team) const +{ + uint32 count = 0; + ICNodeState controlledState = team == ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H; + for (int i = 0; i < NODE_TYPE_WORKSHOP; ++i) + { + if (nodePoint[i].nodeState == controlledState) + count++; + } + + return count == NODE_TYPE_WORKSHOP; } void BattlegroundIC::AddPlayer(Player *plr) @@ -57,11 +298,20 @@ void BattlegroundIC::AddPlayer(Player *plr) BattlegroundICScore* sc = new BattlegroundICScore; m_PlayerScores[plr->GetGUID()] = sc; -} -void BattlegroundIC::RemovePlayer(Player* /*plr*/,uint64 /*guid*/) -{ + if (nodePoint[NODE_TYPE_QUARRY].nodeState == (plr->GetTeamId() == TEAM_ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H)) + plr->CastSpell(plr,SPELL_QUARRY,true); + + if (nodePoint[NODE_TYPE_REFINERY].nodeState == (plr->GetTeamId() == TEAM_ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H)) + plr->CastSpell(plr,SPELL_OIL_REFINERY,true); + SendTransportInit(plr); +} + +void BattlegroundIC::RemovePlayer(Player* plr,uint64 guid) +{ + plr->RemoveAura(SPELL_QUARRY); + plr->RemoveAura(SPELL_OIL_REFINERY); } void BattlegroundIC::HandleAreaTrigger(Player * /*Source*/, uint32 /*Trigger*/) @@ -73,60 +323,617 @@ void BattlegroundIC::HandleAreaTrigger(Player * /*Source*/, uint32 /*Trigger*/) void BattlegroundIC::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor) { - std::map<uint64, BattlegroundScore*>::iterator itr = m_PlayerScores.find(Source->GetGUID()); if (itr == m_PlayerScores.end()) // player not found... return; - Battleground::UpdatePlayerScore(Source,type,value, doAddHonor); + switch(type) + { + case SCORE_BASE_ASSAULTED: + ((BattlegroundICScore*)itr->second)->BasesAssaulted += value; + break; + case SCORE_BASE_DEFENDED: + ((BattlegroundICScore*)itr->second)->BasesDefended += value; + break; + default: + Battleground::UpdatePlayerScore(Source,type,value, doAddHonor); + break; + } } -bool BattlegroundIC::SetupBattleground() +void BattlegroundIC::FillInitialWorldStates(WorldPacket& data) { - AddObject(0, 195157, 459.72f, -419.93f, 42.55f, 0, 0, 0, 0.9996573f, 0.02617699f, 10*MINUTE); - AddObject(1, 195158, 797.72f, -1009.48f, 138.52f, 0, 0, 0, 0.9996573f, 0.02617699f, 10*MINUTE); - AddObject(2, 195338, 418.98f, -838.33f, 51.09f, 0, 0, 0, 0.9996573f, 0.02617699f, 10*MINUTE); - AddObject(3, 195343, 1267.45f, -390.88f, 24.23f, 0, 0, 0, 0.9996573f, 0.02617699f, 10*MINUTE); - AddObject(4, 195333, 769.27f, -833.53f, 9.57f, 0, 0, 0, 0.9996573f, 0.02617699f, 10*MINUTE); - SpawnLeader(ALLIANCE); - SpawnLeader(HORDE); - return true; + data << uint32(BG_IC_ALLIANCE_RENFORT_SET) << uint32(1); + data << uint32(BG_IC_HORDE_RENFORT_SET) << uint32(1); + data << uint32(BG_IC_ALLIANCE_RENFORT) << uint32(factionReinforcements[TEAM_ALLIANCE]); + data << uint32(BG_IC_HORDE_RENFORT) << uint32(factionReinforcements[TEAM_HORDE]); + + for (uint8 i = 0; i < 6; i++) + { + uint32 uws = GetWorldStateFromGateEntry(BG_IC_ObjSpawnlocs[i].entry,(GateStatus[GetGateIDFromEntry(BG_IC_ObjSpawnlocs[i].entry)] == BG_IC_GATE_DESTROYED ? true : false)); + data << uint32(uws) << uint32(1); + } + + for (uint8 i = 0 ; i < MAX_NODE_TYPES ; i++) + data << uint32(nodePoint[i].worldStates[nodePoint[i].nodeState]) << uint32(1); } -void BattlegroundIC::SpawnLeader(uint32 teamid) +bool BattlegroundIC::SetupBattleground() { - if (teamid == ALLIANCE) - AddCreature(34924, 0, ALLIANCE, 307.03f, -833.04f, 48.91f, 6.23f, 10*MINUTE); - else - AddCreature(34922, 1, HORDE, 1264.42f, -766.80f, 48.91f, 3.28f, 10*MINUTE); + for (uint8 i = 0; i < GAMEOBJECT_MAX_SPAWNS; i++) + { + if (!AddObject(BG_IC_ObjSpawnlocs[i].type,BG_IC_ObjSpawnlocs[i].entry, + BG_IC_ObjSpawnlocs[i].x,BG_IC_ObjSpawnlocs[i].y, + BG_IC_ObjSpawnlocs[i].z,BG_IC_ObjSpawnlocs[i].o, + 0,0,0,0,RESPAWN_ONE_DAY)) + { + sLog->outError("Isle of Conquest: There was an error spawning gameobject %u",BG_IC_ObjSpawnlocs[i].entry); + return false; + } + } + + for (uint8 i = 0; i < NPCS_MAX_SPAWNS; i++) + { + if (!AddCreature(BG_IC_NpcSpawnlocs[i].entry,BG_IC_NpcSpawnlocs[i].type,BG_IC_NpcSpawnlocs[i].team, + BG_IC_NpcSpawnlocs[i].x,BG_IC_NpcSpawnlocs[i].y, + BG_IC_NpcSpawnlocs[i].z,BG_IC_NpcSpawnlocs[i].o, + RESPAWN_ONE_DAY)) + { + sLog->outError("Isle of Conquest: There was an error spawning creature %u",BG_IC_NpcSpawnlocs[i].entry); + return false; + } + } + + if (!AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+5,BG_IC_SpiritGuidePos[5][0], BG_IC_SpiritGuidePos[5][1],BG_IC_SpiritGuidePos[5][2], BG_IC_SpiritGuidePos[5][3],ALLIANCE) + || !AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+6,BG_IC_SpiritGuidePos[6][0], BG_IC_SpiritGuidePos[6][1],BG_IC_SpiritGuidePos[6][2], BG_IC_SpiritGuidePos[6][3],HORDE) + || !AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+3,BG_IC_SpiritGuidePos[7][0], BG_IC_SpiritGuidePos[7][1],BG_IC_SpiritGuidePos[7][2], BG_IC_SpiritGuidePos[7][3],ALLIANCE) + || !AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+4,BG_IC_SpiritGuidePos[8][0], BG_IC_SpiritGuidePos[8][1],BG_IC_SpiritGuidePos[8][2], BG_IC_SpiritGuidePos[8][3],HORDE)) + { + sLog->outError("Isle of Conquest: Failed to spawn initial spirit guide!"); + return false; + } + + gunshipHorde = CreateTransport(GO_HORDE_GUNSHIP,120000); + gunshipAlliance = CreateTransport(GO_ALLIANCE_GUNSHIP,120000); + + if (!gunshipAlliance || !gunshipHorde) + { + sLog->outError("Isle of Conquest: There was an error creating gunships!"); + return false; + } + + //Send transport init packet to all player in map + for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end();itr++) + { + if (Player* player = sObjectMgr->GetPlayer(itr->first)) + SendTransportInit(player); + } + + // setting correct factions for Keep Cannons + for (uint8 i = BG_IC_NPC_KEEP_CANNON_1; i < BG_IC_NPC_KEEP_CANNON_12; i++) + GetBGCreature(i)->setFaction(BG_IC_Factions[0]); + for (uint8 i = BG_IC_NPC_KEEP_CANNON_13; i < BG_IC_NPC_KEEP_CANNON_25; i++) + GetBGCreature(i)->setFaction(BG_IC_Factions[1]); + + // correcting spawn time for keeps bombs + for (uint8 i = BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_1; i < BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_4; i++) + GetBGObject(i)->SetRespawnTime(10); + + return true; } -void BattlegroundIC::HandleKillUnit(Creature *unit, Player * /*killer*/) +void BattlegroundIC::HandleKillUnit(Creature *unit, Player* killer) { if (GetStatus() != STATUS_IN_PROGRESS) return; uint32 entry = unit->GetEntry(); - if (entry == 34924) + if (entry == NPC_HIGH_COMMANDER_HALFORD_WYRMBANE) { RewardHonorToTeam(500,HORDE); EndBattleground(HORDE); } - else if (entry == 34922) + else if (entry == NPC_OVERLORD_AGMAR) { RewardHonorToTeam(500,ALLIANCE); EndBattleground(ALLIANCE); } + + //Achievement Mowed Down + // TO-DO: This should be done on the script of each vehicle of the BG. + if (unit->IsVehicle()) + killer->CastSpell(killer,68357,true); +} + +void BattlegroundIC::HandleKillPlayer(Player* player, Player* killer) +{ + if (GetStatus() != STATUS_IN_PROGRESS) + return; + + Battleground::HandleKillPlayer(player, killer); + + factionReinforcements[player->GetTeamId()] -= 1; + + UpdateWorldState((player->GetTeamId() == TEAM_ALLIANCE ? BG_IC_ALLIANCE_RENFORT : BG_IC_HORDE_RENFORT), factionReinforcements[player->GetTeamId()]); + + // we must end the battleground + if (factionReinforcements[player->GetTeamId()] < 1) + EndBattleground(killer->GetTeam()); } void BattlegroundIC::EndBattleground(uint32 winner) { + SendMessage2ToAll(LANG_BG_IC_TEAM_WINS,CHAT_MSG_BG_SYSTEM_NEUTRAL,NULL, (winner == ALLIANCE ? LANG_BG_IC_ALLIANCE : LANG_BG_IC_HORDE)); + Battleground::EndBattleground(winner); } -void BattlegroundIC::EventPlayerClickedOnFlag(Player * /*source*/, GameObject* /*target_obj*/) +void BattlegroundIC::RealocatePlayers(ICNodePointType nodeType) +{ + // Those who are waiting to resurrect at this node are taken to the closest own node's graveyard + std::vector<uint64> ghost_list = m_ReviveQueue[m_BgCreatures[BG_IC_NPC_SPIRIT_GUIDE_1+nodeType-2]]; + if (!ghost_list.empty()) + { + WorldSafeLocsEntry const *ClosestGrave = NULL; + for (std::vector<uint64>::const_iterator itr = ghost_list.begin(); itr != ghost_list.end(); ++itr) + { + Player* plr = sObjectMgr->GetPlayer(*itr); + if (!plr) + continue; + + if (!ClosestGrave) // cache + ClosestGrave = GetClosestGraveYard(plr); + + if (ClosestGrave) + plr->TeleportTo(GetMapId(), ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, plr->GetOrientation()); + } + } +} + +void BattlegroundIC::EventPlayerClickedOnFlag(Player* player, GameObject* target_obj) { if (GetStatus() != STATUS_IN_PROGRESS) return; + + // All the node points are iterated to find the clicked one + for (uint8 i = 0; i < MAX_NODE_TYPES; i++) + { + if (nodePoint[i].gameobject_entry == target_obj->GetEntry()) + { + // THIS SHOULD NEEVEER HAPPEN + if (nodePoint[i].faction == player->GetTeamId()) + return; + + uint32 nextBanner = GetNextBanner(&nodePoint[i],player->GetTeamId(),false); + + // we set the new settings of the nodePoint + nodePoint[i].faction = player->GetTeamId(); + nodePoint[i].last_entry = nodePoint[i].gameobject_entry; + nodePoint[i].gameobject_entry = nextBanner; + + // this is just needed if the next banner is grey + if (nodePoint[i].banners[1] == nextBanner || nodePoint[i].banners[3] == nextBanner) + { + nodePoint[i].timer = 60000; // 1 minute for last change (real faction banner) + nodePoint[i].needChange = true; + + RealocatePlayers(nodePoint[i].nodeType); + + // if we are here means that the point has been lost, or it is the first capture + + if (nodePoint[i].nodeType != NODE_TYPE_REFINERY && nodePoint[i].nodeType != NODE_TYPE_QUARRY) + if (m_BgCreatures[BG_IC_NPC_SPIRIT_GUIDE_1+(nodePoint[i].nodeType)-2]) + DelCreature(BG_IC_NPC_SPIRIT_GUIDE_1+(nodePoint[i].nodeType)-2); + + UpdatePlayerScore(player, SCORE_BASE_ASSAULTED, 1); + + SendMessage2ToAll(LANG_BG_IC_TEAM_ASSAULTED_NODE_1,CHAT_MSG_BG_SYSTEM_NEUTRAL,player,nodePoint[i].string); + SendMessage2ToAll(LANG_BG_IC_TEAM_ASSAULTED_NODE_2,CHAT_MSG_BG_SYSTEM_NEUTRAL,player,nodePoint[i].string, (player->GetTeamId() == TEAM_ALLIANCE ? LANG_BG_IC_ALLIANCE : LANG_BG_IC_HORDE)); + HandleContestedNodes(&nodePoint[i]); + } else if (nextBanner == nodePoint[i].banners[0] || nextBanner == nodePoint[i].banners[2]) // if we are going to spawn the definitve faction banner, we dont need the timer anymore + { + nodePoint[i].timer = 60000; + nodePoint[i].needChange = false; + SendMessage2ToAll(LANG_BG_IC_TEAM_DEFENDED_NODE,CHAT_MSG_BG_SYSTEM_NEUTRAL,player,nodePoint[i].string); + HandleCapturedNodes(&nodePoint[i],true); + UpdatePlayerScore(player, SCORE_BASE_DEFENDED, 1); + } + + GameObject* banner = GetBGObject(nodePoint[i].gameobject_type); + + if (!banner) // this should never happen + return; + + float cords[4] = {banner->GetPositionX(), banner->GetPositionY(), banner->GetPositionZ(), banner->GetOrientation() }; + + DelObject(nodePoint[i].gameobject_type); + AddObject(nodePoint[i].gameobject_type,nodePoint[i].gameobject_entry,cords[0],cords[1],cords[2],cords[3],0,0,0,0,RESPAWN_ONE_DAY); + + GetBGObject(nodePoint[i].gameobject_type)->SetUInt32Value(GAMEOBJECT_FACTION, nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_Factions[1] : BG_IC_Factions[0]); + + if (nodePoint[i].nodeType == NODE_TYPE_WORKSHOP) + { + DelObject(BG_IC_GO_SEAFORIUM_BOMBS_1); + DelObject(BG_IC_GO_SEAFORIUM_BOMBS_2); + } + + UpdateNodeWorldState(&nodePoint[i]); + // we dont need iterating if we are here + // If the needChange bool was set true, we will handle the rest in the Update Map function. + return; + } + } +} + +void BattlegroundIC::UpdateNodeWorldState(ICNodePoint* nodePoint) +{ + //updating worldstate + if (nodePoint->gameobject_entry == nodePoint->banners[0]) + nodePoint->nodeState = NODE_STATE_CONTROLLED_A; + else if (nodePoint->gameobject_entry == nodePoint->banners[1]) + nodePoint->nodeState = NODE_STATE_CONFLICT_A; + else if (nodePoint->gameobject_entry == nodePoint->banners[2]) + nodePoint->nodeState = NODE_STATE_CONTROLLED_H; + else if (nodePoint->gameobject_entry == nodePoint->banners[3]) + nodePoint->nodeState = NODE_STATE_CONFLICT_H; + + uint32 worldstate = nodePoint->worldStates[nodePoint->nodeState]; + + // with this we are sure we dont bug the client + for (uint8 i = 0; i < 4; i++) + UpdateWorldState(nodePoint->worldStates[i],0); + + UpdateWorldState(worldstate,1); +} + +uint32 BattlegroundIC::GetNextBanner(ICNodePoint* nodePoint, uint32 team, bool returnDefinitve) +{ + // this is only used in the update map function + if (returnDefinitve) + // here is a special case, here we must return the definitve faction banner after the grey banner was spawned 1 minute + return nodePoint->banners[(team == TEAM_ALLIANCE ? 0 : 2)]; + + // there were no changes, this point has never been captured by any faction or at least clicked + if (nodePoint->last_entry == 0) + // 1 returns the CONTESTED ALLIANCE BANNER, 3 returns the HORDE one + return nodePoint->banners[(team == TEAM_ALLIANCE ? 1 : 3)]; + + // If the actual banner is the definitive faction banner, we must return the grey banner of the player's faction + if (nodePoint->gameobject_entry == nodePoint->banners[0] || nodePoint->gameobject_entry == nodePoint->banners[2]) + return nodePoint->banners[(team == TEAM_ALLIANCE ? 1 : 3)]; + + // If the actual banner is the grey faction banner, we must return the previous banner + if (nodePoint->gameobject_entry == nodePoint->banners[1] || nodePoint->banners[3]) + return nodePoint->last_entry; + + // we should never be here... + sLog->outError("Isle Of Conquest: Unexpected return in GetNextBanner function"); + return 0; +} + +void BattlegroundIC::HandleContestedNodes(ICNodePoint* nodePoint) +{ + if (nodePoint->nodeType == NODE_TYPE_HANGAR) + { + if (gunshipAlliance && gunshipHorde) + (nodePoint->faction == TEAM_ALLIANCE ? gunshipHorde : gunshipAlliance)->BuildStopMovePacket(GetBgMap()); + + for (uint8 u = BG_IC_GO_HANGAR_TELEPORTER_1; u < BG_IC_GO_HANGAR_TELEPORTER_3; u++) + DelObject(u); + } +} + +void BattlegroundIC::HandleCapturedNodes(ICNodePoint* nodePoint, bool recapture) +{ + if(nodePoint->nodeType != NODE_TYPE_REFINERY && nodePoint->nodeType != NODE_TYPE_QUARRY) + { + if (!AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+nodePoint->nodeType-2, + BG_IC_SpiritGuidePos[nodePoint->nodeType][0], BG_IC_SpiritGuidePos[nodePoint->nodeType][1], + BG_IC_SpiritGuidePos[nodePoint->nodeType][2], BG_IC_SpiritGuidePos[nodePoint->nodeType][3], + (nodePoint->faction == TEAM_ALLIANCE ? ALLIANCE : HORDE))) + sLog->outError("Isle of Conquest: Failed to spawn spirit guide! point: %u, team: %u,", nodePoint->nodeType, nodePoint->faction); + } + + switch(nodePoint->gameobject_type) + { + case BG_IC_GO_HANGAR_BANNER: + // all the players on the stopped transport should be teleported out + if (!gunshipAlliance || !gunshipHorde) + break; + + for (uint8 u = 0; u < 3; u++) + { + uint8 type = BG_IC_GO_HANGAR_TELEPORTER_1+u; + AddObject(type, (nodePoint->faction == TEAM_ALLIANCE ? GO_ALLIANCE_GUNSHIP_PORTAL : GO_HORDE_GUNSHIP_PORTAL), + BG_IC_HangarTeleporters[u].GetPositionX(),BG_IC_HangarTeleporters[u].GetPositionY(), + BG_IC_HangarTeleporters[u].GetPositionZ(),BG_IC_HangarTeleporters[u].GetOrientation(), + 0,0,0,0,RESPAWN_ONE_DAY); + } + + //sLog->outError("BG_IC_GO_HANGAR_BANNER CAPTURED Faction: %u", nodePoint->faction); + + (nodePoint->faction == TEAM_ALLIANCE ? gunshipAlliance : gunshipHorde)->BuildStartMovePacket(GetBgMap()); + (nodePoint->faction == TEAM_ALLIANCE ? gunshipHorde : gunshipAlliance)->BuildStopMovePacket(GetBgMap()); + // we should spawn teleporters + break; + case BG_IC_GO_QUARRY_BANNER: + RemoveAuraOnTeam(SPELL_QUARRY,(nodePoint->faction == TEAM_ALLIANCE ? HORDE : ALLIANCE)); + CastSpellOnTeam(SPELL_QUARRY,(nodePoint->faction == TEAM_ALLIANCE ? ALLIANCE : HORDE)); + break; + case BG_IC_GO_REFINERY_BANNER: + RemoveAuraOnTeam(SPELL_OIL_REFINERY,(nodePoint->faction == TEAM_ALLIANCE ? HORDE : ALLIANCE)); + CastSpellOnTeam(SPELL_OIL_REFINERY,(nodePoint->faction == TEAM_ALLIANCE ? ALLIANCE : HORDE)); + break; + case BG_IC_GO_DOCKS_BANNER: + + if (recapture) + break; + + if (docksTimer < DOCKS_UPDATE_TIMER) + docksTimer = DOCKS_UPDATE_TIMER; + + // we must del opposing faction vehicles when the node is captured (unused ones) + for (uint8 i = (nodePoint->faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_1_H : BG_IC_NPC_GLAIVE_THROWER_1_A); i < (nodePoint->faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_2_H : BG_IC_NPC_GLAIVE_THROWER_2_A); i++) + { + if (Creature* glaiveThrower = GetBGCreature(i)) + { + if (Vehicle* vehicleGlaive = glaiveThrower->GetVehicleKit()) + { + if (!vehicleGlaive->GetPassenger(0)) + DelCreature(i); + } + } + } + + for (uint8 i = (nodePoint->faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_1_H : BG_IC_NPC_CATAPULT_1_A); i < (nodePoint->faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_4_H : BG_IC_NPC_CATAPULT_4_A); i++) + { + if (Creature* catapult = GetBGCreature(i)) + { + if (Vehicle* vehicleGlaive = catapult->GetVehicleKit()) + { + if (!vehicleGlaive->GetPassenger(0)) + DelCreature(i); + } + } + } + + // spawning glaive throwers + for (uint8 i = 0; i < 2; i++) + { + uint8 type = (nodePoint->faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_1_A : BG_IC_NPC_GLAIVE_THROWER_1_H)+i; + + if (GetBGCreature(type) && GetBGCreature(type)->isAlive()) + continue; + + if (AddCreature(NPC_GLAIVE_THROWER,type,nodePoint->faction, + BG_IC_DocksVehiclesGlaives[i].GetPositionX(),BG_IC_DocksVehiclesGlaives[i].GetPositionY(), + BG_IC_DocksVehiclesGlaives[i].GetPositionZ(),BG_IC_DocksVehiclesGlaives[i].GetOrientation(), + RESPAWN_ONE_DAY)) + GetBGCreature(type)->setFaction(BG_IC_Factions[(nodePoint->faction == TEAM_ALLIANCE ? 0 : 1)]); + } + + // spawning catapults + for (uint8 i = 0; i < 4; i++) + { + uint8 type = (nodePoint->faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_1_A : BG_IC_NPC_CATAPULT_1_H)+i; + + if (GetBGCreature(type) && GetBGCreature(type)->isAlive()) + continue; + + if (AddCreature(NPC_CATAPULT,type,nodePoint->faction, + BG_IC_DocksVehiclesCatapults[i].GetPositionX(),BG_IC_DocksVehiclesCatapults[i].GetPositionY(), + BG_IC_DocksVehiclesCatapults[i].GetPositionZ(),BG_IC_DocksVehiclesCatapults[i].GetOrientation(), + RESPAWN_ONE_DAY)) + GetBGCreature(type)->setFaction(BG_IC_Factions[(nodePoint->faction == TEAM_ALLIANCE ? 0 : 1)]); + } + break; + case BG_IC_GO_WORKSHOP_BANNER: + { + if (siegeEngineWorkshopTimer < WORKSHOP_UPDATE_TIMER) + siegeEngineWorkshopTimer = WORKSHOP_UPDATE_TIMER; + + if (!recapture) + { + // we must del opposing faction vehicles when the node is captured (unused ones) + for (uint8 i = (nodePoint->faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_1_H : BG_IC_NPC_DEMOLISHER_1_A); i < (nodePoint->faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_4_H : BG_IC_NPC_DEMOLISHER_4_A); i++) + { + //uint8 type = (nodePoint->faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_1_H : BG_IC_NPC_DEMOLISHER_1_A)+i; + if (Creature* demolisher = GetBGCreature(i)) + { + if (Vehicle* vehicleDemolisher = demolisher->GetVehicleKit()) + { + // is IsVehicleInUse working as expected? + if (!vehicleDemolisher->IsVehicleInUse()) + DelCreature(i); + } + } + } + + for (uint8 i = 0; i < 4; i++) + { + uint8 type = (nodePoint->faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_1_A : BG_IC_NPC_DEMOLISHER_1_H)+i; + + if (GetBGCreature(type) && GetBGCreature(type)->isAlive()) + continue; + + if (AddCreature(NPC_DEMOLISHER,type,nodePoint->faction, + BG_IC_WorkshopVehicles[i].GetPositionX(),BG_IC_WorkshopVehicles[i].GetPositionY(), + BG_IC_WorkshopVehicles[i].GetPositionZ(),BG_IC_WorkshopVehicles[i].GetOrientation(), + RESPAWN_ONE_DAY)) + GetBGCreature(type)->setFaction(BG_IC_Factions[(nodePoint->faction == TEAM_ALLIANCE ? 0 : 1)]); + } + + // we check if the opossing siege engine is in use + int8 enemySiege = (nodePoint->faction == TEAM_ALLIANCE ? BG_IC_NPC_SIEGE_ENGINE_H : BG_IC_NPC_SIEGE_ENGINE_A); + + if (Creature* siegeEngine = GetBGCreature(enemySiege)) + { + if (Vehicle* vehicleSiege = siegeEngine->GetVehicleKit()) + { + // is VehicleInUse working as expected ? + if (!vehicleSiege->IsVehicleInUse()) + DelCreature(enemySiege); + } + } + + uint8 siegeType = (nodePoint->faction == TEAM_ALLIANCE ? BG_IC_NPC_SIEGE_ENGINE_A : BG_IC_NPC_SIEGE_ENGINE_H); + if (!GetBGCreature(siegeType) || !GetBGCreature(siegeType)->isAlive()) + { + AddCreature((nodePoint->faction == TEAM_ALLIANCE ? NPC_SIEGE_ENGINE_A : NPC_SIEGE_ENGINE_H),siegeType,nodePoint->faction, + BG_IC_WorkshopVehicles[4].GetPositionX(),BG_IC_WorkshopVehicles[4].GetPositionY(), + BG_IC_WorkshopVehicles[4].GetPositionZ(),BG_IC_WorkshopVehicles[4].GetOrientation(), + RESPAWN_ONE_DAY); + + if (Creature* siegeEngine = GetBGCreature(siegeType)) + { + siegeEngine->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_UNK_14|UNIT_FLAG_OOC_NOT_ATTACKABLE); + siegeEngine->setFaction(BG_IC_Factions[(nodePoint->faction == TEAM_ALLIANCE ? 0 : 1)]); + } + } + } + for (uint8 i = 0; i < 2; i++) + { + AddObject(BG_IC_GO_SEAFORIUM_BOMBS_1+i,GO_SEAFORIUM_BOMBS, + workshopBombs[i].GetPositionX(),workshopBombs[i].GetPositionY(), + workshopBombs[i].GetPositionZ(),workshopBombs[i].GetOrientation(), + 0,0,0,0,10); + + if (GameObject* seaforiumBombs = GetBGObject(BG_IC_GO_SEAFORIUM_BOMBS_1+i)) + { + seaforiumBombs->SetRespawnTime(10); + seaforiumBombs->SetUInt32Value(GAMEOBJECT_FACTION,BG_IC_Factions[(nodePoint->faction == TEAM_ALLIANCE ? 0 : 1)]); + } + } + break; + } + default: + break; + } +} + +void BattlegroundIC::DestroyGate(Player* pl, GameObject* go, uint32 destroyedEvent) +{ + GateStatus[GetGateIDFromEntry(go->GetEntry())] = BG_IC_GATE_DESTROYED; + uint32 uws_open = GetWorldStateFromGateEntry(go->GetEntry(), true); + uint32 uws_close = GetWorldStateFromGateEntry(go->GetEntry(), false); + if (uws_open) + { + UpdateWorldState(uws_close,0); + UpdateWorldState(uws_open, 1); + } + DoorOpen((pl->GetTeamId() == TEAM_ALLIANCE ? BG_IC_GO_HORDE_KEEP_PORTCULLIS : BG_IC_GO_DOODAD_PORTCULLISACTIVE02)); + + uint32 lang_entry = 0; + + switch(go->GetEntry()) + { + case GO_HORDE_GATE_1: + lang_entry = LANG_BG_IC_NORTH_GATE_DESTROYED; + case GO_HORDE_GATE_2: + case GO_ALLIANCE_GATE_1: + lang_entry = LANG_BG_IC_WEST_GATE_DESTROYED; + break; + case GO_HORDE_GATE_3: + case GO_ALLIANCE_GATE_2: + lang_entry = LANG_BG_IC_EAST_GATE_DESTROYED; + break; + case GO_ALLIANCE_GATE_3: + lang_entry = LANG_BG_IC_SOUTH_GATE_DESTROYED; + break; + default: + break; + } + + SendMessage2ToAll(lang_entry,CHAT_MSG_BG_SYSTEM_NEUTRAL,NULL,(pl->GetTeamId() == TEAM_ALLIANCE ? LANG_BG_IC_HORDE_KEEP : LANG_BG_IC_ALLIANCE_KEEP)); +} + +void BattlegroundIC::EventPlayerDamagedGO(Player* /*plr*/, GameObject* go, uint8 hitType, uint32 destroyedEvent) +{ + +} + +WorldSafeLocsEntry const* BattlegroundIC::GetClosestGraveYard(Player* player) +{ + BattlegroundTeamId teamIndex = GetTeamIndexByTeamId(player->GetTeam()); + + // Is there any occupied node for this team? + std::vector<uint8> nodes; + for (uint8 i = 0; i < MAX_NODE_TYPES; ++i) + if (nodePoint[i].faction == player->GetTeamId()) + nodes.push_back(i); + + WorldSafeLocsEntry const* good_entry = NULL; + // If so, select the closest node to place ghost on + if (!nodes.empty()) + { + float plr_x = player->GetPositionX(); + float plr_y = player->GetPositionY(); + + float mindist = 999999.0f; + for (uint8 i = 0; i < nodes.size(); ++i) + { + WorldSafeLocsEntry const*entry = sWorldSafeLocsStore.LookupEntry(BG_IC_GraveyardIds[nodes[i]]); + if (!entry) + continue; + float dist = (entry->x - plr_x)*(entry->x - plr_x)+(entry->y - plr_y)*(entry->y - plr_y); + if (mindist > dist) + { + mindist = dist; + good_entry = entry; + } + } + nodes.clear(); + } + // If not, place ghost on starting location + if (!good_entry) + good_entry = sWorldSafeLocsStore.LookupEntry(BG_IC_GraveyardIds[teamIndex+MAX_NODE_TYPES]); + + return good_entry; +} + +Transport* BattlegroundIC::CreateTransport(uint32 goEntry,uint32 period) +{ + Transport* t = new Transport(period,0); + + const GameObjectInfo* goinfo = sObjectMgr->GetGameObjectInfo(goEntry); + + if (!goinfo) + { + sLog->outErrorDb("Transport ID: %u will not be loaded, gameobject_template missing", goEntry); + delete t; + return NULL; + } + + std::set<uint32> mapsUsed; + + if (!t->GenerateWaypoints(goinfo->moTransport.taxiPathId, mapsUsed)) + // skip transports with empty waypoints list + { + sLog->outErrorDb("Transport (path id %u) path size = 0. Transport ignored, check DBC files or transport GO data0 field.",goinfo->moTransport.taxiPathId); + delete t; + return NULL; + } + + uint32 mapid = t->m_WayPoints[0].mapid; + + float x = t->m_WayPoints[0].x; + float y = t->m_WayPoints[0].y; + float z = t->m_WayPoints[0].z; + float o = 1; + + // creates the Gameobject + if (!t->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_MO_TRANSPORT),goEntry, mapid, x, y, z, o, 100, 0)) + { + delete t; + return NULL; + } + + //If we someday decide to use the grid to track transports, here: + t->SetMap(GetBgMap()); + + for (uint8 i = 0; i < 5; i++) + t->AddNPCPassenger(0,(goEntry == GO_HORDE_GUNSHIP ? NPC_HORDE_GUNSHIP_CANNON : NPC_ALLIANCE_GUNSHIP_CANNON), (goEntry == GO_HORDE_GUNSHIP ? hordeGunshipPassengers[i].GetPositionX() : allianceGunshipPassengers[i].GetPositionX()) , (goEntry == GO_HORDE_GUNSHIP ? hordeGunshipPassengers[i].GetPositionY() : allianceGunshipPassengers[i].GetPositionY()),(goEntry == GO_HORDE_GUNSHIP ? hordeGunshipPassengers[i].GetPositionZ() : allianceGunshipPassengers[i].GetPositionZ()), (goEntry == GO_HORDE_GUNSHIP ? hordeGunshipPassengers[i].GetOrientation() : allianceGunshipPassengers[i].GetOrientation())); + + return t; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h index 82b2c0d57de..f57b85d92cb 100755 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h @@ -21,10 +21,609 @@ class Battleground; +const uint32 BG_IC_Factions[2] = +{ + 1732, // Alliance + 1735 // Horde +}; + +enum creaturesIC +{ + NPC_HIGH_COMMANDER_HALFORD_WYRMBANE = 34924, // Alliance Boss + NPC_OVERLORD_AGMAR = 34922, // Horde Boss + NPC_KOR_KRON_GUARD = 34918, // horde guard + NPC_SEVEN_TH_LEGION_INFANTRY = 34919, // alliance guard + NPC_KEEP_CANNON = 34944, + NPC_DEMOLISHER = 34775, + NPC_SIEGE_ENGINE_H = 35069, + NPC_SIEGE_ENGINE_A = 34776, + NPC_GLAIVE_THROWER = 34802, + NPC_CATAPULT = 34793, + NPC_HORDE_GUNSHIP_CANNON = 34935, + NPC_ALLIANCE_GUNSHIP_CANNON = 34929 +}; + +enum gameobjectsIC +{ + GO_ALLIANCE_BANNER = 195396, + + GO_ALLIANCE_GATE_1 = 195699, + GO_ALLIANCE_GATE_2 = 195698, + GO_ALLIANCE_GATE_3 = 195700, + + GO_ALLIANCE_GUNSHIP_PORTAL = 195320, + + GO_ALLIANCE_GUNSHIP_PORTAL_EFFECTS = 195705, + + GO_BENCH_1 = 186896, + GO_BENCH_2 = 186922, + GO_BENCH_3 = 186899, + GO_BENCH_4 = 186904, + GO_BENCH_5 = 186897, + + GO_BONFIRE_1 = 195376, + GO_BONFIRE_2 = 195208, + GO_BONFIRE_3 = 195210, + GO_BONFIRE_4 = 195207, + GO_BONFIRE_5 = 195209, + GO_BONFIRE_6 = 195377, + + GO_DOCKS_BANNER = 195157, + + GO_DOODAD_HU_PORTCULLIS01 = 195436, + + GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01 = 195703, + + GO_DOODAD_PORTCULLISACTIVE01 = 195451, + + GO_DOODAD_PORTCULLISACTIVE02 = 195452, + + GO_DOODAD_VR_PORTCULLIS01 = 195437, + + GO_CHAIR_1 = 195410, + GO_CHAIR_2 = 195414, + GO_CHAIR_3 = 160415, + GO_CHAIR_4 = 195418, + GO_CHAIR_5 = 195416, + GO_CHAIR_6 = 160410, + GO_CHAIR_7 = 160418, + GO_CHAIR_8 = 160416, + GO_CHAIR_9 = 160419, + + GO_FLAGPOLE_1 = 195131, + GO_FLAGPOLE_2 = 195439, + GO_FLAGPOLE_3 = 195131, + + GO_GUNSHIP_PORTAL_1 = 195371, + GO_GUNSHIP_PORTAL_2 = 196413, + + GO_HANGAR_BANNER = 195158, + + GO_HORDE_BANNER = 195393, + + GO_HORDE_GATE_1 = 195494, + GO_HORDE_GATE_2 = 195496, + GO_HORDE_GATE_3 = 195495, + + GO_HORDE_GUNSHIP_PORTAL = 195326, + + GO_HORDE_GUNSHIP_PORTAL_EFFECTS = 195706, + + GO_HORDE_KEEP_PORTCULLIS = 195223, + + GO_HUGE_SEAFORIUM_BOMB_A = 195332, + GO_HUGE_SEAFORIUM_BOMB_H = 195333, + + GO_QUARRY_BANNER = 195338, + GO_REFRESHMENT_PORTAL = 186811, + GO_SEAFORIUM_BOMBS = 195237, + + GO_STOVE_1 = 174863, + GO_STOVE_2 = 160411, + + GO_TELEPORTER_1 = 195314, // 195314 H-OUT 66549 + GO_TELEPORTER_2 = 195313, // 195313 H-IN 66548 + + GO_TELEPORTER_3 = 195315, // 195315 A-OUT 66549 + GO_TELEPORTER_4 = 195316, // 195316 A-IN 66548 + + GO_TELEPORTER_EFFECTS_A = 195701, + + GO_TELEPORTER_EFFECTS_H = 195702, + + GO_WORKSHOP_BANNER = 195133, + + GO_BRAZIER_1 = 195402, + GO_BRAZIER_2 = 195403, + GO_BRAZIER_3 = 195425, + GO_BRAZIER_4 = 195424, + + GO_REFINERY_BANNER = 195343, + + GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01 = 195491, + + GO_ALLIANCE_BANNER_DOCK = 195153, + GO_ALLIANCE_BANNER_DOCK_CONT = 195154, + GO_HORDE_BANNER_DOCK = 195155, + GO_HORDE_BANNER_DOCK_CONT = 195156, + + GO_HORDE_BANNER_HANGAR = 195130, + GO_HORDE_BANNER_HANGAR_CONT = 195145, + GO_ALLIANCE_BANNER_HANGAR = 195132, + GO_ALLIANCE_BANNER_HANGAR_CONT= 195144, + + GO_ALLIANCE_BANNER_QUARRY = 195334, + GO_ALLIANCE_BANNER_QUARRY_CONT = 195335, + GO_HORDE_BANNER_QUARRY = 195336, + GO_HORDE_BANNER_QUARRY_CONT = 195337, + + GO_ALLIANCE_BANNER_REFINERY = 195339, + GO_ALLIANCE_BANNER_REFINERY_CONT = 195340, + GO_HORDE_BANNER_REFINERY = 195341, + GO_HORDE_BANNER_REFINERY_CONT = 195342, + + GO_ALLIANCE_BANNER_WORKSHOP = 195149, + GO_ALLIANCE_BANNER_WORKSHOP_CONT = 195150, + GO_HORDE_BANNER_WORKSHOP = 195151, + GO_HORDE_BANNER_WORKSHOP_CONT = 195152, + + GO_ALLIANCE_BANNER_GRAVEYARD_A = 195396, + GO_ALLIANCE_BANNER_GRAVEYARD_A_CONT = 195397, + GO_HORDE_BANNER_GRAVEYARD_A = 195398, + GO_HORDE_BANNER_GRAVEYARD_A_CONT = 195399, + + GO_ALLIANCE_BANNER_GRAVEYARD_H = 195391, + GO_ALLIANCE_BANNER_GRAVEYARD_H_CONT = 195392, + GO_HORDE_BANNER_GRAVEYARD_H = 195393, + GO_HORDE_BANNER_GRAVEYARD_H_CONT = 195394, + + GO_HORDE_GUNSHIP = 195276, + GO_ALLIANCE_GUNSHIP = 195121, +}; + +#define NPCS_MAX_SPAWNS BG_IC_NPC_KEEP_CANNON_25+1 +#define MAX_WORKSHOP_SPAWNS 10 +#define MAX_DOCKS_SPAWNS 12 +#define MAX_SPIRIT_GUIDES 7 +#define MAX_HANGAR_TELEPORTERS 3 +#define MAX_AIRSHIPS 2 + +#define WORKSHOP_UPDATE_TIMER 180000 // 3 minutes +#define DOCKS_UPDATE_TIMER 180000 // not sure if it is 3 minutes +#define IC_RESOURCE_TIME 45000 // not sure, need more research + +struct ICNpc +{ + uint32 type; + uint32 entry; + uint32 team; + float x; + float y; + float z; + float o; +}; + +enum BG_IC_NPCs +{ + BG_IC_NPC_OVERLORD_AGMAR = 0, + BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE, + BG_IC_NPC_KOR_KRON_GUARD_1, + BG_IC_NPC_KOR_KRON_GUARD_2, + BG_IC_NPC_KOR_KRON_GUARD_3, + BG_IC_NPC_KOR_KRON_GUARD_4, + BG_IC_NPC_SEVEN_TH_LEGION_INFANTRY_1, + BG_IC_NPC_SEVEN_TH_LEGION_INFANTRY_2, + BG_IC_NPC_SEVEN_TH_LEGION_INFANTRY_3, + BG_IC_NPC_SEVEN_TH_LEGION_INFANTRY_4, + BG_IC_NPC_KEEP_CANNON_1, + BG_IC_NPC_KEEP_CANNON_2, + BG_IC_NPC_KEEP_CANNON_3, + BG_IC_NPC_KEEP_CANNON_4, + BG_IC_NPC_KEEP_CANNON_5, + BG_IC_NPC_KEEP_CANNON_6, + BG_IC_NPC_KEEP_CANNON_7, + BG_IC_NPC_KEEP_CANNON_8, + BG_IC_NPC_KEEP_CANNON_9, + BG_IC_NPC_KEEP_CANNON_10, + BG_IC_NPC_KEEP_CANNON_11, + BG_IC_NPC_KEEP_CANNON_12, + BG_IC_NPC_KEEP_CANNON_13, + BG_IC_NPC_KEEP_CANNON_14, + BG_IC_NPC_KEEP_CANNON_15, + BG_IC_NPC_KEEP_CANNON_16, + BG_IC_NPC_KEEP_CANNON_17, + BG_IC_NPC_KEEP_CANNON_18, + BG_IC_NPC_KEEP_CANNON_19, + BG_IC_NPC_KEEP_CANNON_20, + BG_IC_NPC_KEEP_CANNON_21, + BG_IC_NPC_KEEP_CANNON_22, + BG_IC_NPC_KEEP_CANNON_23, + BG_IC_NPC_KEEP_CANNON_24, + BG_IC_NPC_KEEP_CANNON_25, + + BG_IC_NPC_SIEGE_ENGINE_A, + BG_IC_NPC_SIEGE_ENGINE_H, + + BG_IC_NPC_DEMOLISHER_1_A, + BG_IC_NPC_DEMOLISHER_2_A, + BG_IC_NPC_DEMOLISHER_3_A, + BG_IC_NPC_DEMOLISHER_4_A, + + BG_IC_NPC_DEMOLISHER_1_H, + BG_IC_NPC_DEMOLISHER_2_H, + BG_IC_NPC_DEMOLISHER_3_H, + BG_IC_NPC_DEMOLISHER_4_H, + + BG_IC_NPC_GLAIVE_THROWER_1_A, + BG_IC_NPC_GLAIVE_THROWER_2_A, + BG_IC_NPC_GLAIVE_THROWER_1_H, + BG_IC_NPC_GLAIVE_THROWER_2_H, + + BG_IC_NPC_CATAPULT_1_A, + BG_IC_NPC_CATAPULT_2_A, + BG_IC_NPC_CATAPULT_3_A, + BG_IC_NPC_CATAPULT_4_A, + + BG_IC_NPC_CATAPULT_1_H, + BG_IC_NPC_CATAPULT_2_H, + BG_IC_NPC_CATAPULT_3_H, + BG_IC_NPC_CATAPULT_4_H, + + BG_IC_NPC_SPIRIT_GUIDE_1, + BG_IC_NPC_SPIRIT_GUIDE_2, + BG_IC_NPC_SPIRIT_GUIDE_3, + BG_IC_NPC_SPIRIT_GUIDE_4, + BG_IC_NPC_SPIRIT_GUIDE_5, + BG_IC_NPC_SPIRIT_GUIDE_6, + BG_IC_NPC_SPIRIT_GUIDE_7, +}; +const ICNpc BG_IC_NpcSpawnlocs[NPCS_MAX_SPAWNS]= +{ + {BG_IC_NPC_OVERLORD_AGMAR,NPC_OVERLORD_AGMAR,TEAM_HORDE,1295.44f,-765.733f,70.0541f,0.0f},//Overlord Agmar 1 + {BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE,NPC_HIGH_COMMANDER_HALFORD_WYRMBANE,TEAM_ALLIANCE,224.983f,-831.573f,60.9034f,0.0f},//High Commander Halford Wyrmbane 2 + {BG_IC_NPC_KOR_KRON_GUARD_1,NPC_KOR_KRON_GUARD,TEAM_HORDE,1296.01f,-773.256f,69.958f,0.292168f}, // 3 + {BG_IC_NPC_KOR_KRON_GUARD_2,NPC_KOR_KRON_GUARD,TEAM_HORDE,1295.94f,-757.756f,69.9587f,6.02165f}, // 4 + {BG_IC_NPC_KOR_KRON_GUARD_3,NPC_KOR_KRON_GUARD,TEAM_HORDE,1295.09f,-760.927f,69.9587f,5.94311f}, // 5 + {BG_IC_NPC_KOR_KRON_GUARD_4,NPC_KOR_KRON_GUARD,TEAM_HORDE,1295.13f,-769.7f,69.95f,0.34f}, // 6 + + {BG_IC_NPC_SEVEN_TH_LEGION_INFANTRY_1,NPC_SEVEN_TH_LEGION_INFANTRY,TEAM_ALLIANCE,223.969f,-822.958f,60.8151f,0.46337f}, // 7 + {BG_IC_NPC_SEVEN_TH_LEGION_INFANTRY_2,NPC_SEVEN_TH_LEGION_INFANTRY,TEAM_ALLIANCE,224.211f,-826.952f,60.8188f,6.25961f}, // 8 + {BG_IC_NPC_SEVEN_TH_LEGION_INFANTRY_3,NPC_SEVEN_TH_LEGION_INFANTRY,TEAM_ALLIANCE,223.119f,-838.386f,60.8145f,5.64857f}, // 9 + {BG_IC_NPC_SEVEN_TH_LEGION_INFANTRY_4,NPC_SEVEN_TH_LEGION_INFANTRY,TEAM_ALLIANCE,223.889f,-835.102f,60.8201f,6.21642f},// 10 + + {BG_IC_NPC_KEEP_CANNON_1,NPC_KEEP_CANNON,TEAM_ALLIANCE,415.825f,-754.634f,87.799f,1.78024f},// 11 + {BG_IC_NPC_KEEP_CANNON_2,NPC_KEEP_CANNON,TEAM_ALLIANCE,410.142f,-755.332f,87.7991f,1.78024f},// 12 + {BG_IC_NPC_KEEP_CANNON_3,NPC_KEEP_CANNON,TEAM_ALLIANCE,424.33f,-879.352f,88.0446f,0.436332f},// 13 + {BG_IC_NPC_KEEP_CANNON_4,NPC_KEEP_CANNON,TEAM_ALLIANCE,425.602f,-786.646f,87.7991f,5.74213f},// 14 + {BG_IC_NPC_KEEP_CANNON_5,NPC_KEEP_CANNON,TEAM_ALLIANCE,426.743f,-884.939f,87.9613f,0.436332f},// 15 + {BG_IC_NPC_KEEP_CANNON_6,NPC_KEEP_CANNON,TEAM_ALLIANCE,404.736f,-755.495f,87.7989f,1.78024f},// 16 + {BG_IC_NPC_KEEP_CANNON_7,NPC_KEEP_CANNON,TEAM_ALLIANCE,428.375f,-780.797f,87.7991f,5.79449f},// 17 + {BG_IC_NPC_KEEP_CANNON_8,NPC_KEEP_CANNON,TEAM_ALLIANCE,429.175f,-890.436f,88.0446f,0.436332f},// 18 + {BG_IC_NPC_KEEP_CANNON_9,NPC_KEEP_CANNON,TEAM_ALLIANCE,430.872f,-775.278f,87.7991f,5.88176f},// 19 + {BG_IC_NPC_KEEP_CANNON_10,NPC_KEEP_CANNON,TEAM_ALLIANCE,408.056f,-911.283f,88.0445f,4.64258f},// 20 + {BG_IC_NPC_KEEP_CANNON_11,NPC_KEEP_CANNON,TEAM_ALLIANCE,413.609f,-911.566f,88.0447f,4.66003f},// 21 + {BG_IC_NPC_KEEP_CANNON_12,NPC_KEEP_CANNON,TEAM_ALLIANCE,402.554f,-910.557f,88.0446f,4.57276f},// 22 + + {BG_IC_NPC_KEEP_CANNON_13,NPC_KEEP_CANNON,TEAM_HORDE,1158.91f,-660.144f,87.9332f,0.750492f},// 23 + {BG_IC_NPC_KEEP_CANNON_14,NPC_KEEP_CANNON,TEAM_HORDE,1156.22f,-866.809f,87.8754f,5.27089f},// 24 + {BG_IC_NPC_KEEP_CANNON_15,NPC_KEEP_CANNON,TEAM_HORDE,1163.74f,-663.67f,88.3571f,0.558505f},// 25 + {BG_IC_NPC_KEEP_CANNON_16,NPC_KEEP_CANNON,TEAM_HORDE,1135.18f,-683.896f,88.0409f,3.9619f},// 26 + {BG_IC_NPC_KEEP_CANNON_17,NPC_KEEP_CANNON,TEAM_HORDE,1138.91f,-836.359f,88.3728f,2.18166f},// 27 + {BG_IC_NPC_KEEP_CANNON_18,NPC_KEEP_CANNON,TEAM_HORDE,1162.08f,-863.717f,88.358f,5.48033f},// 28 + {BG_IC_NPC_KEEP_CANNON_19,NPC_KEEP_CANNON,TEAM_HORDE,1167.13f,-669.212f,87.9682f,0.383972f},// 29 + {BG_IC_NPC_KEEP_CANNON_20,NPC_KEEP_CANNON,TEAM_HORDE,1137.72f,-688.517f,88.4023f,3.9619f},// 30 + {BG_IC_NPC_KEEP_CANNON_21,NPC_KEEP_CANNON,TEAM_HORDE,1135.29f,-840.878f,88.0252f,2.30383f},// 31 + {BG_IC_NPC_KEEP_CANNON_22,NPC_KEEP_CANNON,TEAM_HORDE,1144.33f,-833.309f,87.9268f,2.14675f},// 32 + {BG_IC_NPC_KEEP_CANNON_23,NPC_KEEP_CANNON,TEAM_HORDE,1135.29f,-840.878f,88.0252f,2.30383f},// 33 + {BG_IC_NPC_KEEP_CANNON_24,NPC_KEEP_CANNON,TEAM_HORDE,1142.59f,-691.946f,87.9756f,3.9619f},// 34 + {BG_IC_NPC_KEEP_CANNON_25,NPC_KEEP_CANNON,TEAM_HORDE,1166.13f,-858.391f,87.9653f,5.63741f},// 35 +}; + +const Position BG_IC_WorkshopVehicles[5] = +{ + {751.8281f, -852.732666f, 12.5250978f, 1.46607661f}, // Demolisher + {761.809f, -854.2274f, 12.5263243f, 1.46607661f}, // Demolisher + {783.4722f, -853.9601f, 12.54775f, 1.71042264f}, // Demolisher + {793.055542f, -852.71875f, 12.5671329f, 1.71042264f}, // Demolisher + {773.680542f, -884.092041f, 16.8090363f, 1.58824956f} // Siege Engine +}; + +const Position BG_IC_DocksVehiclesGlaives[2] = +{ + { 779.3125f, -342.972229f, 12.2104874f, 4.712389f }, // Glaive Throwers + { 790.029541f, -342.899323f, 12.2128582f, 4.71238f }, // Glaive Throwers +}; + +const Position BG_IC_DocksVehiclesCatapults[4] = +{ + {757.283f, -341.7795f, 12.2113762f, 4.729842f}, // Catapults + {766.947937f, -342.053833f, 12.2009945f, 4.694f}, // Catapults + {800.3785f, -342.607635f, 12.1669979f, 4.6774f}, // Catapults + {810.7257f, -342.083344f, 12.1675768f, 4.6600f}, // Catapults +}; + +const Position BG_IC_HangarTeleporters[3] = +{ + {827.958f,-994.467f,134.071f,0.0f}, // Gunship Portal + {738.613f,-1106.58f,134.745f,2.54818f}, // Gunship Portal + {672.283f,-1156.99f,133.706f,1.37881f}, // Gunship Portal +}; + +#define GAMEOBJECT_MAX_SPAWNS BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01+1 + +enum BG_IC_GOs +{ + BG_IC_GO_ALLIANCE_BANNER = 0, + + BG_IC_GO_ALLIANCE_GATE_1, + BG_IC_GO_ALLIANCE_GATE_2, + BG_IC_GO_ALLIANCE_GATE_3, + + BG_IC_GO_BENCH_1, + BG_IC_GO_BENCH_2, + BG_IC_GO_BENCH_3, + BG_IC_GO_BENCH_4, + BG_IC_GO_BENCH_5, + + BG_IC_GO_BONFIRE_1, + BG_IC_GO_BONFIRE_2, + BG_IC_GO_BONFIRE_3, + BG_IC_GO_BONFIRE_4, + BG_IC_GO_BONFIRE_5, + BG_IC_GO_BONFIRE_6, + + BG_IC_GO_BRAZIER_1, + BG_IC_GO_BRAZIER_2, + BG_IC_GO_BRAZIER_3, + BG_IC_GO_BRAZIER_4, + + BG_IC_GO_CHAIR_1, + BG_IC_GO_CHAIR_2, + BG_IC_GO_CHAIR_3_1, + BG_IC_GO_CHAIR_4, + BG_IC_GO_CHAIR_5, + BG_IC_GO_CHAIR_6_1, + BG_IC_GO_CHAIR_7, + BG_IC_GO_CHAIR_3_2, + BG_IC_GO_CHAIR_6_2, + BG_IC_GO_CHAIR_8_1, + BG_IC_GO_CHAIR_8_2, + BG_IC_GO_CHAIR_9, + + BG_IC_GO_DOCKS_BANNER, + + BG_IC_GO_DOODAD_HU_PORTCULLIS01_1, + BG_IC_GO_DOODAD_HU_PORTCULLIS01_2, + + BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01, + + BG_IC_GO_DOODAD_PORTCULLISACTIVE01, + + BG_IC_GO_DOODAD_PORTCULLISACTIVE02, + + BG_IC_GO_DOODAD_VR_PORTCULLIS01_1, + BG_IC_GO_DOODAD_VR_PORTCULLIS01_2, + + BG_IC_GO_FLAGPOLE_1_1, + BG_IC_GO_FLAGPOLE_2_1, + BG_IC_GO_FLAGPOLE_2_2, + BG_IC_GO_FLAGPOLE_1_2, + BG_IC_GO_FLAGPOLE_1_3, + BG_IC_GO_FLAGPOLE_1_4, + BG_IC_GO_FLAGPOLE_1_5, + + BG_IC_GO_HANGAR_BANNER, + + BG_IC_GO_HORDE_BANNER, + + BG_IC_GO_HORDE_GATE_1, + BG_IC_GO_HORDE_GATE_2, + BG_IC_GO_HORDE_GATE_3, + + BG_IC_GO_HORDE_KEEP_PORTCULLIS, + + BG_IC_GO_QUARRY_BANNER, + + BG_IC_GO_STOVE_1_1, + BG_IC_GO_STOVE_2_1, + BG_IC_GO_STOVE_1_2, + BG_IC_GO_STOVE_2_2, + + BG_IC_GO_WORKSHOP_BANNER, + + BG_IC_GO_REFINERY_BANNER, + + BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_1, + BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_2, + BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_3, + BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_4, + + BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_1, + BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_2, + BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_3, + BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_4, + + BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01, + + BG_IC_GO_SEAFORIUM_BOMBS_1, + BG_IC_GO_SEAFORIUM_BOMBS_2, + + BG_IC_GO_HANGAR_TELEPORTER_1, + BG_IC_GO_HANGAR_TELEPORTER_2, + BG_IC_GO_HANGAR_TELEPORTER_3, + + BG_IC_GO_TELEPORTER_1_1, + BG_IC_GO_TELEPORTER_1_2, + BG_IC_GO_TELEPORTER_2_1, + BG_IC_GO_TELEPORTER_3_1, + BG_IC_GO_TELEPORTER_2_2, + BG_IC_GO_TELEPORTER_4_1, + BG_IC_GO_TELEPORTER_3_2, + BG_IC_GO_TELEPORTER_3_3, + BG_IC_GO_TELEPORTER_4_2, + BG_IC_GO_TELEPORTER_4_3, + BG_IC_GO_TELEPORTER_1_3, + BG_IC_GO_TELEPORTER_2_3, + + BG_IC_GO_TELEPORTER_EFFECTS_A_1, + BG_IC_GO_TELEPORTER_EFFECTS_A_2, + BG_IC_GO_TELEPORTER_EFFECTS_A_3, + BG_IC_GO_TELEPORTER_EFFECTS_A_4, + BG_IC_GO_TELEPORTER_EFFECTS_A_5, + BG_IC_GO_TELEPORTER_EFFECTS_A_6, + + BG_IC_GO_TELEPORTER_EFFECTS_H_1, + BG_IC_GO_TELEPORTER_EFFECTS_H_2, + BG_IC_GO_TELEPORTER_EFFECTS_H_3, + BG_IC_GO_TELEPORTER_EFFECTS_H_4, + BG_IC_GO_TELEPORTER_EFFECTS_H_5, + BG_IC_GO_TELEPORTER_EFFECTS_H_6, +}; + +struct ICGo +{ + uint32 type; + uint32 entry; + float x; + float y; + float z; + float o; +}; + +#define MAX_TELEPORTERS_SPAWNS 24 +const ICGo BG_IC_Teleporters[MAX_TELEPORTERS_SPAWNS] = +{ + {BG_IC_GO_TELEPORTER_1_1,GO_TELEPORTER_1,1143.25f,-779.599f,48.629f,1.64061f}, // Teleporter + {BG_IC_GO_TELEPORTER_1_2,GO_TELEPORTER_1,1236.53f,-669.415f,48.2729f,0.104719f}, // Teleporter + {BG_IC_GO_TELEPORTER_2_1,GO_TELEPORTER_2,1233.27f,-844.526f,48.8824f,-0.0174525f}, // Teleporter + {BG_IC_GO_TELEPORTER_3_1,GO_TELEPORTER_3,311.92f,-913.972f,48.8159f,3.08918f}, // Teleporter + {BG_IC_GO_TELEPORTER_2_2,GO_TELEPORTER_2,1235.53f,-683.872f,49.304f,-3.08918f}, // Teleporter + {BG_IC_GO_TELEPORTER_4_1,GO_TELEPORTER_4,397.089f,-859.382f,48.8993f,1.64061f}, // Teleporter + {BG_IC_GO_TELEPORTER_3_2,GO_TELEPORTER_3,324.635f,-749.128f,49.3602f,0.0174525f}, // Teleporter + {BG_IC_GO_TELEPORTER_3_3,GO_TELEPORTER_3,425.675f,-857.09f,48.5104f,-1.6057f}, // Teleporter + {BG_IC_GO_TELEPORTER_4_2,GO_TELEPORTER_4,323.54f,-888.361f,48.9197f,0.0349063f}, // Teleporter + {BG_IC_GO_TELEPORTER_4_3,GO_TELEPORTER_4,326.285f,-777.366f,49.0208f,3.12412f}, // Teleporter + {BG_IC_GO_TELEPORTER_1_3,GO_TELEPORTER_1,1235.09f,-857.898f,48.9163f,3.07177f}, // Teleporter + {BG_IC_GO_TELEPORTER_2_3,GO_TELEPORTER_2,1158.76f,-746.182f,48.6277f,-1.51844f}, // Teleporter + + {BG_IC_GO_TELEPORTER_EFFECTS_A_1,GO_TELEPORTER_EFFECTS_A,425.686f,-857.092f,48.51f,-1.62316f}, // Teleporter Effects (Alliance) + {BG_IC_GO_TELEPORTER_EFFECTS_A_2,GO_TELEPORTER_EFFECTS_A,324.634f,-749.148f,49.359f,0.0174525f}, // Teleporter Effects (Alliance) + {BG_IC_GO_TELEPORTER_EFFECTS_A_3,GO_TELEPORTER_EFFECTS_A,311.911f,-913.986f,48.8157f,3.08918f}, // Teleporter Effects (Alliance) + {BG_IC_GO_TELEPORTER_EFFECTS_A_4,GO_TELEPORTER_EFFECTS_A,326.266f,-777.347f,49.0215f,3.12412f}, // Teleporter Effects (Alliance) + {BG_IC_GO_TELEPORTER_EFFECTS_A_5,GO_TELEPORTER_EFFECTS_A,323.55f,-888.347f,48.9198f,0.0174525f}, // Teleporter Effects (Alliance) + {BG_IC_GO_TELEPORTER_EFFECTS_A_6,GO_TELEPORTER_EFFECTS_A,397.116f,-859.378f,48.8989f,1.64061f}, // Teleporter Effects (Alliance) + + {BG_IC_GO_TELEPORTER_EFFECTS_H_1,GO_TELEPORTER_EFFECTS_H,1143.25f,-779.623f,48.6291f,1.62316f}, // Teleporter Effects (Horde) + {BG_IC_GO_TELEPORTER_EFFECTS_H_2,GO_TELEPORTER_EFFECTS_H,1158.64f,-746.148f,48.6277f,-1.50098f}, // Teleporter Effects (Horde) + {BG_IC_GO_TELEPORTER_EFFECTS_H_3,GO_TELEPORTER_EFFECTS_H,1233.25f,-844.573f,48.8836f,0.0174525f}, // Teleporter Effects (Horde) + {BG_IC_GO_TELEPORTER_EFFECTS_H_4,GO_TELEPORTER_EFFECTS_H,1235.07f,-857.957f,48.9163f,3.05433f}, // Teleporter Effects (Horde) + {BG_IC_GO_TELEPORTER_EFFECTS_H_5,GO_TELEPORTER_EFFECTS_H,1236.46f,-669.344f,48.2684f,0.087266f}, // Teleporter Effects (Horde) + {BG_IC_GO_TELEPORTER_EFFECTS_H_6,GO_TELEPORTER_EFFECTS_H,1235.6f,-683.806f,49.3028f,-3.07177f}, // Teleporter Effects (Horde) +}; + +const ICGo BG_IC_ObjSpawnlocs[GAMEOBJECT_MAX_SPAWNS] = +{ + {BG_IC_GO_ALLIANCE_GATE_1,GO_ALLIANCE_GATE_1,351.615f,-762.75f,48.9162f,-1.5708f}, // Alliance Gate || Left + {BG_IC_GO_ALLIANCE_GATE_2,GO_ALLIANCE_GATE_2,351.024f,-903.326f,48.9247f,1.5708f}, // Alliance Gate || Right + {BG_IC_GO_ALLIANCE_GATE_3,GO_ALLIANCE_GATE_3,413.479f,-833.95f,48.5238f,3.14159f}, // Alliance Gate || Front + + {BG_IC_GO_HORDE_GATE_1,GO_HORDE_GATE_1,1150.9f,-762.606f,47.5077f,3.14159f}, // Horde Gate || Front + {BG_IC_GO_HORDE_GATE_2,GO_HORDE_GATE_2,1218.74f,-851.155f,48.2533f,-1.5708f}, // Horde Gate || Left + {BG_IC_GO_HORDE_GATE_3,GO_HORDE_GATE_3,1217.9f,-676.948f,47.6341f,1.5708f}, // Horde Gate || Right + + {BG_IC_GO_HORDE_BANNER,GO_HORDE_BANNER,1284.76f,-705.668f,48.9163f,-3.08918f}, // Horde Banner + {BG_IC_GO_ALLIANCE_BANNER,GO_ALLIANCE_BANNER,299.153f,-784.589f,48.9162f,-0.157079f}, // Alliance Banner + + {BG_IC_GO_WORKSHOP_BANNER,GO_WORKSHOP_BANNER,776.229f,-804.283f,6.45052f,1.6057f}, // Workshop Banner + {BG_IC_GO_DOCKS_BANNER,GO_DOCKS_BANNER,726.385f,-360.205f,17.8153f,-1.62316f}, // Docks Banner + {BG_IC_GO_HANGAR_BANNER,GO_HANGAR_BANNER,807.78f,-1000.07f,132.381f,-1.93732f}, // Hangar Banner + {BG_IC_GO_QUARRY_BANNER,GO_QUARRY_BANNER,251.016f,-1159.32f,17.2376f,-2.25147f}, // Quarry Banner + {BG_IC_GO_REFINERY_BANNER,GO_REFINERY_BANNER,1269.5f,-400.809f,37.6253f,-1.76278f}, // Refinery Banner + + {BG_IC_GO_BENCH_1,GO_BENCH_1,834.208f,-461.826f,22.3067f,1.5708f}, // Bench + {BG_IC_GO_BENCH_2,GO_BENCH_2,826.153f,-461.985f,22.5149f,1.5708f}, // Bench + {BG_IC_GO_BENCH_3,GO_BENCH_3,817.446f,-470.47f,25.372f,-1.56207f}, // Bench + {BG_IC_GO_BENCH_4,GO_BENCH_4,827.001f,-474.415f,25.372f,1.57952f}, // Bench + {BG_IC_GO_BENCH_5,GO_BENCH_5,819.264f,-461.961f,22.7614f,1.57952f}, // Bench + + {BG_IC_GO_BONFIRE_1,GO_BONFIRE_1,1162.91f,-734.578f,48.8948f,-2.9845f}, // Bonfire + {BG_IC_GO_BONFIRE_2,GO_BONFIRE_2,1282.34f,-799.762f,87.1357f,-3.13286f}, // Bonfire + {BG_IC_GO_BONFIRE_3,GO_BONFIRE_3,1358.06f,-732.178f,87.1606f,-3.13284f}, // Bonfire + {BG_IC_GO_BONFIRE_4,GO_BONFIRE_4,1281.76f,-732.844f,87.1574f,-3.13246f}, // Bonfire + {BG_IC_GO_BONFIRE_5,GO_BONFIRE_5,1358.81f,-797.899f,87.2953f,3.13312f}, // Bonfire + {BG_IC_GO_BONFIRE_6,GO_BONFIRE_6,1162.21f,-790.543f,48.9162f,2.27765f}, // Bonfire + + {BG_IC_GO_BRAZIER_1,GO_BRAZIER_1,1262.21f,-751.358f,48.8133f,2.26893f}, // Brazier + {BG_IC_GO_BRAZIER_2,GO_BRAZIER_2,1262.58f,-781.861f,48.8132f,2.04203f}, // Brazier + {BG_IC_GO_BRAZIER_3,GO_BRAZIER_3,223.818f,-839.352f,60.7917f,1.09083f}, // Brazier + {BG_IC_GO_BRAZIER_4,GO_BRAZIER_4,224.277f,-822.77f,60.7917f,2.06822f}, // Brazier + + {BG_IC_GO_CHAIR_1,GO_CHAIR_1,632.876f,-282.461f,5.45364f,-0.851094f}, // Chair + {BG_IC_GO_CHAIR_2,GO_CHAIR_2,635.796f,-276.295f,5.48659f,-3.03273f}, // Chair + {BG_IC_GO_CHAIR_3_1,GO_CHAIR_3,762.245f,-444.795f,22.8526f,-1.98095f}, // Chair + {BG_IC_GO_CHAIR_4,GO_CHAIR_4,632.156f,-304.503f,5.4879f,1.15603f}, // Chair + {BG_IC_GO_CHAIR_5,GO_CHAIR_5,643.86f,-270.204f,5.48898f,2.36903f}, // Chair + {BG_IC_GO_CHAIR_6_1,GO_CHAIR_6,902.234f,-455.508f,18.3935f,-1.00356f}, // Chair + {BG_IC_GO_CHAIR_7,GO_CHAIR_7,810.237f,-461.2f,25.4627f,1.5708f}, // Chair + {BG_IC_GO_CHAIR_3_2,GO_CHAIR_3,1117.19f,-365.674f,18.8456f,0.968657f}, // Chair + {BG_IC_GO_CHAIR_6_2,GO_CHAIR_6,1066.19f,-337.214f,18.8225f,0.453785f}, // Chair + {BG_IC_GO_CHAIR_8_1,GO_CHAIR_8,798.324f,-444.951f,22.5601f,-1.02102f}, // Chair + {BG_IC_GO_CHAIR_8_2,GO_CHAIR_8,1081.81f,-358.637f,18.5531f,1.92859f}, // Chair + {BG_IC_GO_CHAIR_9,GO_CHAIR_9,814.931f,-470.816f,33.6373f,-3.12412f}, // Chair + + {BG_IC_GO_DOODAD_HU_PORTCULLIS01_1,GO_DOODAD_HU_PORTCULLIS01,401.024f,-780.724f,49.9482f,-2.52896f}, // Doodad_HU_Portcullis01 + {BG_IC_GO_DOODAD_HU_PORTCULLIS01_2,GO_DOODAD_HU_PORTCULLIS01,399.802f,-885.208f,50.1939f,2.516f}, // Doodad_HU_Portcullis01 + + {BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01,GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01,413.479f,-833.95f,48.5238f,3.14159f}, // Doodad_ND_Human_Gate_ClosedFX_Door01 + + {BG_IC_GO_DOODAD_PORTCULLISACTIVE01,GO_DOODAD_PORTCULLISACTIVE01,-832.595f,51.4109f,-0.0261791f, 0.0f}, // Doodad_PortcullisActive01 + + {BG_IC_GO_DOODAD_PORTCULLISACTIVE02,GO_DOODAD_PORTCULLISACTIVE02,273.033f,-832.199f,51.4109f,-0.0261791f}, // Doodad_PortcullisActive02 + + {BG_IC_GO_DOODAD_VR_PORTCULLIS01_1,GO_DOODAD_VR_PORTCULLIS01,1156.89f,-843.998f,48.6322f,0.732934f}, // Doodad_VR_Portcullis01 + {BG_IC_GO_DOODAD_VR_PORTCULLIS01_2,GO_DOODAD_VR_PORTCULLIS01,1157.05f,-682.36f,48.6322f,-0.829132f}, // Doodad_VR_Portcullis01 + + {BG_IC_GO_FLAGPOLE_1_1,GO_FLAGPOLE_1,-400.809f,37.6253f,-1.76278f}, // Flagpole + {BG_IC_GO_FLAGPOLE_2_1,GO_FLAGPOLE_2,1284.76f,-705.668f,48.9163f,-3.08918f}, // Flagpole + {BG_IC_GO_FLAGPOLE_2_2,GO_FLAGPOLE_2,299.153f,-784.589f,48.9162f,-0.157079f}, // Flagpole + {BG_IC_GO_FLAGPOLE_1_2,GO_FLAGPOLE_1,726.385f,-360.205f,17.8153f,-1.6057f}, // Flagpole + {BG_IC_GO_FLAGPOLE_1_3,GO_FLAGPOLE_1,807.78f,-1000.07f,132.381f,-1.91986f}, // Flagpole + {BG_IC_GO_FLAGPOLE_1_4,GO_FLAGPOLE_1,776.229f,-804.283f,6.45052f,1.6057f}, // Flagpole + {BG_IC_GO_FLAGPOLE_1_5,GO_FLAGPOLE_1,251.016f,-1159.32f,17.2376f,-2.25147f}, // Flagpole + + {BG_IC_GO_HORDE_KEEP_PORTCULLIS,GO_HORDE_KEEP_PORTCULLIS,1283.05f,-765.878f,50.8297f,-3.13286f}, // Horde Keep Portcullis + + {BG_IC_GO_STOVE_1_1,GO_STOVE_1,903.291f,-457.345f,18.1356f,2.23402f}, // Stove + {BG_IC_GO_STOVE_2_1,GO_STOVE_2,761.462f,-446.684f,22.5602f,0.244344f}, // Stove + {BG_IC_GO_STOVE_1_2,GO_STOVE_1,11068.13f,-336.373f,18.5647f,-2.59181f}, // Stove + {BG_IC_GO_STOVE_2_2,GO_STOVE_2,1118.32f,-363.969f,18.5532f,-3.08918f}, // Stove + + {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_1,GO_HUGE_SEAFORIUM_BOMB_A,297.3212f,-851.321167f,48.91627f,-0.94247663f}, + {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_2,GO_HUGE_SEAFORIUM_BOMB_A,298.104156f,-861.026062f,48.916275f,-2.75761318f}, + {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_3,GO_HUGE_SEAFORIUM_BOMB_A,300.371521f,-818.732666f,48.91625f,0.785396755f}, + {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_4,GO_HUGE_SEAFORIUM_BOMB_A,302.1354f,-810.7083f,48.91625f,-1.04719758f}, + + {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_1,GO_HUGE_SEAFORIUM_BOMB_H,1268.30908f, -745.783f, 48.9187775f, 0.785396755f}, + {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_2,GO_HUGE_SEAFORIUM_BOMB_H,1268.50867f, -738.1215f, 48.9175f, -1.04719758f}, + {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_3,GO_HUGE_SEAFORIUM_BOMB_H,1273.066f, -786.572937f, 48.9419174f, -0.94247663f}, + {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_4,GO_HUGE_SEAFORIUM_BOMB_H,1273.849f, -796.2778f, 48.9364281f, -2.75761318f}, + + {BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01,GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01,1150.9f,-762.606f,47.0f,3.14159f} // Doodad_ND_WinterOrc_Wall_GateFX_Door01 -> this was not sniffed because I only had alliance sniffs +}; + +const Position workshopBombs[2] = +{ + {750.601f,-864.597f,13.4754f,1.93731f}, + {785.509f,-864.715f,13.3993f,2.47837f} +}; + enum Buffs { - OIL_REFINERY = 68719, - QUARRY = 68720 + SPELL_OIL_REFINERY = 68719, + SPELL_QUARRY = 68720, + + SPELL_PARACHUTE = 66656, + SPELL_SLOW_FALL = 12438 }; enum BG_IC_Objectives @@ -33,11 +632,177 @@ enum BG_IC_Objectives IC_OBJECTIVE_DEFEND_BASE = 246 }; +enum ICWorldStates +{ + BG_IC_ALLIANCE_RENFORT_SET = 4221, + BG_IC_HORDE_RENFORT_SET = 4222, + BG_IC_ALLIANCE_RENFORT = 4226, + BG_IC_HORDE_RENFORT = 4227, + BG_IC_GATE_FRONT_H_WS_CLOSED = 4317, + BG_IC_GATE_WEST_H_WS_CLOSED = 4318, + BG_IC_GATE_EAST_H_WS_CLOSED = 4319, + BG_IC_GATE_FRONT_A_WS_CLOSED = 4328, + BG_IC_GATE_WEST_A_WS_CLOSED = 4327, + BG_IC_GATE_EAST_A_WS_CLOSED = 4326, + BG_IC_GATE_FRONT_H_WS_OPEN = 4322, + BG_IC_GATE_WEST_H_WS_OPEN = 4321, + BG_IC_GATE_EAST_H_WS_OPEN = 4320, + BG_IC_GATE_FRONT_A_WS_OPEN = 4323, + BG_IC_GATE_WEST_A_WS_OPEN = 4324, + BG_IC_GATE_EAST_A_WS_OPEN = 4325, + + BG_IC_DOCKS_UNCONTROLLED = 4301, + BG_IC_DOCKS_CONFLICT_A = 4305, + BG_IC_DOCKS_CONFLICT_H = 4302, + BG_IC_DOCKS_CONTROLLED_A = 4304, + BG_IC_DOCKS_CONTROLLED_H = 4303, + + BG_IC_HANGAR_UNCONTROLLED = 4296, + BG_IC_HANGAR_CONFLICT_A = 4300, + BG_IC_HANGAR_CONFLICT_H = 4297, + BG_IC_HANGAR_CONTROLLED_A = 4299, + BG_IC_HANGAR_CONTROLLED_H = 4298, + + BG_IC_QUARRY_UNCONTROLLED = 4306, + BG_IC_QUARRY_CONFLICT_A = 4310, + BG_IC_QUARRY_CONFLICT_H = 4307, + BG_IC_QUARRY_CONTROLLED_A = 4309, + BG_IC_QUARRY_CONTROLLED_H = 4308, + + BG_IC_REFINERY_UNCONTROLLED = 4311, + BG_IC_REFINERY_CONFLICT_A = 4315, + BG_IC_REFINERY_CONFLICT_H = 4312, + BG_IC_REFINERY_CONTROLLED_A = 4314, + BG_IC_REFINERY_CONTROLLED_H = 4313, + + BG_IC_WORKSHOP_UNCONTROLLED = 4294, + BG_IC_WORKSHOP_CONFLICT_A = 4228, + BG_IC_WORKSHOP_CONFLICT_H = 4293, + BG_IC_WORKSHOP_CONTROLLED_A = 4229, + BG_IC_WORKSHOP_CONTROLLED_H = 4230, + + BG_IC_ALLIANCE_KEEP_UNCONTROLLED = 4341, + BG_IC_ALLIANCE_KEEP_CONFLICT_A = 4342, + BG_IC_ALLIANCE_KEEP_CONFLICT_H = 4343, + BG_IC_ALLIANCE_KEEP_CONTROLLED_A = 4339, + BG_IC_ALLIANCE_KEEP_CONTROLLED_H = 4340, + + BG_IC_HORDE_KEEP_UNCONTROLLED = 4346, + BG_IC_HORDE_KEEP_CONFLICT_A = 4347, + BG_IC_HORDE_KEEP_CONFLICT_H = 4348, + BG_IC_HORDE_KEEP_CONTROLLED_A = 4344, + BG_IC_HORDE_KEEP_CONTROLLED_H = 4345 +}; + +enum BG_IC_GateState +{ + BG_IC_GATE_OK = 1, + BG_IC_GATE_DAMAGED = 2, + BG_IC_GATE_DESTROYED = 3 +}; + +enum ICDoorList +{ + BG_IC_H_FRONT, + BG_IC_H_WEST, + BG_IC_H_EAST, + BG_IC_A_FRONT, + BG_IC_A_WEST, + BG_IC_A_EAST, + BG_IC_MAXDOOR, +}; + +enum ICNodePointType +{ + NODE_TYPE_REFINERY, + NODE_TYPE_QUARRY, + NODE_TYPE_DOCKS, + NODE_TYPE_HANGAR, + NODE_TYPE_WORKSHOP, + + // Graveyards + NODE_TYPE_GRAVEYARD_A, + NODE_TYPE_GRAVEYARD_H, + + MAX_NODE_TYPES +}; + +enum ICNodeState +{ + NODE_STATE_UNCONTROLLED = 0, + NODE_STATE_CONFLICT_A, + NODE_STATE_CONFLICT_H, + NODE_STATE_CONTROLLED_A, + NODE_STATE_CONTROLLED_H +}; + +const uint32 BG_IC_GraveyardIds[MAX_NODE_TYPES+2] = {0, 0, 1480, 1481, 1482, 1485, 1486, 1483, 1484}; + +const float BG_IC_SpiritGuidePos[MAX_NODE_TYPES+2][4] = +{ + {0.0f, 0.0f, 0.0f, 0.0f}, // no grave + {0.0f, 0.0f, 0.0f, 0.0f}, // no grave + {629.57f, -279.83f, 11.33f, 0.0f}, // dock + {780.729f, -1103.08f, 135.51f, 2.27f}, // hangar + {775.74f, -652.77f, 9.31f, 4.27f}, // workshop + {278.42f, -883.20f, 49.89f, 1.53f}, // alliance starting base + {1300.91f, -834.04f, 48.91f, 1.69f}, // horde starting base + {438.86f, -310.04f, 51.81f, 5.87f}, // last resort alliance + {1148.65f, -1250.98f, 16.60f, 1.74f}, // last resort horde +}; + +const Position hordeGunshipPassengers[5] = +{ + {-21.401f, -31.343f, 34.173f, 4.62057f}, + {-12.1064f, -31.9697f, 34.3807f, 4.62057f}, + {-2.4877f, -31.9885f, 34.8384f, 4.62057f}, + {10.2664f, -32.0713f, 35.7357f, 4.62057f}, + {19.4636f, -30.794f, 36.2254f, 4.83106f} +}; + +const Position allianceGunshipPassengers[5] = +{ + {-41.7122f, 23.1838f, 22.5605f, 1.60659f}, + {-31.0354f, 25.1286f, 21.6921f, 1.60659f}, + {-21.4492f, 25.8326f, 21.6309f, 1.60659f}, + {-12.4734f, 26.321f, 21.6237f, 1.60659f}, + {-2.81125f, 26.2077f, 21.6566f, 1.60659f} +}; + +// I.E: Hangar, Quarry, Graveyards .. etc +struct ICNodePoint +{ + uint32 gameobject_type; // with this we will get the GameObject of that point + uint32 gameobject_entry; // what gamoebject entry is active here. + uint8 faction; // who has this node + ICNodePointType nodeType; // here we can specify if it is graveyards, hangar etc... + uint32 banners[4]; // the banners that have this point + bool needChange; // this is used for the 1 minute time period after the point is captured + uint32 timer; // the same use for needChange + uint32 last_entry; // the last gameobject_entry + uint32 worldStates[5]; // the worldstates that represent the node in the map + ICNodeState nodeState; + uint32 string; +}; + +const ICNodePoint nodePointInitial[7] = +{ + {BG_IC_GO_REFINERY_BANNER,GO_REFINERY_BANNER,TEAM_NEUTRAL,NODE_TYPE_REFINERY,{GO_ALLIANCE_BANNER_REFINERY,GO_ALLIANCE_BANNER_REFINERY_CONT,GO_HORDE_BANNER_REFINERY,GO_HORDE_BANNER_REFINERY_CONT},false,0,0,{BG_IC_REFINERY_UNCONTROLLED,BG_IC_REFINERY_CONFLICT_A,BG_IC_REFINERY_CONFLICT_H,BG_IC_REFINERY_CONTROLLED_A,BG_IC_REFINERY_CONTROLLED_H},NODE_STATE_UNCONTROLLED,LANG_BG_IC_REFINERY}, + {BG_IC_GO_QUARRY_BANNER,GO_QUARRY_BANNER,TEAM_NEUTRAL,NODE_TYPE_QUARRY, {GO_ALLIANCE_BANNER_QUARRY,GO_ALLIANCE_BANNER_QUARRY_CONT,GO_HORDE_BANNER_QUARRY,GO_HORDE_BANNER_QUARRY_CONT},false,0,0,{BG_IC_QUARRY_UNCONTROLLED,BG_IC_QUARRY_CONFLICT_A,BG_IC_QUARRY_CONFLICT_H,BG_IC_QUARRY_CONTROLLED_A,BG_IC_QUARRY_CONTROLLED_H},NODE_STATE_UNCONTROLLED,LANG_BG_IC_QUARRY}, + {BG_IC_GO_DOCKS_BANNER,GO_DOCKS_BANNER,TEAM_NEUTRAL,NODE_TYPE_DOCKS, {GO_ALLIANCE_BANNER_DOCK,GO_ALLIANCE_BANNER_DOCK_CONT,GO_HORDE_BANNER_DOCK,GO_HORDE_BANNER_DOCK_CONT},false,0,0,{BG_IC_DOCKS_UNCONTROLLED, BG_IC_DOCKS_CONFLICT_A, BG_IC_DOCKS_CONFLICT_H, BG_IC_DOCKS_CONTROLLED_A,BG_IC_DOCKS_CONTROLLED_H},NODE_STATE_UNCONTROLLED,LANG_BG_IC_DOCKS}, + {BG_IC_GO_HANGAR_BANNER,GO_HANGAR_BANNER,TEAM_NEUTRAL,NODE_TYPE_HANGAR, {GO_ALLIANCE_BANNER_HANGAR,GO_ALLIANCE_BANNER_HANGAR_CONT,GO_HORDE_BANNER_HANGAR,GO_HORDE_BANNER_HANGAR_CONT},false,0,0,{BG_IC_HANGAR_UNCONTROLLED,BG_IC_HANGAR_CONFLICT_A, BG_IC_HANGAR_CONFLICT_H, BG_IC_HANGAR_CONTROLLED_A, BG_IC_HANGAR_CONTROLLED_H},NODE_STATE_UNCONTROLLED,LANG_BG_IC_HANGAR}, + {BG_IC_GO_WORKSHOP_BANNER,GO_WORKSHOP_BANNER,TEAM_NEUTRAL, NODE_TYPE_WORKSHOP, {GO_ALLIANCE_BANNER_WORKSHOP,GO_ALLIANCE_BANNER_WORKSHOP_CONT,GO_HORDE_BANNER_WORKSHOP,GO_HORDE_BANNER_WORKSHOP_CONT},false,0,0,{BG_IC_WORKSHOP_UNCONTROLLED,BG_IC_WORKSHOP_CONFLICT_A,BG_IC_WORKSHOP_CONFLICT_H,BG_IC_WORKSHOP_CONTROLLED_A,BG_IC_WORKSHOP_CONTROLLED_H},NODE_STATE_UNCONTROLLED,LANG_BG_IC_WORKSHOP}, + {BG_IC_GO_ALLIANCE_BANNER,GO_ALLIANCE_BANNER,TEAM_ALLIANCE,NODE_TYPE_GRAVEYARD_A, {GO_ALLIANCE_BANNER_GRAVEYARD_A,GO_ALLIANCE_BANNER_GRAVEYARD_A_CONT,GO_HORDE_BANNER_GRAVEYARD_A,GO_HORDE_BANNER_GRAVEYARD_A_CONT},false,0,0,{BG_IC_ALLIANCE_KEEP_UNCONTROLLED,BG_IC_ALLIANCE_KEEP_CONFLICT_A,BG_IC_ALLIANCE_KEEP_CONFLICT_H,BG_IC_ALLIANCE_KEEP_CONTROLLED_A,BG_IC_ALLIANCE_KEEP_CONTROLLED_H},NODE_STATE_CONTROLLED_A,LANG_BG_IC_ALLIANCE_KEEP}, + {BG_IC_GO_HORDE_BANNER,GO_HORDE_BANNER,TEAM_HORDE,NODE_TYPE_GRAVEYARD_H, {GO_ALLIANCE_BANNER_GRAVEYARD_H,GO_ALLIANCE_BANNER_GRAVEYARD_H_CONT,GO_HORDE_BANNER_GRAVEYARD_H,GO_HORDE_BANNER_GRAVEYARD_H_CONT},false,0,0,{BG_IC_HORDE_KEEP_UNCONTROLLED,BG_IC_HORDE_KEEP_CONFLICT_A,BG_IC_HORDE_KEEP_CONFLICT_H,BG_IC_HORDE_KEEP_CONTROLLED_A,BG_IC_HORDE_KEEP_CONTROLLED_H},NODE_STATE_CONTROLLED_H,LANG_BG_IC_HORDE_KEEP}, +}; + class BattlegroundICScore : public BattlegroundScore { public: - BattlegroundICScore() {}; + BattlegroundICScore() : BasesAssaulted(0), BasesDefended(0) {}; virtual ~BattlegroundICScore() {}; + uint32 BasesAssaulted; + uint32 BasesDefended; }; class BattlegroundIC : public Battleground @@ -59,12 +824,91 @@ class BattlegroundIC : public Battleground bool SetupBattleground(); void SpawnLeader(uint32 teamid); void HandleKillUnit(Creature *unit, Player *killer); + void HandleKillPlayer(Player* player, Player* killer); void EndBattleground(uint32 winner); void EventPlayerClickedOnFlag(Player *source, GameObject* /*target_obj*/); + void EventPlayerDamagedGO(Player* /*plr*/, GameObject* go, uint8 hitType, uint32 destroyedEvent); + void DestroyGate(Player* pl, GameObject* /*go*/, uint32 destroyedEvent); + + virtual WorldSafeLocsEntry const* GetClosestGraveYard(Player* player); + /* Scorekeeping */ void UpdatePlayerScore(Player *Source, uint32 type, uint32 value, bool doAddHonor = true); + void FillInitialWorldStates(WorldPacket& data); + + virtual void DoAction(uint32 action, uint64 var); + + virtual void HandlePlayerResurrect(Player* player); + + uint32 GetNodeState(uint8 nodeType) { return (uint8)nodePoint[nodeType].nodeState; } + + virtual bool IsAllNodesConrolledByTeam(uint32 team) const; // overwrited private: + uint32 closeFortressDoors; + bool doorsClosed; + uint32 docksTimer; + uint32 resourceTimer; + uint32 siegeEngineWorkshopTimer; + uint16 factionReinforcements[2]; + BG_IC_GateState GateStatus[6]; + ICNodePoint nodePoint[7]; + + Transport* gunshipAlliance; + Transport* gunshipHorde; + + + uint32 GetNextBanner(ICNodePoint* nodePoint,uint32 team, bool returnDefinitve); + + uint32 GetGateIDFromEntry(uint32 id) + { + uint32 i = 0; + switch(id) + { + case GO_HORDE_GATE_1: i = BG_IC_H_FRONT ;break; + case GO_HORDE_GATE_2: i = BG_IC_H_WEST ;break; + case GO_HORDE_GATE_3: i = BG_IC_H_EAST ;break; + case GO_ALLIANCE_GATE_3: i = BG_IC_A_FRONT ;break; + case GO_ALLIANCE_GATE_1: i = BG_IC_A_WEST ;break; + case GO_ALLIANCE_GATE_2: i = BG_IC_A_EAST ;break; + } + return i; + } + + uint32 GetWorldStateFromGateEntry(uint32 id, bool open) + { + uint32 uws = 0; + + switch(id) + { + case GO_HORDE_GATE_1: + uws = (open ? BG_IC_GATE_FRONT_H_WS_OPEN : BG_IC_GATE_FRONT_H_WS_CLOSED); + break; + case GO_HORDE_GATE_2: + uws = (open ? BG_IC_GATE_WEST_H_WS_OPEN : BG_IC_GATE_WEST_H_WS_CLOSED); + break; + case GO_HORDE_GATE_3: + uws = (open ? BG_IC_GATE_EAST_H_WS_OPEN : BG_IC_GATE_EAST_H_WS_CLOSED); + break; + case GO_ALLIANCE_GATE_3: + uws = (open ? BG_IC_GATE_FRONT_A_WS_OPEN : BG_IC_GATE_FRONT_A_WS_CLOSED); + break; + case GO_ALLIANCE_GATE_1: + uws = (open ? BG_IC_GATE_WEST_A_WS_OPEN : BG_IC_GATE_WEST_A_WS_CLOSED); + break; + case GO_ALLIANCE_GATE_2: + uws = (open ? BG_IC_GATE_EAST_A_WS_OPEN : BG_IC_GATE_EAST_A_WS_CLOSED); + break; + } + return uws; + } + + void RealocatePlayers(ICNodePointType nodeType); + void UpdateNodeWorldState(ICNodePoint* nodePoint); + void HandleCapturedNodes(ICNodePoint* nodePoint, bool recapture); + void HandleContestedNodes(ICNodePoint* nodePoint); + Transport* CreateTransport(uint32 goEntry,uint32 period); + void SendTransportInit(Player* player); }; #endif diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 67f0bea677f..7ed20819e68 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1563,6 +1563,7 @@ void Player::setDeathState(DeathState s) GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, 1); GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH, 1); GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, 1); + GetAchievementMgr().ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL,ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH); } Unit::setDeathState(s); @@ -1885,7 +1886,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati if (duel && GetMapId() != mapid && GetMap()->GetGameObject(GetUInt64Value(PLAYER_DUEL_ARBITER))) DuelComplete(DUEL_FLED); - if (GetMapId() == mapid && !m_transport) + if (GetMapId() == mapid && !m_transport || (GetTransport() && GetMapId() == 628)) { //lets reset far teleport flag if it wasn't reset during chained teleports SetSemaphoreTeleportFar(false); @@ -4809,6 +4810,12 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) UpdateZone(newzone,newarea); sOutdoorPvPMgr->HandlePlayerResurrects(this, newzone); + if (InBattleground()) + { + if (Battleground* bg = GetBattleground()) + bg->HandlePlayerResurrect(this); + } + // update visibility UpdateObjectVisibility(); @@ -8752,6 +8759,9 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) case 4384: NumberOfFields = 30; break; + case 4710: + NumberOfFields = 28; + break; default: NumberOfFields = 12; break; @@ -9244,6 +9254,32 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) data << uint32(0xe1a) << uint32(0x0); // 9 show } break; + case 4710: + if (bg && bg->GetTypeID(true) == BATTLEGROUND_IC) + bg->FillInitialWorldStates(data); + else + { + data << uint32(4221) << uint32(1); // 7 + data << uint32(4222) << uint32(1); // 8 + data << uint32(4226) << uint32(300); // 9 + data << uint32(4227) << uint32(300); // 10 + data << uint32(4322) << uint32(1); // 11 + data << uint32(4321) << uint32(1); // 12 + data << uint32(4320) << uint32(1); // 13 + data << uint32(4323) << uint32(1); // 14 + data << uint32(4324) << uint32(1); // 15 + data << uint32(4325) << uint32(1); // 16 + data << uint32(4317) << uint32(1); // 17 + + data << uint32(4301) << uint32(1); // 18 + data << uint32(4296) << uint32(1); // 19 + data << uint32(4306) << uint32(1); // 20 + data << uint32(4311) << uint32(1); // 21 + data << uint32(4294) << uint32(1); // 22 + data << uint32(4243) << uint32(1); // 23 + data << uint32(4345) << uint32(1); // 24 + } + break; default: data << uint32(0x914) << uint32(0x0); // 7 data << uint32(0x913) << uint32(0x0); // 8 diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 4afb3156276..24c4114f230 100755 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -811,7 +811,31 @@ enum TrinityStrings LANG_DEBUG_AREATRIGGER_REACHED = 1204, // Room for more debug 1205-1299 not used - // FREE IDS 1300-9999 + // Isle of Conquest + LANG_BG_IC_START_TWO_MINUTES = 1205, + LANG_BG_IC_START_ONE_MINUTE = 1206, + LANG_BG_IC_START_HALF_MINUTE = 1207, + LANG_BG_IC_HAS_BEGUN = 1208, + LANG_BG_IC_ALLIANCE_KEEP = 1209, + LANG_BG_IC_HORDE_KEEP = 1210, + LANG_BG_IC_TEAM_WINS = 1211, + LANG_BG_IC_WEST_GATE_DESTROYED = 1212, + LANG_BG_IC_EAST_GATE_DESTROYED = 1213, + LANG_BG_IC_SOUTH_GATE_DESTROYED = 1214, + LANG_BG_IC_NORTH_GATE_DESTROYED = 1215, + LANG_BG_IC_TEAM_ASSAULTED_NODE_1 = 1216, + LANG_BG_IC_TEAM_DEFENDED_NODE = 1217, + LANG_BG_IC_TEAM_ASSAULTED_NODE_2 = 1218, + LANG_BG_IC_TEAM_HAS_TAKEN_NODE = 1219, + LANG_BG_IC_WORKSHOP = 1220, + LANG_BG_IC_DOCKS = 1221, + LANG_BG_IC_REFINERY = 1222, + LANG_BG_IC_QUARRY = 1223, + LANG_BG_IC_HANGAR = 1224, + LANG_BG_IC_ALLIANCE = 1225, + LANG_BG_IC_HORDE = 1226, + + // FREE IDS 1228-9999 // AV LANG_BG_AV_ALLY = 1300, diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 48056f717dc..794bb106083 100755 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -484,6 +484,7 @@ void AddSC_sholazar_basin(); void AddSC_storm_peaks(); void AddSC_zuldrak(); void AddSC_crystalsong_forest(); +void AddSC_isle_of_conquest(); //outland void AddSC_boss_exarch_maladaar(); //Auchindoun Auchenai Crypts @@ -1170,6 +1171,7 @@ void AddNorthrendScripts() AddSC_storm_peaks(); AddSC_zuldrak(); AddSC_crystalsong_forest(); + AddSC_isle_of_conquest(); #endif } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 67ca17b54e7..601195a65f0 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1669,7 +1669,6 @@ void Spell::EffectForceCastWithValue(SpellEffIndex effIndex) return; } int32 bp = damage; - Unit * caster = GetTriggeredSpellCaster(spellInfo, m_caster, unitTarget); caster->CastCustomSpell(unitTarget, spellInfo->Id, &bp, &bp, &bp, true, NULL, NULL, m_originalCasterGUID); @@ -1957,6 +1956,24 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/) return; } break; + case 66550: // teleports outside (Isle of Conquest) + if (Player* pTarget = unitTarget->ToPlayer()) + { + if (pTarget->GetTeamId() == TEAM_ALLIANCE) + m_targets.setDst(442.24f,-835.25f,44.30f,0.06f,628); + else + m_targets.setDst(1120.43f,-762.11f,47.92f,2.94f,628); + } + break; + case 66551: // teleports inside (Isle of Conquest) + if (Player* pTarget = unitTarget->ToPlayer()) + { + if (pTarget->GetTeamId() == TEAM_ALLIANCE) + m_targets.setDst(389.57f,-832.38f,48.65f,3.00f,628); + else + m_targets.setDst(1174.85f,-763.24f,48.72f,6.26f,628); + } + break; } // If not exist data for dest location - return diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 56b3ab57306..08f8541f80b 100755 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -27,6 +27,7 @@ #include "BattlegroundMgr.h" #include "CreatureAI.h" #include "MapManager.h" +#include "BattlegroundIC.h" bool IsAreaEffectTarget[TOTAL_SPELL_TARGETS]; SpellEffectTargetTypes EffectTargetType[TOTAL_SPELL_EFFECTS]; @@ -3084,15 +3085,32 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32 switch(spellId) { case 58600: // No fly Zone - Dalaran - if (!player) - return false; + { + if (!player) + return false; + + AreaTableEntry const* pArea = GetAreaEntryByAreaID(player->GetAreaId()); + if (!(pArea && pArea->flags & AREA_FLAG_NO_FLY_ZONE)) + return false; + if (!player->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !player->HasAuraType(SPELL_AURA_FLY)) + return false; + break; + } + case 68719: // Oil Refinery - Isle of Conquest. + case 68720: // Quarry - Isle of Conquest. + { + if (player->GetBattlegroundTypeId() != BATTLEGROUND_IC || !player->GetBattleground()) + return false; + + uint8 nodeType = spellId == 68719 ? NODE_TYPE_REFINERY : NODE_TYPE_QUARRY; + uint8 nodeState = player->GetTeamId() == TEAM_ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H; + + BattlegroundIC* pIC = static_cast<BattlegroundIC*>(player->GetBattleground()); + if (pIC->GetNodeState(nodeType) == nodeState) + return true; - AreaTableEntry const* pArea = GetAreaEntryByAreaID(player->GetAreaId()); - if (!(pArea && pArea->flags & AREA_FLAG_NO_FLY_ZONE)) - return false; - if (!player->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !player->HasAuraType(SPELL_AURA_FLY)) return false; - break; + } } return true; diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt index cad76883781..f1c80b14bd1 100644 --- a/src/server/scripts/Northrend/CMakeLists.txt +++ b/src/server/scripts/Northrend/CMakeLists.txt @@ -1,5 +1,6 @@ set(scripts_STAT_SRCS ${scripts_STAT_SRCS} + Northrend/isle_of_conquest.cpp Northrend/storm_peaks.cpp Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp diff --git a/src/server/scripts/Northrend/isle_of_conquest.cpp b/src/server/scripts/Northrend/isle_of_conquest.cpp new file mode 100644 index 00000000000..b70f8de4b4c --- /dev/null +++ b/src/server/scripts/Northrend/isle_of_conquest.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/> + * + * 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/>. + */ + +#include "ScriptPCH.h" +#include "BattlegroundIC.h" + +// TO-DO: This should be done with SmartAI, but yet it does not correctly support vehicles's AIs. +// Even adding ReactState Passive we still have issues using SmartAI. + +class npc_four_car_garage : public CreatureScript +{ + public: + npc_four_car_garage() : CreatureScript("npc_four_car_garage") {} + + struct npc_four_car_garageAI : public NullCreatureAI + { + npc_four_car_garageAI(Creature* pCreature) : NullCreatureAI(pCreature) { } + + void PassengerBoarded(Unit* who, int8 seatId, bool apply) + { + if (apply) + { + uint32 spellId = 0; + + switch(me->GetEntry()) + { + case NPC_DEMOLISHER: + spellId = 68365; + break; + case NPC_GLAIVE_THROWER: + spellId = 68363; + break; + case NPC_SIEGE_ENGINE_H: + case NPC_SIEGE_ENGINE_A: + spellId = 68364; + break; + case NPC_CATAPULT: + spellId = 68362; + break; + default: + return; + } + + me->CastSpell(who,spellId,true); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_four_car_garageAI(creature); + } +}; + +void AddSC_isle_of_conquest() +{ + new npc_four_car_garage(); +}
\ No newline at end of file diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index a7510b97ff3..3b1a535fcfe 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -635,6 +635,76 @@ public: } }; +class spell_gen_gunship_portal : public SpellScriptLoader +{ +public: + spell_gen_gunship_portal() : SpellScriptLoader("spell_gen_gunship_portal") { } + + class spell_gen_gunship_portalSpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_gunship_portalSpellScript) + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (!caster->ToPlayer()) + return; + + if (Battleground *bg = caster->ToPlayer()->GetBattleground()) + { + if (bg->GetTypeID(true) == BATTLEGROUND_IC) + bg->DoAction(1,caster->GetGUID()); + } + } + + void Register() + { + OnEffect += SpellEffectFn(spell_gen_gunship_portalSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_gunship_portalSpellScript(); + } +}; + +enum parachuteIC +{ + SPELL_PARACHUTE_IC = 66657 +}; + +class spell_gen_parachute_ic : public SpellScriptLoader +{ + public: + spell_gen_parachute_ic() : SpellScriptLoader("spell_gen_parachute_ic") { } + + class spell_gen_parachute_icAuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_parachute_icAuraScript) + + void HandleTriggerSpell(AuraEffect const * /*aurEff*/) + { + Unit* target = GetTarget(); + + if (!target->ToPlayer()) + return; + + if (target->ToPlayer()->m_movementInfo.fallTime > 2000) + target->CastSpell(target,SPELL_PARACHUTE_IC,true); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_parachute_icAuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript *GetAuraScript() const + { + return new spell_gen_parachute_icAuraScript(); + } +}; + void AddSC_generic_spell_scripts() { new spell_gen_absorb0_hitlimit1(); @@ -651,4 +721,6 @@ void AddSC_generic_spell_scripts() new spell_gen_animal_blood(); new spell_gen_shroud_of_death(); new spell_gen_divine_storm_cd_reset(); + new spell_gen_parachute_ic(); + new spell_gen_gunship_portal(); } diff --git a/src/server/scripts/World/achievement_scripts.cpp b/src/server/scripts/World/achievement_scripts.cpp index 4b9f4470450..385e973ee78 100755 --- a/src/server/scripts/World/achievement_scripts.cpp +++ b/src/server/scripts/World/achievement_scripts.cpp @@ -18,6 +18,7 @@ #include "ScriptPCH.h" #include "BattlegroundAB.h" #include "BattlegroundWS.h" +#include "BattlegroundIC.h" class achievement_school_of_hard_knocks : public AchievementCriteriaScript { @@ -116,6 +117,54 @@ class achievement_save_the_day : public AchievementCriteriaScript } }; +class achievement_bg_ic_resource_glut : public AchievementCriteriaScript +{ + public: + achievement_bg_ic_resource_glut() : AchievementCriteriaScript("achievement_bg_ic_resource_glut") { } + + bool OnCheck(Player* source, Unit* /*target*/) + { + if (source->HasAura(SPELL_OIL_REFINERY) && source->HasAura(SPELL_QUARRY)) + return true; + + return false; + } +}; + +class achievement_bg_ic_glaive_grave : public AchievementCriteriaScript +{ + public: + achievement_bg_ic_glaive_grave() : AchievementCriteriaScript("achievement_bg_ic_glaive_grave") { } + + bool OnCheck(Player* source, Unit* target) + { + if (Creature* vehicle = source->GetVehicleCreatureBase()) + { + if (vehicle->GetEntry() == 35273 || vehicle->GetEntry() == 34802) + return true; + } + + return false; + } +}; + +class achievement_bg_ic_mowed_down : public AchievementCriteriaScript +{ + public: + achievement_bg_ic_mowed_down() : AchievementCriteriaScript("achievement_bg_ic_mowed_down") { } + + bool OnCheck(Player* source, Unit* target) + { + if (Creature* vehicle = source->GetVehicleCreatureBase()) + { + if (vehicle->GetEntry() == NPC_KEEP_CANNON) + return true; + } + + return false; + } +}; + void AddSC_achievement_scripts() { new achievement_school_of_hard_knocks(); @@ -123,4 +172,7 @@ void AddSC_achievement_scripts() new achievement_resilient_victory(); new achievement_bg_control_all_nodes(); new achievement_save_the_day(); + new achievement_bg_ic_resource_glut(); + new achievement_bg_ic_glaive_grave(); + new achievement_bg_ic_mowed_down(); } |