diff options
Diffstat (limited to 'src/game/Player.cpp')
-rw-r--r-- | src/game/Player.cpp | 122 |
1 files changed, 83 insertions, 39 deletions
diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 85d03fc2fd1..608ad81f7a9 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -5723,6 +5723,12 @@ void Player::SendFactionState(FactionState const* faction) const } } +void Player::SendFactionStates() const +{ + for(FactionStateList::const_iterator itr = m_factions.begin(); itr != m_factions.end(); ++itr) + SendFactionState(&(itr->second)); +} + void Player::SendInitialReputations() { WorldPacket data(SMSG_INITIALIZE_FACTIONS, (4+128*5)); @@ -5756,13 +5762,17 @@ void Player::SendInitialReputations() GetSession()->SendPacket(&data); } -FactionState const* Player::GetFactionState( FactionEntry const* factionEntry) const +void Player::SetFactionAtWar( RepListID repListID, bool on ) { - FactionStateList::const_iterator itr = m_factions.find(factionEntry->reputationListID); - if (itr != m_factions.end()) - return &itr->second; + FactionStateList::iterator itr = m_factions.find(repListID); + if (itr == m_factions.end()) + return; - return NULL; + // always invisible or hidden faction can't change war state + if(itr->second.Flags & (FACTION_FLAG_INVISIBLE_FORCED|FACTION_FLAG_HIDDEN) ) + return; + + SetFactionAtWar(&itr->second,on); } void Player::SetFactionAtWar(FactionState* faction, bool atWar) @@ -5783,6 +5793,15 @@ void Player::SetFactionAtWar(FactionState* faction, bool atWar) faction->Changed = true; } +void Player::SetFactionInactive( RepListID repListID, bool on ) +{ + FactionStateList::iterator itr = m_factions.find(repListID); + if (itr == m_factions.end()) + return; + + SetFactionInactive(&itr->second,on); +} + void Player::SetFactionInactive(FactionState* faction, bool inactive) { // always invisible or hidden faction can't be inactive @@ -5801,23 +5820,17 @@ void Player::SetFactionInactive(FactionState* faction, bool inactive) faction->Changed = true; } -void Player::SetFactionVisibleForFactionTemplateId(uint32 FactionTemplateId) +void Player::SetFactionVisible(FactionTemplateEntry const*factionTemplateEntry) { - FactionTemplateEntry const*factionTemplateEntry = sFactionTemplateStore.LookupEntry(FactionTemplateId); - - if(!factionTemplateEntry) + if(!factionTemplateEntry->faction) return; - if(factionTemplateEntry->faction) - SetFactionVisibleForFactionId(factionTemplateEntry->faction); + if(FactionEntry const *factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction)) + SetFactionVisible(factionEntry); } -void Player::SetFactionVisibleForFactionId(uint32 FactionId) +void Player::SetFactionVisible(FactionEntry const *factionEntry) { - FactionEntry const *factionEntry = sFactionStore.LookupEntry(FactionId); - if(!factionEntry) - return; - if(factionEntry->reputationListID < 0) return; @@ -6024,30 +6037,11 @@ bool Player::ModifyOneFactionReputation(FactionEntry const* factionEntry, int32 SetFactionVisible(&itr->second); - for( int i = 0; i < MAX_QUEST_LOG_SIZE; ++i ) - { - if(uint32 questid = GetQuestSlotQuestId(i)) - { - Quest const* qInfo = objmgr.GetQuestTemplate(questid); - if( qInfo && qInfo->GetRepObjectiveFaction() == factionEntry->ID ) - { - QuestStatusData& q_status = mQuestStatus[questid]; - if( q_status.m_status == QUEST_STATUS_INCOMPLETE ) - { - if(GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue()) - if ( CanCompleteQuest( questid ) ) - CompleteQuest( questid ); - } - else if( q_status.m_status == QUEST_STATUS_COMPLETE ) - { - if(GetReputation(factionEntry) < qInfo->GetRepObjectiveValue()) - IncompleteQuest( questid ); - } - } - } - } + ReputationChanged(factionEntry); + GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION,factionEntry->ID); GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION,factionEntry->ID); + SendFactionState(&(itr->second)); return true; @@ -6120,6 +6114,27 @@ bool Player::SetOneFactionReputation(FactionEntry const* factionEntry, int32 sta return false; } +void Player::ApplyForceReaction( uint32 faction_id,ReputationRank rank,bool apply ) +{ + if(apply) + m_forcedReactions[faction_id] = rank; + else + m_forcedReactions.erase(faction_id); +} + +void Player::SendForceReactions() +{ + WorldPacket data; + data.Initialize(SMSG_SET_FORCED_REACTIONS, 4+m_forcedReactions.size()*(4+4)); + data << uint32(m_forcedReactions.size()); + for(ForcedReactions::const_iterator itr = m_forcedReactions.begin(); itr != m_forcedReactions.end(); ++itr) + { + data << uint32(itr->first); // faction_id (Faction.dbc) + data << uint32(itr->second); // reputation rank + } + SendDirectMessage(&data); +} + //Calculate total reputation percent player gain with quest/creature level int32 Player::CalculateReputationGain(uint32 creatureOrQuestLevel, int32 rep, bool for_quest) { @@ -12941,7 +12956,8 @@ void Player::AddQuest( Quest const *pQuest, Object *questGiver ) AdjustQuestReqItemCount( pQuest, questStatusData ); if( pQuest->GetRepObjectiveFaction() ) - SetFactionVisibleForFactionId(pQuest->GetRepObjectiveFaction()); + if(FactionEntry const* factionEntry = sFactionStore.LookupEntry(pQuest->GetRepObjectiveFaction())) + SetFactionVisible(factionEntry); uint32 qtime = 0; if( pQuest->HasFlag( QUEST_TRINITY_FLAGS_TIMED ) ) @@ -14086,6 +14102,34 @@ void Player::MoneyChanged( uint32 count ) } } +void Player::ReputationChanged(FactionEntry const* factionEntry ) +{ + for( int i = 0; i < MAX_QUEST_LOG_SIZE; ++i ) + { + if(uint32 questid = GetQuestSlotQuestId(i)) + { + if(Quest const* qInfo = objmgr.GetQuestTemplate(questid)) + { + if(qInfo->GetRepObjectiveFaction() == factionEntry->ID ) + { + QuestStatusData& q_status = mQuestStatus[questid]; + if( q_status.m_status == QUEST_STATUS_INCOMPLETE ) + { + if(GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue()) + if ( CanCompleteQuest( questid ) ) + CompleteQuest( questid ); + } + else if( q_status.m_status == QUEST_STATUS_COMPLETE ) + { + if(GetReputation(factionEntry) < qInfo->GetRepObjectiveValue()) + IncompleteQuest( questid ); + } + } + } + } + } +} + bool Player::HasQuestForItem( uint32 itemid ) const { for( int i = 0; i < MAX_QUEST_LOG_SIZE; ++i ) |