aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-08-14 16:09:51 +0200
committerTreeston <treeston.mmoc@gmail.com>2018-08-14 16:09:51 +0200
commit077bf43ab5e4a646d2898eea28e4b8752a93fc89 (patch)
tree2b27d68caeecf09d4adda1fb717cafa639494e9f
parent9f3e6bfe9b76c4b0829cc4bc702d9a31144ce83f (diff)
Scripts/Commands: Fix .quest complete to properly work with PvP kill quests. Closes #16321.
-rw-r--r--src/server/game/Entities/Player/Player.cpp41
-rw-r--r--src/server/game/Entities/Player/Player.h3
-rw-r--r--src/server/scripts/Commands/cs_quest.cpp5
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())
{