aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRat <none@none>2010-06-01 23:55:09 +0200
committerRat <none@none>2010-06-01 23:55:09 +0200
commitad753b3f677c6280d48391e4bc550eedc9ce7a6e (patch)
tree255cfefa5d78374811cec2a453ee2ee6c1534d8a
parentd53f91ff327ea4f73d7dd16e7246d50150c2458b (diff)
SOTA update
-proper warning text (under attack, destroyed, capture..) -proper icons on map for gate states -fixed second round starting --HG-- branch : trunk
-rw-r--r--sql/updates/8361_world_trinity_string.sql20
-rw-r--r--sql/world.sql24
-rw-r--r--src/game/BattleGround.cpp30
-rw-r--r--src/game/BattleGround.h14
-rw-r--r--src/game/BattleGroundSA.cpp157
-rw-r--r--src/game/BattleGroundSA.h37
-rw-r--r--src/game/GameObject.cpp15
-rw-r--r--src/game/Language.h24
8 files changed, 258 insertions, 63 deletions
diff --git a/sql/updates/8361_world_trinity_string.sql b/sql/updates/8361_world_trinity_string.sql
new file mode 100644
index 00000000000..f8bf096c075
--- /dev/null
+++ b/sql/updates/8361_world_trinity_string.sql
@@ -0,0 +1,20 @@
+DELETE FROM `trinity_string` WHERE `entry` BETWEEN 10056 AND 10073;
+INSERT INTO `trinity_string` VALUES
+(10056,'The battle for Strand of the Ancients begins in 2 minutes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10057,'The battle for Strand of the Ancients begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10058,'The battle for Strand of the Ancients begins in 30 seconds. Prepare yourselves!.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10059,'Let the battle for Strand of the Ancients begin!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10060,'The %s is under attack!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10061,'The %s was destroyed!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10062,'Round 1 - finished!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10063,'The Alliance captured the titan portal!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10064,'The Horde captured the titan portal!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10065,'Round 2 of the Battle for the Strand of the Ancients begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10066,'Round 2 begins in 30 seconds. Prepare yourselves!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10067,'The chamber has been breached! The titan relic is vulnerable!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10068,'The Alliance captured the South Graveyard!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10069,'The Alliance captured the West Graveyard!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10070,'The Alliance captured the East Graveyard!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10071,'The Horde captured the South Graveyard!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10072,'The Horde captured the West Graveyard!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10073,'The Horde captured the East Graveyard!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
diff --git a/sql/world.sql b/sql/world.sql
index 89920fb4f9f..1a2cc4e4362 100644
--- a/sql/world.sql
+++ b/sql/world.sql
@@ -15360,12 +15360,24 @@ INSERT INTO `trinity_string` (`entry`,`content_default`,`content_loc1`,`content_
(10053, 'Take me to Crown Guard Tower.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(10054, 'Give me the flag, I''ll take it to the central beacon for the glory of the Alliance!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(10055, 'Give me the flag, I''ll take it to the central beacon for the glory of the Horde!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
-(10056, 'The battle for Strand of the Ancients begins in 2 minutes.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
-(10057, 'The battle for Strand of the Ancients begins in 1 minute.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
-(10058, 'The battle for Strand of the Ancients begins in 30 seconds. Prepare yourselves!.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
-(10059, 'Let the battle for Strand of the Ancients begin!.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
-(10061, '%s is destroyed!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
-(10060, '%s is under attack!', NULL, NULL ,NULL , NULL, NULL, NULL, NULL, NULL),
+(10056,'The battle for Strand of the Ancients begins in 2 minutes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10057,'The battle for Strand of the Ancients begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10058,'The battle for Strand of the Ancients begins in 30 seconds. Prepare yourselves!.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10059,'Let the battle for Strand of the Ancients begin!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10060,'The %s is under attack!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10061,'The %s was destroyed!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10062,'Round 1 - finished!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10063,'The Alliance captured the titan portal!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10064,'The Horde captured the titan portal!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10065,'Round 2 of the Battle for the Strand of the Ancients begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10066,'Round 2 begins in 30 seconds. Prepare yourselves!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10067,'The chamber has been breached! The titan relic is vulnerable!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10068,'The Alliance captured the South Graveyard!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10069,'The Alliance captured the West Graveyard!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10070,'The Alliance captured the East Graveyard!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10071,'The Horde captured the South Graveyard!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10072,'The Horde captured the West Graveyard!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10073,'The Horde captured the East Graveyard!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
(11000, '|cffffff00[|c00077766Autobroadcast|cffffff00]: |cFFF222FF%s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(11001, 'You have not chosen -1 or the current realmID that you are on.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
/*!40000 ALTER TABLE `trinity_string` ENABLE KEYS */;
diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp
index 389fdc25408..ad279da0628 100644
--- a/src/game/BattleGround.cpp
+++ b/src/game/BattleGround.cpp
@@ -416,7 +416,7 @@ void BattleGround::Update(uint32 diff)
StartingEventOpenDoors();
- SendMessageToAll(m_StartMessageIds[BG_STARTING_EVENT_FOURTH], CHAT_MSG_BG_SYSTEM_NEUTRAL);
+ SendWarningToAll(m_StartMessageIds[BG_STARTING_EVENT_FOURTH]);
SetStatus(STATUS_IN_PROGRESS);
SetStartDelayTime(m_StartDelayTimes[BG_STARTING_EVENT_FOURTH]);
@@ -1634,6 +1634,34 @@ void BattleGround::PSendMessageToAll(int32 entry, ChatMsg type, Player const* so
va_end(ap);
}
+void BattleGround::SendWarningToAll(int32 entry, ...)
+{
+ const char *format = objmgr.GetTrinityStringForDBCLocale(entry);
+ va_list ap;
+ char str [1024];
+ va_start(ap, entry);
+ vsnprintf(str,1024,format, ap);
+ va_end(ap);
+ std::string msg = (std::string)str;
+
+ WorldPacket data(SMSG_MESSAGECHAT, 200);
+
+ data << (uint8)CHAT_MSG_RAID_BOSS_EMOTE;
+ data << (uint32)LANG_UNIVERSAL;
+ data << (uint64)0;
+ data << (uint32)0; // 2.1.0
+ data << (uint32)1;
+ data << (uint8)0;
+ data << (uint64)0;
+ data << (uint32)(strlen(msg.c_str())+1);
+ data << msg.c_str();
+ data << (uint8)0;
+ for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
+ if (Player *plr = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)))
+ if (plr->GetSession())
+ plr->GetSession()->SendPacket(&data);
+}
+
void BattleGround::SendMessage2ToAll(int32 entry, ChatMsg type, Player const* source, int32 arg1, int32 arg2)
{
Trinity::BattleGround2ChatBuilder bg_builder(type, entry, source, arg1, arg2);
diff --git a/src/game/BattleGround.h b/src/game/BattleGround.h
index 38f4a0f443d..6f46b6f8f6d 100644
--- a/src/game/BattleGround.h
+++ b/src/game/BattleGround.h
@@ -258,6 +258,15 @@ enum BattleGroundStartingEventsIds
};
#define BG_STARTING_EVENT_COUNT 4
+enum BG_OBJECT_DMG_HIT_TYPE
+{
+ BG_OBJECT_DMG_HIT_TYPE_JUST_DAMAGED = 0,
+ BG_OBJECT_DMG_HIT_TYPE_DAMAGED = 1,
+ BG_OBJECT_DMG_HIT_TYPE_JUST_HIGH_DAMAGED = 2,
+ BG_OBJECT_DMG_HIT_TYPE_HIGH_DAMAGED = 3,
+ BG_OBJECT_DMG_HIT_TYPE_JUST_DESTROYED = 4
+};
+
enum GroupJoinBattlegroundResult
{
// positive values are indexes in BattlemasterList.dbc
@@ -330,6 +339,8 @@ class BattleGround
{
}
+ virtual void DestroyGate(Player* pl, GameObject* go, uint32 destroyedEvent) {}
+
/* achievement req. */
virtual bool IsAllNodesConrolledByTeam(uint32 /*team*/) const { return false; }
bool IsTeamScoreInRange(uint32 team, uint32 minScore, uint32 maxScore) const;
@@ -468,6 +479,7 @@ class BattleGround
void EndBattleGround(uint32 winner);
void BlockMovement(Player *plr);
+ void SendWarningToAll(int32 entry, ...);
void SendMessageToAll(int32 entry, ChatMsg type, Player const* source = NULL);
void PSendMessageToAll(int32 entry, ChatMsg type, Player const* source, ...);
@@ -512,7 +524,7 @@ class BattleGround
virtual void EventPlayerCapturedFlag(Player* /*player*/) {}
void EventPlayerLoggedIn(Player* player, uint64 plr_guid);
void EventPlayerLoggedOut(Player* player);
- virtual void EventPlayerDamagedGO(Player* /*player*/, GameObject* /*target_obj*/, uint32 /*eventId*/) {}
+ virtual void EventPlayerDamagedGO(Player* plr, GameObject* go, uint8 hitType, uint32 destroyedEvent) {}
virtual void EventPlayerUsedGO(Player* /*player*/, GameObject* /*go*/){}
/* Death related */
diff --git a/src/game/BattleGroundSA.cpp b/src/game/BattleGroundSA.cpp
index fa8c08b6570..95137710adf 100644
--- a/src/game/BattleGroundSA.cpp
+++ b/src/game/BattleGroundSA.cpp
@@ -34,6 +34,10 @@ BattleGroundSA::BattleGroundSA()
m_BgObjects.resize(BG_SA_MAXOBJ);
m_BgCreatures.resize(BG_SA_MAXNPC + BG_SA_MAX_GY);
TimerEnabled = false;
+ UpdateWaitTimer = 0;
+ SignaledRoundTwo = false;
+ SignaledRoundTwoHalfMin = false;
+ InitSecondRound = false;
}
BattleGroundSA::~BattleGroundSA()
@@ -228,22 +232,60 @@ void BattleGroundSA::StartShips()
void BattleGroundSA::Update(uint32 diff)
{
+ if (InitSecondRound)
+ {
+ if (UpdateWaitTimer < diff)
+ {
+ if (!SignaledRoundTwo)
+ {
+ SignaledRoundTwo = true;
+ InitSecondRound = false;
+ SendMessageToAll(LANG_BG_SA_ROUND_TWO_ONE_MINUTE, CHAT_MSG_BG_SYSTEM_NEUTRAL);
+ ResetObjs();
+ }
+ }else
+ {
+ UpdateWaitTimer -= diff;
+ return;
+ }
+ }
BattleGround::Update(diff);
TotalTime += diff;
- if (status == BG_SA_WARMUP || status == BG_SA_SECOND_WARMUP)
+ if (status == BG_SA_WARMUP )
{
if (TotalTime >= BG_SA_WARMUPLENGTH)
{
TotalTime = 0;
ToggleTimer();
DemolisherStartState(false);
- status = (status == BG_SA_WARMUP) ? BG_SA_ROUND_ONE : BG_SA_ROUND_TWO;
+ status = BG_SA_ROUND_ONE;
}
if (TotalTime >= BG_SA_BOAT_START)
StartShips();
return;
}
+ else if (status == BG_SA_SECOND_WARMUP)
+ {
+ if (TotalTime >= 60000)
+ {
+ SendWarningToAll(LANG_BG_SA_HAS_BEGUN);
+ TotalTime = 0;
+ ToggleTimer();
+ DemolisherStartState(false);
+ status = BG_SA_ROUND_TWO;
+ }
+ if (TotalTime >= 30000)
+ {
+ if (!SignaledRoundTwoHalfMin)
+ {
+ SignaledRoundTwoHalfMin = true;
+ SendMessageToAll(LANG_BG_SA_ROUND_TWO_START_HALF_MINUTE, CHAT_MSG_BG_SYSTEM_NEUTRAL);
+ }
+ }
+ StartShips();
+ return;
+ }
else if (GetStatus() == STATUS_IN_PROGRESS)
{
if (status == BG_SA_ROUND_ONE)
@@ -425,30 +467,35 @@ void BattleGroundSA::TeleportPlayers()
}
}
-void BattleGroundSA::EventPlayerDamagedGO(Player* plr, GameObject* /*go*/, uint32 event)
+void BattleGroundSA::EventPlayerDamagedGO(Player* plr, GameObject* go, uint8 hitType, uint32 destroyedEvent)
{
- switch(event)
+ if (!go || !go->GetGOInfo())
+ return;
+
+ switch(hitType)
{
- case 19046: //Green gate destroyed
- DestroyGate(BG_SA_GREEN_GATE,plr);
- return;
- case 19045: //blue gate
- DestroyGate(BG_SA_BLUE_GATE,plr);
- return;
- case 19047: //red gate
- DestroyGate(BG_SA_RED_GATE,plr);
- return;
- case 19048: //purple gate
- DestroyGate(BG_SA_PURPLE_GATE,plr);
- return;
- case 19049: //yellow gate
- DestroyGate(BG_SA_YELLOW_GATE,plr);
- return;
- case 19837: //ancient gate
- DestroyGate(BG_SA_ANCIENT_GATE,plr);
- return;
- default:
- return;
+ case BG_OBJECT_DMG_HIT_TYPE_JUST_DAMAGED://under attack
+ SendWarningToAll(LANG_BG_SA_IS_UNDER_ATTACK, go->GetGOInfo()->name);
+ break;
+ case BG_OBJECT_DMG_HIT_TYPE_DAMAGED:
+ break;
+ case BG_OBJECT_DMG_HIT_TYPE_JUST_HIGH_DAMAGED:
+ {
+ uint32 i = GetGateIDFromDestroyEventID(destroyedEvent);
+ GateStatus[i] = BG_SA_GATE_DAMAGED;
+ uint32 uws = GetWorldStateFromGateID(i);
+ if (uws)
+ UpdateWorldState(uws, GateStatus[i]);
+ break;
+ }
+ case BG_OBJECT_DMG_HIT_TYPE_HIGH_DAMAGED:
+ break;
+ case BG_OBJECT_DMG_HIT_TYPE_JUST_DESTROYED://handled at DestroyGate()
+ if (destroyedEvent == 19837)
+ SendWarningToAll(LANG_BG_SA_CHAMBER_BREACHED);
+ else
+ SendWarningToAll(LANG_BG_SA_WAS_DESTROYED, go->GetGOInfo()->name);
+ break;
}
}
@@ -500,8 +547,9 @@ void BattleGroundSA::DemolisherStartState(bool start)
}
}
-void BattleGroundSA::DestroyGate(uint32 i, Player* pl)
+void BattleGroundSA::DestroyGate(Player* pl, GameObject* /*go*/, uint32 destroyedEvent)
{
+ uint32 i = GetGateIDFromDestroyEventID(destroyedEvent);
if (!GateStatus[i])
return;
@@ -510,36 +558,35 @@ void BattleGroundSA::DestroyGate(uint32 i, Player* pl)
if (g->GetGOValue()->building.health == 0)
{
GateStatus[i] = BG_SA_GATE_DESTROYED;
- uint32 uws = 0;
+ uint32 uws = GetWorldStateFromGateID(i);
+ if (uws)
+ UpdateWorldState(uws, GateStatus[i]);
+ bool rewardHonor = true;
switch(i)
{
- case 0:
- uws = BG_SA_GREEN_GATEWS;
- break;
- case 1:
- uws = BG_SA_YELLOW_GATEWS;
- break;
- case 2:
- uws = BG_SA_BLUE_GATEWS;
- break;
- case 3:
- uws = BG_SA_RED_GATEWS;
+ case BG_SA_GREEN_GATE:
+ if (GateStatus[BG_SA_BLUE_GATE] == BG_SA_GATE_DESTROYED)
+ rewardHonor = false;
break;
- case 4:
- uws = BG_SA_PURPLE_GATEWS;
+ case BG_SA_BLUE_GATE:
+ if (GateStatus[BG_SA_GREEN_GATE] == BG_SA_GATE_DESTROYED)
+ rewardHonor = false;
break;
- case 5:
- uws = BG_SA_ANCIENT_GATEWS;
+ case BG_SA_RED_GATE:
+ if (GateStatus[BG_SA_PURPLE_GATE] == BG_SA_GATE_DESTROYED)
+ rewardHonor = false;
break;
- default:
- ASSERT(false);
+ case BG_SA_PURPLE_GATE:
+ if (GateStatus[BG_SA_RED_GATE] == BG_SA_GATE_DESTROYED)
+ rewardHonor = false;
break;
}
if (i < 5)
DelObject(i+9);
- UpdateWorldState(uws, GateStatus[i]);
UpdatePlayerScore(pl,SCORE_DESTROYED_WALL, 1);
+ if (rewardHonor)
+ UpdatePlayerScore(pl,SCORE_BONUS_HONOR,(GetBonusHonorFromKill(1)));
}
}
}
@@ -634,6 +681,10 @@ void BattleGroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player *Source)
UpdateWorldState(BG_SA_LEFT_GY_ALLIANCE, (GraveyardStatus[i] == TEAM_ALLIANCE? 1:0));
UpdateWorldState(BG_SA_LEFT_GY_HORDE, (GraveyardStatus[i] == TEAM_ALLIANCE? 0:1));
+ if (Source->GetTeamId() == TEAM_ALLIANCE)
+ SendWarningToAll(LANG_BG_SA_A_GY_WEST);
+ else
+ SendWarningToAll(LANG_BG_SA_H_GY_WEST);
break;
case BG_SA_RIGHT_CAPTURABLE_GY:
flag = BG_SA_RIGHT_FLAG;
@@ -649,6 +700,10 @@ void BattleGroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player *Source)
UpdateWorldState(BG_SA_RIGHT_GY_ALLIANCE, (GraveyardStatus[i] == TEAM_ALLIANCE? 1:0));
UpdateWorldState(BG_SA_RIGHT_GY_HORDE, (GraveyardStatus[i] == TEAM_ALLIANCE? 0:1));
+ if (Source->GetTeamId() == TEAM_ALLIANCE)
+ SendWarningToAll(LANG_BG_SA_A_GY_EAST);
+ else
+ SendWarningToAll(LANG_BG_SA_H_GY_EAST);
break;
case BG_SA_CENTRAL_CAPTURABLE_GY:
flag = BG_SA_CENTRAL_FLAG;
@@ -659,6 +714,10 @@ void BattleGroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player *Source)
UpdateWorldState(BG_SA_CENTER_GY_ALLIANCE, (GraveyardStatus[i] == TEAM_ALLIANCE? 1:0));
UpdateWorldState(BG_SA_CENTER_GY_HORDE, (GraveyardStatus[i] == TEAM_ALLIANCE? 0:1));
+ if (Source->GetTeamId() == TEAM_ALLIANCE)
+ SendWarningToAll(LANG_BG_SA_A_GY_SOUTH);
+ else
+ SendWarningToAll(LANG_BG_SA_H_GY_SOUTH);
break;
default:
ASSERT(0);
@@ -672,6 +731,10 @@ void BattleGroundSA::EventPlayerUsedGO(Player* Source, GameObject* object)
{
if (Source->GetTeamId() == attackers)
{
+ if (Source->GetTeamId() == ALLIANCE)
+ SendMessageToAll(LANG_BG_SA_ALLIANCE_CAPTURED_RELIC, CHAT_MSG_BG_SYSTEM_NEUTRAL);
+ else SendMessageToAll(LANG_BG_SA_HORDE_CAPTURED_RELIC, CHAT_MSG_BG_SYSTEM_NEUTRAL);
+
if (status == BG_SA_ROUND_ONE)
{
RoundScores[0].winner = attackers;
@@ -680,7 +743,11 @@ void BattleGroundSA::EventPlayerUsedGO(Player* Source, GameObject* object)
status = BG_SA_SECOND_WARMUP;
TotalTime = 0;
ToggleTimer();
- ResetObjs();
+ SendWarningToAll(LANG_BG_SA_ROUND_ONE_END);
+ UpdateWaitTimer = 5000;
+ SignaledRoundTwo = false;
+ SignaledRoundTwoHalfMin = false;
+ InitSecondRound = true;
}
else if (status == BG_SA_ROUND_TWO)
{
diff --git a/src/game/BattleGroundSA.h b/src/game/BattleGroundSA.h
index fe636c52813..85f94c01a36 100644
--- a/src/game/BattleGroundSA.h
+++ b/src/game/BattleGroundSA.h
@@ -314,12 +314,39 @@ class BattleGroundSA : public BattleGround
virtual bool SetupBattleGround();
virtual void Reset();
virtual void FillInitialWorldStates(WorldPacket& data);
- virtual void EventPlayerDamagedGO(Player* plr, GameObject* go, uint32 event);
+ virtual void EventPlayerDamagedGO(Player* plr, GameObject* go, uint8 hitType, uint32 destroyedEvent);
virtual void HandleKillUnit(Creature* unit, Player* killer);
virtual WorldSafeLocsEntry const* GetClosestGraveYard(Player* player);
virtual void EventPlayerClickedOnFlag(Player *Source, GameObject* target_obj);
virtual void EventPlayerUsedGO(Player* Source, GameObject* object);
-
+ uint32 GetGateIDFromDestroyEventID(uint32 id)
+ {
+ uint32 i = 0;
+ switch(id)
+ {
+ case 19046: i = BG_SA_GREEN_GATE; break; //Green gate destroyed
+ case 19045: i = BG_SA_BLUE_GATE; break; //blue gate
+ case 19047: i = BG_SA_RED_GATE; break; //red gate
+ case 19048: i = BG_SA_PURPLE_GATE; break; //purple gate
+ case 19049: i = BG_SA_YELLOW_GATE; break; //yellow gate
+ case 19837: i = BG_SA_ANCIENT_GATE; break; //ancient gate
+ }
+ return i;
+ }
+ uint32 GetWorldStateFromGateID(uint32 id)
+ {
+ uint32 uws = 0;
+ switch(id)
+ {
+ case BG_SA_GREEN_GATE: uws = BG_SA_GREEN_GATEWS; break;
+ case BG_SA_YELLOW_GATE: uws = BG_SA_YELLOW_GATEWS; break;
+ case BG_SA_BLUE_GATE: uws = BG_SA_BLUE_GATEWS; break;
+ case BG_SA_RED_GATE: uws = BG_SA_RED_GATEWS; break;
+ case BG_SA_PURPLE_GATE: uws = BG_SA_PURPLE_GATEWS; break;
+ case BG_SA_ANCIENT_GATE: uws = BG_SA_ANCIENT_GATEWS; break;
+ }
+ return uws;
+ }
void EndBattleGround(uint32 winner);
void RemovePlayer(Player *plr,uint64 guid);
@@ -335,7 +362,7 @@ class BattleGroundSA : public BattleGround
void TeleportPlayers();
void OverrideGunFaction();
void DemolisherStartState(bool start);
- void DestroyGate(uint32 i, Player* pl);
+ void DestroyGate(Player* pl, GameObject* /*go*/, uint32 destroyedEvent);
void SendTime();
void CaptureGraveyard(BG_SA_Graveyards i, Player *Source);
void ToggleTimer();
@@ -348,5 +375,9 @@ class BattleGroundSA : public BattleGround
TeamId GraveyardStatus[BG_SA_MAX_GY];
BG_SA_RoundScore RoundScores[2];
bool TimerEnabled;
+ uint32 UpdateWaitTimer;//5secs before starting the 1min countdown for second round
+ bool SignaledRoundTwo;
+ bool SignaledRoundTwoHalfMin;
+ bool InitSecondRound;
};
#endif
diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp
index 3aaac5afe31..6eb0b482d80 100644
--- a/src/game/GameObject.cpp
+++ b/src/game/GameObject.cpp
@@ -1598,6 +1598,7 @@ void GameObject::TakenDamage(uint32 damage, Unit *who)
if (HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED)) // from damaged to destroyed
{
+ uint8 hitType = BG_OBJECT_DMG_HIT_TYPE_HIGH_DAMAGED;
if (!m_goValue->building.health)
{
RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
@@ -1607,11 +1608,19 @@ void GameObject::TakenDamage(uint32 damage, Unit *who)
EventInform(m_goInfo->building.destroyedEvent);
if (pwho)
if (BattleGround* bg = pwho->GetBattleGround())
- bg->EventPlayerDamagedGO(pwho, this, m_goInfo->building.destroyedEvent);
+ bg->DestroyGate(pwho, this, m_goInfo->building.destroyedEvent);
+ hitType = BG_OBJECT_DMG_HIT_TYPE_JUST_DESTROYED;
}
+ if (pwho)
+ if (BattleGround* bg = pwho->GetBattleGround())
+ bg->EventPlayerDamagedGO(pwho, this, hitType, m_goInfo->building.destroyedEvent);
}
else // from intact to damaged
{
+ uint8 hitType = BG_OBJECT_DMG_HIT_TYPE_JUST_DAMAGED;
+ if (m_goValue->building.health + damage < m_goInfo->building.intactNumHits + m_goInfo->building.damagedNumHits)
+ hitType = BG_OBJECT_DMG_HIT_TYPE_DAMAGED;
+
if (m_goValue->building.health <= m_goInfo->building.damagedNumHits)
{
if (!m_goInfo->building.destroyedDisplayId)
@@ -1622,7 +1631,11 @@ void GameObject::TakenDamage(uint32 damage, Unit *who)
SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
SetUInt32Value(GAMEOBJECT_DISPLAYID, m_goInfo->building.damagedDisplayId);
EventInform(m_goInfo->building.damagedEvent);
+ hitType = BG_OBJECT_DMG_HIT_TYPE_JUST_HIGH_DAMAGED;
}
+ if (pwho)
+ if (BattleGround* bg = pwho->GetBattleGround())
+ bg->EventPlayerDamagedGO(pwho, this, hitType, m_goInfo->building.destroyedEvent);
}
SetGoAnimProgress(m_goValue->building.health*255/(m_goInfo->building.intactNumHits + m_goInfo->building.damagedNumHits));
}
diff --git a/src/game/Language.h b/src/game/Language.h
index d421344bd30..c0c8fc486f3 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -976,12 +976,24 @@ enum TrinityStrings
LANG_OPVP_ZM_GOSSIP_ALLIANCE = 10054,
LANG_OPVP_ZM_GOSSIP_HORDE = 10055,
- LANG_BG_SA_START_TWO_MINUTES = 10056,
- LANG_BG_SA_START_ONE_MINUTE = 10057,
- LANG_BG_SA_START_HALF_MINUTE = 10058,
- LANG_BG_SA_HAS_BEGUN = 10059,
- LANG_BG_SA_IS_UNDER_ATTACK = 10060,
- LANG_BG_SA_IS_DESTROYED = 10061,
+ LANG_BG_SA_START_TWO_MINUTES = 10056,
+ LANG_BG_SA_START_ONE_MINUTE = 10057,
+ LANG_BG_SA_START_HALF_MINUTE = 10058,
+ LANG_BG_SA_HAS_BEGUN = 10059,
+ LANG_BG_SA_IS_UNDER_ATTACK = 10060,//The %s is under attack!
+ LANG_BG_SA_WAS_DESTROYED = 10061,//The %s was destroyed!
+ LANG_BG_SA_ROUND_ONE_END = 10062,//Round 1 - finished!
+ LANG_BG_SA_ALLIANCE_CAPTURED_RELIC = 10063,//The Alliance captured the titan portal!
+ LANG_BG_SA_HORDE_CAPTURED_RELIC = 10064,//The Horde captured the titan portal!
+ LANG_BG_SA_ROUND_TWO_ONE_MINUTE = 10065,//Round 2 of the Battle for the Strand of the Ancients begins in 1 minute.
+ LANG_BG_SA_ROUND_TWO_START_HALF_MINUTE = 10066,//Round 2 begins in 30 seconds. Prepare yourselves!
+ LANG_BG_SA_CHAMBER_BREACHED = 10067,//The chamber has been breached! The titan relic is vulnerable!
+ LANG_BG_SA_A_GY_SOUTH = 10068,//The Alliance captured the South Graveyard!
+ LANG_BG_SA_A_GY_WEST = 10069,//The Alliance captured the West Graveyard!
+ LANG_BG_SA_A_GY_EAST = 10070,//The Alliance captured the East Graveyard!
+ LANG_BG_SA_H_GY_SOUTH = 10071,//The Horde captured the South Graveyard!
+ LANG_BG_SA_H_GY_WEST = 10072,//The Horde captured the West Graveyard!
+ LANG_BG_SA_H_GY_EAST = 10073,//The Horde captured the East Graveyard!
// Use for custom patches 11000-11999
LANG_AUTO_BROADCAST = 11000,