aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-05-18 16:57:59 +0200
committerShauren <shauren.trinity@gmail.com>2020-05-18 16:57:59 +0200
commit3e833739071a689dc34e33f7a511d8cc50e00b94 (patch)
tree987cebdbb80185ec8aae54147d1ccb22d4d19bc1 /src/server/game/Server
parent4055434ba6260e528c877023faebf87ba2c81a42 (diff)
Core/Achievements: Minor fixes
* Corrected criteria and modifier tree logic after implementing their operators * Account wide achievements will now show progress ingame (even if we still treat them as per-character) * Fixed more cases of achievements being granted automatically without satisfying modifier trees
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/AchievementPackets.cpp21
-rw-r--r--src/server/game/Server/Packets/AchievementPackets.h21
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
3 files changed, 44 insertions, 2 deletions
diff --git a/src/server/game/Server/Packets/AchievementPackets.cpp b/src/server/game/Server/Packets/AchievementPackets.cpp
index 058e6d34524..033f4b9ccf6 100644
--- a/src/server/game/Server/Packets/AchievementPackets.cpp
+++ b/src/server/game/Server/Packets/AchievementPackets.cpp
@@ -66,6 +66,15 @@ WorldPacket const* WorldPackets::Achievement::AllAchievementData::Write()
return &_worldPacket;
}
+WorldPacket const* WorldPackets::Achievement::AllAccountCriteria::Write()
+{
+ _worldPacket << uint32(Progress.size());
+ for (WorldPackets::Achievement::CriteriaProgress const& progress : Progress)
+ _worldPacket << progress;
+
+ return &_worldPacket;
+}
+
WorldPacket const* WorldPackets::Achievement::RespondInspectAchievements::Write()
{
_worldPacket << Player;
@@ -83,6 +92,18 @@ WorldPacket const* WorldPackets::Achievement::CriteriaUpdate::Write()
_worldPacket.AppendPackedTime(CurrentTime);
_worldPacket << uint32(ElapsedTime);
_worldPacket << uint32(CreationTime);
+ _worldPacket.WriteBit(RafAcceptanceID.is_initialized());
+ _worldPacket.FlushBits();
+
+ if (RafAcceptanceID)
+ _worldPacket << uint64(*RafAcceptanceID);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Achievement::AccountCriteriaUpdate::Write()
+{
+ _worldPacket << Progress;
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/AchievementPackets.h b/src/server/game/Server/Packets/AchievementPackets.h
index 7b3d3d927ac..e2c6f85dbc0 100644
--- a/src/server/game/Server/Packets/AchievementPackets.h
+++ b/src/server/game/Server/Packets/AchievementPackets.h
@@ -63,6 +63,16 @@ namespace WorldPackets
AllAchievements Data;
};
+ class AllAccountCriteria final : public ServerPacket
+ {
+ public:
+ AllAccountCriteria() : ServerPacket(SMSG_ALL_ACCOUNT_CRITERIA) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<CriteriaProgress> Progress;
+ };
+
class RespondInspectAchievements final : public ServerPacket
{
public:
@@ -88,6 +98,17 @@ namespace WorldPackets
time_t CurrentTime = time_t(0);
uint32 ElapsedTime = 0;
uint32 CreationTime = 0;
+ Optional<uint64> RafAcceptanceID;
+ };
+
+ class AccountCriteriaUpdate final : public ServerPacket
+ {
+ public:
+ AccountCriteriaUpdate() : ServerPacket(SMSG_ACCOUNT_CRITERIA_UPDATE) { }
+
+ WorldPacket const* Write() override;
+
+ CriteriaProgress Progress;
};
class CriteriaDeleted final : public ServerPacket
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 076e0c55d08..a8f0be7874e 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -895,7 +895,7 @@ void OpcodeTable::Initialize()
ValidateAndSetServerOpcode(opcode, #opcode, status, con)
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ABORT_NEW_WORLD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_CRITERIA_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_CRITERIA_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_HEIRLOOM_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_MOUNT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -913,7 +913,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AE_LOOT_TARGETS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AE_LOOT_TARGET_ACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACCOUNT_CRITERIA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACCOUNT_CRITERIA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_GUILD_ACHIEVEMENTS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARCHAEOLOGY_SURVERY_CAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);