Core/BattleGrounds: update Gameobject hook to support multiple destructable building events.
little cleanup in GameObject.cpp
This commit is contained in:
@@ -256,15 +256,6 @@ 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
|
||||
@@ -527,7 +518,7 @@ class Battleground
|
||||
virtual void EventPlayerCapturedFlag(Player* /*player*/) {}
|
||||
void EventPlayerLoggedIn(Player* player);
|
||||
void EventPlayerLoggedOut(Player* player);
|
||||
virtual void EventPlayerDamagedGO(Player* /*plr*/, GameObject* /*go*/, uint8 /*hitType*/, uint32 /*destroyedEvent*/) {}
|
||||
virtual void EventPlayerDamagedGO(Player* /*plr*/, GameObject* /*go*/, uint32 /*eventType*/) {}
|
||||
virtual void EventPlayerUsedGO(Player* /*player*/, GameObject* /*go*/){}
|
||||
|
||||
// this function can be used by spell to interact with the BG map
|
||||
|
||||
@@ -853,7 +853,7 @@ void BattlegroundIC::DestroyGate(Player* pl, GameObject* go, uint32 /*destroyedE
|
||||
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*/)
|
||||
void BattlegroundIC::EventPlayerDamagedGO(Player* /*plr*/, GameObject* /*go*/, uint32 /*eventType*/)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@@ -878,7 +878,7 @@ class BattlegroundIC : public Battleground
|
||||
void EndBattleground(uint32 winner);
|
||||
void EventPlayerClickedOnFlag(Player *source, GameObject* /*target_obj*/);
|
||||
|
||||
void EventPlayerDamagedGO(Player* /*plr*/, GameObject* go, uint8 hitType, uint32 destroyedEvent);
|
||||
void EventPlayerDamagedGO(Player* /*plr*/, GameObject* go, uint32 eventType);
|
||||
void DestroyGate(Player* pl, GameObject* /*go*/, uint32 destroyedEvent);
|
||||
|
||||
virtual WorldSafeLocsEntry const* GetClosestGraveYard(Player* player);
|
||||
|
||||
@@ -524,36 +524,30 @@ void BattlegroundSA::TeleportPlayers()
|
||||
}
|
||||
}
|
||||
|
||||
void BattlegroundSA::EventPlayerDamagedGO(Player* /*plr*/, GameObject* go, uint8 hitType, uint32 destroyedEvent)
|
||||
void BattlegroundSA::EventPlayerDamagedGO(Player* /*plr*/, GameObject* go, uint32 eventType)
|
||||
{
|
||||
if (!go || !go->GetGOInfo())
|
||||
return;
|
||||
|
||||
switch(hitType)
|
||||
if (eventType == go->GetGOInfo()->building.damagedEvent)
|
||||
{
|
||||
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;
|
||||
uint32 i = GetGateIDFromDestroyEventID(eventType);
|
||||
GateStatus[i] = BG_SA_GATE_DAMAGED;
|
||||
uint32 uws = GetWorldStateFromGateID(i);
|
||||
if (uws)
|
||||
UpdateWorldState(uws, GateStatus[i]);
|
||||
}
|
||||
|
||||
if (eventType == go->GetGOInfo()->building.destroyedEvent)
|
||||
{
|
||||
if (go->GetGOInfo()->building.destroyedEvent == 19837)
|
||||
SendWarningToAll(LANG_BG_SA_CHAMBER_BREACHED);
|
||||
else
|
||||
SendWarningToAll(LANG_BG_SA_WAS_DESTROYED, go->GetGOInfo()->name);
|
||||
}
|
||||
|
||||
if (eventType == go->GetGOInfo()->building.damageEvent)
|
||||
SendWarningToAll(LANG_BG_SA_IS_UNDER_ATTACK, go->GetGOInfo()->name);
|
||||
}
|
||||
|
||||
void BattlegroundSA::HandleKillUnit(Creature* unit, Player* killer)
|
||||
|
||||
@@ -437,7 +437,7 @@ class BattlegroundSA : public Battleground
|
||||
/// Called for generate packet contain worldstate data
|
||||
virtual void FillInitialWorldStates(WorldPacket& data);
|
||||
/// Called when a player deal damage to building (door)
|
||||
virtual void EventPlayerDamagedGO(Player* plr, GameObject* go, uint8 hitType, uint32 destroyedEvent);
|
||||
virtual void EventPlayerDamagedGO(Player* plr, GameObject* go, uint32 eventType);
|
||||
/// Called when a player kill a unit in bg
|
||||
virtual void HandleKillUnit(Creature* unit, Player* killer);
|
||||
/// Return the nearest graveyard where player can respawn
|
||||
|
||||
@@ -1698,7 +1698,6 @@ 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);
|
||||
@@ -1713,19 +1712,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;
|
||||
}
|
||||
sScriptMgr->OnGameObjectDestroyed(this, pwho, m_goInfo->building.destroyedEvent);
|
||||
}
|
||||
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 + damage >= m_goInfo->building.intactNumHits + m_goInfo->building.damagedNumHits)
|
||||
if (pwho)
|
||||
if (Battleground* bg = pwho->GetBattleground())
|
||||
bg->EventPlayerDamagedGO(pwho, this, m_goInfo->building.damageEvent);
|
||||
|
||||
if (m_goValue->building.health <= m_goInfo->building.damagedNumHits)
|
||||
{
|
||||
@@ -1744,11 +1743,10 @@ void GameObject::TakenDamage(uint32 damage, Unit *who)
|
||||
|
||||
EventInform(m_goInfo->building.damagedEvent);
|
||||
sScriptMgr->OnGameObjectDamaged(this, pwho, m_goInfo->building.damagedEvent);
|
||||
hitType = BG_OBJECT_DMG_HIT_TYPE_JUST_HIGH_DAMAGED;
|
||||
if (pwho)
|
||||
if (Battleground* bg = pwho->GetBattleground())
|
||||
bg->EventPlayerDamagedGO(pwho, this, m_goInfo->building.damagedEvent);
|
||||
}
|
||||
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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user