コード例 #1
0
ファイル: BattlefieldWG.cpp プロジェクト: 16898500/SkyFireEMU
bool BattlefieldWG::Update(uint32 diff)
{
    bool m_return = Battlefield::Update(diff);
    if (m_saveTimer <= diff)
    {
        sWorld->setWorldState(BATTLEFIELD_WG_WORLD_STATE_ACTIVE, m_BattlefieldActive);
        sWorld->setWorldState(BATTLEFIELD_WG_WORLD_STATE_DEFENDER, m_DefenderTeam);
        sWorld->setWorldState(ClockWorldState[0], m_Timer);
        m_saveTimer = 60 * IN_MILLISECONDS;
    }
    else
        m_saveTimer -= diff;

    for (GuidSet::const_iterator itr = m_PlayersIsSpellImu.begin(); itr != m_PlayersIsSpellImu.end(); ++itr)
        if (Player* player = ObjectAccessor::FindPlayer(*itr))
        {
            if (player->HasAura(SPELL_SPIRITUAL_IMMUNITY))
            {
                const WorldSafeLocsEntry *graveyard = GetClosestGraveYard(player);
                if (graveyard)
                {
                    if (player->GetDistance2d(graveyard->x, graveyard->y) > 10.0f)
                    {
                        player->RemoveAurasDueToSpell(SPELL_SPIRITUAL_IMMUNITY);
                        m_PlayersIsSpellImu.erase(player->GetGUID());
                    }
                }
            }
        }

    if (m_BattlefieldActive)
    {
        for (uint8 team = 0; team < 2; ++team)
            for (GuidSet::const_iterator itr = m_vehicles[team].begin(); itr != m_vehicles[team].end(); ++itr)
                if (Unit* unit = ObjectAccessor::FindUnit(*itr))
                {
                    if (unit->IsInWater() && !unit->HasAura(SPELL_WINTERGRASP_WATER))
                        unit->AddAura(SPELL_WINTERGRASP_WATER, unit);
                    if (!unit->IsInWater() && unit->HasAura(SPELL_WINTERGRASP_WATER))
                        unit->RemoveAurasDueToSpell(SPELL_WINTERGRASP_WATER);
                }
    }

    for (uint8 team = 0; team < 2; ++team)
        for (GuidSet::const_iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
            if (Player* player = ObjectAccessor::FindPlayer(*itr))
                for (BfCapturePointMap::iterator cp_itr = m_capturePoints.begin(); cp_itr != m_capturePoints.end(); ++cp_itr)
                {
                    if ((*cp_itr).second->GetCapturePointGo()->GetExactDist2dSq(player) < 22500.0f) // 150*150
                    {
                        player->AddAura((*cp_itr).second->GetTeamId() == TEAM_HORDE ? SPELL_HORDE_CONTROLS_FACTORY_PHASE_SHIFT : SPELL_ALLIANCE_CONTROLS_FACTORY_PHASE_SHIFT, player);
                        player->RemoveAurasDueToSpell((*cp_itr).second->GetTeamId() == TEAM_ALLIANCE ? SPELL_HORDE_CONTROLS_FACTORY_PHASE_SHIFT : SPELL_ALLIANCE_CONTROLS_FACTORY_PHASE_SHIFT);
                        break;
                    }
                }

    return m_return;
}
コード例 #2
0
void BattlegroundIC::_NodeDeOccupied(uint8 node)
{
    if(!m_BgCreatures[node] || !GetBGCreature(node))
        return;

    std::vector<uint64> ghost_list = m_ReviveQueue[m_BgCreatures[node]];
    if (!ghost_list.empty())
    {
        WorldSafeLocsEntry const *ClosestGrave = NULL;
        for (std::vector<uint64>::const_iterator itr = ghost_list.begin(); itr != ghost_list.end(); ++itr)
        {
            Player* plr = sObjectMgr.GetPlayer(*itr);
            if (!plr)
                continue;

            if (!ClosestGrave)                              // cache
                ClosestGrave = GetClosestGraveYard(plr);

            if (ClosestGrave)
                plr->TeleportTo(GetMapId(), ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, plr->GetOrientation());
        }
    }
    //Remove spiritguide
    DelCreature(node);

    switch(node)
    {
    case BG_IC_NODE_WORKSHOP:
        DeSpawnNpcType(IC_TYPE_DEMOLISSER_H);
        DeSpawnNpcType(IC_TYPE_SIEGE_H);
        DeSpawnNpcType(IC_TYPE_DEMOLISSER_A);
        DeSpawnNpcType(IC_TYPE_SIEGE_A);
        break ;
    case BG_IC_NODE_DOCK:
        //pop de catapulte et lanceur de glaive
        DeSpawnNpcType(IC_TYPE_DOCKVEHICLE_A);
        DeSpawnNpcType(IC_TYPE_DOCKVEHICLE_H);
        break ;
    case BG_IC_NODE_HANGAR:
        for (int i = 0 ; i < MAX_BG_IC_OBJ; ++i)
        {
            if(BG_IC_OBJ[i].type == IC_TYPE_GUNSHIPTELEPORTER)
                DelObject(BG_IC_OBJ[i].id);
        }        
        break ;
    }
}
コード例 #3
0
void BattlegroundIC::RealocatePlayers(ICNodePointType nodeType)
{
    // Those who are waiting to resurrect at this node are taken to the closest own node's graveyard
    std::vector<uint64> ghost_list = m_ReviveQueue[BgCreatures[BG_IC_NPC_SPIRIT_GUIDE_1+nodeType-2]];
    if (!ghost_list.empty())
    {
        WorldSafeLocsEntry const* ClosestGrave = NULL;
        for (std::vector<uint64>::const_iterator itr = ghost_list.begin(); itr != ghost_list.end(); ++itr)
        {
            Player* player = ObjectAccessor::FindPlayer(*itr);
            if (!player)
                continue;

            if (!ClosestGrave)                              // cache
                ClosestGrave = GetClosestGraveYard(player);

            if (ClosestGrave)
                player->TeleportTo(GetMapId(), ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, player->GetOrientation());
        }
    }
}
コード例 #4
0
bool BattlefieldTB::Update(uint32 diff)
{
    bool m_return = Battlefield::Update(diff);
    if (m_saveTimer <= diff)
    {
        sWorld->setWorldState(WS_TB_NEXT_BATTLE_TIMER_ENABLED, m_isActive);
        sWorld->setWorldState(WS_TB_HORDE_DEFENCE, m_DefenderTeam);
        sWorld->setWorldState(ClockBTWorldState[0], m_Timer);
        m_saveTimer = 60 * IN_MILLISECONDS;
    } 
    else 
        m_saveTimer -= diff;

    for (GuidSet::const_iterator itr = m_PlayersIsSpellImu.begin(); itr != m_PlayersIsSpellImu.end(); ++itr)
    {
        if (Player* plr = sObjectMgr->GetPlayerByLowGUID((*itr)))
        {
            if (plr->HasAura(SPELL_TB_SPIRITUAL_IMMUNITY))
            {
                const WorldSafeLocsEntry* graveyard = GetClosestGraveYard(plr);
                if (graveyard)
                {
                    if (plr->GetDistance2d(graveyard->x, graveyard->y) > 10.0f)
                    {
                        plr->RemoveAurasDueToSpell(SPELL_TB_SPIRITUAL_IMMUNITY);
                        m_PlayersIsSpellImu.erase(plr->GetGUID());
                    }
                }
            }
        }
    }

    if (m_isActive)
        if (m_Data32[BATTLEFIELD_TB_DATA_CAPTURED] == 3)
            EndBattle(false);

    return m_return;
}
コード例 #5
0
bool BattlefieldTB::Update(uint32 diff)
{
    bool m_return = Battlefield::Update(diff);
    if (m_saveTimer <= diff)
    {
        sWorld->setWorldState(5387, m_WarTime);
        if (IsWarTime())
        {
            sWorld->setWorldState(5546, GetAttackerTeam());
            sWorld->setWorldState(5547, GetAttackerTeam());
        }
        else
            sWorld->setWorldState(5384, m_DefenderTeam);
        sWorld->setWorldState(TBClockWorldState[0], m_Timer );
        m_saveTimer = 60 * IN_MILLISECONDS;
    }
    else
        m_saveTimer -= diff;

    for (GuidSet::const_iterator itr = m_PlayersIsSpellImu.begin(); itr != m_PlayersIsSpellImu.end(); ++itr)
        if (Player* player = ObjectAccessor::FindPlayer((*itr)))
        {
            if (player->HasAura(SPELL_SPIRITUAL_IMMUNITY_TB))
            {
                const WorldSafeLocsEntry* graveyard = GetClosestGraveYard(player);
                if (graveyard)
                {
                    if (player->GetDistance2d(graveyard->x, graveyard->y) > 6.0f)
                    {
                        player->RemoveAurasDueToSpell(SPELL_SPIRITUAL_IMMUNITY_TB);
                        m_PlayersIsSpellImu.erase(player->GetGUID());
                    }
                }
            }
        }
    return m_return;
}