diff options
| author | Shauren <shauren.trinity@gmail.com> | 2014-12-28 16:21:35 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2014-12-28 16:21:35 +0100 |
| commit | 483b6ad5a8a36c85cb657b3ed6d0c31b241eeb87 (patch) | |
| tree | 32072653efe0be590623993e7c4ffc3811dfe975 /src/server/game/Server | |
| parent | 12ef5ad90a2bbe367651f82224d785c97b786930 (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.cpp | 74 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/AchievementPackets.h | 93 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 12 |
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, |
