void BattlefieldTB::OnBattleEnd(bool endByTimer) { if (!endByTimer) // Attackers win (but now they are defenders already) SendWarning(GetDefenderTeam() == TEAM_ALLIANCE ? TB_TEXT_FORTRESS_CAPTURE_ALLIANCE : TB_TEXT_FORTRESS_CAPTURE_HORDE); else // Defenders win SendWarning(GetDefenderTeam() == TEAM_ALLIANCE ? TB_TEXT_FORTRESS_DEFEND_ALLIANCE : TB_TEXT_FORTRESS_DEFEND_HORDE); // UpdateNPCsAndGameObjects() must be called 1 minute after battle ends m_updateObjectsTimer = 1 * MINUTE * IN_MILLISECONDS; updatedNPCAndObjects = false; // Complete quest TeamCastSpell(GetDefenderTeam(), GetDefenderTeam() == TEAM_ALLIANCE ? SPELL_VICTORY_ALLIANCE : SPELL_VICTORY_HORDE); // Rewards TeamCastSpell(GetDefenderTeam(), GetDefenderTeam() == TEAM_ALLIANCE ? SPELL_REWARD_VICTORY_ALLIANCE : SPELL_REWARD_VICTORY_HORDE); for (uint32 i = 0; i < GetData(BATTLEFIELD_TB_DATA_TOWERS_INTACT); i++) // Unsure, for each intact tower or only once for having any tower intact? TeamCastSpell(GetDefenderTeam(), SPELL_REWARD_TOWER_INTACT); TeamCastSpell(GetAttackerTeam(), SPELL_REWARD_DEFEAT); for (uint8 team = 0; team < 2; ++team) { for (ObjectGuid const& guid : m_PlayersInWar[team]) if (Player* player = ObjectAccessor::FindPlayer(guid)) RemoveAurasFromPlayer(player); m_PlayersInWar[team].clear(); } // Reset time warning vars warnedFiveMinutes = false; warnedTwoMinutes = false; warnedOneMinute = false; };
bool BattlefieldTB::Update(uint32 diff) { bool m_return = Battlefield::Update(diff); // Minutes till battle preparation warnings if (GetState() == BATTLEFIELD_INACTIVE) { if (m_Timer <= 5 * MINUTE * IN_MILLISECONDS + m_StartGroupingTimer && !warnedFiveMinutes) { warnedFiveMinutes = true; SendWarning(TB_TEXT_PREPARATIONS_IN_5_MIN); } if (m_Timer <= 2 * MINUTE * IN_MILLISECONDS + m_StartGroupingTimer && !warnedTwoMinutes) { warnedTwoMinutes = true; SendWarning(TB_TEXT_PREPARATIONS_IN_2_MIN); } if (m_Timer <= 1 * MINUTE * IN_MILLISECONDS + m_StartGroupingTimer && !warnedOneMinute) { warnedOneMinute = true; SendWarning(TB_TEXT_PREPARATIONS_IN_1_MIN); } } if (!updatedNPCAndObjects) { if (m_updateObjectsTimer <= diff) { UpdateNPCsAndGameObjects(); updatedNPCAndObjects = true; } else m_updateObjectsTimer -= diff; } if (m_saveTimer <= diff) { if (!IsWarTime()) sWorld->setWorldState(TB_WS_TIME_NEXT_BATTLE, m_Timer); m_saveTimer = 60 * IN_MILLISECONDS; } else m_saveTimer -= diff; return m_return; }
void BattlefieldTB::TowerDestroyed(TBTowerId tbTowerId) { if (!IsWarTime()) return; // Add 5 minute bonus time m_Timer += m_BonusTime; SendUpdateWorldState(TB_WS_TIME_BATTLE_END, uint32(time(NULL) + (m_Timer / 1000))); SendWarning(TBTowers[tbTowerId].textDamaged); SetData(BATTLEFIELD_TB_DATA_TOWERS_DESTROYED, GetData(BATTLEFIELD_TB_DATA_TOWERS_DESTROYED) + 1); SendUpdateWorldState(uint32(TB_WS_TOWERS_DESTROYED), int32(GetData(BATTLEFIELD_TB_DATA_TOWERS_DESTROYED))); SendUpdateWorldState(uint32(TBTowers[tbTowerId].wsDamaged[GetDefenderTeam()]), int32(0)); SendUpdateWorldState(uint32(TBTowers[tbTowerId].wsDestroyed), int32(1)); // Attack bonus buff for (ObjectGuid const& guid : m_PlayersInWar[GetAttackerTeam()]) if (Player* player = ObjectAccessor::FindPlayer(guid)) player->CastCustomSpell(SPELL_TOWER_ATTACK_BONUS, SPELLVALUE_AURA_STACK, GetData(BATTLEFIELD_TB_DATA_TOWERS_DESTROYED), player, TRIGGERED_FULL_MASK); // Honor reward TeamCastSpell(GetAttackerTeam(), SPELL_REWARD_TOWER_DESTROYED); }
void BattlefieldTB::TowerDamaged(TBTowerId tbTowerId) { if (!IsWarTime()) return; SendWarning(TBTowers[tbTowerId].textDamaged); SetData(BATTLEFIELD_TB_DATA_TOWERS_INTACT, GetData(BATTLEFIELD_TB_DATA_TOWERS_INTACT) - 1); SendUpdateWorldState(uint32(TBTowers[tbTowerId].wsIntact[GetDefenderTeam()]), int32(0)); SendUpdateWorldState(uint32(TBTowers[tbTowerId].wsDamaged[GetDefenderTeam()]), int32(1)); TeamCastSpell(GetAttackerTeam(), SPELL_REWARD_TOWER_DAMAGED); }
void AIMNetManager::MessageReceived( BMessage* msg ) { // let the network code handle the net messages if( msg->HasBool("netonly") ) { NetworkManager::MessageReceived(msg); return; } // handle all the rest of them here switch( msg->what ) { case BEAIM_SIGN_ON: Login( msg ); break; case BEAIM_LOGOUT: Logout(); break; case BEAIM_SEND_MESSAGE: SendMessage( msg ); break; case BEAIM_GET_USER_INFO: RequestPersonInfo( msg ); break; case BEAIM_GET_AWAY_INFO: RequestAwayInfo( msg ); break; case BEAIM_CANCEL_SIGN_ON: CancelSignOn(); break; case BEAIM_SIGN_OFF: //Logout(); break; case BEAIM_SEND_ARBITRARY_DATA: SendArbitraryData( msg ); break; case BEAIM_NOW_IDLE: SendIdleMessage( true ); break; case BEAIM_NOW_ACTIVE: SendIdleMessage( false ); break; case BEAIM_SEND_NOOP: SendNoOp(); break; case BEAIM_BUDDYLIST_COMMIT: UpdateServerBuddyList( msg ); break; case BEAIM_SEARCH_BY_EMAIL: SearchByEmail( msg ); break; case BEAIM_GOING_AWAY: SetAwayStatus( msg ); break; case BEAIM_WARN_SOMEONE: SendWarning( msg ); break; case BEAIM_SET_USER_BLOCKINESS: SetUserBlockiness( msg ); break; case BEAIM_CLIENT_READY: SetClientReady(); break; case BEAIM_CLEAR_SNACPILE: if (snacPile != -1) snacPile = 0; break; default: NetworkManager::MessageReceived(msg); break; } }