diff options
| author | MitchesD <majklprofik@seznam.cz> | 2015-08-26 11:12:35 +0200 |
|---|---|---|
| committer | MitchesD <majklprofik@seznam.cz> | 2015-08-26 11:15:00 +0200 |
| commit | 614b5832ba96b4c5905ece5490a7b5d18c2f710b (patch) | |
| tree | 454e71dfcab1da90490466dfebd69a115950866d /src/server/game/Server | |
| parent | ca5c5221ba8376d152a4c8216afd922924475802 (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.h | 1 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/ToyPackets.cpp | 55 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/ToyPackets.h | 74 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 9 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.cpp | 43 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 22 |
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; |
