예제 #1
0
void BattleGroundAC::EventPlayerDroppedFlag(Player *Source)
{
    if (GetStatus() != STATUS_IN_PROGRESS)
    {
        // if not running, do not cast things at the dropper player, neither send unnecessary messages
        // just take off the aura
        if (IsFlagPickedup() && GetFlagPickerGuid() == Source->GetObjectGuid())
        {
            ClearFlagPicker();
            Source->RemoveAurasDueToSpell(BG_AC_FLAG_1_FLAG_SPELL);
        }
        return;
    }

    if (!IsFlagPickedup())
        return;

    if (GetFlagPickerGuid() != Source->GetObjectGuid())
        return;

    ClearFlagPicker();
    Source->RemoveAurasDueToSpell(BG_AC_FLAG_1_FLAG_SPELL);
    m_FlagState = BG_AC_FLAG_STATE_ON_GROUND;
    m_FlagsTimer = BG_AC_FLAG_RESPAWN_TIME;
    Source->CastSpell(Source, SPELL_RECENTLY_DROPPED_FLAG, true);
    Source->CastSpell(Source, BG_AC_PLAYER_DROPPED_FLAG_SPELL, true);
    //this does not work correctly :( (it should remove flag carrier name)
    UpdateWorldState(FLAG_1_FLAG_STATE_HORDE, BG_AC_FLAG_STATE_WAIT_RESPAWN);
    UpdateWorldState(FLAG_1_FLAG_STATE_ALLIANCE, BG_AC_FLAG_STATE_WAIT_RESPAWN);

    if (Source->GetTeam() == ALLIANCE)
        SendMessageToAll(LANG_BG_AC_DROPPED_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL);
    else
        SendMessageToAll(LANG_BG_AC_DROPPED_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, NULL);
}
예제 #2
0
void BattleGroundAC::HandleAreaTrigger(Player *Source, uint32 Trigger)
{
    if (GetStatus() != STATUS_IN_PROGRESS)
        return;

    if(!Source->isAlive())                                  //hack code, must be removed later
        return;

    switch(Trigger)
    {
        case TR_TOWER_4_POINT:
            if (m_PointState[BG_AC_NODE_TOWER_4] == AC_POINT_UNDER_CONTROL && m_PointOwnedByTeam[BG_AC_NODE_TOWER_4] == Source->GetTeam())
                if (m_FlagState && GetFlagPickerGuid() == Source->GetObjectGuid())
                    EventPlayerCapturedFlag(Source, BG_AC_NODE_TOWER_4);
            break;
        case TR_TOWER_3_POINT:
            if (m_PointState[BG_AC_NODE_TOWER_3] == AC_POINT_UNDER_CONTROL && m_PointOwnedByTeam[BG_AC_NODE_TOWER_3] == Source->GetTeam())
                if (m_FlagState && GetFlagPickerGuid() == Source->GetObjectGuid())
                    EventPlayerCapturedFlag(Source, BG_AC_NODE_TOWER_3);
            break;
        case TR_TOWER_2_POINT:
            if (m_PointState[BG_AC_NODE_TOWER_2] == AC_POINT_UNDER_CONTROL && m_PointOwnedByTeam[BG_AC_NODE_TOWER_2] == Source->GetTeam())
                if (m_FlagState && GetFlagPickerGuid() == Source->GetObjectGuid())
                    EventPlayerCapturedFlag(Source, BG_AC_NODE_TOWER_2);
            break;
        case TR_TOWER_1_POINT:
            if (m_PointState[BG_AC_NODE_TOWER_1] == AC_POINT_UNDER_CONTROL && m_PointOwnedByTeam[BG_AC_NODE_TOWER_1] == Source->GetTeam())
                if (m_FlagState && GetFlagPickerGuid() == Source->GetObjectGuid())
                    EventPlayerCapturedFlag(Source, BG_AC_NODE_TOWER_1);
            break;
        case 4512:
        case 4515:
        case 4517:
        case 4519:
        case 4530:
        case 4531:
        case 4568:
        case 4569:
        case 4570:
        case 4571:
        case 5866:
            break;
        default:
            sLog.outError("WARNING: Unhandled AreaTrigger in Battleground: %u", Trigger);
            Source->GetSession()->SendAreaTriggerMessage("Warning: Unhandled AreaTrigger in Battleground: %u", Trigger);
            break;
    }
}
예제 #3
0
void BattleGroundEY::HandleAreaTrigger(Player* source, uint32 trigger)
{
    if (GetStatus() != STATUS_IN_PROGRESS)
        return;

    if (!source->isAlive())                                 // hack code, must be removed later
        return;

    switch (trigger)
    {
        case TR_BLOOD_ELF_POINT:
            if (m_PointState[BG_EY_NODE_BLOOD_ELF] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[BG_EY_NODE_BLOOD_ELF] == source->GetTeam())
                if (m_FlagState && GetFlagPickerGuid() == source->GetObjectGuid())
                    EventPlayerCapturedFlag(source, BG_EY_NODE_BLOOD_ELF);
            break;
        case TR_FEL_REAVER_POINT:
            if (m_PointState[BG_EY_NODE_FEL_REAVER] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[BG_EY_NODE_FEL_REAVER] == source->GetTeam())
                if (m_FlagState && GetFlagPickerGuid() == source->GetObjectGuid())
                    EventPlayerCapturedFlag(source, BG_EY_NODE_FEL_REAVER);
            break;
        case TR_MAGE_TOWER_POINT:
            if (m_PointState[BG_EY_NODE_MAGE_TOWER] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[BG_EY_NODE_MAGE_TOWER] == source->GetTeam())
                if (m_FlagState && GetFlagPickerGuid() == source->GetObjectGuid())
                    EventPlayerCapturedFlag(source, BG_EY_NODE_MAGE_TOWER);
            break;
        case TR_DRAENEI_RUINS_POINT:
            if (m_PointState[BG_EY_NODE_DRAENEI_RUINS] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[BG_EY_NODE_DRAENEI_RUINS] == source->GetTeam())
                if (m_FlagState && GetFlagPickerGuid() == source->GetObjectGuid())
                    EventPlayerCapturedFlag(source, BG_EY_NODE_DRAENEI_RUINS);
            break;
        case 4512:
        case 4515:
        case 4517:
        case 4519:
        case 4530:
        case 4531:
        case 4568:
        case 4569:
        case 4570:
        case 4571:
        case 5866:
            break;
        default:
            sLog.outError("WARNING: Unhandled AreaTrigger in Battleground: %u", trigger);
            source->GetSession()->SendAreaTriggerMessage("Warning: Unhandled AreaTrigger in Battleground: %u", trigger);
            break;
    }
}
예제 #4
0
void BattleGroundEY::Update(uint32 diff)
{
    BattleGround::Update(diff);

    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
            */
            CheckSomeoneJoinedPoint();
            //check if player left point
            CheckSomeoneLeftPoint();
            UpdatePointStatuses();
            m_TowerCapCheckTimer = BG_EY_FPOINTS_TICK_TIME;
        }
		
        // areatrigger for Fel Reaver was removed? so:
        if (m_FlagState)
            if(Player* plr = sObjectMgr.GetPlayer(GetFlagPickerGuid()))
                if(plr->GetDistance2d(2043.99f, 1729.91f) < 2)
                    if(m_PointState[BG_EY_NODE_FEL_REAVER] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[BG_EY_NODE_FEL_REAVER] == plr->GetTeam())
                        EventPlayerCapturedFlag(plr, BG_EY_NODE_FEL_REAVER);

    }
}
예제 #5
0
void BattleGroundEY::EventPlayerCapturedFlag(Player *Source, BG_EY_Nodes node)
{
    if (GetStatus() != STATUS_IN_PROGRESS || GetFlagPickerGuid() != Source->GetObjectGuid())
        return;

    ClearFlagPicker();
    m_FlagState = BG_EY_FLAG_STATE_WAIT_RESPAWN;
    Source->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);

    Source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);

    if (Source->GetTeam() == ALLIANCE)
        PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_ALLIANCE);
    else
        PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_HORDE);

    SpawnEvent(BG_EY_EVENT_CAPTURE_FLAG, node, true);

    m_FlagsTimer = BG_EY_FLAG_RESPAWN_TIME;

    BattleGroundTeamIndex team_id;
    if (Source->GetTeam() == ALLIANCE)
    {
        team_id = BG_TEAM_ALLIANCE;
        SendMessageToAll(LANG_BG_EY_CAPTURED_FLAG_A, CHAT_MSG_BG_SYSTEM_ALLIANCE, Source);
    }
    else
    {
        team_id = BG_TEAM_HORDE;
        SendMessageToAll(LANG_BG_EY_CAPTURED_FLAG_H, CHAT_MSG_BG_SYSTEM_HORDE, Source);
    }

    if (m_TeamPointsCount[team_id] > 0)
        AddPoints(Source->GetTeam(), BG_EY_FlagPoints[m_TeamPointsCount[team_id] - 1]);

    RewardXpToTeam(0, 0.6f, Source->GetTeam());

    UpdatePlayerScore(Source, SCORE_FLAG_CAPTURES, 1);
    Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE,1,183);
}