added tracking of Pet Excavator achievement (#213)

* added tracking of the Pet Excavator achievement

* make Pet Extractor Progress Zone specific

* added tracking of Pet Excavator Achievement using player flags
This commit is contained in:
Nordegraf 2022-02-05 13:19:25 +01:00 committed by GitHub
parent 84cf79906b
commit f7009b499b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 8 deletions

View File

@ -39,7 +39,7 @@ const std::map<LOT, DigInfo> PetDigServer::digInfoMap {
{12192, DigInfo { 12192, -1, -1, true, false, false, false }}, {12192, DigInfo { 12192, -1, -1, true, false, false, false }},
}; };
void PetDigServer::OnStartup(Entity* self) void PetDigServer::OnStartup(Entity* self)
{ {
treasures.push_back(self->GetObjectID()); treasures.push_back(self->GetObjectID());
const auto digInfoIterator = digInfoMap.find(self->GetLOT()); const auto digInfoIterator = digInfoMap.find(self->GetLOT());
@ -64,7 +64,7 @@ void PetDigServer::OnStartup(Entity* self)
} }
} }
void PetDigServer::OnDie(Entity* self, Entity* killer) void PetDigServer::OnDie(Entity* self, Entity* killer)
{ {
const auto iterator = std::find(treasures.begin(), treasures.end(), self->GetObjectID()); const auto iterator = std::find(treasures.begin(), treasures.end(), self->GetObjectID());
if (iterator != treasures.end()) if (iterator != treasures.end())
@ -91,7 +91,7 @@ void PetDigServer::OnDie(Entity* self, Entity* killer)
PetDigServer::HandleBouncerDig(self, owner); PetDigServer::HandleBouncerDig(self, owner);
} }
PetDigServer::ProgressCanYouDigIt(owner); PetDigServer::ProgressPetDigMissions(owner, self);
self->SetNetworkVar<bool>(u"treasure_dug", true); self->SetNetworkVar<bool>(u"treasure_dug", true);
// TODO: Reset other pets // TODO: Reset other pets
@ -157,19 +157,36 @@ void PetDigServer::HandleBouncerDig(const Entity *self, const Entity *owner) {
} }
/** /**
* Progresses the Can You Dig It mission if the player has never completed it yet * Progresses the Can You Dig It mission and the Pet Excavator Achievement if the player has never completed it yet
* \param owner the owner that just made a pet dig something up * \param owner the owner that just made a pet dig something up
*/ */
void PetDigServer::ProgressCanYouDigIt(const Entity* owner) { void PetDigServer::ProgressPetDigMissions(const Entity* owner, const Entity* chest) {
auto* missionComponent = owner->GetComponent<MissionComponent>(); auto* missionComponent = owner->GetComponent<MissionComponent>();
if (missionComponent != nullptr) if (missionComponent != nullptr)
{ {
// Can You Dig It progress
const auto digMissionState = missionComponent->GetMissionState(843); const auto digMissionState = missionComponent->GetMissionState(843);
if (digMissionState == MissionState::MISSION_STATE_ACTIVE) if (digMissionState == MissionState::MISSION_STATE_ACTIVE)
{ {
missionComponent->ForceProgress(843, 1216, 1); missionComponent->ForceProgress(843, 1216, 1);
} }
// Pet Excavator progress
const auto excavatorMissionState = missionComponent->GetMissionState(505);
if (excavatorMissionState == MissionState::MISSION_STATE_ACTIVE)
{
if (chest->HasVar(u"PetDig")) {
int32_t playerFlag = 1260 + chest->GetVarAs<int32_t>(u"PetDig");
Character* player = owner->GetCharacter();
// check if player flag is set
if (!player->GetPlayerFlag(playerFlag)) {
missionComponent->ForceProgress(505, 767, 1);
player->SetPlayerFlag(playerFlag, 1);
}
}
}
} }
} }
@ -203,7 +220,7 @@ void PetDigServer::SpawnPet(Entity* self, const Entity* owner, const DigInfo dig
EntityManager::Instance()->ConstructEntity(spawnedPet); EntityManager::Instance()->ConstructEntity(spawnedPet);
} }
Entity* PetDigServer::GetClosestTresure(NiPoint3 position) Entity* PetDigServer::GetClosestTresure(NiPoint3 position)
{ {
float closestDistance = 0; float closestDistance = 0;
Entity* closest = nullptr; Entity* closest = nullptr;
@ -215,7 +232,7 @@ Entity* PetDigServer::GetClosestTresure(NiPoint3 position)
if (tresure == nullptr) continue; if (tresure == nullptr) continue;
float distance = Vector3::DistanceSquared(tresure->GetPosition(), position); float distance = Vector3::DistanceSquared(tresure->GetPosition(), position);
if (closest == nullptr || distance < closestDistance) if (closest == nullptr || distance < closestDistance)
{ {
closestDistance = distance; closestDistance = distance;

View File

@ -20,7 +20,7 @@ public:
static Entity* GetClosestTresure(NiPoint3 position); static Entity* GetClosestTresure(NiPoint3 position);
private: private:
static void ProgressCanYouDigIt(const Entity* owner); static void ProgressPetDigMissions(const Entity* owner, const Entity* chest);
static void SpawnPet(Entity* self, const Entity* owner, DigInfo digInfo); static void SpawnPet(Entity* self, const Entity* owner, DigInfo digInfo);
static void HandleXBuildDig(const Entity* self, Entity* owner, Entity* pet); static void HandleXBuildDig(const Entity* self, Entity* owner, Entity* pet);
static void HandleBouncerDig(const Entity* self, const Entity* owner); static void HandleBouncerDig(const Entity* self, const Entity* owner);