diff options
| -rw-r--r-- | src/server/game/Battlegrounds/ArenaTeam.cpp | 17 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 71 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
| -rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 35 | ||||
| -rw-r--r-- | src/server/game/Handlers/GroupHandler.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 36 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 46 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 59 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/SystemPackets.cpp | 49 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/SystemPackets.h | 56 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 12 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 38 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 3 | ||||
| -rw-r--r-- | src/server/shared/Database/Implementation/CharacterDatabase.cpp | 1 | ||||
| -rw-r--r-- | src/server/shared/Database/Implementation/CharacterDatabase.h | 1 |
15 files changed, 286 insertions, 142 deletions
diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index 2eebf5ca534..dcd0cce55aa 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -102,20 +102,13 @@ bool ArenaTeam::AddMember(ObjectGuid playerGuid) playerClass = player->getClass(); playerName = player->GetName(); } - else + else if (CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(playerGuid)) { - // 0 1 - // SELECT name, class FROM characters WHERE guid = ? - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_NAME_CLASS); - stmt->setUInt64(0, playerGuid.GetCounter()); - PreparedQueryResult result = CharacterDatabase.Query(stmt); - - if (!result) - return false; - - playerName = (*result)[0].GetString(); - playerClass = (*result)[1].GetUInt8(); + playerName = characterInfo->Name; + playerClass = characterInfo->Class; } + else + return false; // Check if player is already in a similar arena team if ((player && player->GetArenaTeamId(GetSlot())) || Player::GetArenaTeamIdFromDB(playerGuid, GetType()) != 0) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 42880a4b06b..c1088c0a406 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -73,6 +73,7 @@ #include "SpellAuraEffects.h" #include "SpellAuras.h" #include "SpellMgr.h" +#include "SpellPackets.h" #include "Transport.h" #include "UpdateData.h" #include "UpdateFieldFlags.h" @@ -3157,73 +3158,25 @@ void Player::InitStatsForLevel(bool reapplyMods) pet->SynchronizeLevelWithOwner(); } -void Player::SendInitialSpells() +void Player::SendKnownSpells() { - time_t curTime = time(NULL); - time_t infTime = curTime + infinityCooldownDelayCheck; - - uint16 spellCount = 0; - - WorldPacket data(SMSG_INITIAL_SPELLS, (1+2+4*m_spells.size()+2+m_spellCooldowns.size()*(2+2+2+4+4))); - data << uint8(0); - - size_t countPos = data.wpos(); - data << uint16(spellCount); // spell count placeholder - - for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr) - { - if (itr->second->state == PLAYERSPELL_REMOVED) - continue; - - if (!itr->second->active || itr->second->disabled) - continue; - - data << uint32(itr->first); - data << uint16(0); // it's not slot id - - ++spellCount; - } - - data.put<uint16>(countPos, spellCount); // write real count value + WorldPackets::Spell::SendKnownSpells knownSpells; + knownSpells.InitialLogin = false; /// @todo - uint16 spellCooldowns = m_spellCooldowns.size(); - data << uint16(spellCooldowns); - for (SpellCooldowns::const_iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); ++itr) + for (PlayerSpellMap::value_type const& spell : m_spells) { - SpellInfo const* sEntry = sSpellMgr->GetSpellInfo(itr->first); - if (!sEntry) + if (spell.second->state == PLAYERSPELL_REMOVED) continue; - data << uint32(itr->first); - - data << uint32(itr->second.itemid); // cast item id - data << uint16(sEntry->GetCategory()); // spell category - - // send infinity cooldown in special format - if (itr->second.end >= infTime) - { - data << uint32(1); // cooldown - data << uint32(0x80000000); // category cooldown + if (!spell.second->active || spell.second->disabled) continue; - } - time_t cooldown = itr->second.end > curTime ? (itr->second.end-curTime)*IN_MILLISECONDS : 0; - - if (sEntry->GetCategory()) // may be wrong, but anyway better than nothing... - { - data << uint32(0); // cooldown - data << uint32(cooldown); // category cooldown - } - else - { - data << uint32(cooldown); // cooldown - data << uint32(0); // category cooldown - } + knownSpells.KnownSpells.push_back(spell.first); } - GetSession()->SendPacket(&data); + SendDirectMessage(knownSpells.Write()); - TC_LOG_DEBUG("network", "CHARACTER: Sent Initial Spells"); + TC_LOG_DEBUG("network", "CHARACTER: Sent Known Spells"); } void Player::RemoveMail(uint32 id) @@ -23044,6 +22997,8 @@ void Player::SendInitialPacketsBeforeAddToMap() // guild bank list wtf? + GetSession()->SendSpellCategoryCooldowns(); + // Homebind WorldPacket data(SMSG_BINDPOINTUPDATE, 5*4); data << m_homebindX << m_homebindY << m_homebindZ; @@ -23076,7 +23031,7 @@ void Player::SendInitialPacketsBeforeAddToMap() data << uint32(GetMap()->GetDifficulty()); GetSession()->SendPacket(&data); - SendInitialSpells(); + SendKnownSpells(); data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4); data << uint32(0); // count, for (count) uint32; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 11167097e89..0f02be336a4 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1803,7 +1803,7 @@ class Player : public Unit, public GridObject<Player> bool IsCurrentSpecMasterySpell(SpellInfo const* spellInfo) const; void SendProficiency(ItemClass itemClass, uint32 itemSubclassMask); - void SendInitialSpells(); + void SendKnownSpells(); bool AddSpell(uint32 spellId, bool active, bool learning, bool dependent, bool disabled, bool loading = false, bool fromSkill = false); void LearnSpell(uint32 spell_id, bool dependent, bool fromSkill = false); void RemoveSpell(uint32 spell_id, bool disabled = false, bool learn_low_rank = true); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 7d892371931..2c294fdf38d 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -854,35 +854,14 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) SendPacket(accountDataTimes.Write()); - bool featureBit4 = true; - WorldPacket data(SMSG_FEATURE_SYSTEM_STATUS, 7); // checked in 4.2.2 - data << uint8(2); // unknown value - data << uint32(1); - data << uint32(1); - data << uint32(2); - data << uint32(0); - data.WriteBit(1); - data.WriteBit(1); - data.WriteBit(0); - data.WriteBit(featureBit4); - data.WriteBit(0); - data.WriteBit(0); - data.FlushBits(); - if (featureBit4) + /// Send FeatureSystemStatus { - data << uint32(1); - data << uint32(0); - data << uint32(10); - data << uint32(60); - } + WorldPackets::System::FeatureSystemStatus features; + features.CharUndeleteEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_ENABLED); + features.BpayStoreEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_BPAY_STORE_ENABLED); - //if (featureBit5) - //{ - // data << uint32(0); - // data << uint32(0); - // data << uint32(0); - //} - SendPacket(&data); + SendPacket(features.Write()); + } // Send MOTD { @@ -930,7 +909,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) pCurrChar->SetGuildLevel(0); } - data.Initialize(SMSG_LEARNED_DANCE_MOVES, 4+4); + WorldPacket data(SMSG_LEARNED_DANCE_MOVES, 4+4); data << uint64(0); SendPacket(&data); diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 46ff540ef04..dda5cbf0f13 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -687,7 +687,7 @@ void WorldSession::HandleMinimapPingOpcode(WorldPacket& recvData) /********************/ // everything's fine, do it - WorldPacket data(MSG_MINIMAP_PING, (8+4+4)); + WorldPacket data(SMSG_MINIMAP_PING, (8+4+4)); data << GetPlayer()->GetGUID(); data << float(x); data << float(y); diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 7f76f13495f..424276966d4 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -35,6 +35,7 @@ #include "SpellAuraEffects.h" #include "Player.h" #include "Config.h" +#include "SpellPackets.h" void WorldSession::HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlags, SpellCastTargets& targets) { @@ -754,25 +755,28 @@ void WorldSession::HandleUpdateProjectilePosition(WorldPacket& recvPacket) void WorldSession::HandleRequestCategoryCooldowns(WorldPacket& /*recvPacket*/) { - std::map<uint32, int32> categoryMods; + SendSpellCategoryCooldowns(); +} + +void WorldSession::SendSpellCategoryCooldowns() +{ + WorldPackets::Spell::CategoryCooldown cooldowns; + Unit::AuraEffectList const& categoryCooldownAuras = _player->GetAuraEffectsByType(SPELL_AURA_MOD_SPELL_CATEGORY_COOLDOWN); - for (Unit::AuraEffectList::const_iterator itr = categoryCooldownAuras.begin(); itr != categoryCooldownAuras.end(); ++itr) + for (AuraEffect* aurEff : categoryCooldownAuras) { - std::map<uint32, int32>::iterator cItr = categoryMods.find((*itr)->GetMiscValue()); - if (cItr == categoryMods.end()) - categoryMods[(*itr)->GetMiscValue()] = (*itr)->GetAmount(); - else - cItr->second += (*itr)->GetAmount(); - } + uint32 categoryId = aurEff->GetMiscValue(); + auto cItr = std::find_if(cooldowns.CategoryCooldowns.begin(), cooldowns.CategoryCooldowns.end(), + [categoryId](WorldPackets::Spell::CategoryCooldown::CategoryCooldownInfo const& cooldown) + { + return cooldown.Category == categoryId; + }); - WorldPacket data(SMSG_SPELL_CATEGORY_COOLDOWN, 11); - data.WriteBits(categoryMods.size(), 23); - data.FlushBits(); - for (std::map<uint32, int32>::const_iterator itr = categoryMods.begin(); itr != categoryMods.end(); ++itr) - { - data << uint32(itr->first); - data << int32(-itr->second); + if (cItr == cooldowns.CategoryCooldowns.end()) + cooldowns.CategoryCooldowns.emplace_back(aurEff->GetMiscValue(), -aurEff->GetAmount()); + else + cItr->ModCooldown -= aurEff->GetAmount(); } - SendPacket(&data); + SendPacket(cooldowns.Write()); } diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp new file mode 100644 index 00000000000..57c8bcb3e3d --- /dev/null +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -0,0 +1,46 @@ +/* + * 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 "SpellPackets.h" + +WorldPacket const* WorldPackets::Spell::CategoryCooldown::Write() +{ + _worldPacket.reserve(4 + 8 * CategoryCooldowns.size()); + + _worldPacket << uint32(CategoryCooldowns.size()); + + for (CategoryCooldownInfo const& cooldown : CategoryCooldowns) + { + _worldPacket << uint32(cooldown.Category); + _worldPacket << int32(cooldown.ModCooldown); + } + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spell::SendKnownSpells::Write() +{ + _worldPacket.reserve(1 + 4 * KnownSpells.size()); + + _worldPacket.WriteBit(InitialLogin); + _worldPacket << uint32(KnownSpells.size()); + + for (uint32 spellId : KnownSpells) + _worldPacket << uint32(spellId); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h new file mode 100644 index 00000000000..6c76ca53c75 --- /dev/null +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -0,0 +1,59 @@ +/* + * 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 SpellPackets_h__ +#define SpellPackets_h__ + +#include "Packet.h" + +namespace WorldPackets +{ + namespace Spell + { + class CategoryCooldown final : public ServerPacket + { + public: + struct CategoryCooldownInfo + { + CategoryCooldownInfo(uint32 category, int32 cooldown) + : Category(category), ModCooldown(cooldown) { } + + uint32 Category = 0; + int32 ModCooldown = 0; + }; + + CategoryCooldown() : ServerPacket(SMSG_SPELL_CATEGORY_COOLDOWN, 4) { } + + WorldPacket const* Write() override; + + std::vector<CategoryCooldownInfo> CategoryCooldowns; + }; + + class SendKnownSpells final : public ServerPacket + { + public: + SendKnownSpells() : ServerPacket(SMSG_INITIAL_SPELLS, 5) { } + + WorldPacket const* Write() override; + + bool InitialLogin = false; + std::vector<uint32> KnownSpells; + }; + } +} + +#endif // SpellPackets_h__ diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index 8181558cae7..7c8ecce3db7 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -17,6 +17,55 @@ #include "SystemPackets.h" +WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() +{ + _worldPacket << uint8(ComplaintStatus); + + _worldPacket << uint32(ScrollOfResurrectionRequestsRemaining); + _worldPacket << uint32(ScrollOfResurrectionMaxRequestsPerDay); + _worldPacket << uint32(CfgRealmID); + _worldPacket << int32(CfgRealmRecID); + + _worldPacket.WriteBit(VoiceEnabled); + _worldPacket.WriteBit(EuropaTicketSystemStatus.HasValue); + _worldPacket.WriteBit(ScrollOfResurrectionEnabled); + _worldPacket.WriteBit(BpayStoreEnabled); + _worldPacket.WriteBit(BpayStoreAvailable); + _worldPacket.WriteBit(BpayStoreDisabledByParentalControls); + _worldPacket.WriteBit(ItemRestorationButtonEnabled); + _worldPacket.WriteBit(BrowserEnabled); + _worldPacket.WriteBit(SessionAlert.HasValue); + _worldPacket.WriteBit(RecruitAFriendSendingEnabled); + _worldPacket.WriteBit(CharUndeleteEnabled); + _worldPacket.WriteBit(UnkBit21); + _worldPacket.WriteBit(UnkBit22); + _worldPacket.WriteBit(UnkBit90); + + if (EuropaTicketSystemStatus.HasValue) + { + _worldPacket.WriteBit(EuropaTicketSystemStatus.value.UnkBit0); + _worldPacket.WriteBit(EuropaTicketSystemStatus.value.UnkBit1); + _worldPacket.WriteBit(EuropaTicketSystemStatus.value.TicketSystemEnabled); + _worldPacket.WriteBit(EuropaTicketSystemStatus.value.SubmitBugEnabled); + + _worldPacket << uint32(EuropaTicketSystemStatus.value.ThrottleState.MaxTries); + _worldPacket << uint32(EuropaTicketSystemStatus.value.ThrottleState.PerMilliseconds); + _worldPacket << uint32(EuropaTicketSystemStatus.value.ThrottleState.TryCount); + _worldPacket << uint32(EuropaTicketSystemStatus.value.ThrottleState.LastResetTimeBeforeNow); + } + + if (SessionAlert.HasValue) + { + _worldPacket << int32(SessionAlert.value.Delay); + _worldPacket << int32(SessionAlert.value.Period); + _worldPacket << int32(SessionAlert.value.DisplayTime); + } + + _worldPacket.FlushBits(); + + return &_worldPacket; +} + WorldPacket const* WorldPackets::System::FeatureSystemStatusGlueScreen::Write() { _worldPacket.WriteBit(BpayStoreEnabled); diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index a2c988ac114..37b85a48b2f 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -24,6 +24,60 @@ namespace WorldPackets { namespace System { + class FeatureSystemStatus final : public ServerPacket + { + public: + struct SavedThrottleObjectState + { + uint32 MaxTries = 0; + uint32 PerMilliseconds = 0; + uint32 TryCount = 0; + uint32 LastResetTimeBeforeNow = 0; + }; + + struct EuropaTicketConfig + { + bool UnkBit0 = false; + bool UnkBit1 = false; + bool TicketSystemEnabled = false; + bool SubmitBugEnabled = false; + + SavedThrottleObjectState ThrottleState; + }; + + struct SessionAlertConfig + { + int32 Delay = 0; + int32 Period = 0; + int32 DisplayTime = 0; + }; + + FeatureSystemStatus() : ServerPacket(SMSG_FEATURE_SYSTEM_STATUS, 48) { } + + WorldPacket const* Write() override; + + bool VoiceEnabled = false; + bool BrowserEnabled = false; + bool BpayStoreAvailable = false; + bool RecruitAFriendSendingEnabled = false; + bool BpayStoreEnabled = false; + Optional<SessionAlertConfig> SessionAlert; + uint32 ScrollOfResurrectionMaxRequestsPerDay = 0; + bool ScrollOfResurrectionEnabled = false; + Optional<EuropaTicketConfig> EuropaTicketSystemStatus; + uint32 ScrollOfResurrectionRequestsRemaining = 0; + uint32 CfgRealmID = 0; + uint8 ComplaintStatus = 0; + int32 CfgRealmRecID = 0; + bool ItemRestorationButtonEnabled = false; + bool CharUndeleteEnabled = false; ///< Implemented + bool BpayStoreDisabledByParentalControls = false; + + bool UnkBit21 = false; + bool UnkBit22 = false; + bool UnkBit90 = false; + }; + class FeatureSystemStatusGlueScreen final : public ServerPacket { public: @@ -33,7 +87,7 @@ namespace WorldPackets bool BpayStoreAvailable = false; // NYI bool BpayStoreDisabledByParentalControls = false; // NYI - bool CharUndeleteEnabled = false; // NYI + bool CharUndeleteEnabled = false; bool BpayStoreEnabled = false; // NYI }; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 9f9f11e8fa2..556560c5e70 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -415,6 +415,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_WHISPER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_YELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMessagechatOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MINIGAME_MOVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_MINIMAP_PING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMinimapPingOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOUNTSPECIAL_ANIM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMountSpecialAnimOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_CHNG_TRANSPORT, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FALL_RESET, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); @@ -525,6 +526,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_RANDOM_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRandomRollOpcode ); DEFINE_HANDLER(CMSG_RANDOMIZE_CHAR_NAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::GenerateRandomCharacterName, &WorldSession::HandleRandomizeCharNameOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_READ_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReadItem ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_REALM_NAME_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_REALM_SPLIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRealmSplitOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_RECLAIM_CORPSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReclaimCorpseOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_REFORGE_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleReforgeItemOpcode ); @@ -652,7 +654,6 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(MSG_CORPSE_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCorpseQueryOpcode ); DEFINE_OPCODE_HANDLER_OLD(MSG_INSPECT_ARENA_TEAMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleInspectArenaTeamsOpcode ); DEFINE_OPCODE_HANDLER_OLD(MSG_LIST_STABLED_PETS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleListStabledPetsOpcode ); - DEFINE_OPCODE_HANDLER_OLD(MSG_MINIMAP_PING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMinimapPingOpcode ); DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_CHARM_TELEPORT_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_TELEPORT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_TELEPORT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck ); @@ -881,7 +882,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPECTED_SPAM_RECORDS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPLORATION_EXPERIENCE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FAILED_PLAYER_CONDITION, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEIGN_DEATH_RESISTED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FISH_ESCAPED, STATUS_UNHANDLED); @@ -980,7 +981,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_NOTIFY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIALIZE_FACTIONS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SETUP, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SPELLS, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SPELLS, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_CURRENCY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_WORLD_STATES, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_HONOR_STATS, STATUS_UNHANDLED); @@ -1025,7 +1026,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_TELEPORT_DENIED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_SEARCH, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS_NONE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICANT_LIST_UPDATED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_BROWSE_UPDATED, STATUS_UNHANDLED); @@ -1062,6 +1062,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGE_BOX, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIGAME_SETUP, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIGAME_STATE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIMAP_PING, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRRORIMAGE_DATA, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MISSILE_CANCEL, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_COOLDOWN, STATUS_UNHANDLED); @@ -1215,6 +1216,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BG_STATS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_FAILED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_OK, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_QUERY_RESPONSE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_SPLIT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REAL_GROUP_UPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECEIVED_MAIL, STATUS_UNHANDLED); @@ -1280,7 +1282,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLNONMELEEDAMAGELOG, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLORDAMAGE_IMMUNE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLSTEALLOG, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CATEGORY_COOLDOWN, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CATEGORY_COOLDOWN, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_COOLDOWN, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DELAYED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_UNHANDLED); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index c5e92afa690..65c33537ec6 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -91,7 +91,7 @@ enum OpcodeClient : uint32 CMSG_BANKER_ACTIVATE = 0x1B24, CMSG_BATTLEFIELD_JOIN = 0xBADD, CMSG_BATTLEFIELD_LEAVE = 0xBADD, - CMSG_BATTLEFIELD_LIST = 0xBADD, + CMSG_BATTLEFIELD_LIST = 0x03B1, CMSG_BATTLEFIELD_MGR_ENTRY_INVITE_RESPONSE = 0xBADD, CMSG_BATTLEFIELD_MGR_EXIT_REQUEST = 0xBADD, CMSG_BATTLEFIELD_MGR_QUEUE_INVITE_RESPONSE = 0xBADD, @@ -340,7 +340,7 @@ enum OpcodeClient : uint32 CMSG_LOOT = 0x01B1, CMSG_LOOT_CURRENCY = 0xBADD, CMSG_LOOT_MASTER_GIVE = 0xBADD, - CMSG_LOOT_METHOD = 0xBADD, + CMSG_LOOT_METHOD = 0x0729, CMSG_LOOT_MONEY = 0xBADD, CMSG_LOOT_RELEASE = 0xBADD, CMSG_LOOT_ROLL = 0xBADD, @@ -371,6 +371,7 @@ enum OpcodeClient : uint32 CMSG_MESSAGECHAT_WHISPER = 0x1829, CMSG_MESSAGECHAT_YELL = 0x1161, CMSG_MINIGAME_MOVE = 0xBADD, + CMSG_MINIMAP_PING = 0x0837, CMSG_MOUNTSPECIAL_ANIM = 0xBADD, CMSG_MOVE_CHARM_TELEPORT_CHEAT = 0xBADD, CMSG_MOVE_CHNG_TRANSPORT = 0xBADD, @@ -463,7 +464,7 @@ enum OpcodeClient : uint32 CMSG_PLAYER_VEHICLE_ENTER = 0xBADD, CMSG_PLAY_DANCE = 0xBADD, CMSG_PUSHQUESTTOPARTY = 0xBADD, - CMSG_PVP_LOG_DATA = 0xBADD, + CMSG_PVP_LOG_DATA = 0x08B5, CMSG_QUERY_BATTLEFIELD_STATE = 0xBADD, CMSG_QUERY_GUILD_MEMBERS_FOR_RECIPE = 0xBADD, CMSG_QUERY_GUILD_MEMBER_RECIPES = 0xBADD, @@ -493,6 +494,7 @@ enum OpcodeClient : uint32 CMSG_RANDOM_ROLL = 0x12AA, CMSG_RANDOMIZE_CHAR_NAME = 0x1981, CMSG_READ_ITEM = 0xBADD, + CMSG_REALM_NAME_QUERY = 0x1189, CMSG_REALM_SPLIT = 0xBADD, CMSG_RECLAIM_CORPSE = 0xBADD, CMSG_REFORGE_ITEM = 0xBADD, @@ -638,7 +640,6 @@ enum OpcodeClient : uint32 MSG_GM_SUMMON = 0xBADD, MSG_INSPECT_ARENA_TEAMS = 0xBADD, MSG_LIST_STABLED_PETS = 0xBADD, - MSG_MINIMAP_PING = 0xBADD, MSG_MOVE_CHARM_TELEPORT_CHEAT = 0xBADD, MSG_MOVE_SET_ALL_SPEED_CHEAT = 0xBADD, MSG_MOVE_SET_FLIGHT_SPEED_CHEAT = 0xBADD, @@ -757,13 +758,13 @@ enum OpcodeServer : uint32 SMSG_BATTLE_PET_JOURNAL = 0x19A2, SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x01A3, SMSG_BATTLE_PET_NAME_QUERY_RESPONSE = 0x09EC, - SMSG_BINDER_CONFIRM = 0xBADD, + SMSG_BINDER_CONFIRM = 0x0B11, SMSG_BINDPOINTUPDATE = 0x0A30, SMSG_BINDZONEREPLY = 0xBADD, SMSG_BREAK_TARGET = 0xBADD, SMSG_BUY_BANK_SLOT_RESULT = 0xBADD, - SMSG_BUY_FAILED = 0xBADD, - SMSG_BUY_ITEM = 0xBADD, + SMSG_BUY_FAILED = 0x013A, + SMSG_BUY_ITEM = 0x0BD1, SMSG_CALENDAR_ACTION_PENDING = 0xBADD, SMSG_CALENDAR_ARENA_TEAM = 0xBADD, SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0xBADD, @@ -935,7 +936,7 @@ enum OpcodeServer : uint32 SMSG_GROUP_DECLINE = 0xBADD, SMSG_GROUP_DESTROYED = 0xBADD, SMSG_GROUP_INVITE = 0xBADD, - SMSG_GROUP_LIST = 0xBADD, + SMSG_GROUP_LIST = 0x15BE, SMSG_GROUP_SET_LEADER = 0xBADD, SMSG_GROUP_SET_ROLE = 0xBADD, SMSG_GROUP_UNINVITE = 0xBADD, @@ -1033,7 +1034,7 @@ enum OpcodeServer : uint32 SMSG_LEVELUP_INFO = 0xBADD, SMSG_LFG_BOOT_PROPOSAL_UPDATE = 0xBADD, SMSG_LFG_DISABLED = 0xBADD, - SMSG_LFG_JOIN_RESULT = 0xBADD, + SMSG_LFG_JOIN_RESULT = 0x0F72, SMSG_LFG_OFFER_CONTINUE = 0xBADD, SMSG_LFG_OPEN_FROM_GOSSIP = 0xBADD, SMSG_LFG_PARTY_INFO = 0xBADD, @@ -1047,8 +1048,7 @@ enum OpcodeServer : uint32 SMSG_LFG_TELEPORT_DENIED = 0xBADD, SMSG_LFG_UPDATE_LIST = 0xBADD, SMSG_LFG_UPDATE_SEARCH = 0xBADD, - SMSG_LFG_UPDATE_STATUS = 0xBADD, - SMSG_LFG_UPDATE_STATUS_NONE = 0xBADD, + SMSG_LFG_UPDATE_STATUS = 0x07F7, SMSG_LF_GUILD_APPLICANT_LIST_UPDATED = 0xBADD, SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0xBADD, SMSG_LF_GUILD_BROWSE_UPDATED = 0xBADD, @@ -1063,14 +1063,14 @@ enum OpcodeServer : uint32 SMSG_LOGOUT_CANCEL_ACK = 0x0FAD, SMSG_LOGOUT_COMPLETE = 0x0B21, SMSG_LOGOUT_RESPONSE = 0x052D, - SMSG_LOG_XPGAIN = 0xBADD, + SMSG_LOG_XPGAIN = 0x1B53, SMSG_LOOT_ALL_PASSED = 0xBADD, SMSG_LOOT_CLEAR_MONEY = 0xBADD, SMSG_LOOT_CONTENTS = 0xBADD, SMSG_LOOT_ITEM_NOTIFY = 0xBADD, SMSG_LOOT_LIST = 0xBADD, SMSG_LOOT_MASTER_LIST = 0xBADD, - SMSG_LOOT_MONEY_NOTIFY = 0xBADD, + SMSG_LOOT_MONEY_NOTIFY = 0x12A9, SMSG_LOOT_RELEASE_RESPONSE = 0xBADD, SMSG_LOOT_REMOVED = 0xBADD, SMSG_LOOT_RESPONSE = 0xBADD, @@ -1088,6 +1088,7 @@ enum OpcodeServer : uint32 SMSG_MESSAGE_BOX = 0xBADD, SMSG_MINIGAME_SETUP = 0xBADD, SMSG_MINIGAME_STATE = 0xBADD, + SMSG_MINIMAP_PING = 0x07BA, SMSG_MIRRORIMAGE_DATA = 0xBADD, SMSG_MISSILE_CANCEL = 0xBADD, SMSG_MODIFY_COOLDOWN = 0xBADD, @@ -1211,13 +1212,13 @@ enum OpcodeServer : uint32 SMSG_PROPOSE_LEVEL_GRANT = 0xBADD, SMSG_PUREMOUNT_CANCELLED_OBSOLETE = 0xBADD, SMSG_PVP_CREDIT = 0xBADD, - SMSG_PVP_LOG_DATA = 0xBADD, + SMSG_PVP_LOG_DATA = 0x1ECA, SMSG_PVP_OPTIONS_ENABLED = 0xBADD, SMSG_PVP_SEASON = 0x09E3, SMSG_QUERY_QUESTS_COMPLETED_RESPONSE = 0xBADD, SMSG_QUERY_TIME_RESPONSE = 0x1DB0, SMSG_QUESTGIVER_OFFER_REWARD = 0xBADD, - SMSG_QUESTGIVER_QUEST_COMPLETE = 0xBADD, + SMSG_QUESTGIVER_QUEST_COMPLETE = 0x1773, SMSG_QUESTGIVER_QUEST_DETAILS = 0x15B3, SMSG_QUESTGIVER_QUEST_FAILED = 0xBADD, SMSG_QUESTGIVER_QUEST_INVALID = 0xBADD, @@ -1248,6 +1249,7 @@ enum OpcodeServer : uint32 SMSG_RATED_BG_STATS = 0xBADD, SMSG_READ_ITEM_FAILED = 0xBADD, SMSG_READ_ITEM_OK = 0xBADD, + SMSG_REALM_QUERY_RESPONSE = 0x011D, SMSG_REALM_SPLIT = 0xBADD, SMSG_REAL_GROUP_UPDATE = 0xBADD, SMSG_RECEIVED_MAIL = 0xBADD, @@ -1277,7 +1279,7 @@ enum OpcodeServer : uint32 SMSG_SERVERTIME = 0xBADD, SMSG_SERVER_FIRST_ACHIEVEMENT = 0xBADD, SMSG_SERVER_INFO_RESPONSE = 0xBADD, - SMSG_SERVER_MESSAGE = 0xBADD, + SMSG_SERVER_MESSAGE = 0x0683, SMSG_SERVER_PERF = 0xBADD, SMSG_SET_AI_ANIM_KIT = 0xBADD, SMSG_SET_DF_FAST_LAUNCH_RESULT = 0xBADD, @@ -1297,7 +1299,7 @@ enum OpcodeServer : uint32 SMSG_SET_PROJECTILE_POSITION = 0xBADD, SMSG_SET_TIME_ZONE_INFORMATION = 0x153E, SMSG_SET_VIGNETTE = 0x09AC, - SMSG_SHOWTAXINODES = 0xBADD, + SMSG_SHOWTAXINODES = 0x12A1, SMSG_SHOW_BANK = 0x0204, SMSG_SHOW_MAILBOX = 0xBADD, SMSG_SHOW_RATINGS = 0xBADD, @@ -1436,7 +1438,7 @@ enum OpcodeServer : uint32 SMSG_WORLD_SERVER_INFO = 0x11AC, SMSG_WORLD_STATE_UI_TIMER_UPDATE = 0xBADD, SMSG_XP_GAIN_ABORTED = 0xBADD, - SMSG_ZONE_UNDER_ATTACK = 0xBADD, + SMSG_ZONE_UNDER_ATTACK = 0x1401 }; /// Player state diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 7be4efbc46b..6e863b9e580 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -1032,6 +1032,9 @@ class WorldSession void HandleViolenceLevel(WorldPackets::Misc::ViolenceLevel& violenceLevel); void HandleObjectUpdateFailedOpcode(WorldPacket& recvPacket); void HandleRequestCategoryCooldowns(WorldPacket& recvPacket); + + void SendSpellCategoryCooldowns(); + int32 HandleEnableNagleAlgorithm(); // Compact Unit Frames (4.x) diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 9c27f876054..18a79ae0ed2 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -167,7 +167,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHARACTER_DATA_BY_GUID, "SELECT account, name, level FROM characters WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES, "DELETE FROM account_instance_times WHERE accountId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES, "INSERT INTO account_instance_times (accountId, instanceId, releaseTime) VALUES (?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_NAME_CLASS, "SELECT name, class FROM characters WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_MATCH_MAKER_RATING, "SELECT matchMakerRating FROM character_arena_stats WHERE guid = ? AND slot = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHARACTER_COUNT, "SELECT account, COUNT(guid) FROM characters WHERE account = ? GROUP BY account", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_NAME_BY_GUID, "UPDATE characters SET name = ? WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index 8755acaf302..3c9f5a53411 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -158,7 +158,6 @@ enum CharacterDatabaseStatements CHAR_SEL_ACCOUNT_BY_GUID, CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES, CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES, - CHAR_SEL_CHARACTER_NAME_CLASS, CHAR_SEL_MATCH_MAKER_RATING, CHAR_SEL_CHARACTER_COUNT, CHAR_UPD_NAME_BY_GUID, |
