void Update(uint32 diff) override { if (CageTimer) { if (CageTimer <= diff) { Creature* Magtheridon = instance->GetCreature(MagtheridonGUID); if (Magtheridon && Magtheridon->IsAlive()) { Magtheridon->ClearUnitState(UNIT_STATE_STUNNED); Magtheridon->AI()->AttackStart(Magtheridon->SelectNearestTarget(999)); } CageTimer = 0; } else CageTimer -= diff; } if (RespawnTimer) { if (RespawnTimer <= diff) { for (GuidSet::const_iterator i = ChannelerGUID.begin(); i != ChannelerGUID.end(); ++i) { if (Creature* Channeler = instance->GetCreature(*i)) { if (Channeler->IsAlive()) Channeler->AI()->EnterEvadeMode(); else Channeler->Respawn(); } } RespawnTimer = 0; } else RespawnTimer -= diff; } }
void ActivatePrisoners(GuidSet const& prisoners) { for (GuidSet::const_iterator i = prisoners.begin(); i != prisoners.end(); ++i) if (Creature* prisoner = instance->GetCreature(*i)) { prisoner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); prisoner->SetInCombatWithZone(); } }
void DespawnIntroCreatures() { if (m_pInstance) { for (GuidSet::const_iterator itr = m_lIntroMobsSet.begin(); itr != m_lIntroMobsSet.end(); ++itr) { if (Creature* pCreature = m_pInstance->instance->GetCreature(*itr)) pCreature->ForcedDespawn(); } } m_lIntroMobsSet.clear(); }
bool Transport::RemovePassenger(WorldObject* passenger) { GetTransportKit()->RemovePassenger(passenger); if (passenger->isType(TYPEMASK_UNIT)) { GuidSet groupPetsCopy = ((Unit*)passenger)->GetPets(); if (!groupPetsCopy.empty()) { for (GuidSet::const_iterator itr = groupPetsCopy.begin(); itr != groupPetsCopy.end(); ++itr) if (Pet* pPet = GetMap()->GetPet(*itr)) if (pPet && pPet->IsInWorld()) GetTransportKit()->RemovePassenger(pPet); } } return true; }
void WorldPvPNA::HandleObjectiveComplete(GuidSet m_sPlayersSet, uint32 uiEventId) { if (uiEventId == EVENT_HALAA_BANNER_WIN_ALLIANCE || uiEventId == EVENT_HALAA_BANNER_WIN_HORDE) { for (GuidSet::iterator itr = m_sPlayersSet.begin(); itr != m_sPlayersSet.end(); ++itr) { if (!(*itr)) continue; Player* pPlayer = sObjectMgr.GetPlayer(*itr); if (!pPlayer) continue; pPlayer->KilledMonsterCredit(NPC_HALAA_COMBATANT); } } }
void DespawnAdds() { if (m_pInstance) { for (GuidSet::const_iterator itr = m_lAddsSet.begin(); itr != m_lAddsSet.end(); ++itr) { if (Creature* pCreature = m_pInstance->instance->GetCreature(*itr)) { if (pCreature->isAlive()) { pCreature->AI()->EnterEvadeMode(); pCreature->ForcedDespawn(15000); } } } } m_lAddsSet.clear(); }
void UpdateData::AddOutOfRangeGUID(GuidSet& guids) { m_outOfRangeGUIDs.insert(guids.begin(), guids.end()); }
void ResetPrisoners(GuidSet const& prisoners) { for (GuidSet::const_iterator i = prisoners.begin(); i != prisoners.end(); ++i) if (Creature* prisoner = instance->GetCreature(*i)) ResetPrisoner(prisoner); }
void SetData(uint32 type, uint32 data) override { switch (type) { case DATA_MAGTHERIDON_EVENT: m_auiEncounter[0] = data; if (data == NOT_STARTED) RespawnTimer = 10000; if (data != IN_PROGRESS) HandleGameObject(DoorGUID, true); break; case DATA_CHANNELER_EVENT: switch (data) { case NOT_STARTED: // Reset all channelers once one is reset. if (m_auiEncounter[1] != NOT_STARTED) { m_auiEncounter[1] = NOT_STARTED; for (GuidSet::const_iterator i = ChannelerGUID.begin(); i != ChannelerGUID.end(); ++i) { if (Creature* Channeler = instance->GetCreature(*i)) { if (Channeler->IsAlive()) Channeler->AI()->EnterEvadeMode(); else Channeler->Respawn(); } } CageTimer = 0; HandleGameObject(DoorGUID, true); } break; case IN_PROGRESS: // Event start. if (m_auiEncounter[1] != IN_PROGRESS) { m_auiEncounter[1] = IN_PROGRESS; // Let all five channelers aggro. for (GuidSet::const_iterator i = ChannelerGUID.begin(); i != ChannelerGUID.end(); ++i) { Creature* Channeler = instance->GetCreature(*i); if (Channeler && Channeler->IsAlive()) Channeler->AI()->AttackStart(Channeler->SelectNearestTarget(999)); } // Release Magtheridon after two minutes. Creature* Magtheridon = instance->GetCreature(MagtheridonGUID); if (Magtheridon && Magtheridon->IsAlive()) { Magtheridon->TextEmote(EMOTE_BONDS_WEAKEN); CageTimer = 120000; } HandleGameObject(DoorGUID, false); } break; case DONE: // Add buff and check if all channelers are dead. for (GuidSet::const_iterator i = ChannelerGUID.begin(); i != ChannelerGUID.end(); ++i) { Creature* Channeler = instance->GetCreature(*i); if (Channeler && Channeler->IsAlive()) { //Channeler->CastSpell(Channeler, SPELL_SOUL_TRANSFER, true); data = IN_PROGRESS; break; } } break; } m_auiEncounter[1] = data; break; case DATA_COLLAPSE: // true - collapse / false - reset for (GuidSet::const_iterator i = ColumnGUID.begin(); i != ColumnGUID.end(); ++i) DoUseDoorOrButton(*i); break; default: break; } }
void WorldSession::SendLfgUpdateList(uint32 dungeonID) { if (!sWorld.getConfig(CONFIG_BOOL_LFR_ENABLE)) { DEBUG_LOG("SendLfgUpdateList %u failed - Raid finder disabled", GetPlayer()->GetObjectGuid().GetCounter()); return; } DEBUG_LOG("SMSG_LFG_SEARCH_RESULTS %u dungeonentry: %u ", GetPlayer()->GetObjectGuid().GetCounter(), dungeonID); LFGDungeonEntry const* dungeon = sLFGMgr.GetDungeon(dungeonID); if (!dungeon) return; Team team = sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_GROUP) ? TEAM_NONE : GetPlayer()->GetTeam(); GuidSet groups = sLFGMgr.GetDungeonGroupQueue(dungeon, team); GuidSet players = sLFGMgr.GetDungeonPlayerQueue(dungeon, team); uint32 groupCount = groups.size(); uint32 groupSize = 4+4; for (GuidSet::const_iterator itr = groups.begin(); itr != groups.end(); ++itr) { Group* pGroup = sObjectMgr.GetGroup(*itr); if (!pGroup) continue; Player* pLeader = sObjectMgr.GetPlayer(pGroup->GetLeaderGuid()); if (!pLeader) continue; sLFGMgr.GetLFGPlayerState(pLeader->GetObjectGuid())->AddFlags(LFG_MEMBER_FLAG_CHARINFO | LFG_MEMBER_FLAG_COMMENT | LFG_MEMBER_FLAG_GROUPLEADER | LFG_MEMBER_FLAG_GROUPGUID | LFG_MEMBER_FLAG_ROLES | LFG_MEMBER_FLAG_AREA | LFG_MEMBER_FLAG_STATUS | LFG_MEMBER_FLAG_BIND); uint32 flags = sLFGMgr.GetLFGPlayerState(pLeader->GetObjectGuid())->GetFlags(); if (flags & LFG_MEMBER_FLAG_COMMENT) groupSize += sLFGMgr.GetLFGPlayerState(pLeader->GetObjectGuid())->GetComment().size()+1; if (flags & LFG_MEMBER_FLAG_ROLES) groupSize +=3; if (flags & LFG_MEMBER_FLAG_BIND) groupSize += (8+4); players.insert(*itr); for (GroupReference *itr2 = pGroup->GetFirstMember(); itr2 != NULL; itr2 = itr2->next()) { Player* player = itr2->getSource(); if (!player || player == pLeader) continue; sLFGMgr.GetLFGPlayerState(player->GetObjectGuid())->AddFlags(LFG_MEMBER_FLAG_GROUPLEADER | LFG_MEMBER_FLAG_GROUPGUID | LFG_MEMBER_FLAG_STATUS); sLFGMgr.GetLFGPlayerState(player->GetObjectGuid())->RemoveFlags(LFG_MEMBER_FLAG_CHARINFO | LFG_MEMBER_FLAG_COMMENT | LFG_MEMBER_FLAG_ROLES | LFG_MEMBER_FLAG_AREA | LFG_MEMBER_FLAG_BIND); players.insert(player->GetObjectGuid()); } } uint32 playerCount = players.size(); uint32 playerSize = 4+4; uint32 guidsSize = 0; GuidSet playersUpdated; playersUpdated.clear(); for(GuidSet::const_iterator itr = players.begin(); itr != players.end(); ++itr) { Player* player = sObjectMgr.GetPlayer(*itr); if (!player || !player->IsInWorld()) continue; uint32 flags = sLFGMgr.GetLFGPlayerState(player->GetObjectGuid())->GetFlags(); playerSize += (8+4); if (flags & LFG_MEMBER_FLAG_CHARINFO) playerSize += (1+1+1+3+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4); if (flags & LFG_MEMBER_FLAG_COMMENT) playerSize += sLFGMgr.GetLFGPlayerState(player->GetObjectGuid())->GetComment().size()+1; // comment if (flags & LFG_MEMBER_FLAG_GROUPLEADER) playerSize += 1; if (flags & LFG_MEMBER_FLAG_GROUPGUID) playerSize += 8; if (flags & LFG_MEMBER_FLAG_ROLES) playerSize += 1; if (flags & LFG_MEMBER_FLAG_AREA) playerSize += 4; if (flags & LFG_MEMBER_FLAG_STATUS) playerSize += 1; if (flags & LFG_MEMBER_FLAG_BIND) playerSize += (8+4); if (flags & LFG_MEMBER_FLAG_UPDATE) { sLFGMgr.GetLFGPlayerState(player->GetObjectGuid())->RemoveFlags(LFG_MEMBER_FLAG_UPDATE); playersUpdated.insert(player->GetObjectGuid()); guidsSize += 8; } } WorldPacket data(SMSG_LFG_SEARCH_RESULTS, 4 + 4 + 1 + groupSize + playerSize + guidsSize); data << uint32(dungeon->type); // type data << uint32(dungeon->Entry()); // entry from LFGDungeons.dbc if (!playersUpdated.empty()) { data << uint8(playersUpdated.size()); for (GuidSet::const_iterator itr = playersUpdated.begin(); itr != playersUpdated.end(); ++itr) { data << *itr; // player guid } } else data << uint8(0); if (!groups.empty()) { data << uint32(groupCount); // groups count data << uint32(groupCount); // groups count2 for (GuidSet::const_iterator itr = groups.begin(); itr != groups.end(); ++itr) { Group* group = sObjectMgr.GetGroup(*itr); if (!group) continue; Player* leader = sObjectMgr.GetPlayer(group->GetLeaderGuid()); uint32 flags = sLFGMgr.GetLFGPlayerState(leader->GetObjectGuid())->GetFlags(); data << group->GetObjectGuid(); data << flags; if (flags & LFG_MEMBER_FLAG_COMMENT) { data << sLFGMgr.GetLFGPlayerState(leader->GetObjectGuid())->GetComment().c_str(); } if (flags & LFG_MEMBER_FLAG_ROLES) { for (int i = 0; i < 3; ++i) { // need implement function for roles count calculation. or not need? data << uint8(0); } } if (flags & LFG_MEMBER_FLAG_BIND) { ObjectGuid instanceGuid; uint32 encounters = 0; if (InstancePlayerBind* bind = leader->GetBoundInstance(dungeon->map, Difficulty(dungeon->difficulty))) { if (DungeonPersistentState* state = bind->state) { instanceGuid = state->GetInstanceGuid(); encounters = state->GetCompletedEncountersMask(); } } data << instanceGuid; data << encounters; } } } else { data << uint32(0); data << uint32(0); // groups count2 } if (!players.empty()) { data << uint32(playerCount); // players count data << uint32(playerCount); // players count 2 for(GuidSet::const_iterator itr = players.begin(); itr != players.end(); ++itr) { Player* player = sObjectMgr.GetPlayer(*itr); if (!player || !player->IsInWorld()) continue; uint32 flags = sLFGMgr.GetLFGPlayerState(player->GetObjectGuid())->GetFlags(); data << *itr; // guid data << flags; // flags if (flags & LFG_MEMBER_FLAG_CHARINFO) // charinfo { data << uint8(player->getLevel()); data << uint8(player->getClass()); data << uint8(player->getRace()); for(int i = 0; i < 3; ++i) data << uint8(player->GetTalentsCount(i)); // spent talents count in specific tab data << uint32(player->GetArmor()); // armor data << uint32(player->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SPELL)); // spd data << uint32(player->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_SPELL)); // heal data << uint32(player->GetRatingBonusValue(CR_CRIT_MELEE)); // crit rating melee data << uint32(player->GetRatingBonusValue(CR_CRIT_RANGED)); // crit rating ranged data << uint32(player->GetRatingBonusValue(CR_CRIT_SPELL)); // crit rating spell data << float(player->GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER)*5); // mp5 data << float(player->GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER)*5); // unk data << uint32(player->GetTotalAttackPowerValue(BASE_ATTACK)); // attack power data << uint32(player->GetTotalStatValue(STAT_AGILITY)); // agility data << uint32(player->GetMaxHealth()); // health data << uint32(player->GetMaxPower(player->GetPowerType())); // power data << uint32(player->GetFreeTalentPoints()); // free talent points (TOM_RUS) data << float(0); // unk data << uint32(player->GetRatingBonusValue(CR_DEFENSE_SKILL)); // defence rating data << uint32(player->GetRatingBonusValue(CR_DODGE)); // dodge rating data << uint32(player->GetRatingBonusValue(CR_BLOCK)); // block rating data << uint32(player->GetRatingBonusValue(CR_PARRY)); // parry rating data << uint32(player->GetRatingBonusValue(CR_HASTE_MELEE)); // crit rating data << uint32(player->GetRatingBonusValue(CR_EXPERTISE)); // expertize } if (flags & LFG_MEMBER_FLAG_COMMENT) data << sLFGMgr.GetLFGPlayerState(player->GetObjectGuid())->GetComment().c_str(); // comment if (flags & LFG_MEMBER_FLAG_GROUPLEADER) // Group leader flag { bool isLeader = false; if (Group* group = player->GetGroup()) if (player->GetObjectGuid() == group->GetLeaderGuid()) isLeader = true; data << uint8(isLeader); } if (flags & LFG_MEMBER_FLAG_GROUPGUID) // Group guid { ObjectGuid groupGuid = ObjectGuid(); if (Group* group = player->GetGroup()) groupGuid = group->GetObjectGuid(); data << groupGuid; } if (flags & LFG_MEMBER_FLAG_ROLES) // rolesMask data << uint8(sLFGMgr.GetLFGPlayerState(player->GetObjectGuid())->GetRoles()); if (flags & LFG_MEMBER_FLAG_AREA) // Area data << uint32(player->GetAreaId()); if (flags & LFG_MEMBER_FLAG_STATUS) // status data << uint8(0); if (flags & LFG_MEMBER_FLAG_BIND) { ObjectGuid instanceGuid; uint32 encounters = 0; if (InstancePlayerBind* bind = player->GetBoundInstance(dungeon->map, Difficulty(dungeon->difficulty))) { if (DungeonPersistentState* state = bind->state) { instanceGuid = state->GetInstanceGuid(); encounters = state->GetCompletedEncountersMask(); } } data << instanceGuid; data << encounters; } } } else { data << uint32(0); // players count data << uint32(0); // unk } SendPacket(&data); }
void WorldSession::SendLfgUpdateProposal(LFGProposal* pProposal) { if (!sWorld.getConfig(CONFIG_BOOL_LFG_ENABLE)) { DEBUG_LOG("SendLfgUpdateProposal %u failed - Dungeon finder disabled", GetPlayer()->GetObjectGuid().GetCounter()); return; } if (!pProposal) return; LFGDungeonEntry const* dungeon = pProposal->GetDungeon(); if (!dungeon) { DEBUG_LOG("SMSG_LFG_PROPOSAL_UPDATE: no dungeon in proposal %u, returning.", pProposal->m_uiID); return; } ObjectGuid guid = GetPlayer()->GetObjectGuid(); bool isSameDungeon = false; bool isSameGroup = false; uint32 completedEncounters = 0; LFGRolesMap rolesMap; if (Group* group = pProposal->GetGroup()) { for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* pGroupMember = itr->getSource(); if (pGroupMember && pGroupMember->IsInWorld()) { rolesMap.insert(std::make_pair(pGroupMember->GetObjectGuid(), sLFGMgr.GetLFGPlayerState(pGroupMember->GetObjectGuid())->GetRoles())); if (InstancePlayerBind* bind = pGroupMember->GetBoundInstance(dungeon->map, Difficulty(dungeon->difficulty))) { if (DungeonPersistentState* state = bind->state) completedEncounters |= state->GetCompletedEncountersMask(); } } } // isContinue = group->isLFGGroup() && sLFGMgr->GetState(gguid) != LFG_STATE_FINISHED_DUNGEON; isSameDungeon = dungeon->map == GetPlayer()->GetMapId(); isSameGroup = GetPlayer()->GetGroup() == group; } GuidSet const proposalGuids = pProposal->GetMembers(); if (!proposalGuids.empty()) { for (GuidSet::const_iterator itr = proposalGuids.begin(); itr != proposalGuids.end(); ++itr) { Player* player = sObjectMgr.GetPlayer(*itr); if (player && player->IsInWorld()) rolesMap.insert(std::make_pair(player->GetObjectGuid(), sLFGMgr.GetLFGPlayerState(player->GetObjectGuid())->GetRoles())); } } uint32 size = rolesMap.size(); DEBUG_LOG("SMSG_LFG_PROPOSAL_UPDATE proposal %u, player %u, state: %u", pProposal->m_uiID, GetPlayer()->GetObjectGuid().GetCounter(), pProposal->GetState()); WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + size * (4 + 1 + 1 + 1 + 1 +1)); data << uint32(dungeon->Entry()); // Dungeon data << uint8(pProposal->GetState()); // Result state data << uint32(pProposal->m_uiID); // Internal Proposal ID data << uint32(completedEncounters); // Bosses killed data << uint8(isSameDungeon); // Silent (show client window) data << uint8(size); // Group size for (LFGRolesMap::const_iterator itr = rolesMap.begin(); itr != rolesMap.end(); ++itr) { Player* pPlayer = sObjectMgr.GetPlayer(itr->first); if (!pPlayer) continue; isSameDungeon = dungeon->map == pPlayer->GetMapId(); isSameGroup = pPlayer->GetGroup() == pProposal->GetGroup(); data << uint32(itr->second); // Role data << uint8(pPlayer->GetObjectGuid() == guid); // Self player data << uint8(isSameDungeon); // Not in dungeon data << uint8(isSameGroup); // Not same group data << uint8(sLFGMgr.GetLFGPlayerState(pPlayer->GetObjectGuid())->GetAnswer() != LFG_ANSWER_PENDING); // Answered data << uint8(sLFGMgr.GetLFGPlayerState(pPlayer->GetObjectGuid())->GetAnswer() == LFG_ANSWER_AGREE); // Accepted } SendPacket(&data); }
void UpdateEscortAI(const uint32 uiDiff) override { if (!m_pInstance) return; if (m_pInstance->GetData(TYPE_RING_OF_LAW) == FAIL) { // Reset Doors if (m_uiEventPhase >= 10) // North Gate is opened { m_pInstance->DoUseDoorOrButton(GO_ARENA_2); m_pInstance->DoUseDoorOrButton(GO_ARENA_4); } else if (m_uiEventPhase >= 4) // East Gate is opened { m_pInstance->DoUseDoorOrButton(GO_ARENA_1); m_pInstance->DoUseDoorOrButton(GO_ARENA_4); } // Despawn Summoned Mobs for (GuidList::const_iterator itr = m_lSummonedGUIDList.begin(); itr != m_lSummonedGUIDList.end(); ++itr) { if (Creature* pSummoned = m_creature->GetMap()->GetCreature(*itr)) pSummoned->ForcedDespawn(); } m_lSummonedGUIDList.clear(); // Despawn NPC m_creature->ForcedDespawn(); return; } if (m_uiEventTimer) { if (m_uiEventTimer <= uiDiff) { switch (m_uiEventPhase) { case 0: // Shortly after spawn, start walking m_creature->CastSpell(m_creature, SPELL_ASHCROMBES_TELEPORT_A, true); DoScriptText(SAY_START_2, m_creature); m_pInstance->DoUseDoorOrButton(GO_ARENA_4); // Some of the NPCs in the crowd do cheer emote at event start // we randomly select 25% of the NPCs to do this m_pInstance->GetArenaCrowdGuid(m_lArenaCrowd); for (GuidSet::const_iterator itr = m_lArenaCrowd.begin(); itr != m_lArenaCrowd.end(); ++itr) { if (Creature* pSpectator = m_creature->GetMap()->GetCreature(*itr)) { if (urand(0, 1) < 0.25) pSpectator->HandleEmote(EMOTE_ONESHOT_CHEER); } } Start(false); SetEscortPaused(false); m_uiEventTimer = 0; break; case 1: // Start walking towards wall SetEscortPaused(false); m_uiEventTimer = 0; break; case 2: m_uiEventTimer = 2000; break; case 3: // Open East Gate m_creature->CastSpell(m_creature, SPELL_ARENA_FLASH_A, true); m_creature->CastSpell(m_creature, SPELL_ARENA_FLASH_B, true); m_pInstance->DoUseDoorOrButton(GO_ARENA_1); m_uiEventTimer = 3000; break; case 4: // timer for teleport out spell which has 2000 ms cast time m_creature->CastSpell(m_creature, SPELL_ASHCROMBES_TELEPORT_B, true); m_uiEventTimer = 2500; break; case 5: m_creature->SetVisibility(VISIBILITY_OFF); SetEscortPaused(false); // Summon Ring Mob(s) SummonRingMob(aRingMob[m_uiMobSpawnId], POS_EAST); m_uiEventTimer = 8000; break; case 6: // Summon Ring Mob(s) SummonRingMob(aRingMob[m_uiMobSpawnId], POS_EAST); SummonRingMob(aRingMob[m_uiMobSpawnId], POS_EAST); m_uiEventTimer = 8000; break; case 7: // Summon Ring Mob(s) SummonRingMob(aRingMob[m_uiMobSpawnId], POS_EAST); m_uiEventTimer = 0; break; case 8: // Summoned Mobs are dead, continue event DoScriptText(SAY_SUMMON_BOSS_2, m_creature); m_creature->SetVisibility(VISIBILITY_ON); m_creature->CastSpell(m_creature, SPELL_ASHCROMBES_TELEPORT_A, true); m_pInstance->DoUseDoorOrButton(GO_ARENA_1); SetEscortPaused(false); m_uiEventTimer = 0; break; case 9: // Open North Gate m_creature->CastSpell(m_creature, SPELL_ARENA_FLASH_C, true); m_creature->CastSpell(m_creature, SPELL_ARENA_FLASH_D, true); m_pInstance->DoUseDoorOrButton(GO_ARENA_2); m_uiEventTimer = 5000; break; case 10: // timer for teleport out spell which has 2000 ms cast time m_creature->CastSpell(m_creature, SPELL_ASHCROMBES_TELEPORT_B, true); m_uiEventTimer = 2500; break; case 11: // Summon Boss m_creature->SetVisibility(VISIBILITY_OFF); // If banner summoned after start, then summon Thelden after the creatures are dead if (m_pInstance->GetData(TYPE_RING_OF_LAW) == SPECIAL && m_uiPhase == PHASE_MOBS) { m_uiPhase = PHASE_GLADIATORS; SummonRingMob(NPC_THELDREN, POS_NORTH); for (uint8 i = 0; i < MAX_THELDREN_ADDS; ++i) SummonRingMob(m_uiGladiatorId[i], POS_NORTH); } else { m_uiPhase = PHASE_BOSS; SummonRingMob(aRingBoss[urand(0, 5)], POS_NORTH); } m_uiEventTimer = 0; break; case 12: // Boss dead m_lSummonedGUIDList.clear(); m_pInstance->DoUseDoorOrButton(GO_ARENA_2); m_pInstance->DoUseDoorOrButton(GO_ARENA_3); m_pInstance->DoUseDoorOrButton(GO_ARENA_4); SetEscortPaused(false); m_uiEventTimer = 0; break; } ++m_uiEventPhase; } else m_uiEventTimer -= uiDiff; } }
/// %Log the player out void WorldSession::LogoutPlayer(bool Save) { // finish pending transfers before starting the logout while(_player && _player->IsBeingTeleportedFar()) HandleMoveWorldportAckOpcode(); m_playerLogout = true; m_playerSave = Save; if (_player) { // Playerbot mod: log out all player bots owned by this toon if (GetPlayer()->GetPlayerbotMgr()) GetPlayer()->GetPlayerbotMgr()->LogoutAllBots(); sLog.outChar("Account: %d (IP: %s) Logout Character:[%s] (guid: %u)", GetAccountId(), GetRemoteAddress().c_str(), _player->GetName() ,_player->GetGUIDLow()); if (ObjectGuid lootGuid = GetPlayer()->GetLootGuid()) DoLootRelease(lootGuid); ///- If the player just died before logging out, make him appear as a ghost //FIXME: logout must be delayed in case lost connection with client in time of combat if (GetPlayer()->GetDeathTimer()) { GetPlayer()->getHostileRefManager().deleteReferences(); GetPlayer()->BuildPlayerRepop(); GetPlayer()->RepopAtGraveyard(); } else if (GetPlayer()->IsInCombat() && GetPlayer()->GetMap()) { GetPlayer()->CombatStop(); GetPlayer()->getHostileRefManager().setOnlineOfflineState(false); GetPlayer()->RemoveAllAurasOnDeath(); // build set of player who attack _player or who have pet attacking of _player std::set<Player*> aset; GuidSet attackers = GetPlayer()->GetMap()->GetAttackersFor(GetPlayer()->GetObjectGuid()); for (GuidSet::const_iterator itr = attackers.begin(); itr != attackers.end();) { Unit* attacker = GetPlayer()->GetMap()->GetUnit(*itr++); if (!attacker) continue; Unit* owner = attacker->GetOwner(); // including player controlled case if(owner) { if(owner->GetTypeId() == TYPEID_PLAYER) aset.insert((Player*)owner); } else if(attacker->GetTypeId() == TYPEID_PLAYER) aset.insert((Player*)(attacker)); } GetPlayer()->SetPvPDeath(!aset.empty()); GetPlayer()->KillPlayer(); GetPlayer()->BuildPlayerRepop(); GetPlayer()->RepopAtGraveyard(); // give honor to all attackers from set like group case for(std::set<Player*>::const_iterator itr = aset.begin(); itr != aset.end(); ++itr) (*itr)->RewardHonor(GetPlayer(),aset.size()); // give bg rewards and update counters like kill by first from attackers // this can't be called for all attackers. if(!aset.empty()) if(BattleGround *bg = GetPlayer()->GetBattleGround()) bg->HandleKillPlayer(GetPlayer(),*aset.begin()); } else if(GetPlayer()->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) { // this will kill character by SPELL_AURA_SPIRIT_OF_REDEMPTION GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT); //GetPlayer()->SetDeathPvP(*); set at SPELL_AURA_SPIRIT_OF_REDEMPTION apply time GetPlayer()->KillPlayer(); GetPlayer()->BuildPlayerRepop(); GetPlayer()->RepopAtGraveyard(); } else if (GetPlayer()->HasPendingBind()) { GetPlayer()->RepopAtGraveyard(); GetPlayer()->SetPendingBind(NULL, 0); } //drop a flag if player is carrying it if(BattleGround *bg = GetPlayer()->GetBattleGround()) bg->EventPlayerLoggedOut(GetPlayer()); ///- Teleport to home if the player is in an invalid instance if(!GetPlayer()->m_InstanceValid && !GetPlayer()->isGameMaster()) { GetPlayer()->TeleportToHomebind(); //this is a bad place to call for far teleport because we need player to be in world for successful logout //maybe we should implement delayed far teleport logout? } // FG: finish pending transfers after starting the logout // this should fix players beeing able to logout and login back with full hp at death position while(GetPlayer()->IsBeingTeleportedFar()) HandleMoveWorldportAckOpcode(); for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) { if(BattleGroundQueueTypeId bgQueueTypeId = GetPlayer()->GetBattleGroundQueueTypeId(i)) { GetPlayer()->RemoveBattleGroundQueueId(bgQueueTypeId); sBattleGroundMgr.m_BattleGroundQueues[ bgQueueTypeId ].RemovePlayer(GetPlayer()->GetObjectGuid(), true); } } ///- Reset the online field in the account table // no point resetting online in character table here as Player::SaveToDB() will set it to 1 since player has not been removed from world at this stage // No SQL injection as AccountID is uint32 if (!GetPlayer()->GetPlayerbotAI()) { static SqlStatementID id; SqlStatement stmt = LoginDatabase.CreateStatement(id, "UPDATE account SET active_realm_id = ? WHERE id = ?"); stmt.PExecute(uint32(0), GetAccountId()); } ///- If the player is in a guild, update the guild roster and broadcast a logout message to other guild members Guild* guild = sGuildMgr.GetGuildById(GetPlayer()->GetGuildId()); if (guild) { if (MemberSlot* slot = guild->GetMemberSlot(GetPlayer()->GetObjectGuid())) { slot->SetMemberStats(GetPlayer()); slot->UpdateLogoutTime(); } guild->BroadcastEvent(GE_SIGNED_OFF, GetPlayer()->GetObjectGuid(), GetPlayer()->GetName()); } ///- Remove pet GetPlayer()->RemovePet(PET_SAVE_AS_CURRENT); GetPlayer()->InterruptNonMeleeSpells(true); if (VehicleKitPtr vehicle = GetPlayer()->GetVehicle()) { if (Creature* base = ((Creature*)vehicle->GetBase())) { bool dismiss = true; if (!base->IsTemporarySummon() || base->GetVehicleInfo()->GetEntry()->m_flags & (VEHICLE_FLAG_NOT_DISMISS | VEHICLE_FLAG_ACCESSORY)) dismiss = false; if (!base->RemoveSpellsCausingAuraByCaster(SPELL_AURA_CONTROL_VEHICLE, GetPlayer()->GetObjectGuid())) GetPlayer()->ExitVehicle(); if (base->HasAuraType(SPELL_AURA_CONTROL_VEHICLE)) dismiss = false; if (dismiss) base->ForcedDespawn(1000); } } ///- empty buyback items and save the player in the database // some save parts only correctly work in case player present in map/player_lists (pets, etc) if(Save) GetPlayer()->SaveToDB(); ///- Leave all channels before player delete... GetPlayer()->CleanupChannels(); // LFG cleanup sLFGMgr.Leave(GetPlayer()); ///- If the player is in a group (or invited), remove him. If the group if then only 1 person, disband the group. GetPlayer()->UninviteFromGroup(); // remove player from the group if he is: // a) in group; b) not in raid group; c) logging out normally (not being kicked or disconnected) if(GetPlayer()->GetGroup() && !GetPlayer()->GetGroup()->isRaidGroup() && m_Socket) GetPlayer()->RemoveFromGroup(); ///- Send update to group if(GetPlayer()->GetGroup()) GetPlayer()->GetGroup()->SendUpdate(); ///- Broadcast a logout message to the player's friends sSocialMgr.SendFriendStatus(GetPlayer(), FRIEND_OFFLINE, GetPlayer()->GetObjectGuid(), true); sSocialMgr.RemovePlayerSocial (GetPlayer()->GetGUIDLow ()); // Playerbot - remember player GUID for update SQL below uint32 guid = GetPlayer()->GetGUIDLow(); ///- Remove the player from the world // the player may not be in the world when logging out // e.g if he got disconnected during a transfer to another map // calls to GetMap in this case may cause crashes if (GetPlayer()->IsInWorld()) { Map* _map = GetPlayer()->GetMap(); _map->Remove(GetPlayer(), true); } else { GetPlayer()->CleanupsBeforeDelete(); if (GetPlayer()->GetMap()) GetPlayer()->GetMap()->DeleteFromWorld(GetPlayer()); else { sObjectAccessor.RemoveObject(GetPlayer()); delete GetPlayer(); } } SetPlayer(NULL); // deleted in Remove/DeleteFromWorld call ///- Send the 'logout complete' packet to the client WorldPacket data( SMSG_LOGOUT_COMPLETE, 0 ); SendPacket( &data ); static SqlStatementID updChars; // Playerbot mod: commented out above and do this one instead SqlStatement stmt = CharacterDatabase.CreateStatement(updChars, "UPDATE characters SET online = 0 WHERE guid = ?"); stmt.PExecute(guid); DEBUG_LOG( "SESSION: Sent SMSG_LOGOUT_COMPLETE Message" ); } m_playerLogout = false; m_playerSave = false; m_playerRecentlyLogout = true; LogoutRequest(0); }
bool BattlefieldTB::SetupBattlefield() { m_TypeId = BATTLEFIELD_TB; m_BattleId = BATTLEFIELD_BATTLEID_TB; m_ZoneId = BATTLEFIELD_TB_ZONEID; m_MapId = BATTLEFIELD_TB_MAPID; m_MaxPlayer = sWorld->getIntConfig(CONFIG_TOL_BARAD_PLR_MAX); m_IsEnabled = sWorld->getBoolConfig(CONFIG_TOL_BARAD_ENABLE); m_MinPlayer = sWorld->getIntConfig(CONFIG_TOL_BARAD_PLR_MIN); m_MinLevel = sWorld->getIntConfig(CONFIG_TOL_BARAD_PLR_MIN_LVL); m_BattleTime = sWorld->getIntConfig(CONFIG_TOL_BARAD_BATTLETIME) * MINUTE * IN_MILLISECONDS; m_NoWarBattleTime = sWorld->getIntConfig(CONFIG_TOL_BARAD_NOBATTLETIME) * MINUTE * IN_MILLISECONDS; m_RestartAfterCrash = sWorld->getIntConfig(CONFIG_TOL_BARAD_RESTART_AFTER_CRASH) * MINUTE * IN_MILLISECONDS; m_TimeForAcceptInvite = 20; m_StartGroupingTimer = 15 * MINUTE * IN_MILLISECONDS; m_StartGrouping = false; KickPosition.Relocate(-630.460f, 1184.504f, 95.766f, 0); KickPosition.m_mapId = m_MapId; RegisterZone(m_ZoneId); m_Data32.resize(BATTLEFIELD_TB_DATA_MAX); m_Data32[BATTLEFIELD_TB_DATA_CAPTURED] = 0; m_saveTimer = 60000; SetGraveyardNumber(BATTLEFIELD_TB_GY_MAX); if ((sWorld->getWorldState(WS_TB_NEXT_BATTLE_TIMER_ENABLED) == 0) && (sWorld->getWorldState(WS_TB_HORDE_DEFENCE) == 0) && (sWorld->getWorldState(ClockBTWorldState[0]) == 0)) { sWorld->setWorldState(WS_TB_NEXT_BATTLE_TIMER_ENABLED, uint64(false)); sWorld->setWorldState(WS_TB_HORDE_DEFENCE, uint64(urand(0, 1))); sWorld->setWorldState(ClockBTWorldState[0], uint64(m_NoWarBattleTime)); } if (sWorld->getWorldState(WS_TB_UNK) == 0) sWorld->setWorldState(WS_TB_UNK, urand(1, 3)); if (sWorld->getWorldState(WS_TB_UNK_2) == 0) sWorld->setWorldState(WS_TB_UNK_2, time(NULL) + 86400); m_isActive = bool(sWorld->getWorldState(WS_TB_NEXT_BATTLE_TIMER_ENABLED)); m_DefenderTeam = (TeamId)sWorld->getWorldState(WS_TB_HORDE_DEFENCE); m_Timer = sWorld->getWorldState(ClockBTWorldState[0]); if (m_isActive) { m_isActive = false; m_Timer = m_RestartAfterCrash; } for (uint8 i = 0; i < BATTLEFIELD_TB_GY_MAX; i++) { BfGraveyardTB* graveyard = new BfGraveyardTB(this); graveyard->Initialize(TBGraveYard[i].entryh, TBGraveYard[i].entrya, TBGraveYard[i].x, TBGraveYard[i].y, TBGraveYard[i].z, TBGraveYard[i].o, m_DefenderTeam, TBGraveYard[i].gyid); m_GraveyardList[i] = graveyard; } for (uint8 i = 0; i < TB_MAX_WORKSHOP; i++) { BfTBWorkShopData* workshop = new BfTBWorkShopData(this); workshop->Init(TBWorkShopDataBase[i].worldstate, TBWorkShopDataBase[i].type, TBWorkShopDataBase[i].nameid); workshop->ChangeControl(GetDefenderTeam(),true); BfCapturePointTB* point = new BfCapturePointTB(this, GetDefenderTeam()); point->SetCapturePointData(GetDefenderTeam() == TEAM_ALLIANCE ? TBWorkShopDataBase[i].CapturePoint.entrya : TBWorkShopDataBase[i].CapturePoint.entryh, BATTLEFIELD_TB_MAPID, TBWorkShopDataBase[i].CapturePoint.x, TBWorkShopDataBase[i].CapturePoint.y, TBWorkShopDataBase[i].CapturePoint.z, 0); point->LinkToWorkShop(workshop); AddCapturePoint(point); CapturePoints.insert(point); WorkShopList.insert(workshop); } for (uint8 i = 0; i < TB_MAX_DESTROY_MACHINE_NPC; i++) { if (Creature* creature = SpawnCreature(TBDestroyMachineNPC[i].entrya, TBDestroyMachineNPC[i].x, TBDestroyMachineNPC[i].y, TBDestroyMachineNPC[i].z, TBDestroyMachineNPC[i].o, GetAttackerTeam())) { HideNpc(creature); Vehicles.insert(creature->GetGUID()); } } for (uint8 i = 0; i < TB_MAX_OBJ; i++) { GameObject* go = SpawnGameObject(TBGameObjectBuillding[i].entry, BATTLEFIELD_TB_MAPID, TBGameObjectBuillding[i].x, TBGameObjectBuillding[i].y, TBGameObjectBuillding[i].z, TBGameObjectBuillding[i].o); BfTBGameObjectBuilding* b = new BfTBGameObjectBuilding(this); b->Init(go,TBGameObjectBuillding[i].type,TBGameObjectBuillding[i].WorldState,TBGameObjectBuillding[i].nameid); b->m_State = BATTLEFIELD_TB_OBJECTSTATE_ALLIANCE_INTACT - (GetDefenderTeam() * 3); BuildingsInZone.insert(b); } for (uint8 i = 0; i < 4; i++) { if (Creature* creature = SpawnCreature(QuestGivers[i].entrya, QuestGivers[i].x, QuestGivers[i].y, QuestGivers[i].z, QuestGivers[i].o, TEAM_ALLIANCE)) { HideNpc(creature); creature->setFaction(TolBaradFaction[TEAM_ALLIANCE]); questgiversA.insert(creature->GetGUID()); } } for (uint8 i = 0; i < 4; i++) { if (Creature* creature = SpawnCreature(QuestGivers[i].entryh, QuestGivers[i].x, QuestGivers[i].y, QuestGivers[i].z, QuestGivers[i].o, TEAM_HORDE)) { HideNpc(creature); creature->setFaction(TolBaradFaction[TEAM_HORDE]); questgiversH.insert(creature->GetGUID()); } } { int i = 0; GuidSet questgivers = (GetDefenderTeam() == TEAM_ALLIANCE ? questgiversA : questgiversH); for (GuidSet::const_iterator itr = questgivers.begin(); itr != questgivers.end(); ++itr) { if (Unit* unit = sObjectAccessor->FindUnit((*itr))) { if (Creature* creature = unit->ToCreature()) { if (!i || i == sWorld->getWorldState(WS_TB_UNK)) if (!m_isActive) ShowNpc(creature, true); i++; } } } } for (uint8 i = 0; i < 23; i++) { if (Creature* creature = SpawnCreature(AllianceSpawnNPC[i].entrya, AllianceSpawnNPC[i].x, AllianceSpawnNPC[i].y, AllianceSpawnNPC[i].z, AllianceSpawnNPC[i].o, TEAM_ALLIANCE)) { creature->setFaction(TolBaradFaction[TEAM_ALLIANCE]); npcAlliance.insert(creature->GetGUID()); } } for (uint8 i = 0; i < 23; i++) { if (Creature* creature = SpawnCreature(HordeSpawnNPC[i].entrya, HordeSpawnNPC[i].x, HordeSpawnNPC[i].y, HordeSpawnNPC[i].z, HordeSpawnNPC[i].o, TEAM_HORDE)) { creature->setFaction(TolBaradFaction[TEAM_HORDE]); npcHorde.insert(creature->GetGUID()); } } for (uint8 i = 0; i < 130; i++) { if (Creature* creature = SpawnCreature(TbOldNpcStructure[i].entrya, TbOldNpcStructure[i].x, TbOldNpcStructure[i].y, TbOldNpcStructure[i].z, TbOldNpcStructure[i].o, TEAM_NEUTRAL)) { creature->SetRespawnRadius(15.0f); creature->SetDefaultMovementType(RANDOM_MOTION_TYPE); creature->GetMotionMaster()->Initialize(); npcOld.insert(creature->GetGUID()); } } for (uint8 i = 0; i < 4; i++) { if (GameObject* go = SpawnGameObject(TBGameobjectsDoor[i].entrya, BATTLEFIELD_TB_MAPID, TBGameobjectsDoor[i].x, TBGameobjectsDoor[i].y, TBGameobjectsDoor[i].z, TBGameobjectsDoor[i].o)) { go->ToGameObject()->SetLootState(GO_READY); go->ToGameObject()->UseDoorOrButton(); goDoors.insert(go); } } return true; }
void BattlefieldTB::OnBattleEnd(bool endbytimer) { if (sWorld->getWorldState(WS_TB_UNK_2) > (uint64)time(NULL)) { if (sWorld->getWorldState(WS_TB_UNK) > 2) sWorld->setWorldState(WS_TB_UNK, 1); else sWorld->setWorldState(WS_TB_UNK, (sWorld->getWorldState(WS_TB_UNK) + 1)); sWorld->setWorldState(WS_TB_UNK_2, time(NULL) + 86400); } for (uint8 team = 0; team < 2; ++team) { for (GuidSet::const_iterator itr = m_PlayersInWar[team].begin(); itr != m_PlayersInWar[team].end(); ++itr) { if (Player* plr = sObjectMgr->GetPlayerByLowGUID((*itr))) { if (endbytimer) { if (plr->GetTeamId() == GetDefenderTeam()) { switch (plr->GetTeamId()) { case TEAM_ALLIANCE: plr->CastSpell(plr, SPELL_TB_VICTORY_REWARD_ALLIANCE, true); plr->CastSpell(plr, SPELL_TB_TOL_BARAD_VETERAN, true); plr->CastSpell(plr, SPELL_TB_TOL_BARAD_TOWER_BONUS, true); IncrementQuest(plr, QUEST_TB_TOL_BARAD_VICTORY_IN_TOL_BARAD_A, true); break; case TEAM_HORDE: plr->CastSpell(plr, SPELL_TB_VICTORY_REWARD_HORDE, true); plr->CastSpell(plr, SPELL_TB_TOL_BARAD_VETERAN, true); plr->CastSpell(plr, SPELL_TB_TOL_BARAD_TOWER_BONUS, true); IncrementQuest(plr, QUEST_TB_TOL_BARAD_VICTORY_IN_TOL_BARAD_H, true); break; } DoCompleteOrIncrementAchievement(ACHIEVEMENT_TOL_BARAD_VICTORY, plr, 1); if (m_Data32[BATTLEFIELD_TB_DATA_DESTROYED] == 0) plr->CastSpell(plr, SPELL_TB_TOL_BARAD_TOWER_DEFENDED, true); } else { switch (plr->GetTeamId()) { case TEAM_ALLIANCE: IncrementQuest(plr, QUEST_TB_TOL_BARAD_VICTORY_IN_TOL_BARAD_A, true); break; case TEAM_HORDE: IncrementQuest(plr, QUEST_TB_TOL_BARAD_VICTORY_IN_TOL_BARAD_H, true); break; } plr->CastSpell(plr, SPELL_TB_LOOSER_REWARD, true); plr->RepopAtGraveyard(); } } else { if (plr->GetTeamId() == GetAttackerTeam()) { switch (team) { case TEAM_ALLIANCE: plr->CastSpell(plr, SPELL_TB_VICTORY_REWARD_ALLIANCE, true); break; case TEAM_HORDE: plr->CastSpell(plr, SPELL_TB_VICTORY_REWARD_HORDE, true); break; } } else { plr->CastSpell(plr, SPELL_TB_LOOSER_REWARD, true); plr->RepopAtGraveyard(); } } } } m_PlayersInWar[team].clear(); } for (TbGameObjectBuilding::const_iterator itr = BuildingsInZone.begin(); itr != BuildingsInZone.end(); ++itr) if ((*itr)) (*itr)->Rebuild(); for (TbWorkShop::const_iterator itr = WorkShopList.begin(); itr != WorkShopList.end(); ++itr) if ((*itr)) (*itr)->UpdateWorkshop(); for (BfCapturePointSet::const_iterator itr = CapturePoints.begin(); itr != CapturePoints.end(); ++itr) if ((*itr)) (*itr)->UpdateCapturePointValue(); for (uint8 i = 0; i < BATTLEFIELD_TB_GY_MAX; i++) m_GraveyardList[i]->GiveControlTo(GetDefenderTeam()); if (GetDefenderTeam() == TEAM_ALLIANCE) { for (GuidSet::const_iterator itr = npcAlliance.begin(); itr != npcAlliance.end(); ++itr) if (Unit* unit = sObjectAccessor->FindUnit((*itr))) if (Creature* creature = unit->ToCreature()) ShowNpc(creature, true); for (GuidSet::const_iterator itr = npcHorde.begin(); itr != npcHorde.end(); ++itr) if (Unit* unit = sObjectAccessor->FindUnit((*itr))) if (Creature* creature = unit->ToCreature()) HideNpc(creature); } else if (GetDefenderTeam() == TEAM_HORDE) { for (GuidSet::const_iterator itr = npcAlliance.begin(); itr != npcAlliance.end(); ++itr) if (Unit* unit = sObjectAccessor->FindUnit((*itr))) if (Creature* creature = unit->ToCreature()) ShowNpc(creature, true); for (GuidSet::const_iterator itr = npcHorde.begin(); itr != npcHorde.end(); ++itr) if (Unit* unit = sObjectAccessor->FindUnit((*itr))) if (Creature* creature = unit->ToCreature()) HideNpc(creature); } for (GuidSet::const_iterator itr = npcOld.begin(); itr != npcOld.end(); ++itr) if (Unit* unit = sObjectAccessor->FindUnit((*itr))) if (Creature* creature = unit->ToCreature()) ShowNpc(creature, true); for (GameobjectSet::const_iterator itr = goDoors.begin(); itr != goDoors.end(); ++itr) { if (*itr) { (*itr)->ToGameObject()->SetLootState(GO_READY); (*itr)->ToGameObject()->UseDoorOrButton(); } } for (GuidSet::const_iterator itr = Vehicles.begin(); itr != Vehicles.end(); ++itr) if (Unit* unit = sObjectAccessor->FindUnit((*itr))) if (Creature* creature = unit->ToCreature()) HideNpc(creature); for (GuidSet::const_iterator itr = questgiversA.begin(); itr != questgiversA.end(); ++itr) if (Unit* unit = sObjectAccessor->FindUnit((*itr))) if (Creature* creature = unit->ToCreature()) HideNpc(creature); for (GuidSet::const_iterator itr = questgiversH.begin(); itr != questgiversH.end(); ++itr) if (Unit* unit = sObjectAccessor->FindUnit((*itr))) if (Creature* creature = unit->ToCreature()) HideNpc(creature); int i = 0; GuidSet questgivers = GetDefenderTeam() == TEAM_ALLIANCE ? questgiversA : questgiversH; for (GuidSet::const_iterator itr = questgivers.begin(); itr != questgivers.end(); ++itr) { if (Unit* unit = sObjectAccessor->FindUnit((*itr))) { if (Creature* creature = unit->ToCreature()) { if (!i || i == sWorld->getWorldState(WS_TB_UNK)) ShowNpc(creature, true); i++; } } } HashMapHolder<Player>::MapType const& plist = sObjectAccessor->GetPlayers(); for (HashMapHolder<Player>::MapType::const_iterator itr = plist.begin(); itr != plist.end(); ++itr) { if (Player* plr = itr->second) { plr->SendUpdateWorldState(WS_TB_BATTLE_TIMER_ENABLED, 0); plr->SendUpdateWorldState(WS_TB_BATTLE_TIMER, 0); plr->SendUpdateWorldState(WS_TB_COUNTER_BUILDINGS, 0); plr->SendUpdateWorldState(WS_TB_COUNTER_BUILDINGS_ENABLED, 0); plr->SendUpdateWorldState(WS_TB_HORDE_DEFENCE, 0); plr->SendUpdateWorldState(WS_TB_ALLIANCE_DEFENCE, 0); plr->SendUpdateWorldState(WS_TB_NEXT_BATTLE_TIMER_ENABLED, 1); plr->SendUpdateWorldState(WS_TB_KEEP_HORDE_DEFENCE, GetDefenderTeam() == TEAM_HORDE ? 1 : 0); plr->SendUpdateWorldState(WS_TB_KEEP_ALLIANCE_DEFENCE, GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0); plr->SendUpdateWorldState(WS_TB_ALLIANCE_ATTACK, 0); plr->SendUpdateWorldState(WS_TB_HORDE_ATTACK, 0); switch (GetDefenderTeam()) { case TEAM_ALLIANCE: for (int i = 0; i < MAX_CP_DIFF; i++) { if (i == ALLIANCE_DEFENCE) plr->SendUpdateWorldState(WS_TB_SOUTH_CAPTURE_POINT + i, 1); else plr->SendUpdateWorldState(WS_TB_SOUTH_CAPTURE_POINT + i, 0); } for (int i = 0; i < MAX_CP_DIFF; i++) { if (i == ALLIANCE_DEFENCE) plr->SendUpdateWorldState(WS_TB_EAST_CAPTURE_POINT + i, 1); else plr->SendUpdateWorldState(WS_TB_EAST_CAPTURE_POINT + i, 0); } for (int i = 0; i < MAX_CP_DIFF; i++) { if (i == ALLIANCE_DEFENCE) plr->SendUpdateWorldState(WS_TB_WEST_CAPTURE_POINT + i, 1); else plr->SendUpdateWorldState(WS_TB_WEST_CAPTURE_POINT + i, 0); } for (int i = 0; i < BUILDING_MAX_DIFF; i++) { if (i == BUILDING_ALLIANCE_DEFENCE) plr->SendUpdateWorldState(WS_TB_EAST_SPIRE + i, 1); else plr->SendUpdateWorldState(WS_TB_EAST_SPIRE + i, 0); } for (int i = 0; i < BUILDING_MAX_DIFF; i++) { if (i == BUILDING_ALLIANCE_DEFENCE) plr->SendUpdateWorldState(WS_TB_SOUTH_SPIRE + i, 1); else plr->SendUpdateWorldState(WS_TB_SOUTH_SPIRE + i, 0); } for (int i = 0; i < BUILDING_MAX_DIFF; i++) { if (i == BUILDING_ALLIANCE_DEFENCE) plr->SendUpdateWorldState(WS_TB_WEST_SPIRE + i, 1); else plr->SendUpdateWorldState(WS_TB_WEST_SPIRE + i, 0); } break; case TEAM_HORDE: for (int i = 0; i < MAX_CP_DIFF; i++) { if (i == HORDE_DEFENCE) plr->SendUpdateWorldState(WS_TB_SOUTH_CAPTURE_POINT + i, 1); else plr->SendUpdateWorldState(WS_TB_SOUTH_CAPTURE_POINT + i, 0); } for (int i = 0; i < MAX_CP_DIFF; i++) { if (i == HORDE_DEFENCE) plr->SendUpdateWorldState(WS_TB_EAST_CAPTURE_POINT + i, 1); else plr->SendUpdateWorldState(WS_TB_EAST_CAPTURE_POINT + i, 0); } for (int i = 0; i < MAX_CP_DIFF; i++) { if (i == HORDE_DEFENCE) plr->SendUpdateWorldState(WS_TB_WEST_CAPTURE_POINT + i, 1); else plr->SendUpdateWorldState(WS_TB_WEST_CAPTURE_POINT + i, 0); } for (int i = 0; i < BUILDING_MAX_DIFF; i++) { if (i == BUILDING_HORDE_DEFENCE) plr->SendUpdateWorldState(WS_TB_EAST_SPIRE + i, 1); else plr->SendUpdateWorldState(WS_TB_EAST_SPIRE + i, 0); } for (int i = 0; i < BUILDING_MAX_DIFF; i++) { if (i == BUILDING_HORDE_DEFENCE) plr->SendUpdateWorldState(WS_TB_SOUTH_SPIRE + i, 1); else plr->SendUpdateWorldState(WS_TB_SOUTH_SPIRE + i, 0); } for (int i = 0; i < BUILDING_MAX_DIFF; i++) { if (i == BUILDING_HORDE_DEFENCE) plr->SendUpdateWorldState(WS_TB_WEST_SPIRE + i, 1); else plr->SendUpdateWorldState(WS_TB_WEST_SPIRE + i, 0); } break; } } } m_Data32[BATTLEFIELD_TB_DATA_CAPTURED] = 0; m_Data32[BATTLEFIELD_TB_DATA_DESTROYED] = 0; }