diff options
| author | Shauren <shauren.trinity@gmail.com> | 2016-08-15 00:03:38 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2016-08-15 00:03:38 +0200 |
| commit | fea0cb16f2e73ec21891ac14cdc10d9d8f518cfe (patch) | |
| tree | 7e3a6ee9b3876ca5b3a7115a9d932ce8125c41e1 /src/server/game/Server | |
| parent | f8c5a2c723c734513eddc98a5c7f380c2f00e479 (diff) | |
Core/Items: Implemented artifacts
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/AllPackets.h | 1 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/ArtifactPackets.cpp | 71 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/ArtifactPackets.h | 105 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/ItemPackets.cpp | 9 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 11 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 1 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 12 |
7 files changed, 203 insertions, 7 deletions
diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index 932b38bbd5e..7c4f7ba39ab 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -19,6 +19,7 @@ #define AllPackets_h__ #include "AchievementPackets.h" +#include "ArtifactPackets.h" #include "AuctionHousePackets.h" #include "AuthenticationPackets.h" #include "BankPackets.h" diff --git a/src/server/game/Server/Packets/ArtifactPackets.cpp b/src/server/game/Server/Packets/ArtifactPackets.cpp new file mode 100644 index 00000000000..1f80789076a --- /dev/null +++ b/src/server/game/Server/Packets/ArtifactPackets.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2008-2016 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 "ArtifactPackets.h" + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Artifact::ArtifactAddPower::ArtifactPowerChoice& artifactPowerChoice) +{ + data >> artifactPowerChoice.ArtifactPowerID; + data >> artifactPowerChoice.Rank; + return data; +} + +void WorldPackets::Artifact::ArtifactAddPower::Read() +{ + _worldPacket >> ArtifactGUID; + _worldPacket >> ForgeGUID; + PowerChoices.resize(_worldPacket.read<uint32>()); + for (ArtifactPowerChoice& artifactPowerChoice : PowerChoices) + _worldPacket >> artifactPowerChoice; +} + +void WorldPackets::Artifact::ArtifactSetAppearance::Read() +{ + _worldPacket >> ArtifactGUID; + _worldPacket >> ForgeGUID; + _worldPacket >> ArtifactAppearanceID; +} + +void WorldPackets::Artifact::ConfirmArtifactRespec::Read() +{ + _worldPacket >> ArtifactGUID; + _worldPacket >> NpcGUID; +} + +WorldPacket const* WorldPackets::Artifact::ArtifactForgeOpened::Write() +{ + _worldPacket << ArtifactGUID; + _worldPacket << ForgeGUID; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Artifact::ArtifactRespecConfirm::Write() +{ + _worldPacket << ArtifactGUID; + _worldPacket << NpcGUID; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Artifact::ArtifactXpGain::Write() +{ + _worldPacket << ArtifactGUID; + _worldPacket << int32(Amount); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/ArtifactPackets.h b/src/server/game/Server/Packets/ArtifactPackets.h new file mode 100644 index 00000000000..f8ad3011ce0 --- /dev/null +++ b/src/server/game/Server/Packets/ArtifactPackets.h @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2008-2016 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 ArtifactPackets_h__ +#define ArtifactPackets_h__ + +#include "Packet.h" +#include "PacketUtilities.h" +#include "ObjectGuid.h" + +namespace WorldPackets +{ + namespace Artifact + { + class ArtifactAddPower final : public ClientPacket + { + public: + struct ArtifactPowerChoice + { + int32 ArtifactPowerID = 0; + uint8 Rank = 0; + }; + + ArtifactAddPower(WorldPacket&& packet) : ClientPacket(CMSG_ARTIFACT_ADD_POWER, std::move(packet)) { } + + void Read() override; + + ObjectGuid ArtifactGUID; + ObjectGuid ForgeGUID; + Array<ArtifactPowerChoice, 1 /*lua allows only 1 power per call*/> PowerChoices; + }; + + class ArtifactSetAppearance final : public ClientPacket + { + public: + ArtifactSetAppearance(WorldPacket&& packet) : ClientPacket(CMSG_ARTIFACT_SET_APPEARANCE, std::move(packet)) { } + + void Read() override; + + ObjectGuid ArtifactGUID; + ObjectGuid ForgeGUID; + int32 ArtifactAppearanceID = 0; + }; + + class ConfirmArtifactRespec final : public ClientPacket + { + public: + ConfirmArtifactRespec(WorldPacket&& packet) : ClientPacket(CMSG_CONFIRM_ARTIFACT_RESPEC, std::move(packet)) { } + + void Read() override; + + ObjectGuid ArtifactGUID; + ObjectGuid NpcGUID; + }; + + class ArtifactForgeOpened final : public ServerPacket + { + public: + ArtifactForgeOpened() : ServerPacket(SMSG_ARTIFACT_FORGE_OPENED, 16 + 16) { } + + WorldPacket const* Write() override; + + ObjectGuid ArtifactGUID; + ObjectGuid ForgeGUID; + }; + + class ArtifactRespecConfirm final : public ServerPacket + { + public: + ArtifactRespecConfirm() : ServerPacket(SMSG_ARTIFACT_RESPEC_CONFIRM, 16 + 16) { } + + WorldPacket const* Write() override; + + ObjectGuid ArtifactGUID; + ObjectGuid NpcGUID; + }; + + class ArtifactXpGain final : public ServerPacket + { + public: + ArtifactXpGain() : ServerPacket(SMSG_ARTIFACT_XP_GAIN, 16 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid ArtifactGUID; + int32 Amount = 0; + }; + } +} + +#endif // ArtifactPackets_h__ diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 54bc120d178..73225ae8e02 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -319,10 +319,15 @@ void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidI ItemID = voidItem->ItemEntry; RandomPropertiesID = voidItem->ItemRandomPropertyId; RandomPropertiesSeed = voidItem->ItemSuffixFactor; - if (voidItem->ItemUpgradeId) + if (voidItem->ItemUpgradeId || voidItem->FixedScalingLevel || voidItem->ArtifactKnowledgeLevel) { Modifications = boost::in_place(); - Modifications->Insert(ITEM_MODIFIER_UPGRADE_ID, voidItem->ItemUpgradeId); + if (voidItem->ItemUpgradeId) + Modifications->Insert(ITEM_MODIFIER_UPGRADE_ID, voidItem->ItemUpgradeId); + if (voidItem->FixedScalingLevel) + Modifications->Insert(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL, voidItem->FixedScalingLevel); + if (voidItem->ArtifactKnowledgeLevel) + Modifications->Insert(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL, voidItem->ArtifactKnowledgeLevel); } if (!voidItem->BonusListIDs.empty()) diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ca86d3de4e3..9a6d7adba71 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -140,8 +140,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaSpiritHealerQueryOpcode); DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUEUE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaSpiritHealerQueueOpcode); DEFINE_HANDLER(CMSG_AREA_TRIGGER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaTriggerOpcode); - DEFINE_HANDLER(CMSG_ARTIFACT_ADD_POWER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_ARTIFACT_SET_APPEARANCE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_ARTIFACT_ADD_POWER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleArtifactAddPower); + DEFINE_HANDLER(CMSG_ARTIFACT_SET_APPEARANCE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleArtifactSetAppearance); DEFINE_HANDLER(CMSG_ATTACK_STOP, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAttackStopOpcode); DEFINE_HANDLER(CMSG_ATTACK_SWING, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAttackSwingOpcode); DEFINE_HANDLER(CMSG_AUCTION_HELLO_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionHelloOpcode); @@ -310,7 +310,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_COMPLAINT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleComplaint); DEFINE_HANDLER(CMSG_COMPLETE_CINEMATIC, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCompleteCinematic); DEFINE_HANDLER(CMSG_COMPLETE_MOVIE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CONFIRM_ARTIFACT_RESPEC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_CONFIRM_ARTIFACT_RESPEC, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleConfirmArtifactRespec); DEFINE_HANDLER(CMSG_CONFIRM_RESPEC_WIPE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleConfirmRespecWipeOpcode); DEFINE_HANDLER(CMSG_CONNECT_TO_FAILED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_CONVERT_RAID, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleConvertRaidOpcode); @@ -858,9 +858,10 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_APPEARANCE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_FORGE_OPENED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_FORGE_OPENED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_POWERS_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_XP_GAIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_RESPEC_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_XP_GAIN, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKER_STATE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_STOP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 223d55cc9d0..3dde86efe49 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -775,6 +775,7 @@ enum OpcodeServer : uint32 SMSG_ARTIFACT_APPEARANCE_CHANGED = 0x27E3, SMSG_ARTIFACT_FORGE_OPENED = 0x27E1, SMSG_ARTIFACT_POWERS_UPDATED = 0x27E2, + SMSG_ARTIFACT_RESPEC_CONFIRM = 0x27E4, SMSG_ARTIFACT_XP_GAIN = 0x2823, SMSG_ATTACKER_STATE_UPDATE = 0x27CE, SMSG_ATTACK_START = 0x2669, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 6fdf5c560bf..be4060bdc9b 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -80,6 +80,13 @@ namespace WorldPackets class GuildSetFocusedAchievement; } + namespace Artifact + { + class ArtifactAddPower; + class ArtifactSetAppearance; + class ConfirmArtifactRespec; + } + namespace AuctionHouse { class AuctionHelloRequest; @@ -1718,6 +1725,11 @@ class TC_GAME_API WorldSession std::unordered_map<uint32, uint8> const& GetRealmCharacterCounts() const { return _realmCharacterCounts; } + // Artifact + void HandleArtifactAddPower(WorldPackets::Artifact::ArtifactAddPower& artifactAddPower); + void HandleArtifactSetAppearance(WorldPackets::Artifact::ArtifactSetAppearance& artifactSetAppearance); + void HandleConfirmArtifactRespec(WorldPackets::Artifact::ConfirmArtifactRespec& confirmArtifactRespec); + union ConnectToKey { struct |
