Files
DarkflameServer/dGame/dMission/MissionPrerequisites.h
Aaron Kimbrell 8564e293fa fix(mission): GetMissionState answers the client's state bit mask
LWOMissionComponent::getMissionState (0x00cd7400) returns a mask: COMPLETE
once the mission was completed, ORed with the state of the mission in
progress; a mission not in progress gets AVAILABLE when it was never
completed or is repeatable and its prerequisites are met, else 0. DLU's
handler answered UNKNOWN (-1, every bit set) for a mission that cannot be
taken and COMPLETE for a completed repeatable one, and ignored
cooldownInfoRequested. With cooldown info requested (0x00cd7770) the
client only checks the cooldown of a repeat in progress (state 9 or 10):
fewer whole minutes since the last completion than Missions.cooldownTime.

MissionComponent::GetMissionState, used across the server, is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 09:43:08 -05:00

60 lines
1.9 KiB
C++

#pragma once
#include <vector>
#include <string>
#include <map>
#include "Mission.h"
/**
* An expression that checks if a mission may be accepted or not
*/
class PrerequisiteExpression final
{
bool m_or;
uint32_t a;
uint32_t sub;
PrerequisiteExpression* b;
public:
/**
* Executes the prerequisite, checking its contents and returning whether or not the mission may be accepted
* @param missions the list of missions to check the prerequisites against (f.e. whether they're completed)
* @return whether or not all the prerequisites are met
*/
bool Execute(const std::unordered_map<uint32_t, Mission*>& missions) const;
explicit PrerequisiteExpression(const std::string& str);
~PrerequisiteExpression();
};
/**
* Utility class for checking whether or not a mission can be accepted using its prerequisites
*/
class MissionPrerequisites final
{
public:
/**
* Checks whether or not the mission identified by the specified ID can be accepted based on the mission inventory passed.
* Also performs checks for daily missions (e.g. if the time out is valid).
* @param missionId the mission ID to check prerequisites for
* @param missions the mission inventory to check the prerequisites against
* @return whether or not the mission identified by the specified ID can be accepted
*/
static bool CanAccept(uint32_t missionId, const std::unordered_map<uint32_t, Mission*>& missions);
/**
* Checks the prerequisites for a mission
* @param missionId the mission ID to check prerequisites for
* @param missions the mission inventory to check the prerequisites against
* @return whether or not the prerequisites of the mission identified by the specified ID are met
*/
static bool CheckPrerequisites(uint32_t missionId, const std::unordered_map<uint32_t, Mission*>& missions);
private:
/**
* Cache of all the executed prerequisites
*/
static std::unordered_map<uint32_t, PrerequisiteExpression*> expressions;
};