Core/BattleGrounds: update Gameobject hook to support multiple destructable building events.

little cleanup in GameObject.cpp
This commit is contained in:
Supabad
2011-04-10 20:55:17 +02:00
parent 9bed8e49db
commit 3771798a2e
6 changed files with 32 additions and 49 deletions
+1 -10
View File
@@ -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));
}