aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-08-15 00:03:38 +0200
committerShauren <shauren.trinity@gmail.com>2016-08-15 00:03:38 +0200
commitfea0cb16f2e73ec21891ac14cdc10d9d8f518cfe (patch)
tree7e3a6ee9b3876ca5b3a7115a9d932ce8125c41e1 /src/server/game/Server
parentf8c5a2c723c734513eddc98a5c7f380c2f00e479 (diff)
Core/Items: Implemented artifacts
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/AllPackets.h1
-rw-r--r--src/server/game/Server/Packets/ArtifactPackets.cpp71
-rw-r--r--src/server/game/Server/Packets/ArtifactPackets.h105
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp9
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp11
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h1
-rw-r--r--src/server/game/Server/WorldSession.h12
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