aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-12-28 16:21:35 +0100
committerShauren <shauren.trinity@gmail.com>2014-12-28 16:21:35 +0100
commit483b6ad5a8a36c85cb657b3ed6d0c31b241eeb87 (patch)
tree32072653efe0be590623993e7c4ffc3811dfe975 /src/server/game/Server
parent12ef5ad90a2bbe367651f82224d785c97b786930 (diff)
Core/Achievements: Updated achievements - progress is currently not saved until a conversion of existing data from old to new criteria is made
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/AchievementPackets.cpp74
-rw-r--r--src/server/game/Server/Packets/AchievementPackets.h93
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h12
4 files changed, 175 insertions, 10 deletions
diff --git a/src/server/game/Server/Packets/AchievementPackets.cpp b/src/server/game/Server/Packets/AchievementPackets.cpp
new file mode 100644
index 00000000000..d471d87426c
--- /dev/null
+++ b/src/server/game/Server/Packets/AchievementPackets.cpp
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "AchievementPackets.h"
+
+WorldPacket const* WorldPackets::Achievement::AllAchievements::Write()
+{
+ _worldPacket << uint32(Earned.size());
+ _worldPacket << uint32(Progress.size());
+
+ for (EarnedAchievement const& earned : Earned)
+ {
+ _worldPacket << uint32(earned.Id);
+ _worldPacket.AppendPackedTime(earned.Date);
+ _worldPacket << earned.Owner;
+ _worldPacket << uint32(earned.VirtualRealmAddress);
+ _worldPacket << uint32(earned.NativeRealmAddress);
+ }
+
+ for (CriteriaProgress const& progress : Progress)
+ {
+ _worldPacket << uint32(progress.Id);
+ _worldPacket << uint64(progress.Quantity);
+ _worldPacket << progress.Player;
+ _worldPacket.AppendPackedTime(progress.Date);
+ _worldPacket << uint32(progress.TimeFromStart);
+ _worldPacket << uint32(progress.TimeFromCreate);
+ _worldPacket.WriteBits(progress.Flags, 4);
+ _worldPacket.FlushBits();
+ }
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Achievement::CriteriaUpdate::Write()
+{
+ _worldPacket << uint32(CriteriaID);
+ _worldPacket << uint64(Quantity);
+ _worldPacket << PlayerGUID;
+ _worldPacket << uint32(Flags);
+ _worldPacket.AppendPackedTime(CurrentTime);
+ _worldPacket << uint32(ElapsedTime);
+ _worldPacket << uint32(CreationTime);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Achievement::AchievementEarned::Write()
+{
+ _worldPacket << Sender;
+ _worldPacket << Earner;
+ _worldPacket << uint32(AchievementID);
+ _worldPacket.AppendPackedTime(Time);
+ _worldPacket << uint32(EarnerNativeRealm);
+ _worldPacket << uint32(EarnerVirtualRealm);
+ _worldPacket.WriteBit(Initial);
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/AchievementPackets.h b/src/server/game/Server/Packets/AchievementPackets.h
new file mode 100644
index 00000000000..9d609372831
--- /dev/null
+++ b/src/server/game/Server/Packets/AchievementPackets.h
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef game_AchievementPackets_h__
+#define game_AchievementPackets_h__
+
+#include "ObjectGuid.h"
+#include "Packet.h"
+
+namespace WorldPackets
+{
+ namespace Achievement
+ {
+ struct EarnedAchievement
+ {
+ uint32 Id = 0;
+ time_t Date = time_t(0);
+ ObjectGuid Owner;
+ uint32 VirtualRealmAddress = 0;
+ uint32 NativeRealmAddress = 0;
+ };
+
+ struct CriteriaProgress
+ {
+ uint32 Id = 0;
+ uint64 Quantity = 0;
+ ObjectGuid Player;
+ uint32 Flags = 0;
+ time_t Date = time_t(0);
+ uint32 TimeFromStart = 0;
+ uint32 TimeFromCreate = 0;
+ };
+
+ class AllAchievements final : public ServerPacket
+ {
+ public:
+ AllAchievements() : ServerPacket(SMSG_ALL_ACHIEVEMENT_DATA) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<EarnedAchievement> Earned;
+ std::vector<CriteriaProgress> Progress;
+ };
+
+ class CriteriaUpdate final : public ServerPacket
+ {
+ public:
+ CriteriaUpdate() : ServerPacket(SMSG_CRITERIA_UPDATE, 4 + 8 + 16 + 4 + 4 + 4 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 CriteriaID = 0;
+ uint64 Quantity = 0;
+ ObjectGuid PlayerGUID;
+ uint32 Flags = 0;
+ time_t CurrentTime = time_t(0);
+ uint32 ElapsedTime = 0;
+ uint32 CreationTime = 0;
+ };
+
+ class AchievementEarned final : public ServerPacket
+ {
+ public:
+ AchievementEarned() : ServerPacket(SMSG_ACHIEVEMENT_EARNED, 16 + 4 + 4 + 4 + 4 + 1 + 16) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Earner;
+ uint32 EarnerNativeRealm = 0;
+ uint32 EarnerVirtualRealm = 0;
+ uint32 AchievementID = 0;
+ time_t Time = time_t(0);
+ bool Initial = false;
+ ObjectGuid Sender;
+ };
+ }
+}
+
+#endif // game_AchievementPackets_h__
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index e18e5e984ac..603e55ff738 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -709,14 +709,14 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_RESTRICTED_WARNING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_TOYS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTION_BUTTONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATETAXIREPLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADDON_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_RUNE_POWER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADJUST_SPLINE_DURATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_MOVEMENT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -867,7 +867,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_RECLAIM_DELAY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CREATURE_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRITERIA_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRITERIA_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRITERIA_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CROSSED_INEBRIATION_THRESHOLD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CURRENCY_LOOT_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CURRENCY_LOOT_RESTORED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 68fd9c30d48..ddad78a527b 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -686,16 +686,16 @@ enum OpcodeServer : uint32
SMSG_ACCOUNT_RESTRICTED_WARNING = 0xBADD,
SMSG_ACCOUNT_TOYS_UPDATE = 0x0590,
SMSG_ACHIEVEMENT_DELETED = 0xBADD,
- SMSG_ACHIEVEMENT_EARNED = 0xBADD,
+ SMSG_ACHIEVEMENT_EARNED = 0x010E,
SMSG_ACTION_BUTTONS = 0x1D1F,
SMSG_ACTIVATETAXIREPLY = 0xBADD,
SMSG_ADDON_INFO = 0x1D9F,
SMSG_ADD_RUNE_POWER = 0xBADD,
SMSG_ADJUST_SPLINE_DURATION = 0x0104,
SMSG_AI_REACTION = 0x0BA1,
- SMSG_ALL_ACHIEVEMENT_DATA = 0xBADD,
- SMSG_ALL_ACHIEVEMENT_DATA_ACCOUNT = 0x0123,
- SMSG_ALL_ACHIEVEMENT_DATA_PLAYER = 0x0030,
+ SMSG_ACCOUNT_CRITERIA_UPDATE = 0x0912,
+ SMSG_ALL_ACCOUNT_CRITERIA = 0x0123,
+ SMSG_ALL_ACHIEVEMENT_DATA = 0x0030,
SMSG_AREA_SPIRIT_HEALER_TIME = 0xBADD,
SMSG_AREA_TRIGGER_MESSAGE = 0xBADD,
SMSG_AREA_TRIGGER_MOVEMENT_UPDATE = 0xBADD,
@@ -852,9 +852,7 @@ enum OpcodeServer : uint32
SMSG_CORPSE_RECLAIM_DELAY = 0x0BE2,
SMSG_CREATURE_QUERY_RESPONSE = 0x0A26,
SMSG_CRITERIA_DELETED = 0xBADD,
- SMSG_CRITERIA_UPDATE = 0xBADD,
- SMSG_CRITERIA_UPDATE_ACCOUNT = 0x0912,
- SMSG_CRITERIA_UPDATE_PLAYER = 0x1904,
+ SMSG_CRITERIA_UPDATE = 0x1904,
SMSG_CROSSED_INEBRIATION_THRESHOLD = 0xBADD,
SMSG_CURRENCY_LOOT_REMOVED = 0xBADD,
SMSG_CURRENCY_LOOT_RESTORED = 0xBADD,