From 6324222cdb4d5d99673b788bfff5b324efc7ea5f Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 18 May 2026 00:28:59 +0200 Subject: [PATCH] Core/Misc: Port some 3.3.5 cherry-pick refactors --- src/server/game/Chat/Channels/Channel.cpp | 119 ++++++++---------- src/server/game/Chat/Channels/Channel.h | 14 +-- .../game/Entities/Item/ItemEnchantmentMgr.cpp | 4 +- .../game/Entities/Item/ItemEnchantmentMgr.h | 2 +- src/server/game/Entities/Player/Player.cpp | 9 +- src/server/game/Entities/Unit/Unit.cpp | 13 +- src/server/game/Handlers/ItemHandler.cpp | 20 +-- src/server/game/Handlers/PetHandler.cpp | 3 + src/server/game/Handlers/SpellHandler.cpp | 14 +-- .../game/Server/Packets/ChannelPackets.cpp | 6 +- .../game/Server/Packets/ChannelPackets.h | 4 +- .../game/Server/Packets/MovementPackets.h | 4 +- src/server/game/Server/Packets/SpellPackets.h | 2 +- .../game/Spells/Auras/SpellAuraDefines.h | 2 +- src/server/game/Spells/Auras/SpellAuras.cpp | 9 +- src/server/game/Spells/Auras/SpellAuras.h | 2 +- src/server/game/Spells/Spell.cpp | 105 +++------------- src/server/game/Spells/Spell.h | 2 +- src/server/game/Spells/SpellDefines.h | 2 +- src/server/scripts/Commands/cs_debug.cpp | 1 - 20 files changed, 117 insertions(+), 220 deletions(-) diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 0550f4ea93..4bbe8bbe9c 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -214,12 +214,6 @@ void Channel::JoinChannel(Player* player, std::string const& pass) PlayerInfo& playerInfo = _playersStore[guid]; playerInfo.SetInvisible(!player->isGMVisible()); - /* - YouJoinedAppend appender; - ChannelNameBuilder builder(this, appender); - SendToOne(builder, guid); - */ - auto builder = [&](LocaleConstant locale) { LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale); @@ -237,7 +231,7 @@ void Channel::JoinChannel(Player* player, std::string const& pass) SendToOne(builder, guid); - JoinNotify(player); + JoinNotify(guid); // Custom channel handling if (!IsConstant()) @@ -269,16 +263,8 @@ void Channel::LeaveChannel(Player* player, bool send, bool suspend) return; } - player->LeftChannel(this); - if (send) { - /* - YouLeftAppend appender; - ChannelNameBuilder builder(this, appender); - SendToOne(builder, guid); - */ - auto builder = [&](LocaleConstant locale) { LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale); @@ -292,11 +278,12 @@ void Channel::LeaveChannel(Player* player, bool send, bool suspend) }; SendToOne(builder, guid); + + player->LeftChannel(this); } - PlayerInfo& info = _playersStore.at(guid); + PlayerInfo info = _playersStore.extract(guid).mapped(); bool changeowner = info.IsOwner(); - _playersStore.erase(guid); if (_announceEnabled && !player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { @@ -305,11 +292,11 @@ void Channel::LeaveChannel(Player* player, bool send, bool suspend) SendToAll(builder); } - LeaveNotify(player); + LeaveNotify(guid); if (!IsConstant()) { - // If the channel owner left and there are still playersStore inside, pick a new owner + // If the channel owner left and there are players still inside, pick a new owner // do not pick invisible gm owner unless there are only invisible gms in that channel (rare) if (changeowner && _ownershipEnabled && !_playersStore.empty()) { @@ -323,10 +310,10 @@ void Channel::LeaveChannel(Player* player, bool send, bool suspend) if (itr == _playersStore.end()) itr = _playersStore.begin(); - ObjectGuid const& newowner = itr->first; + ObjectGuid const& newOwner = itr->first; itr->second.SetModerator(true); - SetOwner(newowner); + SetOwner(newOwner); // if the new owner is invisible gm, set flag to automatically choose a new owner if (itr->second.IsInvisible()) @@ -541,6 +528,40 @@ void Channel::SetInvisible(Player const* player, bool on) _isOwnerInvisible = on; } +void Channel::SetModerator(ObjectGuid const& guid, bool set) +{ + if (!IsOn(guid)) + return; + + PlayerInfo& playerInfo = _playersStore.at(guid); + if (playerInfo.IsModerator() != set) + { + uint8 oldFlag = playerInfo.GetFlags(); + playerInfo.SetModerator(set); + + ModeChangeAppend appender(guid, oldFlag, playerInfo.GetFlags()); + ChannelNameBuilder builder(this, appender); + SendToAll(builder); + } +} + +void Channel::SetMute(ObjectGuid const& guid, bool set) +{ + if (!IsOn(guid)) + return; + + PlayerInfo& playerInfo = _playersStore.at(guid); + if (playerInfo.IsMuted() != set) + { + uint8 oldFlag = playerInfo.GetFlags(); + playerInfo.SetMuted(set); + + ModeChangeAppend appender(guid, oldFlag, playerInfo.GetFlags()); + ChannelNameBuilder builder(this, appender); + SendToAll(builder); + } +} + void Channel::SetOwner(Player const* player, std::string const& newname) { ObjectGuid const& guid = player->GetGUID(); @@ -597,7 +618,7 @@ void Channel::SendWhoOwner(Player const* player) } } -void Channel::List(Player const* player) +void Channel::List(Player const* player) const { ObjectGuid const& guid = player->GetGUID(); if (!IsOn(guid)) @@ -613,13 +634,13 @@ void Channel::List(Player const* player) player->GetSession()->GetPlayerInfo(), channelName); WorldPackets::Channel::ChannelListResponse list; - list._Display = true; /// always true? + list.Display = true; /// always true? list._Channel = channelName; list._ChannelFlags = GetFlags(); uint32 gmLevelInWhoList = sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_WHO_LIST); - list._Members.reserve(_playersStore.size()); + list.Members.reserve(_playersStore.size()); for (PlayerContainer::value_type const& i : _playersStore) { Player* member = ObjectAccessor::FindConnectedPlayer(i.first); @@ -631,7 +652,7 @@ void Channel::List(Player const* player) member->GetSession()->GetSecurity() <= AccountTypes(gmLevelInWhoList)) && member->IsVisibleGloballyFor(player)) { - list._Members.emplace_back(i.first, *member->m_playerData->VirtualPlayerRealm, i.second.GetFlags()); + list.Members.emplace_back(i.first, *member->m_playerData->VirtualPlayerRealm, i.second.GetFlags()); } } @@ -661,7 +682,6 @@ void Channel::Announce(Player const* player) _announceEnabled = !_announceEnabled; - WorldPackets::Channel::ChannelNotify notify; if (_announceEnabled) { AnnouncementsOnAppend appender(guid); @@ -841,7 +861,6 @@ void Channel::SetOwner(ObjectGuid const& guid, bool exclaim) { if (!_ownerGuid.IsEmpty()) { - // [] will re-add player after it possible removed auto itr = _playersStore.find(_ownerGuid); if (itr != _playersStore.end()) itr->second.SetOwner(false); @@ -850,15 +869,15 @@ void Channel::SetOwner(ObjectGuid const& guid, bool exclaim) _ownerGuid = guid; if (!_ownerGuid.IsEmpty()) { - uint8 oldFlag = GetPlayerFlags(_ownerGuid); auto itr = _playersStore.find(_ownerGuid); if (itr == _playersStore.end()) return; + uint8 oldFlag = itr->second.GetFlags(); itr->second.SetModerator(true); itr->second.SetOwner(true); - ModeChangeAppend appender(_ownerGuid, oldFlag, GetPlayerFlags(_ownerGuid)); + ModeChangeAppend appender(_ownerGuid, oldFlag, itr->second.GetFlags()); ChannelNameBuilder builder(this, appender); SendToAll(builder); @@ -885,10 +904,8 @@ void Channel::DeclineInvite(Player const* /*player*/) { } -void Channel::JoinNotify(Player const* player) +void Channel::JoinNotify(ObjectGuid const& guid) const { - ObjectGuid const& guid = player->GetGUID(); - if (IsConstant()) { auto builder = [&](LocaleConstant locale) @@ -927,10 +944,8 @@ void Channel::JoinNotify(Player const* player) } } -void Channel::LeaveNotify(Player const* player) +void Channel::LeaveNotify(ObjectGuid const& guid) const { - ObjectGuid const& guid = player->GetGUID(); - auto builder = [&](LocaleConstant locale) { LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale); @@ -950,40 +965,6 @@ void Channel::LeaveNotify(Player const* player) SendToAll(builder); } -void Channel::SetModerator(ObjectGuid const& guid, bool set) -{ - if (!IsOn(guid)) - return; - - PlayerInfo& playerInfo = _playersStore.at(guid); - if (playerInfo.IsModerator() != set) - { - uint8 oldFlag = playerInfo.GetFlags(); - playerInfo.SetModerator(set); - - ModeChangeAppend appender(guid, oldFlag, playerInfo.GetFlags()); - ChannelNameBuilder builder(this, appender); - SendToAll(builder); - } -} - -void Channel::SetMute(ObjectGuid const& guid, bool set) -{ - if (!IsOn(guid)) - return; - - PlayerInfo& playerInfo = _playersStore.at(guid); - if (playerInfo.IsMuted() != set) - { - uint8 oldFlag = playerInfo.GetFlags(); - playerInfo.SetMuted(set); - - ModeChangeAppend appender(guid, oldFlag, playerInfo.GetFlags()); - ChannelNameBuilder builder(this, appender); - SendToAll(builder); - } -} - template void Channel::SendToAll(Builder& builder, ObjectGuid const& guid, ObjectGuid const& accountGuid) const { diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h index 8fff9ea395..193d2567f1 100644 --- a/src/server/game/Chat/Channels/Channel.h +++ b/src/server/game/Chat/Channels/Channel.h @@ -27,14 +27,6 @@ class Player; struct AreaTableEntry; -namespace WorldPackets -{ - namespace Channel - { - class ChannelNotify; - } -} - // EnumUtils: DESCRIBE THIS enum ChatNotify : uint8 { @@ -218,14 +210,14 @@ class TC_GAME_API Channel void UnsetMute(Player const* player, std::string const& newname) { SetMode(player, newname, false, false); } void SilenceAll(Player const* player, std::string const& name); void UnsilenceAll(Player const* player, std::string const& name); - void List(Player const* player); + void List(Player const* player) const; void Announce(Player const* player); void Say(ObjectGuid const& guid, std::string const& what, uint32 lang) const; void AddonSay(ObjectGuid const& guid, std::string const& prefix, std::string const& what, bool isLogged) const; void DeclineInvite(Player const* player); void Invite(Player const* player, std::string const& newp); - void JoinNotify(Player const* player); - void LeaveNotify(Player const* player); + void JoinNotify(ObjectGuid const& guid) const; + void LeaveNotify(ObjectGuid const& guid) const; void SetOwnership(bool ownership) { _ownershipEnabled = ownership; } private: diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp index 297d39f1da..cc7b31e1cf 100644 --- a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp +++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp @@ -104,7 +104,7 @@ ItemRandomBonusListId GenerateItemRandomBonusListId(uint32 item_id) return *Trinity::Containers::SelectRandomWeightedContainerElement(tab->second.BonusListIDs, std::span(tab->second.Chances)); } -TC_GAME_API float GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint32 inventoryType, uint32 subClass) +float GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint32 inventoryType, uint32 subClass) { uint32 propIndex; @@ -168,6 +168,8 @@ TC_GAME_API float GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint case ITEM_QUALITY_LEGENDARY: case ITEM_QUALITY_ARTIFACT: return randPropPointsEntry->EpicF[propIndex]; + default: + break; } return 0; diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.h b/src/server/game/Entities/Item/ItemEnchantmentMgr.h index 5c8f524a12..375b7914ed 100644 --- a/src/server/game/Entities/Item/ItemEnchantmentMgr.h +++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.h @@ -24,6 +24,6 @@ using ItemRandomBonusListId = uint32; TC_GAME_API void LoadItemRandomBonusListTemplates(); TC_GAME_API ItemRandomBonusListId GenerateItemRandomBonusListId(uint32 item_id); -TC_GAME_API float GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint32 inventoryType, uint32 subclass); +TC_GAME_API float GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint32 inventoryType, uint32 subClass); #endif diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1e351c6522..8a15f548c9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22932,8 +22932,7 @@ void Player::AddSpellMod(SpellModifier* mod, bool apply) spellModifier.ModIndex = AsUnderlyingType(mod->op); - boost::dynamic_bitset mask; - mask.resize(128); + boost::dynamic_bitset mask(128, 0); boost::from_block_range( &static_cast(mod)->mask[0], @@ -25543,11 +25542,7 @@ void Player::SendAurasForTarget(Unit* target) const update.Auras.reserve(visibleAuras.size()); for (AuraApplication* auraApp : visibleAuras) - { - WorldPackets::Spells::AuraInfo auraInfo; - auraApp->BuildUpdatePacket(auraInfo, false); - update.Auras.push_back(auraInfo); - } + auraApp->BuildUpdatePacket(update.Auras.emplace_back(), false); SendDirectMessage(update.Write()); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 3a0fbbf9f4..cfbc42802b 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -2096,6 +2096,8 @@ void Unit::HandleEmoteCommand(Emote emoteId, Player* target /*=nullptr*/, Trinit log.damage = splitDamage; log.originalDamage = splitDamage; log.absorb = split_absorb; + log.periodicLog = damageInfo.GetDamageType() == DOT; + log.HitInfo |= SPELL_HIT_TYPE_SPLIT; caster->SendSpellNonMeleeDamageLog(&log); // break 'Fear' and similar auras @@ -12982,7 +12984,6 @@ void Unit::SendTeleportPacket(TeleportLocation const& teleportLocation) moveUpdateTeleport.Status = &m_movementInfo; if (_movementForces) moveUpdateTeleport.MovementForces = _movementForces->GetForces(); - Unit* broadcastSource = this; // should this really be the unit _being_ moved? not the unit doing the moving? if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) @@ -12995,14 +12996,15 @@ void Unit::SendTeleportPacket(TeleportLocation const& teleportLocation) moveTeleport.SequenceIndex = m_movementCounter++; playerMover->SendDirectMessage(moveTeleport.Write()); - broadcastSource = playerMover; + // Broadcast the packet to everyone except self. + SendMessageToSet(moveUpdateTeleport.Write(), playerMover); } else { // This is the only packet sent for creatures which contains MovementInfo structure // we do not update m_movementInfo for creatures so it needs to be done manually here moveUpdateTeleport.Status->guid = GetGUID(); - moveUpdateTeleport.Status->time = getMSTime(); + moveUpdateTeleport.Status->time = GameTime::GetGameTimeMS(); if (teleportLocation.TransportGuid) { @@ -13018,10 +13020,9 @@ void Unit::SendTeleportPacket(TeleportLocation const& teleportLocation) moveUpdateTeleport.Status->pos.Relocate(teleportLocation.Location); moveUpdateTeleport.Status->transport.Reset(); } - } - // Broadcast the packet to everyone except self. - broadcastSource->SendMessageToSet(moveUpdateTeleport.Write(), false); + SendMessageToSet(moveUpdateTeleport.Write(), true); + } } bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool teleport) diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 7085946033..d6b70b68b6 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -620,7 +620,7 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid) if (!itemTemplate) continue; - int32 leftInStock = !vendorItem->maxcount ? -1 : vendor->GetVendorItemCurrentCount(vendorItem); + int32 leftInStock = !vendorItem->maxcount ? -1 : int32(vendor->GetVendorItemCurrentCount(vendorItem)); if (!_player->IsGameMaster()) // ignore conditions if GM on { // Respect allowed class @@ -656,20 +656,20 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid) price = std::max(uint64(1), price); item.MuID = slot + 1; // client expects counting to start at 1 - item.ExtendedCostID = vendorItem->ExtendedCost; item.Type = vendorItem->Type; - item.Quantity = leftInStock; - item.StackCount = itemTemplate->GetBuyCount(); - item.Price = price; - item.DoNotFilterOnVendor = vendorItem->IgnoreFiltering; - item.Refundable = itemTemplate->HasFlag(ITEM_FLAG_ITEM_PURCHASE_RECORD) && vendorItem->ExtendedCost && itemTemplate->GetMaxStackSize() == 1; - item.Item.ItemID = vendorItem->item; if (!vendorItem->BonusListIDs.empty()) { item.Item.ItemBonus.emplace(); item.Item.ItemBonus->BonusListIDs = vendorItem->BonusListIDs; } + item.Quantity = leftInStock; + item.Price = price; + item.StackCount = itemTemplate->GetBuyCount(); + item.ExtendedCostID = vendorItem->ExtendedCost; + item.DoNotFilterOnVendor = vendorItem->IgnoreFiltering; + item.Refundable = itemTemplate->HasFlag(ITEM_FLAG_ITEM_PURCHASE_RECORD) && vendorItem->ExtendedCost && itemTemplate->GetMaxStackSize() == 1; + } else if (vendorItem->Type == ITEM_VENDOR_TYPE_CURRENCY) { @@ -681,10 +681,10 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid) continue; // there's no price defined for currencies, only extendedcost is used item.MuID = slot + 1; // client expects counting to start at 1 - item.ExtendedCostID = vendorItem->ExtendedCost; - item.Item.ItemID = vendorItem->item; item.Type = vendorItem->Type; + item.Item.ItemID = vendorItem->item; item.StackCount = vendorItem->maxcount; + item.ExtendedCostID = vendorItem->ExtendedCost; item.DoNotFilterOnVendor = vendorItem->IgnoreFiltering; } else diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index f7a76ee198..aa4ec2f610 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -727,6 +727,9 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& return; } + if (petCastSpell.Cast.MoveUpdate) + HandleMovementOpcode(CMSG_MOVE_STOP, *petCastSpell.Cast.MoveUpdate); + Spell* spell = new Spell(caster, spellInfo, triggerCastFlags); spell->m_fromClient = true; std::ranges::copy(petCastSpell.Cast.Misc, std::ranges::begin(spell->m_misc.Raw.Data)); diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 76999e5524..574a52b00f 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -228,13 +228,13 @@ void WorldSession::HandleGameobjectReportUse(WorldPackets::GameObject::GameObjRe } } -void WorldSession::HandleCastSpellOpcode(WorldPackets::Spells::CastSpell& cast) +void WorldSession::HandleCastSpellOpcode(WorldPackets::Spells::CastSpell& castRequest) { // Skip casting invalid spells right away - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(cast.Cast.SpellID, _player->GetMap()->GetDifficultyID()); + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(castRequest.Cast.SpellID, _player->GetMap()->GetDifficultyID()); if (!spellInfo) { - TC_LOG_ERROR("network", "WorldSession::HandleCastSpellOpcode: attempted to cast a non-existing spell (Id: {})", cast.Cast.SpellID); + TC_LOG_ERROR("network", "WorldSession::HandleCastSpellOpcode: attempted to cast a non-existing spell (Id: {})", castRequest.Cast.SpellID); return; } @@ -254,13 +254,13 @@ void WorldSession::HandleCastSpellOpcode(WorldPackets::Spells::CastSpell& cast) castingUnit = _player; } - if (cast.Cast.MoveUpdate.has_value()) - HandleMovementOpcode(CMSG_MOVE_STOP, *cast.Cast.MoveUpdate); + if (castRequest.Cast.MoveUpdate.has_value()) + HandleMovementOpcode(CMSG_MOVE_STOP, *castRequest.Cast.MoveUpdate); if (_player->CanRequestSpellCast(spellInfo, castingUnit)) - _player->RequestSpellCast(std::make_unique(std::move(cast.Cast), castingUnit->GetGUID())); + _player->RequestSpellCast(std::make_unique(std::move(castRequest.Cast), castingUnit->GetGUID())); else - Spell::SendCastResult(_player, spellInfo, {}, cast.Cast.CastID, SPELL_FAILED_SPELL_IN_PROGRESS); + Spell::SendCastResult(_player, spellInfo, {}, castRequest.Cast.CastID, SPELL_FAILED_SPELL_IN_PROGRESS); } void WorldSession::HandleCancelCastOpcode(WorldPackets::Spells::CancelCast& packet) diff --git a/src/server/game/Server/Packets/ChannelPackets.cpp b/src/server/game/Server/Packets/ChannelPackets.cpp index dc7fef49db..ae9fed1f27 100644 --- a/src/server/game/Server/Packets/ChannelPackets.cpp +++ b/src/server/game/Server/Packets/ChannelPackets.cpp @@ -24,13 +24,13 @@ namespace WorldPackets::Channel { WorldPacket const* ChannelListResponse::Write() { - _worldPacket << Bits<1>(_Display); + _worldPacket << Bits<1>(Display); _worldPacket << SizedString::BitsSize<7>(_Channel); _worldPacket << uint32(_ChannelFlags); - _worldPacket << Size(_Members); + _worldPacket << Size(Members); _worldPacket << SizedString::Data(_Channel); - for (ChannelPlayer const& player : _Members) + for (ChannelPlayer const& player : Members) { _worldPacket << player.Guid; _worldPacket << uint32(player.VirtualRealmAddress); diff --git a/src/server/game/Server/Packets/ChannelPackets.h b/src/server/game/Server/Packets/ChannelPackets.h index db4b51ddd2..a14e16d3a1 100644 --- a/src/server/game/Server/Packets/ChannelPackets.h +++ b/src/server/game/Server/Packets/ChannelPackets.h @@ -42,10 +42,10 @@ namespace WorldPackets WorldPacket const* Write() override; - std::vector _Members; + std::vector Members; std::string _Channel; ///< Channel Name uint32 _ChannelFlags = 0; ///< @see enum ChannelFlags - bool _Display = false; + bool Display = false; }; class TC_GAME_API ChannelNotify final : public ServerPacket diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index acdc5a10fa..9ed604c561 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -246,7 +246,7 @@ namespace WorldPackets class MoveSplineSetFlag final : public ServerPacket { public: - explicit MoveSplineSetFlag(OpcodeServer opcode) : ServerPacket(opcode, 8) { } + explicit MoveSplineSetFlag(OpcodeServer opcode) : ServerPacket(opcode, 18) { } WorldPacket const* Write() override; @@ -256,7 +256,7 @@ namespace WorldPackets class MoveSetFlag final : public ServerPacket { public: - explicit MoveSetFlag(OpcodeServer opcode) : ServerPacket(opcode, 12) { } + explicit MoveSetFlag(OpcodeServer opcode) : ServerPacket(opcode, 18 + 4) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 17c5134fba..e0c97857f1 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -139,7 +139,7 @@ namespace WorldPackets class SetActionButton final : public ClientPacket { public: - explicit SetActionButton(WorldPacket&& packet) : ClientPacket(CMSG_SET_ACTION_BUTTON, std::move(packet)) {} + explicit SetActionButton(WorldPacket&& packet) : ClientPacket(CMSG_SET_ACTION_BUTTON, std::move(packet)) { } void Read() override; diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 1e4e0e8626..cfd3b4719d 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -24,7 +24,7 @@ enum AURA_FLAGS { AFLAG_NONE = 0x0000, - AFLAG_NOCASTER = 0x0001, + AFLAG_SELF_CAST = 0x0001, AFLAG_POSITIVE = 0x0002, AFLAG_DURATION = 0x0004, AFLAG_SCALABLE = 0x0008, diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index a85a826362..0802ca2587 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -113,7 +113,7 @@ void AuraApplication::_Remove() void AuraApplication::_InitFlags(Unit* caster, uint32 effMask) { // mark as selfcast if needed - _flags |= (GetBase()->GetCasterGUID() == GetTarget()->GetGUID()) ? AFLAG_NOCASTER : AFLAG_NONE; + _flags |= (GetBase()->GetCasterGUID() == GetTarget()->GetGUID()) ? AFLAG_SELF_CAST : AFLAG_NONE; // aura is cast by self or an enemy // one negative effect and we know aura is negative @@ -261,7 +261,7 @@ void AuraApplication::BuildUpdatePacket(WorldPackets::Spells::AuraInfo& auraInfo auraData.Applications = aura->IsUsingStacks() ? aura->GetStackAmount() : aura->GetCharges(); if (!aura->GetCasterGUID().IsUnit()) auraData.CastUnit = ObjectGuid::Empty; // optional data is filled in, but cast unit contains empty guid in packet - else if (!(auraData.Flags & AFLAG_NOCASTER)) + else if (!(auraData.Flags & AFLAG_SELF_CAST)) auraData.CastUnit = aura->GetCasterGUID(); if (!aura->GetCastItemGUID().IsEmpty()) @@ -304,10 +304,7 @@ void AuraApplication::ClientUpdate(bool remove) WorldPackets::Spells::AuraUpdate update; update.UpdateAll = false; update.UnitGUID = GetTarget()->GetGUID(); - - WorldPackets::Spells::AuraInfo auraInfo; - BuildUpdatePacket(auraInfo, remove); - update.Auras.push_back(auraInfo); + BuildUpdatePacket(update.Auras.emplace_back(), remove); _target->SendMessageToSet(update.Write(), true); } diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 84765df970..da50245076 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -86,7 +86,7 @@ class TC_GAME_API AuraApplication uint32 GetEffectMask() const { return _effectMask; } bool HasEffect(uint8 effect) const { ASSERT(effect < MAX_SPELL_EFFECTS); return (_effectMask & (1 << effect)) != 0; } bool IsPositive() const { return (_flags & AFLAG_POSITIVE) != 0; } - bool IsSelfcast() const { return (_flags & AFLAG_NOCASTER) != 0; } + bool IsSelfcast() const { return (_flags & AFLAG_SELF_CAST) != 0; } uint32 GetEffectsToApply() const { return _effectsToApply; } void UpdateApplyEffectMask(uint32 newEffMask, bool canHandleNewEffects); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 4a335aec99..fd241174fc 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4441,7 +4441,7 @@ void Spell::finish(SpellCastResult result) } template -inline void FillSpellCastFailedArgs(T& packet, ObjectGuid castId, SpellInfo const* spellInfo, SpellCastResult result, SpellCustomErrors customError, int32* param1 /*= nullptr*/, int32* param2 /*= nullptr*/, Player* caster) +inline void FillSpellCastFailedArgs(T& packet, ObjectGuid castId, SpellInfo const* spellInfo, SpellCastResult result, SpellCustomErrors customError, int32* param1, int32* param2) { packet.CastID = castId; packet.SpellID = spellInfo->Id; @@ -4490,30 +4490,26 @@ inline void FillSpellCastFailedArgs(T& packet, ObjectGuid castId, SpellInfo cons if (param1) { packet.FailedArg1 = *param1; - if (param2) - packet.FailedArg2 = *param2; } else { if (spellInfo->Totem[0]) packet.FailedArg1 = spellInfo->Totem[0]; - if (spellInfo->Totem[1]) - packet.FailedArg2 = spellInfo->Totem[1]; + else if (spellInfo->Totem[1]) + packet.FailedArg1 = spellInfo->Totem[1]; } break; case SPELL_FAILED_TOTEM_CATEGORY: if (param1) { packet.FailedArg1 = *param1; - if (param2) - packet.FailedArg2 = *param2; } else { if (spellInfo->TotemCategory[0]) packet.FailedArg1 = spellInfo->TotemCategory[0]; - if (spellInfo->TotemCategory[1]) - packet.FailedArg2 = spellInfo->TotemCategory[1]; + else if (spellInfo->TotemCategory[1]) + packet.FailedArg1 = spellInfo->TotemCategory[1]; } break; case SPELL_FAILED_EQUIPPED_ITEM_CLASS: @@ -4531,68 +4527,34 @@ inline void FillSpellCastFailedArgs(T& packet, ObjectGuid castId, SpellInfo cons } break; case SPELL_FAILED_TOO_MANY_OF_ITEM: - { if (param1) - packet.FailedArg1 = *param1; - else - { - uint32 item = 0; - for (SpellEffectInfo const& spellEffectInfo : spellInfo->GetEffects()) - { - if (uint32 itemType = spellEffectInfo.ItemType) - { - item = itemType; - break; - } - } - - ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item); - if (proto && proto->GetItemLimitCategory()) - packet.FailedArg1 = proto->GetItemLimitCategory(); - } + packet.FailedArg1 = *param1; // ItemLimitCategory id break; - } case SPELL_FAILED_PREVENTED_BY_MECHANIC: if (param1) packet.FailedArg1 = *param1; - else - packet.FailedArg1 = spellInfo->GetAllEffectsMechanicMask(); // SpellMechanic.dbc id break; case SPELL_FAILED_NEED_EXOTIC_AMMO: if (param1) - packet.FailedArg1 = *param1; - else - packet.FailedArg1 = spellInfo->EquippedItemSubClassMask; // seems correct... + packet.FailedArg1 = *param1; // weapon subclass id break; case SPELL_FAILED_NEED_MORE_ITEMS: if (param1 && param2) { - packet.FailedArg1 = *param1; - packet.FailedArg2 = *param2; - } - else - { - packet.FailedArg1 = 0; // Item id - packet.FailedArg2 = 0; // Item count? + packet.FailedArg1 = *param1; // Item id + packet.FailedArg2 = *param2; // Item count } break; case SPELL_FAILED_MIN_SKILL: if (param1 && param2) { - packet.FailedArg1 = *param1; - packet.FailedArg2 = *param2; - } - else - { - packet.FailedArg1 = 0; // SkillLine.dbc id - packet.FailedArg2 = 0; // required skill value + packet.FailedArg1 = *param1; // SkillLine.dbc id + packet.FailedArg2 = *param2; // required skill value } break; case SPELL_FAILED_FISHING_TOO_LOW: if (param1) - packet.FailedArg1 = *param1; - else - packet.FailedArg1 = 0; // required fishing skill + packet.FailedArg1 = *param1; // required fishing skill break; case SPELL_FAILED_CUSTOM_ERROR: packet.FailedArg1 = customError; @@ -4604,44 +4566,9 @@ inline void FillSpellCastFailedArgs(T& packet, ObjectGuid castId, SpellInfo cons packet.FailedArg1 = 0; // Unknown break; case SPELL_FAILED_REAGENTS: - { if (param1) packet.FailedArg1 = *param1; - else - { - for (uint32 i = 0; i < MAX_SPELL_REAGENTS; i++) - { - if (spellInfo->Reagent[i] <= 0) - continue; - - uint32 itemid = spellInfo->Reagent[i]; - uint32 itemcount = spellInfo->ReagentCount[i]; - - if (caster && !caster->HasItemCount(itemid, itemcount)) - { - packet.FailedArg1 = itemid; // first missing item - break; - } - } - } - - if (param2) - packet.FailedArg2 = *param2; - else if (!param1) - { - for (SpellReagentsCurrencyEntry const* reagentsCurrency : spellInfo->ReagentsCurrency) - { - if (caster && !caster->HasCurrency(reagentsCurrency->CurrencyTypesID, reagentsCurrency->CurrencyCount)) - { - packet.FailedArg1 = -1; - packet.FailedArg2 = reagentsCurrency->CurrencyTypesID; - break; - } - } - } - break; - } case SPELL_FAILED_CANT_UNTALENT: { ASSERT(param1); @@ -4675,7 +4602,7 @@ void Spell::SendCastResult(SpellCastResult result, int32* param1 /*= nullptr*/, WorldPackets::Spells::CastFailed castFailed; castFailed.Visual = m_SpellVisual; - FillSpellCastFailedArgs(castFailed, m_castId, m_spellInfo, result, m_customError, param1, param2, m_caster->ToPlayer()); + FillSpellCastFailedArgs(castFailed, m_castId, m_spellInfo, result, m_customError, param1, param2); receiver->SendDirectMessage(castFailed.Write()); } @@ -4692,18 +4619,18 @@ void Spell::SendPetCastResult(SpellCastResult result, int32* param1 /*= nullptr* result = SPELL_FAILED_DONT_REPORT; WorldPackets::Spells::PetCastFailed petCastFailed; - FillSpellCastFailedArgs(petCastFailed, m_castId, m_spellInfo, result, SPELL_CUSTOM_ERROR_NONE, param1, param2, owner->ToPlayer()); + FillSpellCastFailedArgs(petCastFailed, m_castId, m_spellInfo, result, SPELL_CUSTOM_ERROR_NONE, param1, param2); owner->ToPlayer()->SendDirectMessage(petCastFailed.Write()); } -void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, SpellCastVisual spellVisual, ObjectGuid cast_count, SpellCastResult result, SpellCustomErrors customError /*= SPELL_CUSTOM_ERROR_NONE*/, int32* param1 /*= nullptr*/, int32* param2 /*= nullptr*/) +void Spell::SendCastResult(Player const* caster, SpellInfo const* spellInfo, SpellCastVisual spellVisual, ObjectGuid cast_count, SpellCastResult result, SpellCustomErrors customError /*= SPELL_CUSTOM_ERROR_NONE*/, int32* param1 /*= nullptr*/, int32* param2 /*= nullptr*/) { if (result == SPELL_CAST_OK) return; WorldPackets::Spells::CastFailed packet; packet.Visual = spellVisual; - FillSpellCastFailedArgs(packet, cast_count, spellInfo, result, customError, param1, param2, caster); + FillSpellCastFailedArgs(packet, cast_count, spellInfo, result, customError, param1, param2); caster->SendDirectMessage(packet.Write()); } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 5f57e9b304..3ca32b0de1 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -559,7 +559,7 @@ class TC_GAME_API Spell void CheckSrc(); void CheckDst(); - static void SendCastResult(Player* caster, SpellInfo const* spellInfo, SpellCastVisual spellVisual, ObjectGuid cast_count, SpellCastResult result, SpellCustomErrors customError = SPELL_CUSTOM_ERROR_NONE, int32* param1 = nullptr, int32* param2 = nullptr); + static void SendCastResult(Player const* caster, SpellInfo const* spellInfo, SpellCastVisual spellVisual, ObjectGuid cast_count, SpellCastResult result, SpellCustomErrors customError = SPELL_CUSTOM_ERROR_NONE, int32* param1 = nullptr, int32* param2 = nullptr); void SendCastResult(SpellCastResult result, int32* param1 = nullptr, int32* param2 = nullptr) const; void SendPetCastResult(SpellCastResult result, int32* param1 = nullptr, int32* param2 = nullptr) const; void SendMountResult(MountResult result); diff --git a/src/server/game/Spells/SpellDefines.h b/src/server/game/Spells/SpellDefines.h index 259e39868a..e85cd9e818 100644 --- a/src/server/game/Spells/SpellDefines.h +++ b/src/server/game/Spells/SpellDefines.h @@ -437,7 +437,7 @@ public: float GetSpeedZ() const { return m_speed * std::sin(m_pitch); } void Update(WorldObject* caster); - std::string GetTargetString() const { return m_strTarget; } + std::string const& GetTargetString() const { return m_strTarget; } private: uint32 m_targetMask; diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 46e8a7ad18..757491784c 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -301,7 +301,6 @@ public: castFailed.FailedArg1 = failArg1.value_or(-1); castFailed.FailedArg2 = failArg2.value_or(-1); handler->GetSession()->SendPacket(castFailed.Write()); - return true; }