Beispiel #1
0
bool OutdoorPvPSI::HandleAreaTrigger(Player *plr, uint32 trigger)
{
    switch(trigger)
    {
    case SI_AREATRIGGER_A:
        if(plr->GetTeam() == ALLIANCE && plr->HasAura(SI_SILITHYST_FLAG,0))
        {
            // remove aura
            plr->RemoveAurasDueToSpell(SI_SILITHYST_FLAG);
            ++ m_Gathered_A;
            if(m_Gathered_A >= SI_MAX_RESOURCES)
            {
                BuffTeam(ALLIANCE);
                sWorld.SendZoneText(OutdoorPvPSIBuffZones[0],objmgr.GetMangosString(LANG_OPVP_SI_CAPTURE_A,-1));
                m_LastController = ALLIANCE;
                m_Gathered_A = 0;
                m_Gathered_H = 0;
            }
            UpdateWorldState();
            // reward player
            plr->CastSpell(plr,SI_TRACES_OF_SILITHYST,true);
            // add 19 honor
            plr->RewardHonor(NULL,1,19);
            // add 20 cenarion circle repus 
            plr->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), 20);
            // complete quest
            plr->KilledMonster(SI_TURNIN_QUEST_CM_A,0);
        }
        return true;
    case SI_AREATRIGGER_H:
        if(plr->GetTeam() == HORDE && plr->HasAura(SI_SILITHYST_FLAG,0))
        {
            // remove aura
            plr->RemoveAurasDueToSpell(SI_SILITHYST_FLAG);
            ++ m_Gathered_H;
            if(m_Gathered_H >= SI_MAX_RESOURCES)
            {
                BuffTeam(HORDE);
                sWorld.SendZoneText(OutdoorPvPSIBuffZones[0],objmgr.GetMangosString(LANG_OPVP_SI_CAPTURE_H,-1));
                m_LastController = HORDE;
                m_Gathered_A = 0;
                m_Gathered_H = 0;
            }
            UpdateWorldState();
            // reward player
            plr->CastSpell(plr,SI_TRACES_OF_SILITHYST,true);
            // add 19 honor
            plr->RewardHonor(NULL,1,19);
            // add 20 cenarion circle repu
            plr->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), 20);

            // complete quest
            plr->KilledMonster(SI_TURNIN_QUEST_CM_H,0);
        }
        return true;
    }
    return false;
}
bool OutdoorPvPHP::Update(uint32 diff)
{
    bool changed = false;
    if(changed = OutdoorPvP::Update(diff))
    {
        if(m_AllianceTowersControlled == 3)
            BuffTeam(ALLIANCE);
        else if(m_HordeTowersControlled == 3)
            BuffTeam(HORDE);
        else
            BuffTeam(NULL);
        SendUpdateWorldState(HP_UI_TOWER_COUNT_A, m_AllianceTowersControlled);
        SendUpdateWorldState(HP_UI_TOWER_COUNT_H, m_HordeTowersControlled);
    }
    return changed;
}
Beispiel #3
0
void OutdoorPvPTF::ProcessCaptureEvent(GameObject* pGo, uint32 uiTowerId, Team team, uint32 uiNewWorldState)
{
    if (team != TEAM_NONE)
    {
        if (team == ALLIANCE)
        {
            SetBannerVisual(pGo, CAPTURE_ARTKIT_ALLIANCE, CAPTURE_ANIM_ALLIANCE);
            ++m_uiTowersAlliance;
        }
        else
        {
            SetBannerVisual(pGo, CAPTURE_ARTKIT_HORDE, CAPTURE_ANIM_HORDE);
            ++m_uiTowersHorde;
        }

        // if all towers are captured then process event
        if (m_uiTowersAlliance == MAX_TF_TOWERS || m_uiTowersHorde == MAX_TF_TOWERS)
        {
            SendUpdateWorldState(m_uiZoneWorldState, WORLD_STATE_REMOVE);
            m_uiZoneWorldState = team == ALLIANCE ? WORLD_STATE_TF_LOCKED_ALLIANCE : WORLD_STATE_TF_LOCKED_HORDE;
            SendUpdateWorldState(m_uiZoneWorldState, WORLD_STATE_ADD);

            m_uiZoneLockTimer = TIMER_TF_LOCK_TIME;
            UpdateTimerWorldState();

            m_zoneOwner = team;
            BuffTeam(team, SPELL_AUCHINDOUN_BLESSING);

            // lock the towers
            LockTowers(pGo);
        }
    }
    else
    {
        SetBannerVisual(pGo, CAPTURE_ARTKIT_NEUTRAL, CAPTURE_ANIM_NEUTRAL);

        if (m_capturePointOwner[uiTowerId] == ALLIANCE)
            --m_uiTowersAlliance;
        else
            --m_uiTowersHorde;
    }

    // update tower state
    SendUpdateWorldState(m_uiTowerWorldState[uiTowerId], WORLD_STATE_REMOVE);
    m_uiTowerWorldState[uiTowerId] = uiNewWorldState;
    SendUpdateWorldState(m_uiTowerWorldState[uiTowerId], WORLD_STATE_ADD);

    // update tower count
    SendUpdateWorldState(WORLD_STATE_TF_TOWER_COUNT_A, m_uiTowersAlliance);
    SendUpdateWorldState(WORLD_STATE_TF_TOWER_COUNT_H, m_uiTowersHorde);

    // update capture point owner
    m_capturePointOwner[uiTowerId] = team;

}
Beispiel #4
0
void OutdoorPvPTF::Update(uint32 diff)
{
    if (m_uiZoneLockTimer)
    {
        if (m_uiZoneLockTimer < diff)
        {
            // remove buffs
            BuffTeam(m_zoneOwner, SPELL_AUCHINDOUN_BLESSING, true);

            // reset world states and towers
            UpdateWorldState(WORLD_STATE_REMOVE);
            m_zoneOwner = TEAM_NONE;
            m_uiZoneWorldState = WORLD_STATE_TF_TOWERS_CONTROLLED;
            m_uiTowersAlliance = 0;
            m_uiTowersHorde = 0;
            m_uiTowerWorldState[0] = WORLD_STATE_TOWER_1_NEUTRAL;
            m_uiTowerWorldState[1] = WORLD_STATE_TOWER_2_NEUTRAL;
            m_uiTowerWorldState[2] = WORLD_STATE_TOWER_3_NEUTRAL;
            m_uiTowerWorldState[3] = WORLD_STATE_TOWER_4_NEUTRAL;
            m_uiTowerWorldState[4] = WORLD_STATE_TOWER_5_NEUTRAL;
            UpdateWorldState(WORLD_STATE_ADD);

            // update tower count
            SendUpdateWorldState(WORLD_STATE_TF_TOWER_COUNT_A, m_uiTowersAlliance);
            SendUpdateWorldState(WORLD_STATE_TF_TOWER_COUNT_H, m_uiTowersHorde);

            for (PlayerSet::iterator itr = m_sZonePlayers.begin(); itr != m_sZonePlayers.end(); ++itr)
            {
                if ((*itr) && (*itr)->isAlive())
                {
                    ResetTowers((*itr));
                    break;
                }
            }

            m_uiZoneLockTimer = 0;
        }
        else
        {
            if (m_uiZoneUpdateTimer < diff)
            {
                // update timer
                UpdateTimerWorldState();

                m_uiZoneUpdateTimer = TIMER_TF_UPDATE_TIME;
            }
            else
                m_uiZoneUpdateTimer -= diff;

            m_uiZoneLockTimer -= diff;
        }
    }
}
Beispiel #5
0
void OutdoorPvPNA::ProcessCaptureEvent(GameObject* go, Team team)
{
    BuffTeam(m_zoneOwner, SPELL_STRENGTH_HALAANI, true);

    // update capture point owner
    m_zoneOwner = team;

    LockHalaa(go);
    m_guardsLeft = MAX_NA_GUARDS;

    m_isUnderSiege = false;
    m_soldiersRespawnTimer = 0;

    UpdateWorldState(WORLD_STATE_REMOVE);
    DespawnVendors(go);
    sObjectMgr.SetGraveYardLinkTeam(GRAVEYARD_ID_HALAA, GRAVEYARD_ZONE_ID_HALAA, m_zoneOwner);

    if (m_zoneOwner == ALLIANCE)
    {
        m_zoneWorldState = WORLD_STATE_NA_GUARDS_ALLIANCE;
        m_zoneMapState = WORLD_STATE_NA_HALAA_ALLIANCE;
    }
    else
    {
        m_zoneWorldState = WORLD_STATE_NA_GUARDS_HORDE;
        m_zoneMapState = WORLD_STATE_NA_HALAA_HORDE;
    }

    HandleFactionObjects(go);
    UpdateWorldState(WORLD_STATE_ADD);

    SendUpdateWorldState(WORLD_STATE_NA_GUARDS_LEFT, m_guardsLeft);

    BuffTeam(m_zoneOwner, SPELL_STRENGTH_HALAANI);
    sWorld.SendDefenseMessage(ZONE_ID_NAGRAND, m_zoneOwner == ALLIANCE ? LANG_OPVP_NA_CAPTURE_A : LANG_OPVP_NA_CAPTURE_H);
}
// Handle the zone reset when the timer expires
void OutdoorPvPTF::UnlockZone()
{
    // remove buffs
    BuffTeam(m_zoneOwner, SPELL_AUCHINDOUN_BLESSING, true);

    m_zoneOwner = TEAM_NONE;

    // reset world states and towers
    SendUpdateWorldState(m_zoneWorldState, WORLD_STATE_REMOVE);
    m_zoneWorldState = WORLD_STATE_TF_TOWERS_CONTROLLED;
    SendUpdateWorldState(m_zoneWorldState, WORLD_STATE_ADD);

    // reset tower states
    m_towerWorldState[0] = WORLD_STATE_TF_WEST_TOWER_NEUTRAL;
    m_towerWorldState[1] = WORLD_STATE_TF_NORTH_TOWER_NEUTRAL;
    m_towerWorldState[2] = WORLD_STATE_TF_EAST_TOWER_NEUTRAL;
    m_towerWorldState[3] = WORLD_STATE_TF_SOUTH_EAST_TOWER_NEUTRAL;
    m_towerWorldState[4] = WORLD_STATE_TF_SOUTH_TOWER_NEUTRAL;
    for (uint8 i = 0; i < MAX_TF_TOWERS; ++i)
        SendUpdateWorldState(m_towerWorldState[i], WORLD_STATE_ADD);

    // update tower count
    m_towersAlliance = 0;
    m_towersHorde = 0;
    SendUpdateWorldState(WORLD_STATE_TF_TOWER_COUNT_A, m_towersAlliance);
    SendUpdateWorldState(WORLD_STATE_TF_TOWER_COUNT_H, m_towersHorde);

    for (GuidZoneMap::iterator itr = m_zonePlayers.begin(); itr != m_zonePlayers.end(); ++itr)
    {
        // Find player who is in main zone (Terokkar Forest) to get correct map reference
        if (!itr->second)
            continue;

        if (Player* player = sObjectMgr.GetPlayer(itr->first))
        {
            ResetTowers(player);
            break;
        }
    }
}
// Handle the zone lock when the timer is activated
void OutdoorPvPTF::LockZone(GameObject* go, uint32 towerId, Team team, uint32 newWorldState)
{
    SendUpdateWorldState(m_zoneWorldState, WORLD_STATE_REMOVE);
    m_zoneWorldState = team == ALLIANCE ? WORLD_STATE_TF_LOCKED_ALLIANCE : WORLD_STATE_TF_LOCKED_HORDE;
    SendUpdateWorldState(m_zoneWorldState, WORLD_STATE_ADD);

    m_zoneLockTimer = TIMER_TF_LOCK_TIME;
    UpdateTimerWorldState();

    m_zoneOwner = team;
    BuffTeam(team, SPELL_AUCHINDOUN_BLESSING);

    // lock the towers
    LockTowers(go);

    sWorld.SendDefenseMessage(ZONE_ID_TEROKKAR_FOREST, team == ALLIANCE ? LANG_OPVP_TF_CAPTURE_ALL_TOWERS_A : LANG_OPVP_TF_CAPTURE_ALL_TOWERS_H);

    // remove tower states when zone has been captured and locked
    for (uint8 i = 0; i < MAX_TF_TOWERS; ++i)
        SendUpdateWorldState(m_towerWorldState[i], WORLD_STATE_REMOVE);

    m_towerWorldState[towerId] = newWorldState;
}
Beispiel #8
0
// Handle case when player returns a silithyst
bool OutdoorPvPSI::HandleAreaTrigger(Player* player, uint32 triggerId)
{
    if (player->isGameMaster() || player->isDead())
        return false;

    switch (triggerId)
    {
        case AREATRIGGER_SILITHUS_ALLIANCE:
            if (player->GetTeam() != ALLIANCE || !player->HasAura(SPELL_SILITHYST))
                return false;

            // update counter
            ++ m_resourcesAlliance;
            SendUpdateWorldState(WORLD_STATE_SI_GATHERED_A, m_resourcesAlliance);

            // handle the case when the faction has reached maximum resources allowed
            if (m_resourcesAlliance == MAX_SILITHYST)
            {
                // NOTE: On retail it would not reset until server restart but we do not support weekly restart :)
                m_zoneOwner = ALLIANCE;
                m_resourcesAlliance = 0;
                m_resourcesHorde = 0;

                // also update the horde counter if resources were reset
                SendUpdateWorldState(WORLD_STATE_SI_GATHERED_H, m_resourcesHorde);

                // apply buff to owner team
                BuffTeam(ALLIANCE, SPELL_CENARION_FAVOR);

                // Send defense message
                sWorld.SendDefenseMessage(ZONE_ID_SILITHUS, LANG_OPVP_SI_CAPTURE_A);
            }

            // give quest credit if necessary
            if (player->GetQuestStatus(QUEST_SCOURING_DESERT_ALLIANCE) == QUEST_STATUS_INCOMPLETE)
                player->KilledMonsterCredit(NPC_SILITHUS_DUST_QUEST_ALLIANCE);
            break;
        case AREATRIGGER_SILITHUS_HORDE:
            if (player->GetTeam() != HORDE || !player->HasAura(SPELL_SILITHYST))
                return false;

            // update counter
            ++ m_resourcesHorde;
            SendUpdateWorldState(WORLD_STATE_SI_GATHERED_H, m_resourcesHorde);

            // handle the case when the faction has reached maximum resources allowed
            if (m_resourcesHorde == MAX_SILITHYST)
            {
                // NOTE: On retail it would not reset until server restart but we do not support weekly restart :)
                m_zoneOwner = HORDE;
                m_resourcesAlliance = 0;
                m_resourcesHorde = 0;

                // also update the alliance counter if resources were reset
                SendUpdateWorldState(WORLD_STATE_SI_GATHERED_A, m_resourcesAlliance);

                // apply buff to owner team
                BuffTeam(HORDE, SPELL_CENARION_FAVOR);

                // Send defense message
                sWorld.SendDefenseMessage(ZONE_ID_SILITHUS, LANG_OPVP_SI_CAPTURE_H);
            }

            // give quest credit if necessary
            if (player->GetQuestStatus(QUEST_SCOURING_DESERT_HORDE) == QUEST_STATUS_INCOMPLETE)
                player->KilledMonsterCredit(NPC_SILITHUS_DUST_QUEST_HORDE);
            break;
        default:
            return false;
    }

    // remove silithyst aura
    player->RemoveAurasDueToSpell(SPELL_SILITHYST);

    // reward the player
    player->CastSpell(player, SPELL_TRACES_OF_SILITHYST, true);
    player->RewardHonor(NULL, 1, HONOR_REWARD_SILITHYST);
    player->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(FACTION_CENARION_CIRCLE), REPUTATION_REWARD_SILITHYST);

    return true;
}
Beispiel #9
0
// Handle the graveyard banner use
bool OutdoorPvPZM::HandleGameObjectUse(Player* player, GameObject* go)
{
    Team team = player->GetTeam();

    switch (go->GetEntry())
    {
        case GO_ZANGA_BANNER_CENTER_NEUTRAL:
            break;
        case GO_ZANGA_BANNER_CENTER_ALLIANCE:
            if (team == ALLIANCE || !player->HasAura(SPELL_BATTLE_STANDARD_HORDE))
                return false;
            break;
        case GO_ZANGA_BANNER_CENTER_HORDE:
            if (team == HORDE || !player->HasAura(SPELL_BATTLE_STANDARD_ALLIANCE))
                return false;
            break;
        default:
            return false;
    }

    // disable old banners - note the alliance and horde banners can despawn by self
    if (m_graveyardOwner == ALLIANCE)
    {
        //RespawnGO(go, m_graveyardBannerAlliance, false);
        SetBeaconArtKit(go, m_beamGraveyardBlue, 0);
    }
    else if (m_graveyardOwner == HORDE)
    {
        //RespawnGO(go, m_graveyardBannerHorde, false);
        SetBeaconArtKit(go, m_beamGraveyardRed, 0);
    }
    else
        RespawnGO(go, m_graveyardBannerNeutral, false);

    if (team == ALLIANCE)
    {
        // change banners
        RespawnGO(go, m_graveyardBannerAlliance, true);
        SetBeaconArtKit(go, m_beamGraveyardBlue, SPELL_BEAM_BLUE);

        // update world state
        SendUpdateWorldState(m_graveyardWorldState, WORLD_STATE_REMOVE);
        m_graveyardWorldState = WORLD_STATE_ZM_GRAVEYARD_ALLIANCE;
        SendUpdateWorldState(m_graveyardWorldState, WORLD_STATE_ADD);

        // remove player flag aura
        player->RemoveAurasDueToSpell(SPELL_BATTLE_STANDARD_ALLIANCE);

        // send defense message
        sWorld.SendDefenseMessage(ZONE_ID_ZANGARMARSH, LANG_OPVP_ZM_CAPTURE_GRAVEYARD_A);
    }
    else
    {
        // change banners
        RespawnGO(go, m_graveyardBannerHorde, true);
        SetBeaconArtKit(go, m_beamGraveyardRed, SPELL_BEAM_RED);

        // update world state
        SendUpdateWorldState(m_graveyardWorldState, WORLD_STATE_REMOVE);
        m_graveyardWorldState = WORLD_STATE_ZM_GRAVEYARD_HORDE;
        SendUpdateWorldState(m_graveyardWorldState, WORLD_STATE_ADD);

        // remove player flag aura
        player->RemoveAurasDueToSpell(SPELL_BATTLE_STANDARD_HORDE);

        // send defense message
        sWorld.SendDefenseMessage(ZONE_ID_ZANGARMARSH, LANG_OPVP_ZM_CAPTURE_GRAVEYARD_H);
    }

    // change the graveyard link
    sObjectMgr.SetGraveYardLinkTeam(GRAVEYARD_ID_TWIN_SPIRE, GRAVEYARD_ZONE_TWIN_SPIRE, team);

    // apply zone buff
    if (m_graveyardOwner != TEAM_NONE)
        BuffTeam(m_graveyardOwner, SPELL_TWIN_SPIRE_BLESSING, true);
    BuffTeam(team, SPELL_TWIN_SPIRE_BLESSING);

    // reset scout so that team cannot take flag
    UpdateScoutState(team, false);

    // update graveyard owner
    m_graveyardOwner = team;

    return false;
}
Beispiel #10
0
bool OutdoorPvPHP::ProcessCaptureEvent(GameObject* go, uint32 towerId, Team team, uint32 newWorldState, uint32 towerArtKit, uint32 towerAnim)
{
    // set artkits and process buffs
    if (team == ALLIANCE)
    {
        SetBannerVisual(go, CAPTURE_ARTKIT_ALLIANCE, CAPTURE_ANIM_ALLIANCE);

        // update counter state
        ++m_towersAlliance;
        SendUpdateWorldState(WORLD_STATE_HP_TOWER_COUNT_ALLIANCE, m_towersAlliance);

        if (m_towersAlliance == MAX_HP_TOWERS)
            BuffTeam(ALLIANCE, SPELL_HELLFIRE_SUPERIORITY_ALLIANCE);
    }
    else if (team == HORDE)
    {
        SetBannerVisual(go, CAPTURE_ARTKIT_HORDE, CAPTURE_ANIM_HORDE);

        // update counter
        ++m_towersHorde;
        SendUpdateWorldState(WORLD_STATE_HP_TOWER_COUNT_HORDE, m_towersHorde);

        if (m_towersHorde == MAX_HP_TOWERS)
            BuffTeam(HORDE, SPELL_HELLFIRE_SUPERIORITY_HORDE);
    }
    else
    {
        SetBannerVisual(go, CAPTURE_ARTKIT_NEUTRAL, CAPTURE_ANIM_NEUTRAL);

        if (m_towerOwner[towerId] == ALLIANCE)
        {
            if (m_towersAlliance == MAX_HP_TOWERS)
                BuffTeam(ALLIANCE, SPELL_HELLFIRE_SUPERIORITY_ALLIANCE, true);

            // update counter
            --m_towersAlliance;
            SendUpdateWorldState(WORLD_STATE_HP_TOWER_COUNT_ALLIANCE, m_towersAlliance);
        }
        else
        {
            if (m_towersHorde == MAX_HP_TOWERS)
                BuffTeam(HORDE, SPELL_HELLFIRE_SUPERIORITY_HORDE, true);

            // update counter
            --m_towersHorde;
            SendUpdateWorldState(WORLD_STATE_HP_TOWER_COUNT_HORDE, m_towersHorde);
        }
    }

    SetBannerVisual(go, m_banners[towerId], towerArtKit, towerAnim);

    // update tower state
    SendUpdateWorldState(m_towerWorldState[towerId], WORLD_STATE_REMOVE);
    m_towerWorldState[towerId] = newWorldState;
    SendUpdateWorldState(m_towerWorldState[towerId], WORLD_STATE_ADD);

    // update capture point owner
    m_towerOwner[towerId] = team;

    // the are no DB exceptions in this case
    return true;
}
Beispiel #11
0
bool OutdoorPvPEP::ProcessCaptureEvent(GameObject* go, uint32 towerId, Team team, uint32 newWorldState)
{
    if (team == ALLIANCE)
    {
        // update banner
        for (GuidList::const_iterator itr = m_towerBanners[towerId].begin(); itr != m_towerBanners[towerId].end(); ++itr)
            SetBannerVisual(go, (*itr), CAPTURE_ARTKIT_ALLIANCE, CAPTURE_ANIM_ALLIANCE);

        // update counter
        ++m_towersAlliance;
        SendUpdateWorldState(WORLD_STATE_EP_TOWER_COUNT_ALLIANCE, m_towersAlliance);

        // buff players
        BuffTeam(ALLIANCE, plaguelandsTowerBuffs[m_towersAlliance - 1].spellIdAlliance);
    }
    else if (team == HORDE)
    {
        // update banner
        for (GuidList::const_iterator itr = m_towerBanners[towerId].begin(); itr != m_towerBanners[towerId].end(); ++itr)
            SetBannerVisual(go, (*itr), CAPTURE_ARTKIT_HORDE, CAPTURE_ANIM_HORDE);

        // update counter
        ++m_towersHorde;
        SendUpdateWorldState(WORLD_STATE_EP_TOWER_COUNT_HORDE, m_towersHorde);

        // buff players
        BuffTeam(HORDE, plaguelandsTowerBuffs[m_towersHorde - 1].spellIdHorde);
    }
    else
    {
        // update banner
        for (GuidList::const_iterator itr = m_towerBanners[towerId].begin(); itr != m_towerBanners[towerId].end(); ++itr)
            SetBannerVisual(go, (*itr), CAPTURE_ARTKIT_NEUTRAL, CAPTURE_ANIM_NEUTRAL);

        if (m_towerOwner[towerId] == ALLIANCE)
        {
            // update counter
            --m_towersAlliance;
            SendUpdateWorldState(WORLD_STATE_EP_TOWER_COUNT_ALLIANCE, m_towersAlliance);

            if (m_towersAlliance == 0)
                BuffTeam(ALLIANCE, plaguelandsTowerBuffs[0].spellIdAlliance, true);
        }
        else
        {
            // update counter
            --m_towersHorde;
            SendUpdateWorldState(WORLD_STATE_EP_TOWER_COUNT_HORDE, m_towersHorde);

            if (m_towersHorde == 0)
                BuffTeam(HORDE, plaguelandsTowerBuffs[0].spellIdHorde, true);
        }
    }

    bool eventHandled = true;

    if (team != TEAM_NONE)
    {
        // update capture point owner before rewards are applied
        m_towerOwner[towerId] = team;

        // apply rewards of changed tower
        switch (towerId)
        {
            case TOWER_ID_NORTHPASS:
                RespawnGO(go, team == ALLIANCE ? m_lordaeronShrineAlliance : m_lordaeronShrineHorde, true);
                break;
            case TOWER_ID_CROWNGUARD:
                sObjectMgr.SetGraveYardLinkTeam(GRAVEYARD_ID_EASTERN_PLAGUE, GRAVEYARD_ZONE_EASTERN_PLAGUE, team);
                break;
            case TOWER_ID_EASTWALL:
                // Return false - allow the DB to handle summons
                if (m_towerOwner[TOWER_ID_NORTHPASS] != team)
                    eventHandled = false;
                break;
            case TOWER_ID_PLAGUEWOOD:
                // Return false - allow the DB to handle summons
                eventHandled = false;
                break;
        }
    }
    else
    {
        // remove rewards of changed tower
        switch (towerId)
        {
            case TOWER_ID_NORTHPASS:
                RespawnGO(go, m_towerOwner[TOWER_ID_NORTHPASS] == ALLIANCE ? m_lordaeronShrineAlliance : m_lordaeronShrineHorde, false);
                break;
            case TOWER_ID_CROWNGUARD:
                sObjectMgr.SetGraveYardLinkTeam(GRAVEYARD_ID_EASTERN_PLAGUE, GRAVEYARD_ZONE_EASTERN_PLAGUE, TEAM_INVALID);
                break;
            case TOWER_ID_EASTWALL:
                UnsummonSoldiers(go);
                break;
            case TOWER_ID_PLAGUEWOOD:
                UnsummonFlightMaster(go);
                break;
        }

        // update capture point owner after rewards have been removed
        m_towerOwner[towerId] = team;
    }

    // update tower state
    SendUpdateWorldState(m_towerWorldState[towerId], WORLD_STATE_REMOVE);
    m_towerWorldState[towerId] = newWorldState;
    SendUpdateWorldState(m_towerWorldState[towerId], WORLD_STATE_ADD);

    // there are some events which required further DB script
    return eventHandled;
}
Beispiel #12
0
bool OutdoorPvPTF::Update(uint32 diff)
{
    bool changed = false;

    if(changed = OutdoorPvP::Update(diff))
    {
        if(m_AllianceTowersControlled == TF_TOWER_NUM)
        {
            BuffTeam(ALLIANCE);
            m_IsLocked = true;
            SendUpdateWorldState(TF_UI_LOCKED_DISPLAY_NEUTRAL,uint32(0));
            SendUpdateWorldState(TF_UI_LOCKED_DISPLAY_HORDE,uint32(0));
            SendUpdateWorldState(TF_UI_LOCKED_DISPLAY_ALLIANCE,uint32(1));
            SendUpdateWorldState(TF_UI_TOWERS_CONTROLLED_DISPLAY, uint32(0));
        }
        else if(m_HordeTowersControlled == TF_TOWER_NUM)
        {
            BuffTeam(HORDE);
            m_IsLocked = true;
            SendUpdateWorldState(TF_UI_LOCKED_DISPLAY_NEUTRAL,uint32(0));
            SendUpdateWorldState(TF_UI_LOCKED_DISPLAY_HORDE,uint32(1));
            SendUpdateWorldState(TF_UI_LOCKED_DISPLAY_ALLIANCE,uint32(0));
            SendUpdateWorldState(TF_UI_TOWERS_CONTROLLED_DISPLAY, uint32(0));
        }
        else
            BuffTeam(NULL);
        SendUpdateWorldState(TF_UI_TOWER_COUNT_A, m_AllianceTowersControlled);
        SendUpdateWorldState(TF_UI_TOWER_COUNT_H, m_HordeTowersControlled);
    }
    if(m_IsLocked)
    {
        // lock timer is down, release lock
        if(m_LockTimer < diff)
        {
            m_LockTimer = TF_LOCK_TIME;
            m_LockTimerUpdate = 0;
            m_IsLocked = false;
            SendUpdateWorldState(TF_UI_TOWERS_CONTROLLED_DISPLAY, uint32(1));
            SendUpdateWorldState(TF_UI_LOCKED_DISPLAY_NEUTRAL,uint32(0));
            SendUpdateWorldState(TF_UI_LOCKED_DISPLAY_HORDE,uint32(0));
            SendUpdateWorldState(TF_UI_LOCKED_DISPLAY_ALLIANCE,uint32(0));
        }
        else
        {
            // worldstateui update timer is down, update ui with new time data
            if(m_LockTimerUpdate < diff)
            {
                m_LockTimerUpdate = TF_LOCK_TIME_UPDATE;
                uint32 minutes_left = m_LockTimer / 60000;
                hours_left = minutes_left / 60;
                minutes_left -= hours_left * 60;
                second_digit = minutes_left % 10;
                first_digit = minutes_left / 10;

                SendUpdateWorldState(TF_UI_LOCKED_TIME_MINUTES_FIRST_DIGIT,first_digit);
                SendUpdateWorldState(TF_UI_LOCKED_TIME_MINUTES_SECOND_DIGIT,second_digit);
                SendUpdateWorldState(TF_UI_LOCKED_TIME_HOURS,hours_left);
            } else m_LockTimerUpdate -= diff;
            m_LockTimer -= diff;
        }
    }
    return changed;
}
Beispiel #13
0
// Handle case when player returns a silithyst
bool OutdoorPvPSI::HandleAreaTrigger(Player* pPlayer, uint32 uiTriggerId)
{
    if (pPlayer->isGameMaster() || pPlayer->isDead())
        return false;

    if (uiTriggerId == AREATRIGGER_SILITHUS_ALLIANCE)
    {
        if (pPlayer->GetTeam() == ALLIANCE && pPlayer->HasAura(SPELL_SILITHYST))
        {
            // remove aura
            pPlayer->RemoveAurasDueToSpell(SPELL_SILITHYST);

            ++m_uiResourcesAlliance;
            if (m_uiResourcesAlliance == MAX_SILITHYST)
            {
                // apply buff to owner team
                BuffTeam(ALLIANCE, SPELL_CENARION_FAVOR);

                //send zone text and reset stats
                sWorld.SendZoneText(ZONE_ID_SILITHUS, sObjectMgr.GetMangosStringForDBCLocale(LANG_OPVP_SI_CAPTURE_A));

                m_zoneOwner = ALLIANCE;
                m_uiResourcesAlliance = 0;
                m_uiResourcesHorde = 0;
            }

            // update the world states
            UpdateWorldState();

            // reward the player
            pPlayer->CastSpell(pPlayer, SPELL_TRACES_OF_SILITHYST, true);
            pPlayer->RewardHonor(NULL, 1, HONOR_REWARD_SILITHYST);
            pPlayer->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(FACTION_CENARION_CIRCLE), REPUTATION_REWARD_SILITHYST);

            // complete quest
            if (pPlayer->GetQuestStatus(QUEST_SCOURING_DESERT_ALLIANCE) == QUEST_STATUS_INCOMPLETE)
                pPlayer->KilledMonsterCredit(NPC_SILITHUS_DUST_QUEST_ALLIANCE);

            return true;
        }
    }
    else if (uiTriggerId == AREATRIGGER_SILITHUS_HORDE)
    {
        if (pPlayer->GetTeam() == HORDE && pPlayer->HasAura(SPELL_SILITHYST))
        {
            // remove aura
            pPlayer->RemoveAurasDueToSpell(SPELL_SILITHYST);

            ++ m_uiResourcesHorde;
            if (m_uiResourcesHorde == MAX_SILITHYST)
            {
                // apply buff to owner team
                BuffTeam(HORDE, SPELL_CENARION_FAVOR);

                //send zone text and reset stats
                sWorld.SendZoneText(ZONE_ID_SILITHUS, sObjectMgr.GetMangosStringForDBCLocale(LANG_OPVP_SI_CAPTURE_H));
                m_zoneOwner = HORDE;
                m_uiResourcesAlliance = 0;
                m_uiResourcesHorde = 0;
            }

            // update world states
            UpdateWorldState();

            // reward the player
            pPlayer->CastSpell(pPlayer, SPELL_TRACES_OF_SILITHYST, true);
            pPlayer->RewardHonor(NULL, 1, HONOR_REWARD_SILITHYST);
            pPlayer->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(FACTION_CENARION_CIRCLE), REPUTATION_REWARD_SILITHYST);

            // complete quest
            if (pPlayer->GetQuestStatus(QUEST_SCOURING_DESERT_HORDE) == QUEST_STATUS_INCOMPLETE)
                pPlayer->KilledMonsterCredit(NPC_SILITHUS_DUST_QUEST_HORDE);

            return true;
        }
    }

    return false;
}
Beispiel #14
0
void OutdoorPvPEP::ProcessCaptureEvent(GameObject* pGo, uint32 uiTowerId, Team team, uint32 uiNewWorldState)
{
    if (team == ALLIANCE)
    {
        for (std::list<ObjectGuid>::iterator itr = m_lTowerBanners[uiTowerId].begin(); itr != m_lTowerBanners[uiTowerId].end(); ++itr)
            SetBannerVisual(pGo, (*itr), CAPTURE_ARTKIT_ALLIANCE, CAPTURE_ANIM_ALLIANCE);

        ++m_uiTowersAlliance;
        BuffTeam(ALLIANCE, m_aPlaguelandsTowerBuffs[m_uiTowersAlliance - 1].uiSpellIdAlliance);
    }
    else if (team == HORDE)
    {
        for (std::list<ObjectGuid>::iterator itr = m_lTowerBanners[uiTowerId].begin(); itr != m_lTowerBanners[uiTowerId].end(); ++itr)
            SetBannerVisual(pGo, (*itr), CAPTURE_ARTKIT_HORDE, CAPTURE_ANIM_HORDE);

        ++m_uiTowersHorde;
        BuffTeam(HORDE, m_aPlaguelandsTowerBuffs[m_uiTowersHorde - 1].uiSpellIdHorde);
    }
    else
    {
        for (std::list<ObjectGuid>::iterator itr = m_lTowerBanners[uiTowerId].begin(); itr != m_lTowerBanners[uiTowerId].end(); ++itr)
            SetBannerVisual(pGo, (*itr), CAPTURE_ARTKIT_NEUTRAL, CAPTURE_ANIM_NEUTRAL);

        if (m_capturePointOwner[uiTowerId] == ALLIANCE)
        {
            if (--m_uiTowersAlliance == 0)
                BuffTeam(ALLIANCE, m_aPlaguelandsTowerBuffs[0].uiSpellIdAlliance, true);
        }
        else
        {
            if (--m_uiTowersHorde == 0)
                BuffTeam(HORDE, m_aPlaguelandsTowerBuffs[0].uiSpellIdHorde, true);
        }
    }

    // handle rewards of each tower
    if (team != TEAM_NONE)
    {
        // update capture point owner
        m_capturePointOwner[uiTowerId] = team;

        switch (uiTowerId)
        {
            case TOWER_ID_NORTHPASS:
                UpdateShrine(pGo);
                break;
            case TOWER_ID_CROWNGUARD:
                SetGraveyard();
                break;
            case TOWER_ID_EASTWALL:
                if (m_capturePointOwner[TOWER_ID_NORTHPASS] != team)
                    SummonSoldiers(pGo);
                break;
            case TOWER_ID_PLAGUEWOOD:
                SummonFlightMaster(pGo);
                break;
        }
    }
    else
    {
        switch (uiTowerId)
        {
            case TOWER_ID_NORTHPASS:
                UpdateShrine(pGo, true);
                break;
            case TOWER_ID_CROWNGUARD:
                SetGraveyard(true);
                break;
            case TOWER_ID_EASTWALL:
                UnsummonSoldiers(pGo);
                break;
            case TOWER_ID_PLAGUEWOOD:
                UnsummonFlightMaster(pGo);
                break;
        }

        // update capture point owner
        m_capturePointOwner[uiTowerId] = team;
    }

    // update tower state
    SendUpdateWorldState(m_uiTowerWorldState[uiTowerId], WORLD_STATE_REMOVE);
    m_uiTowerWorldState[uiTowerId] = uiNewWorldState;
    SendUpdateWorldState(m_uiTowerWorldState[uiTowerId], WORLD_STATE_ADD);

    // update counter state
    UpdateWorldState();
}