diff options
author | Treeston <treeston.mmoc@gmail.com> | 2018-08-14 16:09:51 +0200 |
---|---|---|
committer | Treeston <treeston.mmoc@gmail.com> | 2018-08-14 16:09:51 +0200 |
commit | 077bf43ab5e4a646d2898eea28e4b8752a93fc89 (patch) | |
tree | 2b27d68caeecf09d4adda1fb717cafa639494e9f /src | |
parent | 9f3e6bfe9b76c4b0829cc4bc702d9a31144ce83f (diff) |
Scripts/Commands: Fix .quest complete to properly work with PvP kill quests. Closes #16321.
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 41 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 3 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_quest.cpp | 5 |
3 files changed, 32 insertions, 17 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 266adf32dd1..8902b8575ea 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -16292,10 +16292,8 @@ void Player::KilledMonsterCredit(uint32 entry, ObjectGuid guid /*= ObjectGuid::E } } -void Player::KilledPlayerCredit() +void Player::KilledPlayerCredit(uint16 count) { - uint16 addkillcount = 1; - for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i) { uint32 questid = GetQuestSlotQuestId(i); @@ -16312,25 +16310,36 @@ void Player::KilledPlayerCredit() // PvP Killing quest require player to be in same zone as quest zone (only 2 quests so no doubt) if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL) && GetZoneId() == static_cast<uint32>(qInfo->GetZoneOrSort())) { - uint32 reqkill = qInfo->GetPlayersSlain(); - uint16 curkill = q_status.PlayerCount; + KilledPlayerCreditForQuest(count, qInfo); + break; // there is only one quest per zone + } + } + } +} - if (curkill < reqkill) - { - q_status.PlayerCount = curkill + addkillcount; +void Player::KilledPlayerCreditForQuest(uint16 count, Quest const* quest) +{ + uint32 const questId = quest->GetQuestId(); + auto it = m_QuestStatus.find(questId); + if (it == m_QuestStatus.end()) + return; + QuestStatusData& questStatus = it->second; - m_QuestStatusSave[questid] = QUEST_DEFAULT_SAVE_TYPE; + uint16 curKill = questStatus.PlayerCount; + uint32 reqKill = quest->GetPlayersSlain(); - SendQuestUpdateAddPlayer(qInfo, curkill, addkillcount); - } + if (curKill < reqKill) + { + count = std::min<uint16>(reqKill - curKill, count); + questStatus.PlayerCount = curKill + count; - if (CanCompleteQuest(questid)) - CompleteQuest(questid); + m_QuestStatusSave[quest->GetQuestId()] = QUEST_DEFAULT_SAVE_TYPE; - break; - } - } + SendQuestUpdateAddPlayer(quest, curKill, count); } + + if (CanCompleteQuest(questId)) + CompleteQuest(questId); } void Player::KillCreditGO(uint32 entry, ObjectGuid guid) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 0ade1633504..0bb4b515ac0 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1254,7 +1254,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void ItemRemovedQuestCheck(uint32 entry, uint32 count); void KilledMonster(CreatureTemplate const* cInfo, ObjectGuid guid); void KilledMonsterCredit(uint32 entry, ObjectGuid guid = ObjectGuid::Empty); - void KilledPlayerCredit(); + void KilledPlayerCredit(uint16 count = 1); + void KilledPlayerCreditForQuest(uint16 count, Quest const* quest); void KillCreditGO(uint32 entry, ObjectGuid guid = ObjectGuid::Empty); void TalkedToCreature(uint32 entry, ObjectGuid guid); void MoneyChanged(uint32 value); diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index 6d333866606..1c6b5d55f6a 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -230,6 +230,11 @@ public: player->KillCreditGO(creature); } + // player kills + if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL)) + if (uint32 reqPlayers = quest->GetPlayersSlain()) + player->KilledPlayerCreditForQuest(reqPlayers, quest); + // If the quest requires reputation to complete if (uint32 repFaction = quest->GetRepObjectiveFaction()) { |