void BattlegroundBG::Update(uint32 diff) // PostUpdateImpl... { Battleground::Update(diff); if (GetStatus() == STATUS_IN_PROGRESS) { int team_points[BG_TEAMS_COUNT] = { 0, 0 }; for (int node = 0; node < GILNEAS_BG_DYNAMIC_NODES_COUNT; ++node) { // 3sec delay to spawn new a banner instead previous despawned one. if (_BannerTimers[node].timer) { if (_BannerTimers[node].timer > diff) _BannerTimers[node].timer -= diff; else { _BannerTimers[node].timer = 0; _CreateBanner(node, _BannerTimers[node].type, _BannerTimers[node].teamIndex, false); } } // 1 minute cap timer on each node from a contested state. if (_NodeTimers[node]) { if (_NodeTimers[node] > diff) _NodeTimers[node] -= diff; else { _NodeTimers[node] = 0; // Change from contested to occupied ! uint8 teamIndex = _Nodes[node]-1; _prevNodes[node] = _Nodes[node]; _Nodes[node] += 2; // burn current contested banner _DelBanner(node, GILNEAS_BG_NODE_TYPE_CONTESTED, teamIndex); // create new occupied banner _CreateBanner(node, GILNEAS_BG_NODE_TYPE_OCCUPIED, teamIndex, true); _SendNodeUpdate(node); _NodeOccupied(node, (teamIndex == 0) ? ALLIANCE:HORDE); // Message to chatlog if (teamIndex == 0) { // FIXME: need to fix Locales for team and nodes names. SendMessage2ToAll(LANGUAGE_BG_BG_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, LANGUAGE_BG_BG_ALLY, _GetNodeNameId(node)); PlaySoundToAll(GILNEAS_BG_SOUND_NODE_CAPTURED_ALLIANCE); } else { // FIXME: team and node names not localized SendMessage2ToAll(LANGUAGE_BG_BG_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_HORDE, NULL, LANGUAGE_BG_BG_HORDE, _GetNodeNameId(node)); PlaySoundToAll(GILNEAS_BG_SOUND_NODE_CAPTURED_HORDE); } } } for (int team = 0; team < BG_TEAMS_COUNT; ++team) if (_Nodes[node] == team + GILNEAS_BG_NODE_TYPE_OCCUPIED) ++team_points[team]; } // Accumulate points for (int team = 0; team < BG_TEAMS_COUNT; ++team) { int points = team_points[team]; if (!points) continue; _lastTick[team] += diff; if (_lastTick[team] > GILNEAS_BG_TickIntervals[points]) { _lastTick[team] -= GILNEAS_BG_TickIntervals[points]; _TeamScores[team] += GILNEAS_BG_TickPoints[points]; _HonorScoreTicks[team] += GILNEAS_BG_TickPoints[points]; _ReputationScoreTicks[team] += GILNEAS_BG_TickPoints[points]; if (_ReputationScoreTicks[team] >= _ReputationTicks) { (team == BG_TEAM_ALLIANCE) ? RewardReputationToTeam(509, 10, ALLIANCE) : RewardReputationToTeam(510, 10, HORDE); _ReputationScoreTicks[team] -= _ReputationTicks; } if (_HonorScoreTicks[team] >= _HonorTicks) { RewardHonorToTeam(GetBonusHonorFromKill(1), (team == BG_TEAM_ALLIANCE) ? ALLIANCE : HORDE); _HonorScoreTicks[team] -= _HonorTicks; } if (!_IsInformedNearVictory && _TeamScores[team] > GILNEAS_BG_WARNING_NEAR_VICTORY_SCORE) { if (team == BG_TEAM_ALLIANCE) SendMessageToAll(LANGUAGE_BG_BG_A_NEAR_VICTORY, CHAT_MSG_BG_SYSTEM_NEUTRAL); else SendMessageToAll(LANGUAGE_BG_BG_H_NEAR_VICTORY, CHAT_MSG_BG_SYSTEM_NEUTRAL); PlaySoundToAll(GILNEAS_BG_SOUND_NEAR_VICTORY); _IsInformedNearVictory = true; } if (_TeamScores[team] > GILNEAS_BG_MAX_TEAM_SCORE) _TeamScores[team] = GILNEAS_BG_MAX_TEAM_SCORE; if (team == BG_TEAM_ALLIANCE) UpdateWorldState(GILNEAS_BG_OP_RESOURCES_ALLY, _TeamScores[team]); if (team == BG_TEAM_HORDE) UpdateWorldState(GILNEAS_BG_OP_RESOURCES_HORDE, _TeamScores[team]); // update achievement flags // we increased _TeamScores[team] so we just need to check if it is 500 more than other teams resources uint8 otherTeam = (team + 1) % BG_TEAMS_COUNT; if (_TeamScores[team] > _TeamScores[otherTeam] + 500) _TeamScores500Disadvantage[otherTeam] = true; } } // Test win condition if (_TeamScores[BG_TEAM_ALLIANCE] >= GILNEAS_BG_MAX_TEAM_SCORE) EndBattleground(ALLIANCE); if (_TeamScores[BG_TEAM_HORDE] >= GILNEAS_BG_MAX_TEAM_SCORE) EndBattleground(HORDE); } }
void BattlegroundEY::EventTeamCapturedPoint(Player* Source, uint32 Point) { if (GetStatus() != STATUS_IN_PROGRESS) return; uint32 Team = Source->GetTeam(); SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType, RESPAWN_ONE_DAY); SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType + 1, RESPAWN_ONE_DAY); SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType + 2, RESPAWN_ONE_DAY); if (Team == ALLIANCE) { m_TeamPointsCount[BG_TEAM_ALLIANCE]++; SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance, RESPAWN_IMMEDIATELY); SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance + 1, RESPAWN_IMMEDIATELY); SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance + 2, RESPAWN_IMMEDIATELY); } else { m_TeamPointsCount[BG_TEAM_HORDE]++; SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde, RESPAWN_IMMEDIATELY); SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde + 1, RESPAWN_IMMEDIATELY); SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde + 2, RESPAWN_IMMEDIATELY); } //buff isn't respawned m_PointOwnedByTeam[Point] = Team; m_PointState[Point] = EY_POINT_UNDER_CONTROL; if (Team == ALLIANCE) SendMessageToAll(m_CapturingPointTypes[Point].MessageIdAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, Source); else SendMessageToAll(m_CapturingPointTypes[Point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, Source); if (BgCreatures[Point]) DelCreature(Point); WorldSafeLocsEntry const* sg = NULL; sg = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[Point].GraveYardId); if (!sg || !AddSpiritGuide(Point, sg->x, sg->y, sg->z, 3.124139f, Team)) sLog->outError("BatteGroundEY: Failed to spawn spirit guide! point: %u, team: %u, graveyard_id: %u", Point, Team, m_CapturingPointTypes[Point].GraveYardId); // SpawnBGCreature(Point, RESPAWN_IMMEDIATELY); UpdatePointsIcons(Team, Point); UpdatePointsCount(Team); if (Point >= EY_POINTS_MAX) return; Creature* trigger = GetBGCreature(Point + 6);//0-5 spirit guides if (!trigger) trigger = AddCreature(WORLD_TRIGGER, Point+6, Team, BG_EY_TriggerPositions[Point][0], BG_EY_TriggerPositions[Point][1], BG_EY_TriggerPositions[Point][2], BG_EY_TriggerPositions[Point][3]); //add bonus honor aura trigger creature when node is accupied //cast bonus aura (+50% honor in 25yards) //aura should only apply to players who have accupied the node, set correct faction for trigger if (trigger) { trigger->setFaction(Team == ALLIANCE ? 84 : 83); trigger->CastSpell(trigger, SPELL_HONORABLE_DEFENDER_25Y, false); } }
void BattlegroundWS::EventPlayerDroppedFlag(Player* Source) { if (GetStatus() != STATUS_IN_PROGRESS) { // if not running, do not cast things at the dropper player (prevent spawning the "dropped" flag), neither send unnecessary messages // just take off the aura if (Source->GetTeam() == ALLIANCE) { if (!IsHordeFlagPickedup()) return; if (GetFlagPickerGUID(TEAM_HORDE) == Source->GetGUID()) { SetHordeFlagPicker(0); Source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG); } } else { if (!IsAllianceFlagPickedup()) return; if (GetFlagPickerGUID(TEAM_ALLIANCE) == Source->GetGUID()) { SetAllianceFlagPicker(0); Source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG); } } return; } bool set = false; if (Source->GetTeam() == ALLIANCE) { if (!IsHordeFlagPickedup()) return; if (GetFlagPickerGUID(TEAM_HORDE) == Source->GetGUID()) { SetHordeFlagPicker(0); Source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG); if (_flagDebuffState == 1) Source->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT); if (_flagDebuffState == 2) Source->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT); _flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_ON_GROUND; Source->CastSpell(Source, BG_WS_SPELL_WARSONG_FLAG_DROPPED, true); set = true; } } else { if (!IsAllianceFlagPickedup()) return; if (GetFlagPickerGUID(TEAM_ALLIANCE) == Source->GetGUID()) { SetAllianceFlagPicker(0); Source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG); if (_flagDebuffState == 1) Source->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT); if (_flagDebuffState == 2) Source->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT); _flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_GROUND; Source->CastSpell(Source, BG_WS_SPELL_SILVERWING_FLAG_DROPPED, true); set = true; } } if (set) { Source->CastSpell(Source, SPELL_RECENTLY_DROPPED_FLAG, true); UpdateFlagState(Source->GetTeam(), 1); if (Source->GetTeam() == ALLIANCE) { SendMessageToAll(LANG_BG_WS_DROPPED_HF, CHAT_MSG_BG_SYSTEM_HORDE, Source); UpdateWorldState(BG_WS_FLAG_UNK_HORDE, uint32(-1)); } else { SendMessageToAll(LANG_BG_WS_DROPPED_AF, CHAT_MSG_BG_SYSTEM_ALLIANCE, Source); UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, uint32(-1)); } _flagsDropTimer[GetTeamIndexByTeamId(Source->GetTeam()) ? 0 : 1] = BG_WS_FLAG_DROP_TIME; } }
void BattleGroundWS::Update(time_t diff) { BattleGround::Update(diff); // after bg start we get there (once) if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize()) { ModifyStartDelayTime(diff); if(!(m_Events & 0x01)) { m_Events |= 0x01; // setup here, only when at least one player has ported to the map if(!SetupBattleGround()) { EndNow(); return; } // for(uint32 i = WS_SPIRIT_MAIN_ALLIANCE; i <= WS_SPIRIT_MAIN_HORDE; i++) // SpawnBGCreature(i, RESPAWN_IMMEDIATELY); for(uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_H_4; i++) { SpawnBGObject(i, RESPAWN_IMMEDIATELY); DoorClose(i); } for(uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; i++) SpawnBGObject(i, RESPAWN_ONE_DAY); SetStartDelayTime(START_DELAY0); } // After 1 minute, warning is signalled else if(GetStartDelayTime() <= START_DELAY1 && !(m_Events & 0x04)) { m_Events |= 0x04; SendMessageToAll(GetTrinityString(LANG_BG_WS_ONE_MINUTE)); } // After 1,5 minute, warning is signalled else if(GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x08)) { m_Events |= 0x08; SendMessageToAll(GetTrinityString(LANG_BG_WS_HALF_MINUTE)); } // After 2 minutes, gates OPEN ! x) else if(GetStartDelayTime() < 0 && !(m_Events & 0x10)) { m_Events |= 0x10; for(uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_A_4; i++) DoorOpen(i); for(uint32 i = BG_WS_OBJECT_DOOR_H_1; i <= BG_WS_OBJECT_DOOR_H_2; i++) DoorOpen(i); SpawnBGObject(BG_WS_OBJECT_DOOR_A_5, RESPAWN_ONE_DAY); SpawnBGObject(BG_WS_OBJECT_DOOR_A_6, RESPAWN_ONE_DAY); SpawnBGObject(BG_WS_OBJECT_DOOR_H_3, RESPAWN_ONE_DAY); SpawnBGObject(BG_WS_OBJECT_DOOR_H_4, RESPAWN_ONE_DAY); for(uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; i++) SpawnBGObject(i, RESPAWN_IMMEDIATELY); SendMessageToAll(GetTrinityString(LANG_BG_WS_BEGIN)); PlaySoundToAll(SOUND_BG_START); if(sWorld.getConfig(CONFIG_BG_START_MUSIC)) PlaySoundToAll(SOUND_BG_START_L70ETC); //MUSIC - Custom config SetStatus(STATUS_IN_PROGRESS); for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if(Player* plr = objmgr.GetPlayer(itr->first)) plr->RemoveAurasDueToSpell(SPELL_PREPARATION); } } else if(GetStatus() == STATUS_IN_PROGRESS) { if(m_FlagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_WAIT_RESPAWN) { m_FlagsTimer[BG_TEAM_ALLIANCE] -= diff; if(m_FlagsTimer[BG_TEAM_ALLIANCE] < 0) { m_FlagsTimer[BG_TEAM_ALLIANCE] = 0; RespawnFlag(ALLIANCE, true); } } if(m_FlagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_ON_GROUND) { m_FlagsDropTimer[BG_TEAM_ALLIANCE] -= diff; if(m_FlagsDropTimer[BG_TEAM_ALLIANCE] < 0) { m_FlagsDropTimer[BG_TEAM_ALLIANCE] = 0; RespawnFlagAfterDrop(ALLIANCE); } } if(m_FlagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_WAIT_RESPAWN) { m_FlagsTimer[BG_TEAM_HORDE] -= diff; if(m_FlagsTimer[BG_TEAM_HORDE] < 0) { m_FlagsTimer[BG_TEAM_HORDE] = 0; RespawnFlag(HORDE, true); } } if(m_FlagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_ON_GROUND) { m_FlagsDropTimer[BG_TEAM_HORDE] -= diff; if(m_FlagsDropTimer[BG_TEAM_HORDE] < 0) { m_FlagsDropTimer[BG_TEAM_HORDE] = 0; RespawnFlagAfterDrop(HORDE); } } } }
void BattleGroundAB::Update(uint32 diff) { BattleGround::Update(diff); if( GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize() ) { ModifyStartDelayTime(diff); if( !(m_Events & 0x01) ) { m_Events |= 0x01; // setup here, only when at least one player has ported to the map if(!SetupBattleGround()) { EndNow(); return; } sLog.outDebug("Arathi Basin: entering state STATUS_WAIT_JOIN ..."); // despawn banners, auras and buffs for (int obj = BG_AB_OBJECT_BANNER_NEUTRAL; obj < BG_AB_DYNAMIC_NODES_COUNT * 8; ++obj) SpawnBGObject(obj, RESPAWN_ONE_DAY); for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT * 3; ++i) SpawnBGObject(BG_AB_OBJECT_SPEEDBUFF_STABLES + i, RESPAWN_ONE_DAY); // Starting doors SpawnBGObject(BG_AB_OBJECT_GATE_A, RESPAWN_IMMEDIATELY); SpawnBGObject(BG_AB_OBJECT_GATE_H, RESPAWN_IMMEDIATELY); DoorClose(BG_AB_OBJECT_GATE_A); DoorClose(BG_AB_OBJECT_GATE_H); // Starting base spirit guides _NodeOccupied(BG_AB_SPIRIT_ALIANCE,ALLIANCE); _NodeOccupied(BG_AB_SPIRIT_HORDE,HORDE); SetStartDelayTime(START_DELAY0); } // After 1 minute, warning is signalled else if( GetStartDelayTime() <= START_DELAY1 && !(m_Events & 0x04) ) { m_Events |= 0x04; SendMessageToAll(GetMangosString(LANG_BG_AB_ONEMINTOSTART)); } // After 1,5 minute, warning is signalled else if( GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x08) ) { m_Events |= 0x08; SendMessageToAll(GetMangosString(LANG_BG_AB_HALFMINTOSTART)); } // After 2 minutes, gates OPEN ! x) else if( GetStartDelayTime() < 0 && !(m_Events & 0x10) ) { m_Events |= 0x10; SendMessageToAll(GetMangosString(LANG_BG_AB_STARTED)); // spawn neutral banners for (int banner = BG_AB_OBJECT_BANNER_NEUTRAL, i = 0; i < 5; banner += 8, ++i) SpawnBGObject(banner, RESPAWN_IMMEDIATELY); for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) { //randomly select buff to spawn uint8 buff = urand(0, 2); SpawnBGObject(BG_AB_OBJECT_SPEEDBUFF_STABLES + buff + i * 3, RESPAWN_IMMEDIATELY); } DoorOpen(BG_AB_OBJECT_GATE_A); DoorOpen(BG_AB_OBJECT_GATE_H); PlaySoundToAll(SOUND_BG_START); SetStatus(STATUS_IN_PROGRESS); for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if(Player* plr = objmgr.GetPlayer(itr->first)) plr->RemoveAurasDueToSpell(SPELL_PREPARATION); } } else if( GetStatus() == STATUS_IN_PROGRESS ) { int team_points[2] = { 0, 0 }; for (int node = 0; node < BG_AB_DYNAMIC_NODES_COUNT; ++node) { // 3 sec delay to spawn new banner instead previous despawned one if( m_BannerTimers[node].timer ) { if( m_BannerTimers[node].timer > diff ) m_BannerTimers[node].timer -= diff; else { m_BannerTimers[node].timer = 0; _CreateBanner(node, m_BannerTimers[node].type, m_BannerTimers[node].teamIndex, false); } } // 1-minute to occupy a node from contested state if( m_NodeTimers[node] ) { if( m_NodeTimers[node] > diff ) m_NodeTimers[node] -= diff; else { m_NodeTimers[node] = 0; // Change from contested to occupied ! uint8 teamIndex = m_Nodes[node]-1; m_prevNodes[node] = m_Nodes[node]; m_Nodes[node] += 2; // burn current contested banner _DelBanner(node, BG_AB_NODE_TYPE_CONTESTED, teamIndex); // create new occupied banner _CreateBanner(node, BG_AB_NODE_TYPE_OCCUPIED, teamIndex, true); _SendNodeUpdate(node); _NodeOccupied(node,(teamIndex == 0) ? ALLIANCE:HORDE); // Message to chatlog char buf[256]; uint8 type = (teamIndex == 0) ? CHAT_MSG_BG_SYSTEM_ALLIANCE : CHAT_MSG_BG_SYSTEM_HORDE; sprintf(buf, GetMangosString(LANG_BG_AB_NODE_TAKEN), (teamIndex == 0) ? GetMangosString(LANG_BG_AB_ALLY) : GetMangosString(LANG_BG_AB_HORDE), _GetNodeName(node)); WorldPacket data; ChatHandler::FillMessageData(&data, NULL, type, LANG_UNIVERSAL, NULL, 0, buf, NULL); SendPacketToAll(&data); PlaySoundToAll((teamIndex == 0) ? SOUND_NODE_CAPTURED_ALLIANCE : SOUND_NODE_CAPTURED_HORDE); } } for (int team = 0; team < 2; ++team) if( m_Nodes[node] == team + BG_AB_NODE_TYPE_OCCUPIED ) ++team_points[team]; } // Accumulate points for (int team = 0; team < 2; ++team) { int points = team_points[team]; if( !points ) continue; m_lastTick[team] += diff; if( m_lastTick[team] > BG_AB_TickIntervals[points] ) { m_lastTick[team] -= BG_AB_TickIntervals[points]; m_TeamScores[team] += BG_AB_TickPoints[points]; m_HonorScoreTics[team] += BG_AB_TickPoints[points]; m_ReputationScoreTics[team] += BG_AB_TickPoints[points]; if( m_ReputationScoreTics[team] >= 200 ) { (team == BG_TEAM_ALLIANCE) ? RewardReputationToTeam(509, 10, ALLIANCE) : RewardReputationToTeam(510, 10, HORDE); m_ReputationScoreTics[team] -= 200; } if( m_HonorScoreTics[team] >= BG_HONOR_SCORE_TICKS ) { (team == BG_TEAM_ALLIANCE) ? RewardHonorToTeam(20, ALLIANCE) : RewardHonorToTeam(20, HORDE); m_HonorScoreTics[team] -= BG_HONOR_SCORE_TICKS; } if( !m_IsInformedNearVictory && m_TeamScores[team] > 1800 ) { if( team == BG_TEAM_ALLIANCE ) SendMessageToAll(GetMangosString(LANG_BG_AB_A_NEAR_VICTORY)); else SendMessageToAll(GetMangosString(LANG_BG_AB_H_NEAR_VICTORY)); PlaySoundToAll(SOUND_NEAR_VICTORY); m_IsInformedNearVictory = true; } if( m_TeamScores[team] > 2000 ) m_TeamScores[team] = 2000; if( team == BG_TEAM_ALLIANCE ) UpdateWorldState(BG_AB_OP_RESOURCES_ALLY, m_TeamScores[team]); if( team == BG_TEAM_HORDE ) UpdateWorldState(BG_AB_OP_RESOURCES_HORDE, m_TeamScores[team]); } } // Test win condition if( m_TeamScores[BG_TEAM_ALLIANCE] >= 2000 ) EndBattleGround(ALLIANCE); if( m_TeamScores[BG_TEAM_HORDE] >= 2000 ) EndBattleGround(HORDE); } }
void BattleGroundWS::EventPlayerCapturedFlag(Player* source) { if (GetStatus() != STATUS_IN_PROGRESS) return; m_LastCapturedFlagTeam = source->GetTeam(); source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); if (source->GetTeam() == ALLIANCE) { if (!IsHordeFlagPickedUp()) return; ClearHordeFlagCarrier(); // must be before aura remove to prevent 2 events (drop+capture) at the same time // horde flag in base (but not respawned yet) m_FlagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_WAIT_RESPAWN; // Drop Horde Flag from Player source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG); if (m_TeamScores[BG_TEAM_ALLIANCE] < BG_WS_MAX_TEAM_SCORE) m_TeamScores[BG_TEAM_ALLIANCE] += 1; PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_ALLIANCE); RewardReputationToTeam(890, m_ReputationCapture, ALLIANCE); } else { if (!IsAllianceFlagPickedUp()) return; ClearAllianceFlagCarrier(); // must be before aura remove to prevent 2 events (drop+capture) at the same time // alliance flag in base (but not respawned yet) m_FlagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_WAIT_RESPAWN; // Drop Alliance Flag from Player source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG); if (m_TeamScores[BG_TEAM_HORDE] < BG_WS_MAX_TEAM_SCORE) m_TeamScores[BG_TEAM_HORDE] += 1; PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_HORDE); RewardReputationToTeam(889, m_ReputationCapture, HORDE); } // for flag capture is reward 2 honorable kills RewardHonorToTeam(GetBonusHonorFromKill(2), source->GetTeam()); // despawn flags SpawnEvent(WS_EVENT_FLAG_A, 0, false); SpawnEvent(WS_EVENT_FLAG_H, 0, false); if (source->GetTeam() == ALLIANCE) SendMessageToAll(LANG_BG_WS_CAPTURED_HF, CHAT_MSG_BG_SYSTEM_ALLIANCE, source); else SendMessageToAll(LANG_BG_WS_CAPTURED_AF, CHAT_MSG_BG_SYSTEM_HORDE, source); UpdateFlagState(source->GetTeam(), 1); // flag state none UpdateTeamScore(source->GetTeam()); // only flag capture should be updated UpdatePlayerScore(source, SCORE_FLAG_CAPTURES, 1); // +1 flag captures Team winner = TEAM_NONE; if (m_TeamScores[BG_TEAM_ALLIANCE] == BG_WS_MAX_TEAM_SCORE) winner = ALLIANCE; else if (m_TeamScores[BG_TEAM_HORDE] == BG_WS_MAX_TEAM_SCORE) winner = HORDE; if (winner) { UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 0); UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 0); UpdateWorldState(BG_WS_FLAG_STATE_ALLIANCE, 1); UpdateWorldState(BG_WS_FLAG_STATE_HORDE, 1); EndBattleGround(winner); } else { m_FlagsTimer[GetOtherTeamIndex(GetTeamIndexByTeamId(source->GetTeam()))] = BG_WS_FLAG_RESPAWN_TIME; } }
void BattleGroundWS::EventPlayerClickedOnFlag(Player* source, GameObject* target_obj) { if (GetStatus() != STATUS_IN_PROGRESS) return; int32 message_id = 0; ChatMsg type; uint8 event = (sBattleGroundMgr.GetGameObjectEventIndex(target_obj->GetGUIDLow())).event1; // alliance flag picked up from base if (source->GetTeam() == HORDE && GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE && event == WS_EVENT_FLAG_A) { message_id = LANG_BG_WS_PICKEDUP_AF; type = CHAT_MSG_BG_SYSTEM_HORDE; PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP); SpawnEvent(WS_EVENT_FLAG_A, 0, false); SetAllianceFlagCarrier(source->GetObjectGuid()); m_FlagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER; // update world state to show correct flag carrier UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER); UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1); source->CastSpell(source, BG_WS_SPELL_SILVERWING_FLAG, true); } // horde flag picked up from base if (source->GetTeam() == ALLIANCE && GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_BASE && event == WS_EVENT_FLAG_H) { message_id = LANG_BG_WS_PICKEDUP_HF; type = CHAT_MSG_BG_SYSTEM_ALLIANCE; PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP); SpawnEvent(WS_EVENT_FLAG_H, 0, false); SetHordeFlagCarrier(source->GetObjectGuid()); m_FlagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER; // update world state to show correct flag carrier UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER); UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1); source->CastSpell(source, BG_WS_SPELL_WARSONG_FLAG, true); } // Alliance flag on ground(not in base) (returned or picked up again from ground!) if (GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_GROUND && source->IsWithinDistInMap(target_obj, 10)) { if (source->GetTeam() == ALLIANCE) { message_id = LANG_BG_WS_RETURNED_AF; type = CHAT_MSG_BG_SYSTEM_ALLIANCE; UpdateFlagState(HORDE, BG_WS_FLAG_STATE_WAIT_RESPAWN); RespawnFlag(ALLIANCE, false); PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED); UpdatePlayerScore(source, SCORE_FLAG_RETURNS, 1); } else { message_id = LANG_BG_WS_PICKEDUP_AF; type = CHAT_MSG_BG_SYSTEM_HORDE; PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP); SpawnEvent(WS_EVENT_FLAG_A, 0, false); SetAllianceFlagCarrier(source->GetObjectGuid()); source->CastSpell(source, BG_WS_SPELL_SILVERWING_FLAG, true); m_FlagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER; UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER); UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1); } // called in HandleGameObjectUseOpcode: // target_obj->Delete(); } // Horde flag on ground(not in base) (returned or picked up again) if (GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_GROUND && source->IsWithinDistInMap(target_obj, 10)) { if (source->GetTeam() == HORDE) { message_id = LANG_BG_WS_RETURNED_HF; type = CHAT_MSG_BG_SYSTEM_HORDE; UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_WAIT_RESPAWN); RespawnFlag(HORDE, false); PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED); UpdatePlayerScore(source, SCORE_FLAG_RETURNS, 1); } else { message_id = LANG_BG_WS_PICKEDUP_HF; type = CHAT_MSG_BG_SYSTEM_ALLIANCE; PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP); SpawnEvent(WS_EVENT_FLAG_H, 0, false); SetHordeFlagCarrier(source->GetObjectGuid()); source->CastSpell(source, BG_WS_SPELL_WARSONG_FLAG, true); m_FlagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER; UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER); UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1); } // called in HandleGameObjectUseOpcode: // target_obj->Delete(); } if (!message_id) return; SendMessageToAll(message_id, type, source); source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); }
void BattleGroundSA::Update(uint32 diff) { BattleGround::Update(diff); if (GetStatus() == STATUS_WAIT_JOIN && !shipsStarted) if (Phase == SA_ROUND_ONE) // Round one not started yet if (shipsTimer <= diff) StartShips(); else shipsTimer -= diff; if (GetStatus() == STATUS_IN_PROGRESS) // Battleground already in progress { if (Round_timer >= BG_SA_ROUNDLENGTH) { if(Phase == SA_ROUND_ONE) // Timeout of first round { PlaySoundToAll(BG_SA_SOUND_GYD_VICTORY); SendMessageToAll(defender == ALLIANCE ? LANG_BG_SA_ALLIANCE_TIMEOUT_END_1ROUND : LANG_BG_SA_HORDE_TIMEOUT_END_1ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); RoundScores[0].winner = GetDefender(); RoundScores[0].time = 601000; for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { if (Player *plr = sObjectMgr.GetPlayer(itr->first)) plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 52459); } ResetBattle(0, defender); } else // Timeout of second round { SendMessageToAll(defender == ALLIANCE ? LANG_BG_SA_ALLIANCE_TIMEOUT_END_2ROUND : LANG_BG_SA_HORDE_TIMEOUT_END_2ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); RoundScores[1].winner = GetDefender(); RoundScores[1].time = 601000; for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { if (Player *plr = sObjectMgr.GetPlayer(itr->first)) plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 52459); } BattleGroundSA::EndBattleGround(defender); return; } } else Round_timer += diff; for (int gyd = 0; gyd < BG_SA_GRY_MAX; ++gyd) { // 3 sec delay to spawn new banner instead previous despawned one if (m_BannerTimers[gyd].timer) { if (m_BannerTimers[gyd].timer > diff) m_BannerTimers[gyd].timer -= diff; else { m_BannerTimers[gyd].timer = 0; _CreateBanner(gyd, m_BannerTimers[gyd].type, m_BannerTimers[gyd].teamIndex, false); } } // 1-minute to occupy a node from contested state if (m_GydTimers[gyd]) { if (m_GydTimers[gyd] > diff) m_GydTimers[gyd] -= diff; else { m_GydTimers[gyd] = 0; // Change from contested to occupied ! uint8 teamIndex = m_Gyd[gyd]-1; m_prevGyd[gyd] = m_Gyd[gyd]; m_Gyd[gyd] += 2; // create new occupied banner _CreateBanner(gyd, BG_SA_GARVE_TYPE_OCCUPIED, teamIndex, true); SpawnEvent(gyd+11, teamIndex, true); //_SendNodeUpdate(node); _GydOccupied(gyd,(teamIndex == 0) ? ALLIANCE:HORDE); // Message to chatlog RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE:HORDE); RewardXpToTeam(0, 0.6f, (teamIndex == 0) ? ALLIANCE:HORDE); RewardReputationToTeam((teamIndex == 0) ? 1050:1085, 65, (teamIndex == 0) ? ALLIANCE:HORDE); switch(gyd) { case 0: SpawnEvent(SA_EVENT_ADD_VECH_W, 0, true);break; case 1: SpawnEvent(SA_EVENT_ADD_VECH_E, 0, true);break; } if (teamIndex == 0) { // SendMessage2ToAll(LANG_BG_SA_AH_SEIZES_GRAVEYARD,CHAT_MSG_BG_SYSTEM_ALLIANCE,NULL,LANG_BG_ALLY,_GydName(gyd)); PlaySoundToAll(BG_SA_SOUND_GYD_CAPTURED_ALLIANCE); SendWarningToAllSA(gyd, STATUS_CONQUESTED, ALLIANCE); } else { // SendMessage2ToAll(LANG_BG_SA_AH_SEIZES_GRAVEYARD,CHAT_MSG_BG_SYSTEM_HORDE,NULL,LANG_BG_HORDE,_GydName(gyd)); PlaySoundToAll(BG_SA_SOUND_GYD_CAPTURED_HORDE); SendWarningToAllSA(gyd, STATUS_CONQUESTED, HORDE); } } } } UpdateTimer(); } if (GetStatus() == STATUS_WAIT_JOIN && Phase == SA_ROUND_TWO) // Round two, not yet started { if (!shipsStarted) if (shipsTimer <= diff) { SendMessageToAll(LANG_BG_SA_START_ONE_MINUTE, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); StartShips(); } else shipsTimer -= diff; if (TimeST2Round < diff) { Phase = 2; SpawnEvent(BG_EVENT_DOOR, 0, false); SpawnEvent(SA_EVENT_ADD_NPC, 0, true); SpawnEvent(SA_EVENT_ADD_BOMB, (GetDefender() == ALLIANCE ? 1 : 0), true); ToggleTimer(); SetStatus(STATUS_IN_PROGRESS); // Start round two PlaySoundToAll(SOUND_BG_START); SendMessageToAll(LANG_BG_SA_HAS_BEGUN, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); SendWarningToAll(LANG_BG_SA_HAS_BEGUN); } else TimeST2Round -= diff; } }
void BattleGroundSA::EventSpawnGOSA(Player *owner, Creature* obj, float x, float y, float z) { SendMessageToAll(LANG_BG_SA_INSTALL_BOMB, (defender == ALLIANCE) ? CHAT_MSG_BG_SYSTEM_HORDE : CHAT_MSG_BG_SYSTEM_ALLIANCE , owner); }
bool OutdoorPvPHS::HandleOpenGo(Player* plr, uint64 guid) { sLog->outString("HillsbradMGR: Using %u.", guid); if(GameObject* obj = plr->GetMap()->GetGameObject(guid)) { // Is this the chest? if(obj->GetGUIDLow() == m_ChestGUID) { m_ChestGUID = 0; SendMessageToAll("%s has claimed the chest! The next chest will appear in an hour.", plr->GetName()); return true; } /* for (uint32 node = 0; node < HS_CAPTURE_NUM; node+=1) { if ( obj->GetGUIDLow() == m_TowerPoints[node].gameobject ) // Player just opened a capture point.. { // Player's team == plr->GetTeam() switch( m_TowerPoints[node].state ) { // If neutral.. make it contested.. case HS_CAPTURE_NEUTRAL: changeCapturePoint( node, ( plr->GetTeam() == ALLIANCE ) ? HS_CAPTURE_ALLIANCE_CONT : HS_CAPTURE_HORDE_CONT, 60000 ); if( plr->GetTeam() == ALLIANCE ) SendMessageToAll( "%s has claimed %s tower. If left uncontested Alliance will control it in 60 seconds!", plr->GetName(), m_TowerPoints[node].name.c_str() ); else SendMessageToAll( "%s has claimed %s tower. If left uncontested Horde will control it in 60 seconds!", plr->GetName(), m_TowerPoints[node].name.c_str() ); break; case HS_CAPTURE_ALLIANCE_CONT: { if( plr->GetTeam() == ALLIANCE ) { if ( m_TowerPoints[node].previousState == HS_CAPTURE_NEUTRAL ) return false; else if ( m_TowerPoints[node].teamIndex == 1 ) changeCapturePoint( node, HS_CAPTURE_ALLIANCE, 0 ); } else changeCapturePoint( node, HS_CAPTURE_HORDE_CONT, 60000 ); } break; case HS_CAPTURE_HORDE_CONT: { if( plr->GetTeam() != ALLIANCE ) { if ( m_TowerPoints[node].previousState == HS_CAPTURE_NEUTRAL ) return false; else if ( m_TowerPoints[node].teamIndex == 2 ) changeCapturePoint( node, HS_CAPTURE_HORDE, 0 ); } else changeCapturePoint( node, HS_CAPTURE_ALLIANCE_CONT, 60000 ); } break; case HS_CAPTURE_ALLIANCE: { if( plr->GetTeam() == ALLIANCE ) return false; changeCapturePoint( node, HS_CAPTURE_HORDE_CONT, 60000 ); SendMessageToAll( "%s has claimed %s tower. If left uncontested Horde will control it in 60 seconds!", plr->GetName(), m_TowerPoints[node].name.c_str() ); } break; case HS_CAPTURE_HORDE: { if( plr->GetTeam() != ALLIANCE ) return false; changeCapturePoint( node, HS_CAPTURE_ALLIANCE_CONT, 60000 ); SendMessageToAll( "%s has claimed %s tower. If left uncontested Alliance will control it in 60 seconds!", plr->GetName(), m_TowerPoints[node].name.c_str() ); } break; } return false; } } */ } return true; }
bool OutdoorPvPHS::Update(uint32 diff) { bool changed = OutdoorPvP::Update(diff); // Resurrection System m_LastResurrectTime += diff; if (m_LastResurrectTime >= HS_RESURRECTION_INTERVAL) { //sLog->outString("HillsbradMGR : Reviving..."); if ( GetReviveQueueSize() ) { sLog->outString("HillsbradMGR : Dead players in queue."); for (std::map<uint64, std::vector<uint64> >::iterator itr = m_ReviveQueue.begin(); itr != m_ReviveQueue.end(); ++itr) { Creature* sh = NULL; for (std::vector<uint64>::const_iterator itr2 = (itr->second).begin(); itr2 != (itr->second).end(); ++itr2) { Player* plr = ObjectAccessor::FindPlayer(*itr2); if (!plr) continue; if (!sh && plr->IsInWorld()) { sh = plr->GetMap()->GetCreature(itr->first); // only for visual effect if (sh) // Spirit Heal, effect 117 sh->CastSpell(sh, HS_SPELL_SPIRIT_HEAL, true); } // Resurrection visual plr->CastSpell(plr, HS_SPELL_RESURRECTION_VISUAL, true); m_ResurrectQueue.push_back(*itr2); } (itr->second).clear(); } m_ReviveQueue.clear(); } // Reset last resurrection time m_LastResurrectTime = 0; } else if (m_LastResurrectTime > 500) // Resurrect players only half a second later { if ( GetResurrectQueueSize() ) { //sLog->outString("HillsbradMGR : Resurrecting..."); for (std::vector<uint64>::const_iterator itr = m_ResurrectQueue.begin(); itr != m_ResurrectQueue.end(); ++itr) { Player* plr = ObjectAccessor::FindPlayer(*itr); if (!plr) continue; plr->ResurrectPlayer(1.0f, false); plr->CastSpell(plr, 6962, true); plr->CastSpell(plr, HS_SPELL_SPIRIT_HEAL_MANA, true); sObjectAccessor->ConvertCorpseForPlayer(*itr); } m_ResurrectQueue.clear(); } } // Arena Chest System. // Update the timer. //if( m_ChestGUID == 0 ) //{ if( m_ChestTimer < diff ) { uint32 ffachest = 0; ffachest = urand(0, 9); if( uint32 guid = sObjectMgr->AddGOData(HSChestPoints[ffachest].entry, HSChestPoints[ffachest].map, HSChestPoints[ffachest].x, HSChestPoints[ffachest].y, HSChestPoints[ffachest].z, HSChestPoints[ffachest].o, 99999999999, 0, 0, 0, 0) ) { //sLog->outString( "Hillsbrad : Spawned Chest(%u) at location %u.", guid, ffachest); m_ChestGUID = guid; SendMessageToAll( "FFA chest has been spawned in the fields. Good luck!" ); sLog->outString( "Hillsbrad : Spawned Chest(%u) at location %u.", m_ChestGUID, ffachest); } m_ChestTimer = HS_FFA_CHEST_TIMER; } else { m_ChestTimer -= diff; // Announce when? if( m_ChestAnnounceTimer < diff ) { uint32 ChestTimerSec = uint32( m_ChestTimer / IN_MILLISECONDS ); if ( (ChestTimerSec < 3 && ChestTimerSec > 0) || (ChestTimerSec < 30 && (ChestTimerSec % 5) == 0) || // < 30 sec; every 5 sec (ChestTimerSec <=5*MINUTE && (ChestTimerSec % MINUTE) == 0) || // < 5 min ; every 1 min (ChestTimerSec <=30*MINUTE && (ChestTimerSec % (5*MINUTE)) == 0) ) // < 30 min; every 5 min { std::string str = secsToTimeString( ChestTimerSec ); SendMessageToAll( "FFA chest will spawn in %s.", str.c_str() ); } m_ChestAnnounceTimer = HS_FFA_CHEST_ANNOUNCE_TIMER; } else m_ChestAnnounceTimer -= diff; } //} // Chest debug. if( m_ChestTimer < diff ) { sLog->outString( "HillsbradMGR : Chest Guid (%u), Timer (%u), Announce Timer (%u).", m_ChestGUID, m_ChestTimer, m_ChestAnnounceTimer ); m_ChestDebugTimer = 60000; } else m_ChestDebugTimer -= diff; /* // Player scale checker. if( m_TenacityTimer <= diff ) { float ratio = 0; uint32 stack = 0; // Reset the stack count m_HordeBuff = 0; m_AllianceBuff = 0; if( m_HordeCount > 0 && m_AllianceCount > 0 ) { if( m_AllianceCount > m_HordeCount ) ratio = m_AllianceCount / m_HordeCount; else ratio = m_HordeCount / m_AllianceCount; } if( ratio >= 1.25f ) { // Buff for lower team stack = ratio * ratio; if( stack > 20 ) stack = 20; if( m_HordeCount < m_AllianceCount ) m_HordeBuff = stack; else m_AllianceBuff = stack; } // Apply the buff to players. ApplyZoneBalanceBuff(); m_TenacityTimer = HS_TENACITY_TIME; } else m_TenacityTimer -= diff; */ ApplyZoneBalanceBuff(); return changed; }
void BattleGroundEY::Update(time_t diff) { BattleGround::Update(diff); // after bg start we get there (once) if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize()) { ModifyStartDelayTime(diff); if(!(m_Events & 0x01)) { m_Events |= 0x01; // setup here, only when at least one player has ported to the map if(!SetupBattleGround()) { EndNow(); return; } SpawnBGObject(BG_EY_OBJECT_DOOR_A, RESPAWN_IMMEDIATELY); SpawnBGObject(BG_EY_OBJECT_DOOR_H, RESPAWN_IMMEDIATELY); // SpawnBGCreature(EY_SPIRIT_MAIN_ALLIANCE, RESPAWN_IMMEDIATELY); // SpawnBGCreature(EY_SPIRIT_MAIN_HORDE, RESPAWN_IMMEDIATELY); for(uint32 i = BG_EY_OBJECT_A_BANNER_FEL_REALVER_CENTER; i < BG_EY_OBJECT_MAX; ++i) SpawnBGObject(i, RESPAWN_ONE_DAY); SetStartDelayTime(START_DELAY0); } // After 1 minute, warning is signalled else if(GetStartDelayTime() <= START_DELAY1 && !(m_Events & 0x04)) { m_Events |= 0x04; SendMessageToAll(GetTrinityString(LANG_BG_EY_ONE_MINUTE)); } // After 1,5 minute, warning is signalled else if(GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x08)) { m_Events |= 0x08; SendMessageToAll(GetTrinityString(LANG_BG_EY_HALF_MINUTE)); } // After 2 minutes, gates OPEN ! x) else if(GetStartDelayTime() < 0 && !(m_Events & 0x10)) { m_Events |= 0x10; SpawnBGObject(BG_EY_OBJECT_DOOR_A, RESPAWN_ONE_DAY); SpawnBGObject(BG_EY_OBJECT_DOOR_H, RESPAWN_ONE_DAY); for(uint32 i = BG_EY_OBJECT_N_BANNER_FEL_REALVER_CENTER; i <= BG_EY_OBJECT_FLAG_NETHERSTORM; ++i) SpawnBGObject(i, RESPAWN_IMMEDIATELY); for(uint32 i = 0; i < EY_POINTS_MAX; ++i) { //randomly spawn buff uint8 buff = urand(0, 2); SpawnBGObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REALVER + buff + i * 3, RESPAWN_IMMEDIATELY); } SendMessageToAll(GetTrinityString(LANG_BG_EY_BEGIN)); PlaySoundToAll(SOUND_BG_START); if(sWorld.getConfig(CONFIG_BG_START_MUSIC)) PlaySoundToAll(SOUND_BG_START_L70ETC); //MUSIC SetStatus(STATUS_IN_PROGRESS); for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if(Player *plr = objmgr.GetPlayer(itr->first)) plr->RemoveAurasDueToSpell(SPELL_PREPARATION); } } else if(GetStatus() == STATUS_IN_PROGRESS) { m_PointAddingTimer -= diff; if(m_PointAddingTimer <= 0) { m_PointAddingTimer = BG_EY_FPOINTS_TICK_TIME; if (m_TeamPointsCount[BG_TEAM_ALLIANCE] > 0) AddPoints(ALLIANCE, BG_EY_TickPoints[m_TeamPointsCount[BG_TEAM_ALLIANCE] - 1]); if (m_TeamPointsCount[BG_TEAM_HORDE] > 0) AddPoints(HORDE, BG_EY_TickPoints[m_TeamPointsCount[BG_TEAM_HORDE] - 1]); } if(m_FlagState == BG_EY_FLAG_STATE_WAIT_RESPAWN || m_FlagState == BG_EY_FLAG_STATE_ON_GROUND) { m_FlagsTimer -= diff; if(m_FlagsTimer < 0) { m_FlagsTimer = 0; if (m_FlagState == BG_EY_FLAG_STATE_WAIT_RESPAWN) RespawnFlag(true); else RespawnFlagAfterDrop(); } } m_TowerCapCheckTimer -= diff; if(m_TowerCapCheckTimer <= 0) { //check if player joined point /*I used this order of calls, because although we will check if one player is in gameobject's distance 2 times but we can count of players on current point in CheckSomeoneLeftPoint */ this->CheckSomeoneJoinedPoint(); //check if player left point this->CheckSomeoneLeftPoint(); this->UpdatePointStatuses(); m_TowerCapCheckTimer = BG_EY_FPOINTS_TICK_TIME; } } }
void BattleGround::EndBattleGround(Team winner) { this->RemoveFromBGFreeSlotQueue(); uint32 loser_rating = 0; uint32 winner_rating = 0; WorldPacket data; int32 winmsg_id = 0; if (winner == ALLIANCE) { winmsg_id = LANG_BG_A_WINS; PlaySoundToAll(SOUND_ALLIANCE_WINS); // alliance wins sound } else if (winner == HORDE) { winmsg_id = LANG_BG_H_WINS; PlaySoundToAll(SOUND_HORDE_WINS); // horde wins sound } SetWinner(winner); SetStatus(STATUS_WAIT_LEAVE); // we must set it this way, because end time is sent in packet! m_EndTime = TIME_TO_AUTOREMOVE; for (BattleGroundPlayerMap::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) { Team team = itr->second.PlayerTeam; if (itr->second.OfflineRemoveTime) continue; Player* plr = sObjectMgr.GetPlayer(itr->first); if (!plr) { sLog.outError("BattleGround:EndBattleGround %s not found!", itr->first.GetString().c_str()); continue; } // should remove spirit of redemption if (plr->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) plr->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT); if (!plr->isAlive()) { plr->ResurrectPlayer(1.0f); plr->SpawnCorpseBones(); } else { // needed cause else in av some creatures will kill the players at the end plr->CombatStop(); plr->getHostileRefManager().deleteReferences(); } // this line is obsolete - team is set ALWAYS // if(!team) team = plr->GetTeam(); if (team == winner) { RewardMark(plr, ITEM_WINNER_COUNT); RewardQuestComplete(plr); } else RewardMark(plr, ITEM_LOSER_COUNT); plr->CombatStopWithPets(true); BlockMovement(plr); sBattleGroundMgr.BuildPvpLogDataPacket(&data, this); plr->GetSession()->SendPacket(&data); BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(GetTypeID()); sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, this, plr->GetBattleGroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime()); plr->GetSession()->SendPacket(&data); } if (winmsg_id) SendMessageToAll(winmsg_id, CHAT_MSG_BG_SYSTEM_NEUTRAL); }
void BattleGround::Update(uint32 diff) { if (!GetPlayersSize()) { // BG is empty // if there are no players invited, delete BG // this will delete arena or bg object, where any player entered // [[ but if you use battleground object again (more battles possible to be played on 1 instance) // then this condition should be removed and code: // if (!GetInvitedCount(HORDE) && !GetInvitedCount(ALLIANCE)) // this->AddToFreeBGObjectsQueue(); // not yet implemented // should be used instead of current // ]] // BattleGround Template instance cannot be updated, because it would be deleted if (!GetInvitedCount(HORDE) && !GetInvitedCount(ALLIANCE)) delete this; return; } // remove offline players from bg after 5 minutes if (!m_OfflineQueue.empty()) { BattleGroundPlayerMap::iterator itr = m_Players.find(*(m_OfflineQueue.begin())); if (itr != m_Players.end()) { if (itr->second.OfflineRemoveTime <= sWorld.GetGameTime()) { RemovePlayerAtLeave(itr->first, true, true);// remove player from BG m_OfflineQueue.pop_front(); // remove from offline queue // do not use itr for anything, because it is erased in RemovePlayerAtLeave() } } } /*********************************************************/ /*** BATTLEGROUND BALLANCE SYSTEM ***/ /*********************************************************/ // if less then minimum players are in on one side, then start premature finish timer if (GetStatus() == STATUS_IN_PROGRESS && sBattleGroundMgr.GetPrematureFinishTime() && (GetPlayersCountByTeam(ALLIANCE) < GetMinPlayersPerTeam() || GetPlayersCountByTeam(HORDE) < GetMinPlayersPerTeam())) { if (!m_PrematureCountDown) { m_PrematureCountDown = true; m_PrematureCountDownTimer = sBattleGroundMgr.GetPrematureFinishTime(); } else if (m_PrematureCountDownTimer < diff) { // time's up! Team winner = TEAM_NONE; if (GetPlayersCountByTeam(ALLIANCE) >= GetMinPlayersPerTeam()) winner = ALLIANCE; else if (GetPlayersCountByTeam(HORDE) >= GetMinPlayersPerTeam()) winner = HORDE; EndBattleGround(winner); m_PrematureCountDown = false; } else if (!sBattleGroundMgr.isTesting()) { uint32 newtime = m_PrematureCountDownTimer - diff; // announce every minute if (newtime > (MINUTE * IN_MILLISECONDS)) { if (newtime / (MINUTE * IN_MILLISECONDS) != m_PrematureCountDownTimer / (MINUTE * IN_MILLISECONDS)) PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING, CHAT_MSG_SYSTEM, NULL, (uint32)(m_PrematureCountDownTimer / (MINUTE * IN_MILLISECONDS))); } else { // announce every 15 seconds if (newtime / (15 * IN_MILLISECONDS) != m_PrematureCountDownTimer / (15 * IN_MILLISECONDS)) PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS, CHAT_MSG_SYSTEM, NULL, (uint32)(m_PrematureCountDownTimer / IN_MILLISECONDS)); } m_PrematureCountDownTimer = newtime; } } else if (m_PrematureCountDown) m_PrematureCountDown = false; /*********************************************************/ /*** BATTLEGROUND STARTING SYSTEM ***/ /*********************************************************/ if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize()) { ModifyStartDelayTime(diff); if (!(m_Events & BG_STARTING_EVENT_1)) { m_Events |= BG_STARTING_EVENT_1; // setup here, only when at least one player has ported to the map if (!SetupBattleGround()) { EndNow(); return; } StartingEventCloseDoors(); SetStartDelayTime(m_StartDelayTimes[BG_STARTING_EVENT_FIRST]); // first start warning - 2 or 1 minute, only if defined if (m_StartMessageIds[BG_STARTING_EVENT_FIRST]) SendMessageToAll(m_StartMessageIds[BG_STARTING_EVENT_FIRST], CHAT_MSG_BG_SYSTEM_NEUTRAL); } // After 1 minute or 30 seconds, warning is signalled else if (GetStartDelayTime() <= m_StartDelayTimes[BG_STARTING_EVENT_SECOND] && !(m_Events & BG_STARTING_EVENT_2)) { m_Events |= BG_STARTING_EVENT_2; SendMessageToAll(m_StartMessageIds[BG_STARTING_EVENT_SECOND], CHAT_MSG_BG_SYSTEM_NEUTRAL); } // After 30 or 15 seconds, warning is signalled else if (GetStartDelayTime() <= m_StartDelayTimes[BG_STARTING_EVENT_THIRD] && !(m_Events & BG_STARTING_EVENT_3)) { m_Events |= BG_STARTING_EVENT_3; SendMessageToAll(m_StartMessageIds[BG_STARTING_EVENT_THIRD], CHAT_MSG_BG_SYSTEM_NEUTRAL); } // delay expired (atfer 2 or 1 minute) else if (GetStartDelayTime() <= 0 && !(m_Events & BG_STARTING_EVENT_4)) { m_Events |= BG_STARTING_EVENT_4; StartingEventOpenDoors(); SendMessageToAll(m_StartMessageIds[BG_STARTING_EVENT_FOURTH], CHAT_MSG_BG_SYSTEM_NEUTRAL); SetStatus(STATUS_IN_PROGRESS); SetStartDelayTime(m_StartDelayTimes[BG_STARTING_EVENT_FOURTH]); { PlaySoundToAll(SOUND_BG_START); // Announce BG starting if (sWorld.getConfig(CONFIG_BOOL_BATTLEGROUND_QUEUE_ANNOUNCER_START)) { sWorld.SendWorldText(LANG_BG_STARTED_ANNOUNCE_WORLD, GetName(), GetMinLevel(), GetMaxLevel()); } } } } /*********************************************************/ /*** BATTLEGROUND ENDING SYSTEM ***/ /*********************************************************/ if (GetStatus() == STATUS_WAIT_LEAVE) { // remove all players from battleground after 2 minutes m_EndTime -= diff; if (m_EndTime <= 0) { m_EndTime = 0; BattleGroundPlayerMap::iterator itr, next; for (itr = m_Players.begin(); itr != m_Players.end(); itr = next) { next = itr; ++next; // itr is erased here! RemovePlayerAtLeave(itr->first, true, true);// remove player from BG // do not change any battleground's private variables } } } // update start time m_StartTime += diff; }
void BattlegroundSA::TitanRelicActivated(Player* clicker) { if (!clicker) return; if (GateStatus[BG_SA_ANCIENT_GATE] == BG_SA_GATE_DESTROYED && GateStatus[BG_SA_YELLOW_GATE] == BG_SA_GATE_DESTROYED && (GateStatus[BG_SA_PURPLE_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_RED_GATE] == BG_SA_GATE_DESTROYED) && (GateStatus[BG_SA_GREEN_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_BLUE_GATE] == BG_SA_GATE_DESTROYED)) { if (clicker->GetTeamId() == Attackers) { if (clicker->GetTeamId() == TEAM_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; RoundScores[0].time = TotalTime; // Achievement Storm the Beach (1310) for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { if (Player* player = ObjectAccessor::FindPlayer(itr->first)) if (player->GetTeamId() == Attackers) player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 65246); } Attackers = (Attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; Status = BG_SA_SECOND_WARMUP; TotalTime = 0; ToggleTimer(); if (Creature* c = GetBGCreature(BG_SA_NPC_KANRETHAD)) SendChatMessage(c, TEXT_ROUND_1_FINISHED); UpdateWaitTimer = 5000; SignaledRoundTwo = false; SignaledRoundTwoHalfMin = false; InitSecondRound = true; ResetObjs(); GetBgMap()->UpdateAreaDependentAuras(); CastSpellOnTeam(SPELL_END_OF_ROUND, ALLIANCE); CastSpellOnTeam(SPELL_END_OF_ROUND, HORDE); } else if (Status == BG_SA_ROUND_TWO) { RoundScores[1].winner = Attackers; RoundScores[1].time = TotalTime; ToggleTimer(); // Achievement Storm the Beach (1310) for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { if (Player* player = ObjectAccessor::FindPlayer(itr->first)) if (player->GetTeamId() == Attackers && RoundScores[1].winner == Attackers) player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 65246); } if (RoundScores[0].time == RoundScores[1].time) EndBattleground(0); else if (RoundScores[0].time < RoundScores[1].time) EndBattleground(RoundScores[0].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); else EndBattleground(RoundScores[1].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); } } } }
void BattleGroundSA::EventPlayerDamageGO(Player *player, GameObject* target_obj, uint32 eventId) { BattleGroundTeamIndex teamIndex = GetTeamIndexByTeamId(player->GetTeam()); uint32 type = NULL; switch (target_obj->GetEntry()) { case BG_SA_GO_GATES_ROOM_ANCIENT_SHRINE: { type = BG_SA_GO_GATES_T_ROOM_ANCIENT_SHRINE; switch (eventId) { case 21630: if (!GateRoomAncientShrineDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateRoomAncientShrineDamaged = true; } break; case 19836: // SendMessageSA(player, BG_SA_DAMAGE, _GatesName(target_obj)); SendWarningToAllSA(NULL, NULL, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19837: // SendMessageSA(player, BG_SA_DESTROY, _GatesName(target_obj)); SendWarningToAllSA(NULL, NULL, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(100, (teamIndex == 0) ? ALLIANCE:HORDE); RewardReputationToTeam((teamIndex == 0) ? 1050:1085, 75, (teamIndex == 0) ? ALLIANCE:HORDE); relicGateDestroyed = true; break; } break; } case BG_SA_GO_GATES_GREEN_EMERALD: { type = BG_SA_GO_GATES_T_GREEN_EMERALD; switch (eventId) { case 21630: if (!GateGreenEmeraldDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateGreenEmeraldDamaged = true; } break; case 19041: // SendMessageSA(player, BG_SA_DAMAGE, _GatesName(target_obj)); SendWarningToAllSA(NULL, NULL, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19046: // SendMessageSA(player, BG_SA_DESTROY, _GatesName(target_obj)); SendWarningToAllSA(NULL, NULL, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE:HORDE); RewardReputationToTeam((teamIndex == 0) ? 1050:1085, 65, (teamIndex == 0) ? ALLIANCE:HORDE); break; } break; } case BG_SA_GO_GATES_BLUE_SAPHIRE: { type = BG_SA_GO_GATES_T_BLUE_SAPHIRE; switch (eventId) { case 21630: if (!GateBlueSaphireDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateBlueSaphireDamaged = true; } break; case 19040: // SendMessageSA(player, BG_SA_DAMAGE, _GatesName(target_obj)); SendWarningToAllSA(NULL, NULL, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19045: // SendMessageSA(player, BG_SA_DESTROY, _GatesName(target_obj)); SendWarningToAllSA(NULL, NULL, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE:HORDE); RewardReputationToTeam((teamIndex == 0) ? 1050:1085, 65, (teamIndex == 0) ? ALLIANCE:HORDE); break; } break; } case BG_SA_GO_GATES_MAUVE_AMETHYST: { type = BG_SA_GO_GATES_T_MAUVE_AMETHYST; switch (eventId) { case 21630: if (!GateMauveAmethystDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateMauveAmethystDamaged = true; } break; case 19043: // SendMessageSA(player, BG_SA_DAMAGE, _GatesName(target_obj)); SendWarningToAllSA(NULL, NULL, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19048: // SendMessageSA(player, BG_SA_DESTROY, _GatesName(target_obj)); SendWarningToAllSA(NULL, NULL, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE:HORDE); RewardReputationToTeam((teamIndex == 0) ? 1050:1085, 65, (teamIndex == 0) ? ALLIANCE:HORDE); break; } break; } case BG_SA_GO_GATES_RED_SUN: { type = BG_SA_GO_GATES_T_RED_SUN; switch (eventId) { case 21630: if (!GateRedSunDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateRedSunDamaged = true; } break; case 19042: // SendMessageSA(player, BG_SA_DAMAGE, _GatesName(target_obj)); SendWarningToAllSA(NULL, NULL, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19047: // SendMessageSA(player, BG_SA_DESTROY, _GatesName(target_obj)); SendWarningToAllSA(NULL, NULL, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE:HORDE); RewardReputationToTeam((teamIndex == 0) ? 1050:1085, 65, (teamIndex == 0) ? ALLIANCE:HORDE); break; } break; } case BG_SA_GO_GATES_YELLOW_MOON: { type = BG_SA_GO_GATES_T_YELLOW_MOON; switch (eventId) { case 21630: if (!GateYellowMoonDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateYellowMoonDamaged = true; } break; case 19044: // SendMessageSA(player, BG_SA_DAMAGE, _GatesName(target_obj)); SendWarningToAllSA(NULL, NULL, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19049: // SendMessageSA(player, BG_SA_DESTROY, _GatesName(target_obj)); SendWarningToAllSA(NULL, NULL, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE:HORDE); RewardReputationToTeam((teamIndex == 0) ? 1050:1085, 65, (teamIndex == 0) ? ALLIANCE:HORDE); break; } break; } case BG_SA_GO_TITAN_RELIC: { if (eventId == 22097 && player->GetTeam() != GetDefender()) { if(!relicGateDestroyed) { player->GetSession()->KickPlayer(); sLog.outError("Player %s has clicked SOTA Relic without Relic gate being destroyed", player->GetName()); return; } if(Phase == SA_ROUND_ONE) // Victory at first round { RoundScores[0].winner = GetDefender() == ALLIANCE ? HORDE : ALLIANCE; RoundScores[0].time = Round_timer; PlaySoundToAll(BG_SA_SOUND_GYD_VICTORY); SendMessageToAll(defender == HORDE ? LANG_BG_SA_ALLIANCE_END_1ROUND : LANG_BG_SA_HORDE_END_1ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); RewardHonorToTeam(150, (teamIndex == 0) ? ALLIANCE:HORDE); RewardReputationToTeam((teamIndex == 0) ? 1050:1085, 100, (teamIndex == 0) ? ALLIANCE:HORDE); player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 65246); // Storm the Beach in first round ResetBattle(player->GetTeam(), GetDefender()); } else // Victory at second round { RoundScores[1].winner = GetDefender() == ALLIANCE ? HORDE : ALLIANCE; RoundScores[1].time = Round_timer; SendMessageToAll(defender == HORDE ? LANG_BG_SA_ALLIANCE_END_2ROUND : LANG_BG_SA_HORDE_END_2ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); RewardHonorToTeam(150, (teamIndex == 0) ? ALLIANCE:HORDE); RewardReputationToTeam((teamIndex == 0) ? 1050:1085, 100, (teamIndex == 0) ? ALLIANCE:HORDE); player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 65246); BattleGroundSA::EndBattleGround(player->GetTeam()); } } break; } } }
void BattleGroundAB::Update(uint32 diff) { BattleGround::Update(diff); if (GetStatus() == STATUS_IN_PROGRESS) { int team_points[BG_TEAMS_COUNT] = { 0, 0 }; for (int node = 0; node < BG_AB_NODES_MAX; ++node) { // 3 sec delay to spawn new banner instead previous despawned one if (m_BannerTimers[node].timer) { if (m_BannerTimers[node].timer > diff) m_BannerTimers[node].timer -= diff; else { m_BannerTimers[node].timer = 0; _CreateBanner(node, m_BannerTimers[node].type, m_BannerTimers[node].teamIndex, false); } } // 1-minute to occupy a node from contested state if (m_NodeTimers[node]) { if (m_NodeTimers[node] > diff) m_NodeTimers[node] -= diff; else { m_NodeTimers[node] = 0; // Change from contested to occupied ! uint8 teamIndex = m_Nodes[node]-1; m_prevNodes[node] = m_Nodes[node]; m_Nodes[node] += 2; // create new occupied banner _CreateBanner(node, BG_AB_NODE_TYPE_OCCUPIED, teamIndex, true); _SendNodeUpdate(node); _NodeOccupied(node,(teamIndex == 0) ? ALLIANCE:HORDE); // Message to chatlog if (teamIndex == 0) { SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_ALLIANCE,NULL,LANG_BG_ALLY,_GetNodeNameId(node)); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_ALLIANCE); } else { SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_HORDE,NULL,LANG_BG_HORDE,_GetNodeNameId(node)); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_HORDE); } } } for (int team = 0; team < BG_TEAMS_COUNT; ++team) if (m_Nodes[node] == team + BG_AB_NODE_TYPE_OCCUPIED) ++team_points[team]; } // Accumulate points for (int team = 0; team < BG_TEAMS_COUNT; ++team) { int points = team_points[team]; if (!points) continue; m_lastTick[team] += diff; if (m_lastTick[team] > BG_AB_TickIntervals[points]) { m_lastTick[team] -= BG_AB_TickIntervals[points]; m_TeamScores[team] += BG_AB_TickPoints[points]; m_HonorScoreTics[team] += BG_AB_TickPoints[points]; m_ReputationScoreTics[team] += BG_AB_TickPoints[points]; if (m_ReputationScoreTics[team] >= m_ReputationTics) { (team == BG_TEAM_ALLIANCE) ? RewardReputationToTeam(509, 10, ALLIANCE) : RewardReputationToTeam(510, 10, HORDE); m_ReputationScoreTics[team] -= m_ReputationTics; } if (m_HonorScoreTics[team] >= m_HonorTics) { RewardHonorToTeam(GetBonusHonorFromKill(1), (team == BG_TEAM_ALLIANCE) ? ALLIANCE : HORDE); m_HonorScoreTics[team] -= m_HonorTics; } if (!m_IsInformedNearVictory && m_TeamScores[team] > BG_AB_WARNING_NEAR_VICTORY_SCORE) { if (team == BG_TEAM_ALLIANCE) SendMessageToAll(LANG_BG_AB_A_NEAR_VICTORY, CHAT_MSG_BG_SYSTEM_NEUTRAL); else SendMessageToAll(LANG_BG_AB_H_NEAR_VICTORY, CHAT_MSG_BG_SYSTEM_NEUTRAL); PlaySoundToAll(BG_AB_SOUND_NEAR_VICTORY); m_IsInformedNearVictory = true; } if (m_TeamScores[team] > BG_AB_MAX_TEAM_SCORE) m_TeamScores[team] = BG_AB_MAX_TEAM_SCORE; if (team == BG_TEAM_ALLIANCE) UpdateWorldState(BG_AB_OP_RESOURCES_ALLY, m_TeamScores[team]); if (team == BG_TEAM_HORDE) UpdateWorldState(BG_AB_OP_RESOURCES_HORDE, m_TeamScores[team]); // update achievement flags // we increased m_TeamScores[team] so we just need to check if it is 500 more than other teams resources // horde will be a bit disadvantaged, but we can assume that points aren't updated for both team in same Update() call uint8 otherTeam = (team + 1) % BG_TEAMS_COUNT; if (m_TeamScores[team] > m_TeamScores[otherTeam] + 500) m_TeamScores500Disadvantage[otherTeam] = true; } } // Test win condition if (m_TeamScores[BG_TEAM_ALLIANCE] >= BG_AB_MAX_TEAM_SCORE) EndBattleGround(ALLIANCE); if (m_TeamScores[BG_TEAM_HORDE] >= BG_AB_MAX_TEAM_SCORE) EndBattleGround(HORDE); } }
void BattleGroundSA::Update(uint32 diff) { BattleGround::Update(diff); if (GetStatus() == STATUS_WAIT_JOIN && !shipsStarted) if (Phase == SA_ROUND_ONE) // Round one not started yet { if (shipsTimer <= diff) StartShips(); else shipsTimer -= diff; } if (GetStatus() == STATUS_IN_PROGRESS) // Battleground already in progress { if (Round_timer >= BG_SA_ROUNDLENGTH) { if (Phase == SA_ROUND_ONE) // Timeout of first round { PlaySoundToAll(BG_SA_SOUND_GYD_VICTORY); SendMessageToAll(defender == ALLIANCE ? LANG_BG_SA_ALLIANCE_TIMEOUT_END_1ROUND : LANG_BG_SA_HORDE_TIMEOUT_END_1ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); SendWarningToAll(LANG_BG_SA_END_1ROUND); RoundScores[0].winner = GetDefender(); RoundScores[0].time = BG_SA_ROUNDLENGTH; for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player* plr = sObjectMgr.GetPlayer(itr->first); if (plr) plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, BG_SA_END_OF_ROUND); } ResetBattle(0, defender); } else // Timeout of second round { SendMessageToAll(defender == ALLIANCE ? LANG_BG_SA_ALLIANCE_TIMEOUT_END_2ROUND : LANG_BG_SA_HORDE_TIMEOUT_END_2ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); RoundScores[1].winner = GetDefender(); for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player* plr = sObjectMgr.GetPlayer(itr->first); if (plr) plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, BG_SA_END_OF_ROUND); } if (RoundScores[0].winner == GetDefender()) EndBattleGround(GetDefender()); else EndBattleGround(TEAM_NONE); return; } } else Round_timer += diff; for (int gyd = 0; gyd < BG_SA_GRY_MAX; ++gyd) { // 3 sec delay to spawn new banner instead previous despawned one if (m_BannerTimers[gyd].timer) { if (m_BannerTimers[gyd].timer > diff) m_BannerTimers[gyd].timer -= diff; else { m_BannerTimers[gyd].timer = 0; _CreateBanner(gyd, m_BannerTimers[gyd].type, m_BannerTimers[gyd].teamIndex, false); } } } UpdateTimer(); } if (GetStatus() == STATUS_WAIT_JOIN && Phase == SA_ROUND_TWO) // Round two, not yet started { if (!shipsStarted) { if (shipsTimer <= diff) { SendMessageToAll(LANG_BG_SA_START_ONE_MINUTE, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); StartShips(); } else shipsTimer -= diff; } if (TimeST2Round < diff) { Phase = SA_ROUND_TWO; SpawnEvent(SA_EVENT_ADD_NPC, 0, true); SpawnEvent(SA_EVENT_ADD_BOMB_B, (GetDefender() == ALLIANCE ? BG_SA_GRAVE_STATUS_HORDE_OCCUPIED : BG_SA_GRAVE_STATUS_ALLY_OCCUPIED), true); ToggleTimer(); SetStatus(STATUS_IN_PROGRESS); // Start round two PlaySoundToAll(SOUND_BG_START); SendWarningToAll(LANG_BG_SA_HAS_BEGUN); StartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, BG_SA_EVENT_START_BATTLE_2); for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player* plr = sObjectMgr.GetPlayer(itr->first); if (plr) plr->RemoveAurasDueToSpell(SPELL_PREPARATION); } } else TimeST2Round -= diff; } }
void BattleGroundWS::EventPlayerDroppedFlag(Player* source) { if (GetStatus() != STATUS_IN_PROGRESS) { // if not running, do not cast things at the dropper player (prevent spawning the "dropped" flag), neither send unnecessary messages // just take off the aura if (source->GetTeam() == ALLIANCE) { if (!IsHordeFlagPickedUp()) return; if (GetHordeFlagCarrierGuid() == source->GetObjectGuid()) { ClearHordeFlagCarrier(); source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG); } } else { if (!IsAllianceFlagPickedUp()) return; if (GetAllianceFlagCarrierGuid() == source->GetObjectGuid()) { ClearAllianceFlagCarrier(); source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG); } } return; } bool set = false; if (source->GetTeam() == ALLIANCE) { if (!IsHordeFlagPickedUp()) return; if (GetHordeFlagCarrierGuid() == source->GetObjectGuid()) { ClearHordeFlagCarrier(); source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG); m_FlagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_ON_GROUND; source->CastSpell(source, BG_WS_SPELL_WARSONG_FLAG_DROPPED, true); set = true; } } else { if (!IsAllianceFlagPickedUp()) return; if (GetAllianceFlagCarrierGuid() == source->GetObjectGuid()) { ClearAllianceFlagCarrier(); source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG); m_FlagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_GROUND; source->CastSpell(source, BG_WS_SPELL_SILVERWING_FLAG_DROPPED, true); set = true; } } if (set) { source->CastSpell(source, SPELL_RECENTLY_DROPPED_FLAG, true); UpdateFlagState(source->GetTeam(), 1); if (source->GetTeam() == ALLIANCE) { SendMessageToAll(LANG_BG_WS_DROPPED_HF, CHAT_MSG_BG_SYSTEM_HORDE, source); UpdateWorldState(BG_WS_FLAG_UNK_HORDE, uint32(-1)); } else { SendMessageToAll(LANG_BG_WS_DROPPED_AF, CHAT_MSG_BG_SYSTEM_ALLIANCE, source); UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, uint32(-1)); } m_FlagsDropTimer[GetOtherTeamIndex(GetTeamIndexByTeamId(source->GetTeam()))] = BG_WS_FLAG_DROP_TIME; } }
void BattleGroundSA::EventPlayerDamageGO(Player *player, GameObject* target_obj, uint32 eventId, uint32 doneBy) { TeamIndex teamIndex = GetTeamIndex(player->GetTeam()); // Seaforium Charge Explosion if (doneBy == 52408) player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, BG_SA_PLANT_SEAFORIUM_CHARGE); BG_SA_GoType type = BG_SA_GO_GATES_T_NONE; switch (target_obj->GetEntry()) { case BG_SA_GO_GATES_ROOM_ANCIENT_SHRINE: { type = BG_SA_GO_GATES_T_ROOM_ANCIENT_SHRINE; switch (eventId) { case 21630: if (!GateRoomAncientShrineDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateRoomAncientShrineDamaged = true; } break; case 19836: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], (GetDefender() == HORDE) ? 5 : 2); GateStatus[type] = BG_SA_GO_GATES_DAMAGE; break; case 19837: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], (GetDefender() == HORDE) ? 6 : 3); GateStatus[type] = BG_SA_GO_GATES_DESTROY; UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(100, (teamIndex == 0) ? ALLIANCE : HORDE); MakeInteractive(SA_EVENT_ADD_RELIC, (GetDefender() == ALLIANCE) ? 2 : 1, true); relicGateDestroyed = true; break; } break; } case BG_SA_GO_GATES_GREEN_EMERALD: { type = BG_SA_GO_GATES_T_GREEN_EMERALD; switch (eventId) { case 21630: if (!GateGreenEmeraldDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateGreenEmeraldDamaged = true; } break; case 19041: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19046: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE : HORDE); // make western/eastern graveyard capturable for (int i = SA_EVENT_ADD_GRAVE_E; i <= SA_EVENT_ADD_GRAVE_W; i++) MakeInteractive(i, (GetDefender() == ALLIANCE) ? BG_SA_GRAVE_STATUS_ALLY_CONTESTED : BG_SA_GRAVE_STATUS_HORDE_CONTESTED, true); SpawnEvent(SA_EVENT_ADD_GREEN_SIGIL, 0, false); break; } break; } case BG_SA_GO_GATES_BLUE_SAPHIRE: { type = BG_SA_GO_GATES_T_BLUE_SAPHIRE; switch (eventId) { case 21630: if (!GateBlueSaphireDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateBlueSaphireDamaged = true; } break; case 19040: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19045: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE : HORDE); // make western/eastern graveyard capturable for (int i = SA_EVENT_ADD_GRAVE_E; i <= SA_EVENT_ADD_GRAVE_W; i++) MakeInteractive(i, (GetDefender() == ALLIANCE) ? BG_SA_GRAVE_STATUS_ALLY_CONTESTED : BG_SA_GRAVE_STATUS_HORDE_CONTESTED, true); SpawnEvent(SA_EVENT_ADD_BLUE_SIGIL, 0, false); break; } break; } case BG_SA_GO_GATES_MAUVE_AMETHYST: { type = BG_SA_GO_GATES_T_MAUVE_AMETHYST; switch (eventId) { case 21630: if (!GateMauveAmethystDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateMauveAmethystDamaged = true; } break; case 19043: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19048: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE : HORDE); // make the central graveyard capturable MakeInteractive(SA_EVENT_ADD_GRAVE_C, (GetDefender() == ALLIANCE) ? BG_SA_GRAVE_STATUS_ALLY_CONTESTED : BG_SA_GRAVE_STATUS_HORDE_CONTESTED, true); SpawnEvent(SA_EVENT_ADD_PURPLE_SIGIL, 0, false); break; } break; } case BG_SA_GO_GATES_RED_SUN: { type = BG_SA_GO_GATES_T_RED_SUN; switch (eventId) { case 21630: if (!GateRedSunDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateRedSunDamaged = true; } break; case 19042: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19047: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE : HORDE); // make the central graveyard capturable MakeInteractive(SA_EVENT_ADD_GRAVE_C, (GetDefender() == ALLIANCE) ? BG_SA_GRAVE_STATUS_ALLY_CONTESTED : BG_SA_GRAVE_STATUS_HORDE_CONTESTED, true); SpawnEvent(SA_EVENT_ADD_RED_SIGIL, 0, false); break; } break; } case BG_SA_GO_GATES_YELLOW_MOON: { type = BG_SA_GO_GATES_T_YELLOW_MOON; switch (eventId) { case 21630: if (!GateYellowMoonDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateYellowMoonDamaged = true; } break; case 19044: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19049: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE : HORDE); SpawnEvent(SA_EVENT_ADD_YELLOW_SIGIL, 0, false); break; } break; } case BG_SA_GO_TITAN_RELIC_A: case BG_SA_GO_TITAN_RELIC_H: { if (eventId == 20572 && player->GetTeam() != GetDefender()) { if (!relicGateDestroyed) { player->GetSession()->KickPlayer(); sLog.outError("Player %s has clicked SOTA Relic without Relic gate being destroyed", player->GetName()); return; } //Achievement Storm the Beach (1310) for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player* plr = sObjectMgr.GetPlayer(itr->first); if (plr) { if (plr->GetTeam() != defender) plr->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, BG_SA_STORM_THE_BEACH); } } if (Phase == SA_ROUND_ONE) // Victory at first round { RoundScores[0].winner = GetDefender() == ALLIANCE ? HORDE : ALLIANCE; RoundScores[0].time = Round_timer; PlaySoundToAll(BG_SA_SOUND_GYD_VICTORY); SendMessageToAll(defender == HORDE ? LANG_BG_SA_ALLIANCE_END_1ROUND : LANG_BG_SA_HORDE_END_1ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); SendWarningToAll(LANG_BG_SA_END_1ROUND); RewardHonorToTeam(150, (teamIndex == 0) ? ALLIANCE : HORDE); ResetBattle(player->GetTeam(), GetDefender()); } else // Victory at second round { RoundScores[1].winner = GetDefender() == ALLIANCE ? HORDE : ALLIANCE; SendMessageToAll(defender == HORDE ? LANG_BG_SA_ALLIANCE_END_2ROUND : LANG_BG_SA_HORDE_END_2ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); RewardHonorToTeam(150, (teamIndex == 0) ? ALLIANCE : HORDE); EndBattleGround(player->GetTeam()); } } break; } } }
void BattleGroundWS::Update(uint32 diff) { BattleGround::Update(diff); // after bg start we get there (once) if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize()) { ModifyStartDelayTime(diff); if (!(m_Events & 0x01)) { m_Events |= 0x01; // setup here, only when at least one player has ported to the map if (!SetupBattleGround()) { EndNow(); return; } SetStartDelayTime(START_DELAY0); } // After 1 minute, warning is signalled else if (GetStartDelayTime() <= START_DELAY1 && !(m_Events & 0x04)) { m_Events |= 0x04; SendMessageToAll(GetMangosString(LANG_BG_WS_ONE_MINUTE)); } // After 1,5 minute, warning is signalled else if (GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x08)) { m_Events |= 0x08; SendMessageToAll(GetMangosString(LANG_BG_WS_HALF_MINUTE)); } // After 2 minutes, gates OPEN ! x) else if (GetStartDelayTime() < 0 && !(m_Events & 0x10)) { m_Events |= 0x10; // TODO implement timer to despawn doors after a short while OpenDoorEvent(BG_EVENT_DOOR); SpawnEvent(WS_EVENT_SPIRITGUIDES_SPAWN, 0, true); SpawnEvent(WS_EVENT_FLAG_A, 0, true); SpawnEvent(WS_EVENT_FLAG_H, 0, true); SendMessageToAll(GetMangosString(LANG_BG_WS_BEGIN)); PlaySoundToAll(SOUND_BG_START); SetStatus(STATUS_IN_PROGRESS); for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if (Player* plr = sObjectMgr.GetPlayer(itr->first)) plr->RemoveAurasDueToSpell(SPELL_PREPARATION); } } else if (GetStatus() == STATUS_IN_PROGRESS) { if (m_FlagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_WAIT_RESPAWN) { m_FlagsTimer[BG_TEAM_ALLIANCE] -= diff; if (m_FlagsTimer[BG_TEAM_ALLIANCE] < 0) { m_FlagsTimer[BG_TEAM_ALLIANCE] = 0; RespawnFlag(ALLIANCE, true); } } if (m_FlagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_ON_GROUND) { m_FlagsDropTimer[BG_TEAM_ALLIANCE] -= diff; if (m_FlagsDropTimer[BG_TEAM_ALLIANCE] < 0) { m_FlagsDropTimer[BG_TEAM_ALLIANCE] = 0; RespawnFlagAfterDrop(ALLIANCE); } } if (m_FlagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_WAIT_RESPAWN) { m_FlagsTimer[BG_TEAM_HORDE] -= diff; if (m_FlagsTimer[BG_TEAM_HORDE] < 0) { m_FlagsTimer[BG_TEAM_HORDE] = 0; RespawnFlag(HORDE, true); } } if (m_FlagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_ON_GROUND) { m_FlagsDropTimer[BG_TEAM_HORDE] -= diff; if (m_FlagsDropTimer[BG_TEAM_HORDE] < 0) { m_FlagsDropTimer[BG_TEAM_HORDE] = 0; RespawnFlagAfterDrop(HORDE); } } } }
void BattleGroundWS::Update(uint32 diff) { BattleGround::Update(diff); if (sBattleGroundMgr.IsWSGEndAfterEnabled()) { if (m_TimeElapsedSinceBeggining > sBattleGroundMgr.GetWSGEndAfterTime() && GetStatus() == STATUS_IN_PROGRESS) { if (!sBattleGroundMgr.IsWSGEndAfterAlwaysDraw()) { if(GetTeamScore(HORDE) > GetTeamScore(ALLIANCE)) { EndBattleGround(HORDE); return; } else if (GetTeamScore(HORDE) < GetTeamScore(ALLIANCE)) { EndBattleGround(ALLIANCE); return; } } EndBattleGround(0); return; } if(m_TimeElapsedSinceBeggining> sBattleGroundMgr.GetWSGEndAfterTime()/2 && m_TimeElapsedSinceBeggining/180000 > (m_TimeElapsedSinceBeggining - diff)/180000) //warning every 3 mins PrepareMessageToAll("This battleground will end in %u min.", (sBattleGroundMgr.GetWSGEndAfterTime() - m_TimeElapsedSinceBeggining) /60000); } // after bg start we get there (once) if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize()) { ModifyStartDelayTime(diff); if (!(m_Events & 0x01)) { m_Events |= 0x01; // setup here, only when at least one player has ported to the map if (!SetupBattleGround()) { EndNow(); return; } // for (uint32 i = WS_SPIRIT_MAIN_ALLIANCE; i <= WS_SPIRIT_MAIN_HORDE; i++) // SpawnBGCreature(i, RESPAWN_IMMEDIATELY); for (uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_H_4; i++) { SpawnBGObject(i, RESPAWN_IMMEDIATELY); DoorClose(i); } for (uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; i++) SpawnBGObject(i, RESPAWN_ONE_DAY); SetStartDelayTime(START_DELAY0); } // After 1 minute, warning is signalled else if (GetStartDelayTime() <= START_DELAY1 && !(m_Events & 0x04)) { m_Events |= 0x04; SendMessageToAll(GetHellgroundString(LANG_BG_WS_ONE_MINUTE)); } // After 1,5 minute, warning is signalled else if (GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x08)) { m_Events |= 0x08; SendMessageToAll(GetHellgroundString(LANG_BG_WS_HALF_MINUTE)); } // After 2 minutes, gates OPEN ! x) else if (GetStartDelayTime() < 0 && !(m_Events & 0x10)) { m_Events |= 0x10; for (uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_A_4; i++) DoorOpen(i); for (uint32 i = BG_WS_OBJECT_DOOR_H_1; i <= BG_WS_OBJECT_DOOR_H_2; i++) DoorOpen(i); SpawnBGObject(BG_WS_OBJECT_DOOR_A_5, RESPAWN_ONE_DAY); SpawnBGObject(BG_WS_OBJECT_DOOR_A_6, RESPAWN_ONE_DAY); SpawnBGObject(BG_WS_OBJECT_DOOR_H_3, RESPAWN_ONE_DAY); SpawnBGObject(BG_WS_OBJECT_DOOR_H_4, RESPAWN_ONE_DAY); for (uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; i++) SpawnBGObject(i, RESPAWN_IMMEDIATELY); SendMessageToAll(GetHellgroundString(LANG_BG_WS_BEGIN)); PlaySoundToAll(SOUND_BG_START); if (sWorld.getConfig(CONFIG_BG_START_MUSIC)) PlaySoundToAll(SOUND_BG_START_L70ETC); //MUSIC - Custom config SetStatus(STATUS_IN_PROGRESS); for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if (Player* plr = sObjectMgr.GetPlayer(itr->first)) plr->RemoveAurasDueToSpell(SPELL_PREPARATION); } } else if (GetStatus() == STATUS_IN_PROGRESS) { if (m_FlagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_WAIT_RESPAWN) { m_FlagsTimer[BG_TEAM_ALLIANCE] -= diff; if (m_FlagsTimer[BG_TEAM_ALLIANCE] < 0) { m_FlagsTimer[BG_TEAM_ALLIANCE] = 0; RespawnFlag(ALLIANCE, true); } } if (m_FlagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_ON_GROUND) { m_FlagsDropTimer[BG_TEAM_ALLIANCE] -= diff; if (m_FlagsDropTimer[BG_TEAM_ALLIANCE] < 0) { m_FlagsDropTimer[BG_TEAM_ALLIANCE] = 0; RespawnFlagAfterDrop(ALLIANCE); m_BothFlagsKept = false; } } if (m_FlagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_WAIT_RESPAWN) { m_FlagsTimer[BG_TEAM_HORDE] -= diff; if (m_FlagsTimer[BG_TEAM_HORDE] < 0) { m_FlagsTimer[BG_TEAM_HORDE] = 0; RespawnFlag(HORDE, true); } } if (m_FlagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_ON_GROUND) { m_FlagsDropTimer[BG_TEAM_HORDE] -= diff; if (m_FlagsDropTimer[BG_TEAM_HORDE] < 0) { m_FlagsDropTimer[BG_TEAM_HORDE] = 0; RespawnFlagAfterDrop(HORDE); m_BothFlagsKept = false; } } if (m_BothFlagsKept) { m_FlagSpellForceTimer += diff; if (m_FlagDebuffState == 0 && m_FlagSpellForceTimer >= 600000) //10 minutes { if (Player * plr = sObjectMgr.GetPlayer(m_FlagKeepers[0])) plr->CastSpell(plr,WS_SPELL_FOCUSED_ASSAULT,true); if (Player * plr = sObjectMgr.GetPlayer(m_FlagKeepers[1])) plr->CastSpell(plr,WS_SPELL_FOCUSED_ASSAULT,true); m_FlagDebuffState = 1; } else if (m_FlagDebuffState == 1 && m_FlagSpellForceTimer >= 900000) //15 minutes { if (Player * plr = sObjectMgr.GetPlayer(m_FlagKeepers[0])) { plr->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT); plr->CastSpell(plr,WS_SPELL_BRUTAL_ASSAULT,true); } if (Player * plr = sObjectMgr.GetPlayer(m_FlagKeepers[1])) { plr->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT); plr->CastSpell(plr,WS_SPELL_BRUTAL_ASSAULT,true); } m_FlagDebuffState = 2; } } else { m_FlagSpellForceTimer = 0; //reset timer. m_FlagDebuffState = 0; } } }
void BattleGroundAB::Update(uint32 diff) { BattleGround::Update(diff); if (GetStatus() == STATUS_IN_PROGRESS) { int team_points[BG_TEAMS_COUNT] = { 0, 0 }; for (int node = 0; node < BG_AB_NODES_MAX; ++node) { // 3 sec delay to spawn new banner instead previous despawned one if (m_BannerTimers[node].timer) { if (m_BannerTimers[node].timer > diff) m_BannerTimers[node].timer -= diff; else { m_BannerTimers[node].timer = 0; _CreateBanner(node, m_BannerTimers[node].type, m_BannerTimers[node].teamIndex, false); } } // 1-minute to occupy a node from contested state if (m_NodeTimers[node]) { if (m_NodeTimers[node] > diff) m_NodeTimers[node] -= diff; else { m_NodeTimers[node] = 0; // Change from contested to occupied ! uint8 teamIndex = m_Nodes[node] - 1; m_prevNodes[node] = m_Nodes[node]; m_Nodes[node] += 2; // burn current contested banner _DelBanner(node, BG_AB_NODE_TYPE_CONTESTED, teamIndex); // create new occupied banner _CreateBanner(node, BG_AB_NODE_TYPE_OCCUPIED, teamIndex, true); _SendNodeUpdate(node); _NodeOccupied(node, (teamIndex == 0) ? ALLIANCE : HORDE); // Message to chatlog if (teamIndex == 0) { SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, LANG_BG_AB_ALLY, _GetNodeNameId(node)); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_ALLIANCE); } else { SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_HORDE, NULL, LANG_BG_AB_HORDE, _GetNodeNameId(node)); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_HORDE); } } } for (int team = 0; team < BG_TEAMS_COUNT; ++team) if (m_Nodes[node] == team + BG_AB_NODE_TYPE_OCCUPIED) ++team_points[team]; } // Accumulate points for (int team = 0; team < BG_TEAMS_COUNT; ++team) { int points = team_points[team]; if (!points) continue; m_lastTick[team] += diff; if (m_lastTick[team] > BG_AB_TickIntervals[points]) { m_lastTick[team] -= BG_AB_TickIntervals[points]; m_TeamScores[team] += BG_AB_TickPoints[points]; m_score[team] = m_TeamScores[team]; m_HonorScoreTics[team] += BG_AB_TickPoints[points]; m_ReputationScoreTics[team] += BG_AB_TickPoints[points]; if (m_ReputationScoreTics[team] >= BG_AB_ReputationScoreTicks[m_HonorMode]) { (team == BG_TEAM_ALLIANCE) ? RewardReputationToTeam(509, 10, ALLIANCE) : RewardReputationToTeam(510, 10, HORDE); m_ReputationScoreTics[team] -= BG_AB_ReputationScoreTicks[m_HonorMode]; } if (m_HonorScoreTics[team] >= BG_AB_HonorScoreTicks[m_HonorMode]) { (team == BG_TEAM_ALLIANCE) ? RewardHonorToTeam(20, ALLIANCE) : RewardHonorToTeam(20, HORDE); m_HonorScoreTics[team] -= BG_AB_HonorScoreTicks[m_HonorMode]; } if (!m_IsInformedNearVictory && m_TeamScores[team] > BG_AB_WARNING_NEAR_VICTORY_SCORE) { if (team == BG_TEAM_ALLIANCE) SendMessageToAll(LANG_BG_AB_A_NEAR_VICTORY, CHAT_MSG_BG_SYSTEM_NEUTRAL); else SendMessageToAll(LANG_BG_AB_H_NEAR_VICTORY, CHAT_MSG_BG_SYSTEM_NEUTRAL); PlaySoundToAll(BG_AB_SOUND_NEAR_VICTORY); m_IsInformedNearVictory = true; } if (m_TeamScores[team] > BG_AB_MAX_TEAM_SCORE) m_TeamScores[team] = BG_AB_MAX_TEAM_SCORE; if (team == BG_TEAM_ALLIANCE) UpdateWorldState(BG_AB_OP_RESOURCES_ALLY, m_TeamScores[team]); if (team == BG_TEAM_HORDE) UpdateWorldState(BG_AB_OP_RESOURCES_HORDE, m_TeamScores[team]); } } // Test win condition if (m_TeamScores[BG_TEAM_ALLIANCE] >= BG_AB_MAX_TEAM_SCORE) EndBattleGround(ALLIANCE); if (m_TeamScores[BG_TEAM_HORDE] >= BG_AB_MAX_TEAM_SCORE) EndBattleGround(HORDE); } }
void BattlegroundAB::PostUpdateImpl(uint32 diff) { if (GetStatus() == STATUS_IN_PROGRESS) { _bgEvents.Update(diff); while (uint32 eventId =_bgEvents.ExecuteEvent()) switch (eventId) { case BG_AB_EVENT_UPDATE_BANNER_STABLE: case BG_AB_EVENT_UPDATE_BANNER_FARM: case BG_AB_EVENT_UPDATE_BANNER_BLACKSMITH: case BG_AB_EVENT_UPDATE_BANNER_LUMBERMILL: case BG_AB_EVENT_UPDATE_BANNER_GOLDMINE: CreateBanner(eventId - BG_AB_EVENT_UPDATE_BANNER_STABLE, false); break; case BG_AB_EVENT_CAPTURE_STABLE: case BG_AB_EVENT_CAPTURE_FARM: case BG_AB_EVENT_CAPTURE_BLACKSMITH: case BG_AB_EVENT_CAPTURE_LUMBERMILL: case BG_AB_EVENT_CAPTURE_GOLDMINE: { uint8 node = eventId - BG_AB_EVENT_CAPTURE_STABLE; TeamId teamId = _capturePointInfo[node]._state == BG_AB_NODE_STATE_ALLY_CONTESTED ? TEAM_ALLIANCE : TEAM_HORDE; DeleteBanner(node); _capturePointInfo[node]._ownerTeamId = teamId; _capturePointInfo[node]._state = teamId == TEAM_ALLIANCE ? BG_AB_NODE_STATE_ALLY_OCCUPIED : BG_AB_NODE_STATE_HORDE_OCCUPIED; _capturePointInfo[node]._captured = true; CreateBanner(node, false); NodeOccupied(node); SendNodeUpdate(node); SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, teamId == TEAM_ALLIANCE ? CHAT_MSG_BG_SYSTEM_ALLIANCE : CHAT_MSG_BG_SYSTEM_HORDE, NULL, teamId == TEAM_ALLIANCE ? LANG_BG_AB_ALLY : LANG_BG_AB_HORDE, LANG_BG_AB_NODE_STABLES + node); PlaySoundToAll(teamId == TEAM_ALLIANCE ? BG_AB_SOUND_NODE_CAPTURED_ALLIANCE : BG_AB_SOUND_NODE_CAPTURED_HORDE); break; } case BG_AB_EVENT_ALLIANCE_TICK: case BG_AB_EVENT_HORDE_TICK: { TeamId teamId = TeamId(eventId - BG_AB_EVENT_ALLIANCE_TICK); uint8 controlledPoints = _controlledPoints[teamId]; if (controlledPoints == 0) { _bgEvents.ScheduleEvent(eventId, 3000); break; } uint8 honorRewards = uint8(m_TeamScores[teamId] / _honorTics); uint8 reputationRewards = uint8(m_TeamScores[teamId] / _reputationTics); uint8 information = uint8(m_TeamScores[teamId] / BG_AB_WARNING_NEAR_VICTORY_SCORE); m_TeamScores[teamId] += BG_AB_TickPoints[controlledPoints]; if (m_TeamScores[teamId] > BG_AB_MAX_TEAM_SCORE) m_TeamScores[teamId] = BG_AB_MAX_TEAM_SCORE; if (honorRewards < uint8(m_TeamScores[teamId] / _honorTics)) RewardHonorToTeam(GetBonusHonorFromKill(1), teamId); if (reputationRewards < uint8(m_TeamScores[teamId] / _reputationTics)) RewardReputationToTeam(teamId == TEAM_ALLIANCE ? 509 : 510, 10, teamId); if (information < uint8(m_TeamScores[teamId] / BG_AB_WARNING_NEAR_VICTORY_SCORE)) { SendMessageToAll(teamId == TEAM_ALLIANCE ? LANG_BG_AB_A_NEAR_VICTORY : LANG_BG_AB_H_NEAR_VICTORY, CHAT_MSG_BG_SYSTEM_NEUTRAL); PlaySoundToAll(BG_AB_SOUND_NEAR_VICTORY); } UpdateWorldState(teamId == TEAM_ALLIANCE ? BG_AB_OP_RESOURCES_ALLY : BG_AB_OP_RESOURCES_HORDE, m_TeamScores[teamId]); if (m_TeamScores[teamId] > m_TeamScores[GetOtherTeamId(teamId)] + 500) _teamScores500Disadvantage[GetOtherTeamId(teamId)] = true; if (m_TeamScores[teamId] >= BG_AB_MAX_TEAM_SCORE) EndBattleground(teamId); _bgEvents.ScheduleEvent(eventId, BG_AB_TickIntervals[controlledPoints]); break; } } } }
void BattleGroundNA::Update(uint32 diff) { BattleGround::Update(diff); // after bg start we get there if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize()) { ModifyStartDelayTime(diff); if (!(m_Events & 0x01)) { m_Events |= 0x01; // setup here, only when at least one player has ported to the map if (!SetupBattleGround()) { EndNow(); return; } for (uint32 i = BG_NA_OBJECT_DOOR_1; i <= BG_NA_OBJECT_DOOR_4; i++) SpawnBGObject(i, RESPAWN_IMMEDIATELY); AddSpectatorNPC(4055.74f, 2921.20f, 39.54f, 0.0f); SetStartDelayTime(START_DELAY1); SendMessageToAll(LANG_ARENA_ONE_MINUTE); } // After 30 seconds, warning is signalled else if (GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x04)) { m_Events |= 0x04; SendMessageToAll(LANG_ARENA_THIRTY_SECONDS); } // After 15 seconds, warning is signalled else if (GetStartDelayTime() <= START_DELAY3 && !(m_Events & 0x08)) { m_Events |= 0x08; SendMessageToAll(LANG_ARENA_FIFTEEN_SECONDS); } // delay expired (1 minute) else if (GetStartDelayTime() <= 0 && !(m_Events & 0x10)) { m_Events |= 0x10; for (uint32 i = BG_NA_OBJECT_DOOR_1; i <= BG_NA_OBJECT_DOOR_2; i++) DoorOpen(i); for (uint32 i = BG_NA_OBJECT_BUFF_1; i <= BG_NA_OBJECT_BUFF_2; i++) SpawnBGObject(i, 60); SendMessageToAll(LANG_ARENA_BEGUN); SetStatus(STATUS_IN_PROGRESS); SetStartDelayTime(0); for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if (Player *plr = sObjectMgr.GetPlayer(itr->first)) { SendPacketToEnemyTeam(GetPlayerTeam(plr->GetGUID()), plr->BuildGladdyUpdate()); plr->RemoveAurasDueToSpell(SPELL_ARENA_PREPARATION); } if (!GetPlayersCountByTeam(ALLIANCE) && GetPlayersCountByTeam(HORDE)) EndBattleGround(HORDE); else if (GetPlayersCountByTeam(ALLIANCE) && !GetPlayersCountByTeam(HORDE)) EndBattleGround(ALLIANCE); } } /*if(GetStatus() == STATUS_IN_PROGRESS) { // update something }*/ }
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); } } else { UpdateWaitTimer -= diff; return; } } Battleground::Update(diff); TotalTime += diff; if (Status == BG_SA_WARMUP) { EndRoundTimer = BG_SA_ROUNDLENGTH; if (TotalTime >= BG_SA_WARMUPLENGTH) { TotalTime = 0; ToggleTimer(); DemolisherStartState(false); Status = BG_SA_ROUND_ONE; StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, (Attackers == TEAM_ALLIANCE) ? 23748 : 21702); } if (TotalTime >= BG_SA_BOAT_START) StartShips(); return; } else if (Status == BG_SA_SECOND_WARMUP) { if (RoundScores[0].time < BG_SA_ROUNDLENGTH) EndRoundTimer = RoundScores[0].time; else EndRoundTimer = BG_SA_ROUNDLENGTH; if (TotalTime >= 60000) { SendWarningToAll(LANG_BG_SA_HAS_BEGUN); TotalTime = 0; ToggleTimer(); DemolisherStartState(false); Status = BG_SA_ROUND_TWO; StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, (Attackers == TEAM_ALLIANCE) ? 23748 : 21702); } 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) { if (TotalTime >= BG_SA_ROUNDLENGTH) { RoundScores[0].winner = Attackers; RoundScores[0].time = BG_SA_ROUNDLENGTH; TotalTime = 0; Status = BG_SA_SECOND_WARMUP; Attackers = (Attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; UpdateWaitTimer = 5000; SignaledRoundTwo = false; SignaledRoundTwoHalfMin = false; InitSecondRound = true; ToggleTimer(); ResetObjs(); return; } } else if (Status == BG_SA_ROUND_TWO) { if (TotalTime >= EndRoundTimer) { RoundScores[1].time = BG_SA_ROUNDLENGTH; RoundScores[1].winner = (Attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; if (RoundScores[0].time == RoundScores[1].time) EndBattleground (NULL); else if (RoundScores[0].time < RoundScores[1].time) EndBattleground(RoundScores[0].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); else EndBattleground(RoundScores[1].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); return; } } if (Status == BG_SA_ROUND_ONE || Status == BG_SA_ROUND_TWO) { SendTime(); UpdateDemolisherSpawns(); } } }
void BattlegroundWS::EventPlayerCapturedFlag(Player* Source) { if (GetStatus() != STATUS_IN_PROGRESS) return; uint32 winner = 0; Source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); if (Source->GetTeam() == ALLIANCE) { if (!IsHordeFlagPickedup()) return; SetHordeFlagPicker(0); // must be before aura remove to prevent 2 events (drop+capture) at the same time // horde flag in base (but not respawned yet) _flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_WAIT_RESPAWN; // Drop Horde Flag from Player Source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG); if (_flagDebuffState == 1) Source->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT); if (_flagDebuffState == 2) Source->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT); if (GetTeamScore(TEAM_ALLIANCE) < BG_WS_MAX_TEAM_SCORE) AddPoint(ALLIANCE, 1); PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_ALLIANCE); RewardReputationToTeam(890, m_ReputationCapture, ALLIANCE); } else { if (!IsAllianceFlagPickedup()) return; SetAllianceFlagPicker(0); // must be before aura remove to prevent 2 events (drop+capture) at the same time // alliance flag in base (but not respawned yet) _flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_WAIT_RESPAWN; // Drop Alliance Flag from Player Source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG); if (_flagDebuffState == 1) Source->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT); if (_flagDebuffState == 2) Source->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT); if (GetTeamScore(TEAM_HORDE) < BG_WS_MAX_TEAM_SCORE) AddPoint(HORDE, 1); PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_HORDE); RewardReputationToTeam(889, m_ReputationCapture, HORDE); } //for flag capture is reward 2 honorable kills RewardHonorToTeam(GetBonusHonorFromKill(2), Source->GetTeam()); SpawnBGObject(BG_WS_OBJECT_H_FLAG, BG_WS_FLAG_RESPAWN_TIME); SpawnBGObject(BG_WS_OBJECT_A_FLAG, BG_WS_FLAG_RESPAWN_TIME); if (Source->GetTeam() == ALLIANCE) SendMessageToAll(LANG_BG_WS_CAPTURED_HF, CHAT_MSG_BG_SYSTEM_ALLIANCE, Source); else SendMessageToAll(LANG_BG_WS_CAPTURED_AF, CHAT_MSG_BG_SYSTEM_HORDE, Source); UpdateFlagState(Source->GetTeam(), 1); // flag state none UpdateTeamScore(Source->GetTeamId()); // only flag capture should be updated UpdatePlayerScore(Source, SCORE_FLAG_CAPTURES, 1); // +1 flag captures // update last flag capture to be used if teamscore is equal SetLastFlagCapture(Source->GetTeam()); if (GetTeamScore(TEAM_ALLIANCE) == BG_WS_MAX_TEAM_SCORE) winner = ALLIANCE; if (GetTeamScore(TEAM_HORDE) == BG_WS_MAX_TEAM_SCORE) winner = HORDE; if (winner) { UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 0); UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 0); UpdateWorldState(BG_WS_FLAG_STATE_ALLIANCE, 1); UpdateWorldState(BG_WS_FLAG_STATE_HORDE, 1); UpdateWorldState(BG_WS_STATE_TIMER_ACTIVE, 0); RewardHonorToTeam(BG_WSG_Honor[m_HonorMode][BG_WSG_WIN], winner); EndBattleground(winner); } else { _flagsTimer[GetTeamIndexByTeamId(Source->GetTeam()) ? 0 : 1] = BG_WS_FLAG_RESPAWN_TIME; } }
void BattlegroundSA::PostUpdateImpl(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); } } else { UpdateWaitTimer -= diff; return; } } TotalTime += diff; if (Status == BG_SA_WARMUP) { EndRoundTimer = BG_SA_ROUNDLENGTH; if (TotalTime >= BG_SA_WARMUPLENGTH) { if (Creature* c = GetBGCreature(BG_SA_NPC_KANRETHAD)) SendChatMessage(c, TEXT_ROUND_STARTED); TotalTime = 0; ToggleTimer(); DemolisherStartState(false); Status = BG_SA_ROUND_ONE; StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, (Attackers == TEAM_ALLIANCE) ? 23748 : 21702); } if (TotalTime >= BG_SA_BOAT_START) StartShips(); return; } else if (Status == BG_SA_SECOND_WARMUP) { if (RoundScores[0].time<BG_SA_ROUNDLENGTH) EndRoundTimer = RoundScores[0].time; else EndRoundTimer = BG_SA_ROUNDLENGTH; if (TotalTime >= 60000) { if (Creature* c = GetBGCreature(BG_SA_NPC_KANRETHAD)) SendChatMessage(c, TEXT_ROUND_STARTED); TotalTime = 0; ToggleTimer(); DemolisherStartState(false); Status = BG_SA_ROUND_TWO; StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, (Attackers == TEAM_ALLIANCE) ? 23748 : 21702); // status was set to STATUS_WAIT_JOIN manually for Preparation, set it back now SetStatus(STATUS_IN_PROGRESS); for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if (Player* p = ObjectAccessor::FindPlayer(itr->first)) p->RemoveAurasDueToSpell(SPELL_PREPARATION); } 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) { if (TotalTime >= BG_SA_ROUNDLENGTH) { RoundScores[0].winner = Attackers; RoundScores[0].time = BG_SA_ROUNDLENGTH; TotalTime = 0; Status = BG_SA_SECOND_WARMUP; Attackers = (Attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; UpdateWaitTimer = 5000; SignaledRoundTwo = false; SignaledRoundTwoHalfMin = false; InitSecondRound = true; ToggleTimer(); ResetObjs(); GetBgMap()->UpdateAreaDependentAuras(); CastSpellOnTeam(SPELL_END_OF_ROUND, ALLIANCE); CastSpellOnTeam(SPELL_END_OF_ROUND, HORDE); return; } } else if (Status == BG_SA_ROUND_TWO) { if (TotalTime >= EndRoundTimer) { RoundScores[1].time = BG_SA_ROUNDLENGTH; RoundScores[1].winner = (Attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; if (RoundScores[0].time == RoundScores[1].time) EndBattleground(0); else if (RoundScores[0].time < RoundScores[1].time) EndBattleground(RoundScores[0].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); else EndBattleground(RoundScores[1].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); return; } } if (Status == BG_SA_ROUND_ONE || Status == BG_SA_ROUND_TWO) { SendTime(); UpdateDemolisherSpawns(); } } }
void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target_obj) { if (GetStatus() != STATUS_IN_PROGRESS) return; int32 message_id = 0; ChatMsg type = CHAT_MSG_BG_SYSTEM_NEUTRAL; //alliance flag picked up from base if (Source->GetTeam() == HORDE && GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE && BgObjects[BG_WS_OBJECT_A_FLAG] == target_obj->GetGUID()) { message_id = LANG_BG_WS_PICKEDUP_AF; type = CHAT_MSG_BG_SYSTEM_HORDE; PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP); SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_ONE_DAY); SetAllianceFlagPicker(Source->GetGUID()); _flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER; //update world state to show correct flag carrier UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER); UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1); Source->CastSpell(Source, BG_WS_SPELL_SILVERWING_FLAG, true); Source->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_SILVERWING_FLAG_PICKED); if (_flagState[1] == BG_WS_FLAG_STATE_ON_PLAYER) _bothFlagsKept = true; } //horde flag picked up from base if (Source->GetTeam() == ALLIANCE && GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_BASE && BgObjects[BG_WS_OBJECT_H_FLAG] == target_obj->GetGUID()) { message_id = LANG_BG_WS_PICKEDUP_HF; type = CHAT_MSG_BG_SYSTEM_ALLIANCE; PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP); SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_ONE_DAY); SetHordeFlagPicker(Source->GetGUID()); _flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER; //update world state to show correct flag carrier UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER); UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1); Source->CastSpell(Source, BG_WS_SPELL_WARSONG_FLAG, true); Source->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_WARSONG_FLAG_PICKED); if (_flagState[0] == BG_WS_FLAG_STATE_ON_PLAYER) _bothFlagsKept = true; } //Alliance flag on ground(not in base) (returned or picked up again from ground!) if (GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10) && target_obj->GetGOInfo()->entry == BG_OBJECT_A_FLAG_GROUND_WS_ENTRY) { if (Source->GetTeam() == ALLIANCE) { message_id = LANG_BG_WS_RETURNED_AF; type = CHAT_MSG_BG_SYSTEM_ALLIANCE; UpdateFlagState(HORDE, BG_WS_FLAG_STATE_WAIT_RESPAWN); RespawnFlag(ALLIANCE, false); SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_IMMEDIATELY); PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED); UpdatePlayerScore(Source, SCORE_FLAG_RETURNS, 1); _bothFlagsKept = false; } else { message_id = LANG_BG_WS_PICKEDUP_AF; type = CHAT_MSG_BG_SYSTEM_HORDE; PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP); SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_ONE_DAY); SetAllianceFlagPicker(Source->GetGUID()); Source->CastSpell(Source, BG_WS_SPELL_SILVERWING_FLAG, true); _flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER; UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER); if (_flagDebuffState == 1) Source->CastSpell(Source, WS_SPELL_FOCUSED_ASSAULT, true); if (_flagDebuffState == 2) Source->CastSpell(Source, WS_SPELL_BRUTAL_ASSAULT, true); UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1); } //called in HandleGameObjectUseOpcode: //target_obj->Delete(); } //Horde flag on ground(not in base) (returned or picked up again) if (GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10) && target_obj->GetGOInfo()->entry == BG_OBJECT_H_FLAG_GROUND_WS_ENTRY) { if (Source->GetTeam() == HORDE) { message_id = LANG_BG_WS_RETURNED_HF; type = CHAT_MSG_BG_SYSTEM_HORDE; UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_WAIT_RESPAWN); RespawnFlag(HORDE, false); SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_IMMEDIATELY); PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED); UpdatePlayerScore(Source, SCORE_FLAG_RETURNS, 1); _bothFlagsKept = false; } else { message_id = LANG_BG_WS_PICKEDUP_HF; type = CHAT_MSG_BG_SYSTEM_ALLIANCE; PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP); SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_ONE_DAY); SetHordeFlagPicker(Source->GetGUID()); Source->CastSpell(Source, BG_WS_SPELL_WARSONG_FLAG, true); _flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER; UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER); if (_flagDebuffState == 1) Source->CastSpell(Source, WS_SPELL_FOCUSED_ASSAULT, true); if (_flagDebuffState == 2) Source->CastSpell(Source, WS_SPELL_BRUTAL_ASSAULT, true); UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1); } //called in HandleGameObjectUseOpcode: //target_obj->Delete(); } if (!message_id) return; SendMessageToAll(message_id, type, Source); Source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); }
void BattleGroundWS::EventPlayerCapturedFlag(Player *Source) { if (GetStatus() != STATUS_IN_PROGRESS) return; m_LastCapturedFlagTeam = Source->GetTeam(); uint32 winner = 0; Source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); if(Source->HasAura(BG_WS_FOCUSED_ASSAULT)) Source->RemoveAurasDueToSpell(BG_WS_FOCUSED_ASSAULT); if (Source->GetTeam() == ALLIANCE) { if (!IsHordeFlagPickedup()) return; SetHordeFlagPicker(0); // must be before aura remove to prevent 2 events (drop+capture) at the same time // horde flag in base (but not respawned yet) m_FlagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_WAIT_RESPAWN; // Drop Horde Flag from Player Source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG); if (GetTeamScore(ALLIANCE) < BG_WS_MAX_TEAM_SCORE) AddPoint(ALLIANCE, 1); PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_ALLIANCE); RewardReputationToTeam(890, m_ReputationCapture, ALLIANCE); } else { if (!IsAllianceFlagPickedup()) return; SetAllianceFlagPicker(0); // must be before aura remove to prevent 2 events (drop+capture) at the same time // alliance flag in base (but not respawned yet) m_FlagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_WAIT_RESPAWN; // Drop Alliance Flag from Player Source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG); if (GetTeamScore(HORDE) < BG_WS_MAX_TEAM_SCORE) AddPoint(HORDE, 1); PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_HORDE); RewardReputationToTeam(889, m_ReputationCapture, HORDE); } //for flag capture is reward 2 honorable kills RewardHonorToTeam(GetBonusHonorFromKill(sWorld.getConfig(CONFIG_UINT32_BONUS_HONOR_FLAG_WSG)), Source->GetTeam()); //flag carrier gets another 2 honorable kills Source->RewardHonor(NULL, 0, GetBonusHonorFromKill(sWorld.getConfig(CONFIG_UINT32_BONUS_HONOR_FLAG_WSG))); // despawn flags SpawnEvent(WS_EVENT_FLAG_A, 0, false); SpawnEvent(WS_EVENT_FLAG_H, 0, false); if (Source->GetTeam() == ALLIANCE) SendMessageToAll(LANG_BG_WS_CAPTURED_HF, CHAT_MSG_BG_SYSTEM_ALLIANCE, Source); else SendMessageToAll(LANG_BG_WS_CAPTURED_AF, CHAT_MSG_BG_SYSTEM_HORDE, Source); UpdateFlagState(Source->GetTeam(), 1); // flag state none UpdateTeamScore(Source->GetTeam()); // only flag capture should be updated UpdatePlayerScore(Source, SCORE_FLAG_CAPTURES, 1); // +1 flag captures if (GetTeamScore(ALLIANCE) == BG_WS_MAX_TEAM_SCORE) winner = ALLIANCE; if (GetTeamScore(HORDE) == BG_WS_MAX_TEAM_SCORE) winner = HORDE; if (winner) { UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 0); UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 0); UpdateWorldState(BG_WS_FLAG_STATE_ALLIANCE, 1); UpdateWorldState(BG_WS_FLAG_STATE_HORDE, 1); EndBattleGround(winner); } else { m_FlagsTimer[GetTeamIndexByTeamId(Source->GetTeam()) ? 0 : 1] = BG_WS_FLAG_RESPAWN_TIME; } }