Ejemplo n.º 1
0
bool Battlefield::Update(uint32 diff)
{
    if (m_Timer <= diff)
    {
        // Battlefield ends on time
        if (IsWarTime())
            EndBattle(true);
        else // Time to start a new battle!
            StartBattle();
    }
    else
        m_Timer -= diff;

    // Invite players a few minutes before the battle's beginning
    if (!IsWarTime() && !m_StartGrouping && m_Timer <= m_StartGroupingTimer)
    {
        m_StartGrouping = true;
        InvitePlayersInZoneToQueue();
        OnStartGrouping();
    }

    bool objective_changed = false;
    if (IsWarTime())
    {
        if (m_uiKickAfkPlayersTimer <= diff)
        {
            m_uiKickAfkPlayersTimer = 1000;
            KickAfkPlayers();
        }
        else
            m_uiKickAfkPlayersTimer -= diff;

        // Kick players who chose not to accept invitation to the battle
        if (m_uiKickDontAcceptTimer <= diff)
        {
			time_t now = time(NULL);
            for (int team = 0; team < 2; team++)
                for (PlayerTimerMap::iterator itr = m_InvitedPlayers[team].begin(); itr != m_InvitedPlayers[team].end(); ++itr)
					if (itr->second <= now)
						 KickPlayerFromBattlefield(itr->first);

            InvitePlayersInZoneToWar();
            for (int team = 0; team < 2; team++)
                for (PlayerTimerMap::iterator itr = m_PlayersWillBeKick[team].begin(); itr != m_PlayersWillBeKick[team].end(); ++itr)
					if (itr->second <= now)
						 KickPlayerFromBattlefield(itr->first);

            m_uiKickDontAcceptTimer = 1000;
        }
        else
            m_uiKickDontAcceptTimer -= diff;

        for (BfCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
            if (itr->second->Update(diff))
                objective_changed = true;
    }


    if (m_LastResurectTimer <= diff)
    {
        for (uint8 i = 0; i < m_GraveyardList.size(); i++)
            if (GetGraveyardById(i))
                m_GraveyardList[i]->Resurrect();
        m_LastResurectTimer = RESURRECTION_INTERVAL;
    }
    else
        m_LastResurectTimer -= diff;

    return objective_changed;
}
Ejemplo n.º 2
0
void BattlefieldWG::OnCreatureCreate(Creature* creature)
{
    // Accessing to db spawned creatures
    switch (creature->GetEntry())
    {
        case NPC_DWARVEN_SPIRIT_GUIDE:
        case NPC_TAUNKA_SPIRIT_GUIDE:
        {
            TeamId teamId = (creature->GetEntry() == NPC_DWARVEN_SPIRIT_GUIDE ? TEAM_ALLIANCE : TEAM_HORDE);
            uint8 graveyardId = GetSpiritGraveyardId(creature->GetAreaId());
            if (m_GraveyardList[graveyardId])
                m_GraveyardList[graveyardId]->SetSpirit(creature, teamId);
            break;
        }
    }

    // untested code - not sure if it is valid.
    if (IsWarTime())
    {
        switch (creature->GetEntry())
        {
            case NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE:
            case NPC_WINTERGRASP_SIEGE_ENGINE_HORDE:
            case NPC_WINTERGRASP_CATAPULT:
            case NPC_WINTERGRASP_DEMOLISHER:
            {
                if (!creature->ToTempSummon()->GetSummonerGUID() || !sObjectAccessor->FindPlayer(creature->ToTempSummon()->GetSummonerGUID()))
                {
                    creature->setDeathState(DEAD);
                    creature->RemoveFromWorld();
                    return;
                }
                Player* creator = sObjectAccessor->FindPlayer(creature->ToTempSummon()->GetSummonerGUID());
                TeamId team = creator->GetTeamId();

                if (team == TEAM_HORDE)
                {
                    if (GetData(BATTLEFIELD_WG_DATA_VEHICLE_H) < GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H))
                    {
                        UpdateData(BATTLEFIELD_WG_DATA_VEHICLE_H, 1);
                        creature->AddAura(SPELL_HORDE_FLAG, creature);
                        m_vehicles[team].insert(creature->GetGUID());
                        UpdateVehicleCountWG();
                    }
                    else
                    {
                        creature->setDeathState(DEAD);
                        creature->RemoveFromWorld();
                        return;
                    }
                }
                else
                {
                    if (GetData(BATTLEFIELD_WG_DATA_VEHICLE_A) < GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A))
                    {
                        UpdateData(BATTLEFIELD_WG_DATA_VEHICLE_A, 1);
                        creature->AddAura(SPELL_ALLIANCE_FLAG, creature);
                        m_vehicles[team].insert(creature->GetGUID());
                        UpdateVehicleCountWG();
                    }
                    else
                    {
                        creature->setDeathState(DEAD);
                        creature->RemoveFromWorld();
                        return;
                    }
                }

                creature->CastSpell(creator, SPELL_GRAB_PASSENGER, true);
                break;
            }
        }
    }
}
Ejemplo n.º 3
0
void BattlefieldWG::OnCreatureCreate(Creature *creature, bool add)
{
    if (IsWarTime())
    {
        switch (creature->GetEntry())
        {
            case 28312:
            case 32627:
            case 27881:
            case 28094:
                {
                    uint8 team;
                    if (creature->getFaction() == WintergraspFaction[TEAM_ALLIANCE])
                        team = TEAM_ALLIANCE;
                    else if (creature->getFaction() == WintergraspFaction[TEAM_HORDE])
                        team = TEAM_HORDE;
                    else
                        return;

                    if (add)
                    {
                        if (team == TEAM_HORDE)
                        {
                            m_Data32[BATTLEFIELD_WG_DATA_VEHICLE_H]++;
                            if (GetData(BATTLEFIELD_WG_DATA_VEHICLE_H) <= GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H))
                            {
                                creature->AddAura(SPELL_HORDE_FLAG, creature);
                                m_vehicles[team].insert(creature->GetGUID());
                                UpdateVehicleCountWG();
                            }
                            else
                            {
                                creature->setDeathState(DEAD);
                                creature->SetRespawnTime(RESPAWN_ONE_DAY);
                                return;
                            }
                        }
                        else
                        {
                            m_Data32[BATTLEFIELD_WG_DATA_VEHICLE_A]++;
                            if (GetData(BATTLEFIELD_WG_DATA_VEHICLE_A) <= GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A))
                            {
                                creature->AddAura(SPELL_ALLIANCE_FLAG, creature);
                                m_vehicles[team].insert(creature->GetGUID());
                                UpdateVehicleCountWG();
                            }
                            else
                            {
                                creature->setDeathState(DEAD);
                                creature->SetRespawnTime(RESPAWN_ONE_DAY);
                                return;
                            }
                        }
                    }
                    else
                    {
                        m_vehicles[team].erase(creature->GetGUID());
                        if (team == TEAM_HORDE)
                            m_Data32[BATTLEFIELD_WG_DATA_VEHICLE_H]--;
                        else
                            m_Data32[BATTLEFIELD_WG_DATA_VEHICLE_A]--;
                        UpdateVehicleCountWG();
                    }
                    break;
                }
        }
    }
}
Ejemplo n.º 4
0
bool Battlefield::Update(uint32 diff)
{
    //When global timer is end
    if (m_Timer <= diff)
    {
        //Here end of battle by timer
        if (IsWarTime())
            EndBattle(true);
        //Start of battle
        else
            StartBattle();
    }
    else
        m_Timer -= diff;

    //Some times before battle start invite player to queue
    if (!m_StartGrouping && m_Timer <= m_StartGroupingTimer)
    {
        m_StartGrouping = true;
        InvitePlayerInZoneToQueue();
        OnStartGrouping();                                  // for scripting
    }

    bool objective_changed = false;
    if (IsWarTime())
    {
        if (m_uiKickAfkTimer <= diff)
        {
            m_uiKickAfkTimer = 1000;
            KickAfk();
        }
        else
            m_uiKickAfkTimer -= diff;

        //Here kick player witch dont have accept invitation to join the war when time is end (time of windows)
        if (m_uiKickDontAcceptTimer <= diff)
        {
            for (int team = 0; team < 2; team++)
                for (PlayerTimerMap::iterator itr = m_InvitedPlayers[team].begin(); itr != m_InvitedPlayers[team].end(); itr++)
                    if ((*itr).second <= time(NULL))
                        KickPlayerFromBf((*itr).first);
            InvitePlayerInZoneToWar();
            for (int team = 0; team < 2; team++)
                for (PlayerTimerMap::iterator itr = m_PlayersWillBeKick[team].begin(); itr != m_PlayersWillBeKick[team].end(); itr++)
                    if ((*itr).second <= time(NULL))
                        KickPlayerFromBf((*itr).first);

            m_uiKickDontAcceptTimer = 1000;
        }
        else
            m_uiKickDontAcceptTimer -= diff;

        for (BfCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
            if (itr->second->Update(diff))
                objective_changed = true;
    }

    if (m_LastResurectTimer <= diff)
    {
        for (uint8 i = 0; i < m_GraveYardList.size(); i++)
            if (GetGraveYardById(i))
                m_GraveYardList[i]->Resurrect();
        m_LastResurectTimer = RESURRECTION_INTERVAL;
    }
    else
        m_LastResurectTimer -= diff;

    return objective_changed;
}
Ejemplo n.º 5
0
void BattlefieldTB::FillInitialWorldStates(WorldPacket& data)
{
    data << uint32(WS_TB_BATTLE_TIMER_ENABLED) << uint32(IsWarTime() ? 1 : 0);
    data << uint32(WS_TB_BATTLE_TIMER) << uint32(IsWarTime() ? uint32(time(NULL) + GetTimer() / 1000) : 0);
    data << uint32(WS_TB_COUNTER_BUILDINGS) << uint32(0);
    data << uint32(WS_TB_COUNTER_BUILDINGS_ENABLED) << uint32(IsWarTime() ? 1 : 0);
    data << uint32(WS_TB_HORDE_DEFENCE) << uint32(IsWarTime() ? (GetDefenderTeam() == TEAM_HORDE ? 1 : 0) : 0);
    data << uint32(WS_TB_ALLIANCE_DEFENCE) << uint32(IsWarTime() ? (GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0) : 0);
    data << uint32(WS_TB_NEXT_BATTLE_TIMER_ENABLED) << uint32(IsWarTime() ? 0 : 1);
    data << uint32(WS_TB_NEXT_BATTLE_TIMER) << uint32(!IsWarTime() ? uint32(time(NULL) + GetTimer() / 1000) : 0);
    data << uint32(WS_TB_ALLIANCE_ATTACK) << uint32(IsWarTime() ? (GetAttackerTeam() == TEAM_ALLIANCE ? 1 : 0) : 0);
    data << uint32(WS_TB_HORDE_ATTACK) << uint32(IsWarTime() ? (GetAttackerTeam() == TEAM_HORDE ? 1 : 0) : 0);

    if (!IsWarTime())
        data << uint32(WS_TB_NEXT_BATTLE_TIMER) << uint32(time(NULL) + (GetTimer() / 1000));
    else
        data << uint32(WS_TB_NEXT_BATTLE_TIMER) << uint32(0);
    data << uint32(WS_TB_KEEP_HORDE_DEFENCE) << uint32(GetDefenderTeam() == TEAM_HORDE ? 1 : 0);
    data << uint32(WS_TB_KEEP_ALLIANCE_DEFENCE) << uint32(GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0);

    for (TbWorkShop::const_iterator itr = WorkShopList.begin(); itr != WorkShopList.end(); ++itr)
    {
        for (int i = 0; i < MAX_CP_DIFF; i++)
        {
            switch (i)
            {
            case ALLIANCE_DEFENCE:
                if ((*itr)->m_State == BATTLEFIELD_TB_OBJECTSTATE_ALLIANCE_INTACT)
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(1);
                else
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(0);
                break;
            case HORDE_DEFENCE:
                if ((*itr)->m_State == BATTLEFIELD_TB_OBJECTSTATE_HORDE_INTACT)
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(1);
                else
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(0);
                break;
            case ALLIANCE_ATTACK:
                if ((*itr)->m_State == BF_CAPTUREPOINT_OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE || (*itr)->m_State == BF_CAPTUREPOINT_OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE)
                    data << (uint32)((*itr)->m_WorldState + ALLIANCE_ATTACK) << uint32(1);
                else
                    data << (uint32)((*itr)->m_WorldState + ALLIANCE_ATTACK) << uint32(0);
                break;
            case HORDE_ATTACK:
                if ((*itr)->m_State == BF_CAPTUREPOINT_OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE || (*itr)->m_State == BF_CAPTUREPOINT_OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE)
                    data << (uint32)((*itr)->m_WorldState + HORDE_ATTACK) << uint32(1);
                else
                    data << (uint32)((*itr)->m_WorldState + HORDE_ATTACK) << uint32(0);
                break;
            default:
                data << (uint32)((*itr)->m_WorldState + NEUTRAL) << uint32(1);
            }
        }
    }

    for (TbGameObjectBuilding::const_iterator itr = BuildingsInZone.begin(); itr != BuildingsInZone.end(); ++itr)
    {
        for (int i = 0; i < BUILDING_MAX_DIFF; i++)
        {
            switch (i)
            {
            case BUILDING_HORDE_DEFENCE:
                if ((*itr)->m_State == (BATTLEFIELD_TB_OBJECTSTATE_ALLIANCE_INTACT - TEAM_HORDE * 3))
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(1);
                else
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(0);
                break;
            case BUILDING_HORDE_DEFENCE_DAMAGED:
                if ((*itr)->m_State == (BATTLEFIELD_TB_OBJECTSTATE_ALLIANCE_DAMAGE - TEAM_HORDE * 3))
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(1);
                else
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(0);
                break;
            case BUILDING_DESTROYED:
                if ((*itr)->m_State == BATTLEFIELD_TB_OBJECTSTATE_ALLIANCE_DESTROY - TEAM_HORDE * 3)
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(1);
                else
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(0);
                break;
            case BUILDING_ALLIANCE_DEFENCE:
                if ((*itr)->m_State == (BATTLEFIELD_TB_OBJECTSTATE_ALLIANCE_INTACT - TEAM_ALLIANCE * 3))
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(1);
                else
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(0);
                break;
            case BUILDING_ALLIANCE_DEFENCE_DAMAGED:
                if ((*itr)->m_State == (BATTLEFIELD_TB_OBJECTSTATE_ALLIANCE_DAMAGE - TEAM_ALLIANCE * 3))
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(1);
                else
                    data << (uint32)((*itr)->m_WorldState + i) << uint32(0);
                break;
            default:
                data << (uint32)((*itr)->m_WorldState + BUILDING_DESTROYED) << uint32(1);
            }
        }
    }
}