aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/base/world_database.sql25
-rw-r--r--sql/scripts/world_scripts_full.sql20
-rw-r--r--sql/updates/2011_01_08_2_world_scriptname.sql30
-rw-r--r--sql/updates/2011_01_08_3_world_trinity_strings.sql23
-rw-r--r--sql/updates/2011_1_08_4_world_spell_linked_spell.sql7
-rwxr-xr-xsrc/server/game/Battlegrounds/Battleground.cpp28
-rwxr-xr-xsrc/server/game/Battlegrounds/Battleground.h11
-rwxr-xr-xsrc/server/game/Battlegrounds/BattlegroundMgr.cpp10
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundIC.cpp867
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundIC.h850
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp38
-rwxr-xr-xsrc/server/game/Miscellaneous/Language.h26
-rwxr-xr-xsrc/server/game/Scripting/ScriptLoader.cpp2
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp19
-rwxr-xr-xsrc/server/game/Spells/SpellMgr.cpp32
-rw-r--r--src/server/scripts/Northrend/CMakeLists.txt1
-rw-r--r--src/server/scripts/Northrend/isle_of_conquest.cpp72
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp72
-rwxr-xr-xsrc/server/scripts/World/achievement_scripts.cpp52
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();
}