Reject completion packets for missions that aren't in progress

Also reject players requesting more than 6 missions.

This is just a minimal measure to prevent replaying mission completion
packets. This part of the codebase will be largely refactored soon, so
more through changes can wait.
This commit is contained in:
dongresource 2021-03-09 17:57:33 +01:00
parent ffe5947925
commit f5a34b9a3d

View File

@ -55,6 +55,7 @@ bool MissionManager::startTask(Player* plr, int TaskID) {
if (i == ACTIVE_MISSION_COUNT - 1 && plr->tasks[i] != TaskID) { if (i == ACTIVE_MISSION_COUNT - 1 && plr->tasks[i] != TaskID) {
std::cout << "[WARN] Player has more than 6 active missions!?" << std::endl; std::cout << "[WARN] Player has more than 6 active missions!?" << std::endl;
return false;
} }
return true; return true;
@ -164,6 +165,21 @@ bool MissionManager::endTask(CNSocket *sock, int32_t taskNum, int choice) {
// ugly pointer/reference juggling for the sake of operator overloading... // ugly pointer/reference juggling for the sake of operator overloading...
TaskData& task = *Tasks[taskNum]; TaskData& task = *Tasks[taskNum];
// update player
int i;
for (i = 0; i < ACTIVE_MISSION_COUNT; i++) {
if (plr->tasks[i] == taskNum) {
plr->tasks[i] = 0;
for (int j = 0; j < 3; j++) {
plr->RemainingNPCCount[i][j] = 0;
}
}
}
if (i == ACTIVE_MISSION_COUNT - 1 && plr->tasks[i] != 0) {
std::cout << "[WARN] Player completed non-active mission!?" << std::endl;
return false;
}
// mission rewards // mission rewards
if (Rewards.find(taskNum) != Rewards.end()) { if (Rewards.find(taskNum) != Rewards.end()) {
if (giveMissionReward(sock, taskNum, choice) == -1) if (giveMissionReward(sock, taskNum, choice) == -1)
@ -188,20 +204,6 @@ bool MissionManager::endTask(CNSocket *sock, int32_t taskNum, int choice) {
if (task["m_iSUItem"][i] != 0) if (task["m_iSUItem"][i] != 0)
dropQuestItem(sock, taskNum, task["m_iSUInstancename"][i], task["m_iSUItem"][i], 0); dropQuestItem(sock, taskNum, task["m_iSUInstancename"][i], task["m_iSUItem"][i], 0);
// update player
int i;
for (i = 0; i < ACTIVE_MISSION_COUNT; i++) {
if (plr->tasks[i] == taskNum) {
plr->tasks[i] = 0;
for (int j = 0; j < 3; j++) {
plr->RemainingNPCCount[i][j] = 0;
}
}
}
if (i == ACTIVE_MISSION_COUNT - 1 && plr->tasks[i] != 0) {
std::cout << "[WARN] Player completed non-active mission!?" << std::endl;
}
// if it's the last task // if it's the last task
if (task["m_iSUOutgoingTask"] == 0) { if (task["m_iSUOutgoingTask"] == 0) {
// save completed mission on player // save completed mission on player