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; }
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; } } } }
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; } } } }
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; }
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); } } } }