aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorMitchesD <majklprofik@seznam.cz>2015-08-26 11:12:35 +0200
committerMitchesD <majklprofik@seznam.cz>2015-08-26 11:15:00 +0200
commit614b5832ba96b4c5905ece5490a7b5d18c2f710b (patch)
tree454e71dfcab1da90490466dfebd69a115950866d /src/server/game/Server
parentca5c5221ba8376d152a4c8216afd922924475802 (diff)
Core/Player: implemented Toybox
* now you can use all the things in toybox - add new toys, set them as favorite and use them
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h1
-rw-r--r--src/server/game/Server/Packets/ToyPackets.cpp55
-rw-r--r--src/server/game/Server/Packets/ToyPackets.h74
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp9
-rw-r--r--src/server/game/Server/WorldSession.cpp43
-rw-r--r--src/server/game/Server/WorldSession.h22
6 files changed, 199 insertions, 5 deletions
diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h
index fbd53c0527c..9797f86585c 100644
--- a/src/server/game/Server/Packets/SpellPackets.h
+++ b/src/server/game/Server/Packets/SpellPackets.h
@@ -784,5 +784,6 @@ namespace WorldPackets
}
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData const& spellCastLogData);
+ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellCastRequest& request);
#endif // SpellPackets_h__
diff --git a/src/server/game/Server/Packets/ToyPackets.cpp b/src/server/game/Server/Packets/ToyPackets.cpp
new file mode 100644
index 00000000000..9d0f7b519b9
--- /dev/null
+++ b/src/server/game/Server/Packets/ToyPackets.cpp
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2008-2015 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 "ToyPackets.h"
+
+void WorldPackets::Toy::AddToy::Read()
+{
+ _worldPacket >> Guid;
+}
+
+void WorldPackets::Toy::UseToy::Read()
+{
+ _worldPacket >> ItemID;
+ _worldPacket >> Cast;
+}
+
+WorldPacket const* WorldPackets::Toy::AccountToysUpdate::Write()
+{
+ _worldPacket.WriteBit(IsFullUpdate);
+ _worldPacket.FlushBits();
+
+ // both lists have to have the same size
+ _worldPacket << int32(Toys->size());
+ _worldPacket << int32(Toys->size());
+
+ for (auto const& item : *Toys)
+ _worldPacket << uint32(item.first);
+
+ for (auto const& favourite : *Toys)
+ _worldPacket.WriteBit(favourite.second);
+
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Toy::ToySetFavorite::Read()
+{
+ _worldPacket >> ItemID;
+ Favorite = _worldPacket.ReadBit();
+}
diff --git a/src/server/game/Server/Packets/ToyPackets.h b/src/server/game/Server/Packets/ToyPackets.h
new file mode 100644
index 00000000000..11b0f47ddda
--- /dev/null
+++ b/src/server/game/Server/Packets/ToyPackets.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2008-2015 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 ToyPackets_h__
+#define ToyPackets_h__
+
+#include "Packet.h"
+#include "ObjectGuid.h"
+#include "SpellPackets.h"
+
+namespace WorldPackets
+{
+ namespace Toy
+ {
+ class AddToy final : public ClientPacket
+ {
+ public:
+ AddToy(WorldPacket&& packet) : ClientPacket(CMSG_ADD_TOY, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Guid;
+ };
+
+ class UseToy final : public ClientPacket
+ {
+ public:
+ UseToy(WorldPacket&& packet) : ClientPacket(CMSG_USE_TOY, std::move(packet)) { }
+
+ void Read() override;
+
+ WorldPackets::Spells::SpellCastRequest Cast;
+ uint32 ItemID = 0;
+ };
+
+ class AccountToysUpdate final : public ServerPacket
+ {
+ public:
+ AccountToysUpdate() : ServerPacket(SMSG_ACCOUNT_TOYS_UPDATE, 1 + 4 + 1) { }
+
+ WorldPacket const* Write() override;
+
+ bool IsFullUpdate = false;
+ ToyBoxContainer const* Toys = nullptr;
+ };
+
+ class ToySetFavorite final : public ClientPacket
+ {
+ public:
+ ToySetFavorite(WorldPacket&& packet) : ClientPacket(CMSG_TOY_SET_FAVORITE, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 ItemID = 0;
+ bool Favorite = false;
+ };
+ }
+}
+
+#endif // ToyPackets_h__
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 03a48630afc..24a01eb9057 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -54,6 +54,7 @@
#include "Packets/TicketPackets.h"
#include "Packets/TokenPackets.h"
#include "Packets/TotemPackets.h"
+#include "Packets/ToyPackets.h"
#include "Packets/TradePackets.h"
#include "Packets/VehiclePackets.h"
#include "Packets/VoidStoragePackets.h"
@@ -163,7 +164,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_ADD_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::AddFriend, &WorldSession::HandleAddFriendOpcode);
DEFINE_HANDLER(CMSG_ADD_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::AddIgnore, &WorldSession::HandleAddIgnoreOpcode);
- DEFINE_HANDLER(CMSG_ADD_TOY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_ADD_TOY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Toy::AddToy, &WorldSession::HandleAddToy);
DEFINE_HANDLER(CMSG_ALTER_APPEARANCE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::AlterApperance, &WorldSession::HandleAlterAppearance);
DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::AreaSpiritHealerQuery, &WorldSession::HandleAreaSpiritHealerQueryOpcode);
DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUEUE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::AreaSpiritHealerQueue, &WorldSession::HandleAreaSpiritHealerQueueOpcode);
@@ -786,7 +787,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_TOGGLE_DIFFICULTY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_TOGGLE_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TogglePvP, &WorldSession::HandleTogglePvP);
DEFINE_HANDLER(CMSG_TOTEM_DESTROYED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Totem::TotemDestroyed, &WorldSession::HandleTotemDestroyed);
- DEFINE_HANDLER(CMSG_TOY_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_TOY_SET_FAVORITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Toy::ToySetFavorite, &WorldSession::HandleToySetFavorite);
DEFINE_HANDLER(CMSG_TRAINER_BUY_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::TrainerBuySpell, &WorldSession::HandleTrainerBuySpellOpcode);
DEFINE_HANDLER(CMSG_TRAINER_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTrainerListOpcode);
DEFINE_HANDLER(CMSG_TRANSMOGRIFY_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::TransmogrifyItems, &WorldSession::HandleTransmogrifyItems);
@@ -815,7 +816,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_USE_CRITTER_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_USE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::UseEquipmentSet, &WorldSession::HandleUseEquipmentSet);
DEFINE_HANDLER(CMSG_USE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::UseItem, &WorldSession::HandleUseItemOpcode);
- DEFINE_HANDLER(CMSG_USE_TOY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_USE_TOY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Toy::UseToy, &WorldSession::HandleUseToy);
DEFINE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_AUTHED, PROCESS_INPLACE, WorldPackets::Misc::ViolenceLevel, &WorldSession::HandleViolenceLevel);
DEFINE_HANDLER(CMSG_VOICE_ADD_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_VOICE_DEL_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
@@ -840,7 +841,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_HEIRLOOM_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_MOUNT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_TOYS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_TOYS_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATE_TAXI_REPLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index bc5b2ef69b6..b54528ee248 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -748,6 +748,40 @@ void WorldSession::LoadAccountData(PreparedQueryResult result, uint32 mask)
while (result->NextRow());
}
+void WorldSession::LoadAccountToys(PreparedQueryResult result)
+{
+ if (!result)
+ return;
+
+ do
+ {
+ Field* fields = result->Fetch();
+ uint32 itemId = fields[0].GetUInt32();
+ bool isFavourite = fields[1].GetBool();
+
+ _toys[itemId] = isFavourite;
+ }
+ while (result->NextRow());
+}
+
+void WorldSession::SaveAccountToys(SQLTransaction& trans)
+{
+ PreparedStatement* stmt = NULL;
+ for (ToyBoxContainer::const_iterator itr = _toys.begin(); itr != _toys.end(); ++itr)
+ {
+ stmt = LoginDatabase.GetPreparedStatement(LOGIN_REP_ACCOUNT_TOYS);
+ stmt->setUInt32(0, GetBattlenetAccountId());
+ stmt->setUInt32(1, itr->first);
+ stmt->setBool(2, itr->second);
+ trans->Append(stmt);
+ }
+}
+
+bool WorldSession::UpdateAccountToys(uint32 itemId, bool isFavourite /*= false*/)
+{
+ return _toys.insert(ToyBoxContainer::value_type(itemId, isFavourite)).second;
+}
+
void WorldSession::SetAccountData(AccountDataType type, uint32 time, std::string const& data)
{
if ((1 << type) & GLOBAL_CACHE_MASK)
@@ -1156,15 +1190,21 @@ class AccountInfoQueryHolder : public SQLQueryHolder
public:
enum
{
+ GLOBAL_ACCOUNT_TOYS = 0,
+
MAX_QUERIES
};
AccountInfoQueryHolder() { SetSize(MAX_QUERIES); }
- bool Initialize(uint32 /*accountId*/, uint32 /*battlenetAccountId*/)
+ bool Initialize(uint32 /*accountId*/, uint32 battlenetAccountId)
{
bool ok = true;
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_TOYS);
+ stmt->setUInt32(0, battlenetAccountId);
+ ok = SetPreparedQuery(GLOBAL_ACCOUNT_TOYS, stmt) && ok;
+
return ok;
}
};
@@ -1196,6 +1236,7 @@ void WorldSession::InitializeSessionCallback(SQLQueryHolder* realmHolder, SQLQue
{
LoadAccountData(realmHolder->GetPreparedResult(AccountInfoQueryHolderPerRealm::GLOBAL_ACCOUNT_DATA), GLOBAL_CACHE_MASK);
LoadTutorialsData(realmHolder->GetPreparedResult(AccountInfoQueryHolderPerRealm::TUTORIALS));
+ LoadAccountToys(holder->GetPreparedResult(AccountInfoQueryHolder::GLOBAL_ACCOUNT_TOYS));
if (!m_inQueue)
SendAuthResponse(AUTH_OK, false);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 107a4350af6..c759fe0a98a 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -494,6 +494,14 @@ namespace WorldPackets
class RequestForcedReactions;
}
+ namespace Toy
+ {
+ class AccountToysUpdate;
+ class AddToy;
+ class ToySetFavorite;
+ class UseToy;
+ }
+
namespace Scenes
{
class SceneTriggerEvent;
@@ -662,6 +670,8 @@ enum Tutorials
#define MAX_ACCOUNT_TUTORIAL_VALUES 8
+typedef std::map<uint32, bool> ToyBoxContainer;
+
struct AccountData
{
time_t Time = 0;
@@ -885,6 +895,12 @@ class WorldSession
void SetAccountData(AccountDataType type, uint32 time, std::string const& data);
void LoadAccountData(PreparedQueryResult result, uint32 mask);
+ // Account Toys
+ void LoadAccountToys(PreparedQueryResult result);
+ void SaveAccountToys(SQLTransaction& trans);
+ bool UpdateAccountToys(uint32 itemId, bool isFavourite /*= false*/);
+ ToyBoxContainer const& GetAccountToys() const { return _toys; }
+
void LoadTutorialsData(PreparedQueryResult result);
void SendTutorialsData();
void SaveTutorialsData(SQLTransaction& trans);
@@ -1540,6 +1556,11 @@ class WorldSession
void HandleObjectUpdateRescuedOpcode(WorldPackets::Misc::ObjectUpdateRescued& objectUpdateRescued);
void HandleRequestCategoryCooldowns(WorldPackets::Spells::RequestCategoryCooldowns& requestCategoryCooldowns);
+ // Toys
+ void HandleAddToy(WorldPackets::Toy::AddToy& packet);
+ void HandleToySetFavorite(WorldPackets::Toy::ToySetFavorite& packet);
+ void HandleUseToy(WorldPackets::Toy::UseToy& packet);
+
// Scenes
void HandleSceneTriggerEvent(WorldPackets::Scenes::SceneTriggerEvent& sceneTriggerEvent);
void HandleScenePlaybackComplete(WorldPackets::Scenes::ScenePlaybackComplete& scenePlaybackComplete);
@@ -1671,6 +1692,7 @@ class WorldSession
uint32 expireTime;
bool forceExit;
ObjectGuid m_currentBankerGUID;
+ ToyBoxContainer _toys;
WorldSession(WorldSession const& right) = delete;
WorldSession& operator=(WorldSession const& right) = delete;