diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-02-05 20:10:19 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-02-05 20:10:19 +0100 |
commit | 61819f2dc76814a85250e3859890bcb79a3be10a (patch) | |
tree | 886ad46ab834a79e8bf94559f9a7315683496b1e /src | |
parent | 8b1d6f91ad58fd31d2c5f203d11ff251689c8aed (diff) |
Core/Misc: Reduce differences between branches and fix data sent in SMSG_AUCTION_COMMAND_RESULT, SMSG_PARTY_MEMBER_STATS, SMSG_BATTLEFIELD_STATUS and implemented missing SMSG_AUCTION_REMOVED_NOTIFICATION
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 36 | ||||
-rw-r--r-- | src/server/game/AuctionHouse/AuctionHouseMgr.cpp | 5 | ||||
-rw-r--r-- | src/server/game/AuctionHouse/AuctionHouseMgr.h | 2 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/BattlegroundMgr.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 36 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 110 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.h | 5 | ||||
-rw-r--r-- | src/server/game/Handlers/AuctionHouseHandler.cpp | 92 | ||||
-rw-r--r-- | src/server/game/Handlers/BattlefieldHandler.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Handlers/GroupHandler.cpp | 23 | ||||
-rw-r--r-- | src/server/game/Handlers/GuildHandler.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 53 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 14 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 33 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 1 |
16 files changed, 235 insertions, 194 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 8219d4ab05c..a76564d8b77 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -294,7 +294,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) } } -bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, WorldObject const* target, uint32 miscvalue1 /*= 0*/, uint32 miscvalue2 /* = 0*/) const +bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, WorldObject const* target, uint32 miscValue1 /*= 0*/, uint32 miscValue2 /* = 0*/) const { switch (dataType) { @@ -350,7 +350,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Wo return unitTarget->HasAuraEffect(aura.spell_id, aura.effect_idx); } case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE: - return CompareValues(ComparisionType(value.compType), miscvalue1, value.value); + return CompareValues(ComparisionType(value.compType), miscValue1, value.value); case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL: { if (!target) @@ -422,13 +422,13 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Wo Unit const* unitTarget = nullptr; if (target) unitTarget = target->ToUnit(); - return instance->CheckAchievementCriteriaMeet(criteria_id, source, unitTarget, miscvalue1); + return instance->CheckAchievementCriteriaMeet(criteria_id, source, unitTarget, miscValue1); } case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM: { AchievementCriteriaEntry const* entry = ASSERT_NOTNULL(sAchievementMgr->GetAchievementCriteria(criteria_id)); - uint32 itemId = (entry->Type == ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM ? miscvalue2 : miscvalue1); + uint32 itemId = (entry->Type == ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM ? miscValue2 : miscValue1); ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId); if (!itemTemplate) return false; @@ -457,7 +457,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Wo } case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_ITEM_QUALITY: { - ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(miscvalue1); + ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(miscValue1); if (!pProto) return false; return pProto->Quality == item.item_quality; @@ -468,10 +468,10 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Wo return false; } -bool AchievementCriteriaDataSet::Meets(Player const* source, WorldObject const* target, uint32 miscvalue1 /*= 0*/, uint32 miscvalue2 /* = 0*/) const +bool AchievementCriteriaDataSet::Meets(Player const* source, WorldObject const* target, uint32 miscValue1 /*= 0*/, uint32 miscValue2 /* = 0*/) const { for (AchievementCriteriaData const& criteriadata : storage) - if (!criteriadata.Meets(criteria_id, source, target, miscvalue1, miscvalue2)) + if (!criteriadata.Meets(criteria_id, source, target, miscValue1, miscValue2)) return false; return true; @@ -845,7 +845,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS: SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); break; - // std case: increment at miscvalue1 + // std case: increment at miscValue1 case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE: case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE: case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS: @@ -861,7 +861,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS: SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); break; - // std case: increment at miscvalue2 + // std case: increment at miscValue2 case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM: @@ -869,7 +869,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE: SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE); break; - // std case: high value at miscvalue1 + // std case: high value at miscValue1 case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: /* FIXME: for online player only currently */ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT: @@ -949,7 +949,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; } case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING: - // miscvalue1 is the ingame fallheight*100 as stored in dbc + // miscValue1 is the ingame fallheight*100 as stored in dbc SetCriteriaProgress(achievementCriteria, miscValue1); break; case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: @@ -1871,8 +1871,8 @@ bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const* achie return false; break; case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE: - // miscvalue1=loot_type (note: 0 = LOOT_CORPSE and then it ignored) - // miscvalue2=count of item loot + // miscValue1=loot_type (note: 0 = LOOT_CORPSE and then it ignored) + // miscValue2=count of item loot if (!miscValue1 || !miscValue2) return false; if (miscValue1 != achievementCriteria->Asset.LootType) @@ -1924,8 +1924,8 @@ bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const* achie return false; break; case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM: - // miscvalue1 = itemSlot - // miscvalue2 = itemid + // miscValue1 = itemSlot + // miscValue2 = itemid if (!miscValue2) return false; if (miscValue1 != achievementCriteria->Asset.ItemSlot) @@ -1933,15 +1933,15 @@ bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const* achie break; case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT: - // miscvalue1 = itemid - // miscvalue2 = diced value + // miscValue1 = itemid + // miscValue2 = diced value if (!miscValue1) return false; if (miscValue2 != achievementCriteria->Asset.RollValue) return false; break; case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: - // miscvalue1 = emote + // miscValue1 = emote if (!miscValue1) return false; if (miscValue1 != achievementCriteria->Asset.EmoteID) diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 1139d34bb22..62a7ed1c61c 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -283,7 +283,7 @@ void AuctionHouseMgr::SendAuctionOutbiddedMail(AuctionEntry* auction, uint32 new } //this function sends mail, when auction is cancelled to old bidder -void AuctionHouseMgr::SendAuctionCancelledToBidderMail(AuctionEntry* auction, CharacterDatabaseTransaction trans) +void AuctionHouseMgr::SendAuctionCancelledToBidderMail(AuctionEntry* auction, CharacterDatabaseTransaction trans, Item* item) { ObjectGuid bidder_guid = ObjectGuid(HighGuid::Player, auction->bidder); Player* bidder = ObjectAccessor::FindConnectedPlayer(bidder_guid); @@ -292,6 +292,9 @@ void AuctionHouseMgr::SendAuctionCancelledToBidderMail(AuctionEntry* auction, Ch if (!bidder) bidder_accId = sCharacterCache->GetCharacterAccountIdByGuid(bidder_guid); + if (bidder) + bidder->GetSession()->SendAuctionRemovedNotification(auction->Id, auction->itemEntry, item->GetItemRandomPropertyId()); + // bidder exist if ((bidder || bidder_accId) && !sAuctionBotConfig->IsBotChar(auction->bidder)) MailDraft(auction->BuildAuctionMailSubject(AUCTION_CANCELLED_TO_BIDDER), "") diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h index 80dba9a5ed3..dd7bb5d484c 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.h +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h @@ -188,7 +188,7 @@ class TC_GAME_API AuctionHouseMgr void SendAuctionSuccessfulMail(AuctionEntry* auction, CharacterDatabaseTransaction trans); void SendAuctionExpiredMail(AuctionEntry* auction, CharacterDatabaseTransaction trans); void SendAuctionOutbiddedMail(AuctionEntry* auction, uint32 newPrice, Player* newBidder, CharacterDatabaseTransaction trans); - void SendAuctionCancelledToBidderMail(AuctionEntry* auction, CharacterDatabaseTransaction trans); + void SendAuctionCancelledToBidderMail(AuctionEntry* auction, CharacterDatabaseTransaction trans, Item* item); static uint32 GetAuctionDeposit(AuctionHouseEntry const* entry, uint32 time, Item* pItem, uint32 count); static AuctionHouseEntry const* GetAuctionHouseEntry(uint32 factionTemplateId); diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 1b3d2f0c851..e5af279050c 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -189,7 +189,7 @@ void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket* data, Battlegro // The following segment is read as uint64 in client but can be appended as their original type. *data << uint8(arenatype); TC_LOG_DEBUG("network", "BattlegroundMgr::BuildBattlegroundStatusPacket: arenatype = {} for bg instanceID {}, TypeID {}.", arenatype, bg->GetClientInstanceID(), bg->GetTypeID()); - *data << uint8(bg->isArena() ? 0xE : 0x0); + *data << uint8(bg->GetBracketId()); *data << uint32(bg->GetTypeID()); *data << uint16(0x1F90); // End of uint64 segment, decomposed this way for simplicity diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 431be68fb2d..18bb4c05abf 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6093,8 +6093,8 @@ void Player::SendActionButtons(uint32 state) const data << uint8(state); /* state can be 0, 1, 2 - 0 - Looks to be sent when initial action buttons get sent, however on Trinity we use 1 since 0 had some difficulties - 1 - Used in any SMSG_ACTION_BUTTONS packet with button data on Trinity. Only used after spec swaps on retail. + 0 - Sends initial action buttons, client does not validate if we have the spell or not + 1 - Used used after spec swaps, client validates if a spell is known. 2 - Clears the action bars client sided. This is sent during spec swap before unlearning and before sending the new buttons */ if (state != 2) @@ -21515,10 +21515,12 @@ void Player::InitDisplayIds() inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore) { + uint32 stacks = count; + count = stacks * pProto->BuyCount; ItemPosCountVec vDest; uint16 uiDest = 0; InventoryResult msg = bStore ? - CanStoreNewItem(bag, slot, vDest, item, pProto->BuyCount * count) : + CanStoreNewItem(bag, slot, vDest, item, count) : CanEquipNewItem(slot, uiDest, item, false); if (msg != EQUIP_ERR_OK) { @@ -21533,15 +21535,15 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost); ASSERT(iece); if (iece->HonorPoints) - ModifyHonorPoints(-int32(iece->HonorPoints * count)); + ModifyHonorPoints(-int32(iece->HonorPoints * stacks)); if (iece->ArenaPoints) - ModifyArenaPoints(-int32(iece->ArenaPoints * count)); + ModifyArenaPoints(-int32(iece->ArenaPoints * stacks)); for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) { if (iece->ItemID[i]) - DestroyItemCount(iece->ItemID[i], (iece->ItemCount[i] * count), true); + DestroyItemCount(iece->ItemID[i], iece->ItemCount[i] * stacks, true); } } @@ -21550,15 +21552,16 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c EquipNewItem(uiDest, item, true); if (it) { - uint32 new_count = pVendor->UpdateVendorItemCurrentCount(crItem, pProto->BuyCount * count); + uint32 new_count = pVendor->UpdateVendorItemCurrentCount(crItem, count); WorldPacket data(SMSG_BUY_ITEM, (8+4+4+4)); data << uint64(pVendor->GetGUID()); data << uint32(vendorslot + 1); // numbered from 1 at client data << int32(crItem->maxcount > 0 ? new_count : 0xFFFFFFFF); - data << uint32(count); + data << uint32(stacks); SendDirectMessage(&data); - SendNewItem(it, pProto->BuyCount * count, true, false, false); + + SendNewItem(it, count, true, false, false); if (!bStore) AutoUnequipOffhandIfNeed(); @@ -21577,7 +21580,7 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c } // Return true is the bought item has a max count to force refresh of window by caller -bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot) +bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint32 count, uint8 bag, uint8 slot) { // cheating attempt if (count < 1) count = 1; @@ -21662,6 +21665,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin if (crItem->ExtendedCost) { + uint32 stacks = count; ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost); if (!iece) { @@ -21670,14 +21674,14 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin } // honor points price - if (GetHonorPoints() < (iece->HonorPoints * count)) + if (GetHonorPoints() < (iece->HonorPoints * stacks)) { SendEquipError(EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS, nullptr, nullptr); return false; } // arena points price - if (GetArenaPoints() < (iece->ArenaPoints * count)) + if (GetArenaPoints() < (iece->ArenaPoints * stacks)) { SendEquipError(EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS, nullptr, nullptr); return false; @@ -21686,7 +21690,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin // item base price for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) { - if (iece->ItemID[i] && !HasItemCount(iece->ItemID[i], (iece->ItemCount[i] * count))) + if (iece->ItemID[i] && !HasItemCount(iece->ItemID[i], (iece->ItemCount[i] * stacks))) { SendEquipError(EQUIP_ERR_VENDOR_MISSING_TURNINS, nullptr, nullptr); return false; @@ -21706,11 +21710,11 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin if (crItem->IsGoldRequired(pProto) && pProto->BuyPrice > 0) //Assume price cannot be negative (do not know why it is int32) { uint32 maxCount = MAX_MONEY_AMOUNT / pProto->BuyPrice; - if ((uint32)count > maxCount) + if (uint32(count) > maxCount) { TC_LOG_ERROR("entities.player.cheat", "Player::BuyItemFromVendorSlot: Player '{}' ({}) tried to buy item (ItemID: {}, Count: {}), causing overflow", - GetName(), GetGUID().ToString(), pProto->ItemId, (uint32)count); - count = (uint8)maxCount; + GetName(), GetGUID().ToString(), pProto->ItemId, uint32(count)); + count = uint32(maxCount); } price = pProto->BuyPrice * count; //it should not exceed MAX_MONEY_AMOUNT diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index ec5adfdcf04..23915ad87cf 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1190,7 +1190,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> bool IsTwoHandUsed() const; bool IsUsingTwoHandedWeaponInOneHand() const; void SendNewItem(Item* item, uint32 count, bool received, bool created, bool broadcast = false, bool sendChatMessage = true); - bool BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot); + bool BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint32 count, uint8 bag, uint8 slot); bool _StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore); float GetReputationPriceDiscount(Creature const* creature) const; diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 68cced98d21..5864e8c4d14 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1835,12 +1835,7 @@ void Guild::SendBankLog(WorldSession* session, uint8 tabId) const void Guild::SendBankTabData(WorldSession* session, uint8 tabId, bool sendAllSlots) const { if (tabId < _GetPurchasedTabsSize()) - _SendBankContent(session, tabId, sendAllSlots); -} - -void Guild::SendBankTabsInfo(WorldSession* session, bool sendAllSlots /*= false*/) const -{ - _SendBankList(session, 0, sendAllSlots); + SendBankList(session, tabId, sendAllSlots); } void Guild::SendBankTabText(WorldSession* session, uint8 tabId) const @@ -1897,7 +1892,7 @@ void Guild::SendLoginInfo(WorldSession* session) TC_LOG_DEBUG("guild", "SMSG_GUILD_EVENT [{}] MOTD", session->GetPlayerInfo()); - SendBankTabsInfo(session); + SendBankList(session); Player* player = session->GetPlayer(); @@ -2788,20 +2783,6 @@ bool Guild::_DoItemsMove(MoveItemData* pSrc, MoveItemData* pDest, bool sendError return true; } -void Guild::_SendBankContent(WorldSession* session, uint8 tabId, bool sendAllSlots) const -{ - ObjectGuid guid = session->GetPlayer()->GetGUID(); - if (!_MemberHasTabRights(guid, tabId, GUILD_BANK_RIGHT_VIEW_TAB)) - return; - - _SendBankList(session, tabId, sendAllSlots); -} - -void Guild::_SendBankMoneyUpdate(WorldSession* session) const -{ - _SendBankList(session); -} - void Guild::_SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) const { ASSERT(pSrc->IsBank() || pDest->IsBank()); @@ -2836,7 +2817,7 @@ void Guild::_SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) cons void Guild::_SendBankContentUpdate(uint8 tabId, SlotIds slots) const { - _SendBankList(nullptr, tabId, false, &slots); + SendBankList(nullptr, tabId, false, &slots); } void Guild::_BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, @@ -2865,15 +2846,15 @@ void Guild::_BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, TC_LOG_DEBUG("guild", "SMSG_GUILD_EVENT [Broadcast] Event: {} ({})", GetGuildEventString(guildEvent), guildEvent); } -void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*= 0*/, bool sendAllSlots /*= false*/, SlotIds *slots /*= nullptr*/) const +void Guild::SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*= 0*/, bool fullUpdate /*= false*/, SlotIds *slots /*= nullptr*/) const { WorldPackets::Guild::GuildBankQueryResults packet; packet.Money = m_bankMoney; packet.Tab = int32(tabId); - packet.FullUpdate = sendAllSlots; + packet.FullUpdate = fullUpdate; - if (sendAllSlots && !tabId) + if (fullUpdate && !tabId) { packet.TabInfo.reserve(_GetPurchasedTabsSize()); for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i) @@ -2885,55 +2866,58 @@ void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*= } } - if (BankTab const* tab = GetBankTab(tabId)) + if (!session || _MemberHasTabRights(session->GetPlayer()->GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB)) { - auto fillItems = [&](auto begin, auto end, bool skipEmpty) + if (BankTab const* tab = GetBankTab(tabId)) { - for (auto itr = begin; itr != end; ++itr) + auto fillItems = [&](auto begin, auto end, bool skipEmpty) { - if (Item* tabItem = tab->GetItem(*itr)) + for (auto itr = begin; itr != end; ++itr) { - WorldPackets::Guild::GuildBankItemInfo itemInfo; - - itemInfo.Slot = *itr; - itemInfo.ItemID = tabItem->GetEntry(); - itemInfo.RandomPropertiesID = tabItem->GetItemRandomPropertyId(); - itemInfo.RandomPropertiesSeed = tabItem->GetItemSuffixFactor(); - itemInfo.Count = int32(tabItem->GetCount()); - itemInfo.Charges = int32(abs(tabItem->GetSpellCharges())); - itemInfo.EnchantmentID = int32(tabItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT)); - itemInfo.Flags = tabItem->GetInt32Value(ITEM_FIELD_FLAGS); - - for (uint32 socketSlot = 0; socketSlot < MAX_GEM_SOCKETS; ++socketSlot) + if (Item* tabItem = tab->GetItem(*itr)) { - if (uint32 enchId = tabItem->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT + socketSlot))) + WorldPackets::Guild::GuildBankItemInfo itemInfo; + + itemInfo.Slot = *itr; + itemInfo.ItemID = tabItem->GetEntry(); + itemInfo.RandomPropertiesID = tabItem->GetItemRandomPropertyId(); + itemInfo.RandomPropertiesSeed = tabItem->GetItemSuffixFactor(); + itemInfo.Count = int32(tabItem->GetCount()); + itemInfo.Charges = int32(abs(tabItem->GetSpellCharges())); + itemInfo.EnchantmentID = int32(tabItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT)); + itemInfo.Flags = tabItem->GetInt32Value(ITEM_FIELD_FLAGS); + + for (uint32 socketSlot = 0; socketSlot < MAX_GEM_SOCKETS; ++socketSlot) { - WorldPackets::Guild::GuildBankSocketEnchant gem; - gem.SocketIndex = socketSlot; - gem.SocketEnchantID = int32(enchId); - itemInfo.SocketEnchant.push_back(gem); + if (uint32 enchId = tabItem->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT + socketSlot))) + { + WorldPackets::Guild::GuildBankSocketEnchant gem; + gem.SocketIndex = socketSlot; + gem.SocketEnchantID = int32(enchId); + itemInfo.SocketEnchant.push_back(gem); + } } - } - packet.ItemInfo.push_back(itemInfo); - } - else if (!skipEmpty) - { - WorldPackets::Guild::GuildBankItemInfo itemInfo; + packet.ItemInfo.push_back(itemInfo); + } + else if (!skipEmpty) + { + WorldPackets::Guild::GuildBankItemInfo itemInfo; - itemInfo.Slot = *itr; - itemInfo.ItemID = 0; + itemInfo.Slot = *itr; + itemInfo.ItemID = 0; - packet.ItemInfo.push_back(itemInfo); + packet.ItemInfo.push_back(itemInfo); + } } - } - }; + }; - if (sendAllSlots) - fillItems(boost::make_counting_iterator(uint8(0)), boost::make_counting_iterator(uint8(GUILD_BANK_MAX_SLOTS)), true); - else if (slots && !slots->empty()) - fillItems(slots->begin(), slots->end(), false); + if (fullUpdate) + fillItems(boost::make_counting_iterator(uint8(0)), boost::make_counting_iterator(uint8(GUILD_BANK_MAX_SLOTS)), true); + else if (slots && !slots->empty()) + fillItems(slots->begin(), slots->end(), false); + } } if (session) @@ -2943,7 +2927,7 @@ void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*= session->SendPacket(packet.Write()); TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}", - session->GetPlayerInfo(), tabId, sendAllSlots, packet.WithdrawalsRemaining); + session->GetPlayerInfo(), tabId, fullUpdate, packet.WithdrawalsRemaining); } else /// @todo - Probably this is just sent to session + those that have sent CMSG_GUILD_BANKER_ACTIVATE { @@ -2959,7 +2943,7 @@ void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*= packet.SetWithdrawalsRemaining(_GetMemberRemainingSlots(member, tabId)); player->SendDirectMessage(packet.GetRawPacket()); TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}" - , player->GetName(), tabId, sendAllSlots, packet.WithdrawalsRemaining); + , player->GetName(), tabId, fullUpdate, packet.WithdrawalsRemaining); } } } diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index c1583a29a1b..e42d62bab88 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -677,7 +677,7 @@ class TC_GAME_API Guild void SendInfo(WorldSession* session) const; void SendEventLog(WorldSession* session) const; void SendBankLog(WorldSession* session, uint8 tabId) const; - void SendBankTabsInfo(WorldSession* session, bool showTabs = false) const; + void SendBankList(WorldSession* session = nullptr, uint8 tabId = 0, bool fullUpdate = false, SlotIds* slots = nullptr) const; void SendBankTabData(WorldSession* session, uint8 tabId, bool sendAllSlots) const; void SendBankTabText(WorldSession* session, uint8 tabId) const; void SendPermissions(WorldSession* session) const; @@ -822,11 +822,8 @@ class TC_GAME_API Guild void _MoveItems(MoveItemData* pSrc, MoveItemData* pDest, uint32 splitedAmount); bool _DoItemsMove(MoveItemData* pSrc, MoveItemData* pDest, bool sendError, uint32 splitedAmount = 0); - void _SendBankContent(WorldSession* session, uint8 tabId, bool sendAllSlots) const; - void _SendBankMoneyUpdate(WorldSession* session) const; void _SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) const; void _SendBankContentUpdate(uint8 tabId, SlotIds slots) const; - void _SendBankList(WorldSession* session = nullptr, uint8 tabId = 0, bool sendFullSlots = false, SlotIds* slots = nullptr) const; void _BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, Optional<std::string_view> param1 = {}, Optional<std::string_view> param2 = {}, Optional<std::string_view> param3 = {}) const; }; diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index fd6bd6da091..b50b071b943 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -76,14 +76,31 @@ void WorldSession::SendAuctionHello(ObjectGuid guid, Unit const* unit) } //call this method when player bids, creates, or deletes auction -void WorldSession::SendAuctionCommandResult(uint32 auctionItemId, AuctionAction command, AuctionError errorCode, InventoryResult bagResult) +void WorldSession::SendAuctionCommandResult(AuctionEntry const* auction, AuctionAction command, AuctionError errorCode, InventoryResult bagResult) { - WorldPacket data(SMSG_AUCTION_COMMAND_RESULT, 16); - data << int32(auctionItemId); + WorldPacket data(SMSG_AUCTION_COMMAND_RESULT, 4 + 4 + 4 + 8 + 4 + 4); + data << int32(auction ? auction->Id : 0); data << int32(command); data << int32(errorCode); - if (errorCode == ERR_AUCTION_INVENTORY) - data << int32(bagResult); + + switch (errorCode) + { + case ERR_AUCTION_OK: + if (command == AUCTION_PLACE_BID) + data << uint32(auction->bid ? auction->GetAuctionOutBid() : 0); + break; + case ERR_AUCTION_INVENTORY: + data << uint32(bagResult); + break; + case ERR_AUCTION_HIGHER_BID: + data << uint64(auction->bidder); + data << uint32(auction->bid); + data << uint32(auction->bid ? auction->GetAuctionOutBid() : 0); + break; + default: + break; + } + SendPacket(&data); } @@ -115,6 +132,15 @@ void WorldSession::SendAuctionOwnerNotification(AuctionEntry* auction) SendPacket(&data); } +void WorldSession::SendAuctionRemovedNotification(uint32 auctionId, uint32 itemEntry, int32 randomPropertyId) +{ + WorldPacket data(SMSG_AUCTION_REMOVED_NOTIFICATION, (4+4+4)); + data << uint32(auctionId); + data << uint32(itemEntry); + data << uint32(randomPropertyId); + SendPacket(&data); +} + //this void creates new auction and adds auction to some auctionhouse void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) { @@ -129,7 +155,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (itemsCount > MAX_AUCTION_ITEMS) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); recvData.rfinish(); return; } @@ -156,7 +182,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (bid > MAX_MONEY_AMOUNT || buyout > MAX_MONEY_AMOUNT) { TC_LOG_DEBUG("network", "WORLD: HandleAuctionSellItem - Player {} {} attempted to sell item with higher price than max gold amount.", _player->GetName(), _player->GetGUID().ToString()); - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); return; } @@ -200,7 +226,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (!item) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_ITEM_NOT_FOUND); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_ITEM_NOT_FOUND); return; } @@ -211,7 +237,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) item->GetTemplate()->HasFlag(ITEM_FLAG_CONJURED) || item->GetUInt32Value(ITEM_FIELD_DURATION) || item->GetCount() < count[i] || itemEntry != item->GetTemplate()->ItemId) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); return; } @@ -221,7 +247,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (!finalCount) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); return; } @@ -232,7 +258,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) { if (itemGUIDs[i] == itemGUIDs[j]) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); return; } } @@ -244,7 +270,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (item->GetMaxStackCount() < finalCount) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); return; } } @@ -257,7 +283,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) uint32 deposit = sAuctionMgr->GetAuctionDeposit(auctionHouseEntry, etime, item, finalCount); if (!_player->HasEnoughMoney(deposit)) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_NOT_ENOUGHT_MONEY); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_NOT_ENOUGHT_MONEY); return; } @@ -271,7 +297,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (!auctioneerData) { TC_LOG_ERROR("misc", "Data for auctioneer not found ({})", auctioneer.ToString()); - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); delete AH; return; } @@ -280,7 +306,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (!auctioneerInfo) { TC_LOG_ERROR("misc", "Non existing auctioneer ({})", auctioneer.ToString()); - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); delete AH; return; } @@ -319,7 +345,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) // Add to pending auctions, or fail with insufficient funds error if (!sAuctionMgr->PendingAuctionAdd(_player, AH)) { - SendAuctionCommandResult(AH->Id, AUCTION_SELL_ITEM, ERR_AUCTION_NOT_ENOUGHT_MONEY); + SendAuctionCommandResult(AH, AUCTION_SELL_ITEM, ERR_AUCTION_NOT_ENOUGHT_MONEY); return; } @@ -335,7 +361,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) _player->SaveInventoryAndGoldToDB(trans); CharacterDatabase.CommitTransaction(trans); - SendAuctionCommandResult(AH->Id, AUCTION_SELL_ITEM, ERR_AUCTION_OK); + SendAuctionCommandResult(AH, AUCTION_SELL_ITEM, ERR_AUCTION_OK); GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, 1); } @@ -345,7 +371,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (!newItem) { TC_LOG_ERROR("network", "CMSG_AUCTION_SELL_ITEM: Could not create clone of item {}", item->GetEntry()); - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); delete AH; return; } @@ -377,7 +403,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) // Add to pending auctions, or fail with insufficient funds error if (!sAuctionMgr->PendingAuctionAdd(_player, AH)) { - SendAuctionCommandResult(AH->Id, AUCTION_SELL_ITEM, ERR_AUCTION_NOT_ENOUGHT_MONEY); + SendAuctionCommandResult(AH, AUCTION_SELL_ITEM, ERR_AUCTION_NOT_ENOUGHT_MONEY); return; } @@ -417,7 +443,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) _player->SaveInventoryAndGoldToDB(trans); CharacterDatabase.CommitTransaction(trans); - SendAuctionCommandResult(AH->Id, AUCTION_SELL_ITEM, ERR_AUCTION_OK); + SendAuctionCommandResult(AH, AUCTION_SELL_ITEM, ERR_AUCTION_OK); GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, 1); } @@ -456,7 +482,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData) if (!auction || auction->owner == player->GetGUID().GetCounter()) { //you cannot bid your own auction: - SendAuctionCommandResult(0, AUCTION_PLACE_BID, ERR_AUCTION_BID_OWN); + SendAuctionCommandResult(nullptr, AUCTION_PLACE_BID, ERR_AUCTION_BID_OWN); return; } @@ -466,7 +492,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData) if (!auction_owner && sCharacterCache->GetCharacterAccountIdByGuid(ownerGuid) == player->GetSession()->GetAccountId()) { //you cannot bid your another character auction: - SendAuctionCommandResult(0, AUCTION_PLACE_BID, ERR_AUCTION_BID_OWN); + SendAuctionCommandResult(auction, AUCTION_PLACE_BID, ERR_AUCTION_BID_OWN); return; } @@ -478,14 +504,15 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData) if ((price < auction->buyout || auction->buyout == 0) && price < auction->bid + auction->GetAuctionOutBid()) { - //auction has already higher bid, client tests it! + // client already test it but just in case ... + SendAuctionCommandResult(auction, AUCTION_PLACE_BID, ERR_AUCTION_HIGHER_BID); return; } if (!player->HasEnoughMoney(price)) { - //you don't have enought money!, client tests! - //SendAuctionCommandResult(auction->auctionId, AUCTION_PLACE_BID, ???); + // client already test it but just in case ... + SendAuctionCommandResult(auction, AUCTION_PLACE_BID, ERR_AUCTION_NOT_ENOUGHT_MONEY); return; } @@ -533,7 +560,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData) trans->Append(stmt); } - SendAuctionCommandResult(auction->Id, AUCTION_PLACE_BID, ERR_AUCTION_OK); + SendAuctionCommandResult(auction, AUCTION_PLACE_BID, ERR_AUCTION_OK); } else { @@ -560,7 +587,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData) sAuctionMgr->SendAuctionSuccessfulMail(auction, trans); sAuctionMgr->SendAuctionWonMail(auction, trans); - SendAuctionCommandResult(auction->Id, AUCTION_PLACE_BID, ERR_AUCTION_OK); + SendAuctionCommandResult(auction, AUCTION_PLACE_BID, ERR_AUCTION_OK); auction->DeleteFromDB(trans); @@ -608,8 +635,7 @@ void WorldSession::HandleAuctionRemoveItem(WorldPacket& recvData) uint32 auctionCut = auction->GetAuctionCut(); if (!player->HasEnoughMoney(auctionCut)) //player doesn't have enough money, maybe message needed return; - //some auctionBidderNotification would be needed, but don't know that parts.. - sAuctionMgr->SendAuctionCancelledToBidderMail(auction, trans); + sAuctionMgr->SendAuctionCancelledToBidderMail(auction, trans, pItem); player->ModifyMoney(-int32(auctionCut)); } @@ -621,20 +647,20 @@ void WorldSession::HandleAuctionRemoveItem(WorldPacket& recvData) else { TC_LOG_ERROR("network", "Auction id: {} got non existing item (item guid : {})!!!", auction->Id, auction->itemGUIDLow); - SendAuctionCommandResult(0, AUCTION_CANCEL, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(auction, AUCTION_CANCEL, ERR_AUCTION_DATABASE_ERROR); return; } } else { - SendAuctionCommandResult(0, AUCTION_CANCEL, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_CANCEL, ERR_AUCTION_DATABASE_ERROR); //this code isn't possible ... maybe there should be assert TC_LOG_ERROR("entities.player.cheat", "CHEATER : {} tried to cancel auction (id: {}) of another player or auction is NULL", player->GetGUID().ToString(), auctionId); return; } //inform player, that auction is removed - SendAuctionCommandResult(auction->Id, AUCTION_CANCEL, ERR_AUCTION_OK); + SendAuctionCommandResult(auction, AUCTION_CANCEL, ERR_AUCTION_OK); // Now remove the auction @@ -788,7 +814,7 @@ void WorldSession::HandleAuctionListItems(WorldPacket& recvData) WorldPacket data(SMSG_AUCTION_LIST_RESULT, (4+4+4)); uint32 count = 0; uint32 totalcount = 0; - data << (uint32) 0; + data << uint32(0); // converting string that we try to find to lower case std::wstring wsearchedname; diff --git a/src/server/game/Handlers/BattlefieldHandler.cpp b/src/server/game/Handlers/BattlefieldHandler.cpp index 934ba73d6fc..d64564bff75 100644 --- a/src/server/game/Handlers/BattlefieldHandler.cpp +++ b/src/server/game/Handlers/BattlefieldHandler.cpp @@ -155,14 +155,10 @@ void WorldSession::HandleBfEntryInviteResponse(WorldPacket& recvData) // If player accept invitation if (accepted) - { bf->PlayerAcceptInviteToWar(_player); - } else - { if (_player->GetZoneId() == bf->GetZoneId()) bf->KickPlayerFromBattlefield(_player->GetGUID()); - } } /** @@ -178,9 +174,6 @@ void WorldSession::HandleBfQueueExitRequest(WorldPacket& recvData) TC_LOG_DEBUG("misc", "HandleBfQueueExitRequest: battleId: {} ", battleId); - Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId); - if (!bf) - return; - - bf->AskToLeaveQueue(_player); + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId)) + bf->AskToLeaveQueue(_player); } diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 5554b959763..e9d64c786e9 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -801,7 +801,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke { AuraApplication const* aurApp = player->GetVisibleAura(i); *data << uint32(aurApp ? aurApp->GetBase()->GetId() : 0); - *data << uint8(1); + *data << uint8(aurApp ? aurApp->GetFlags() : 0); } } } @@ -810,9 +810,9 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke if (mask & GROUP_UPDATE_FLAG_PET_GUID) { if (pet) - *data << (uint64) pet->GetGUID(); + *data << pet->GetGUID(); else - *data << (uint64) 0; + *data << uint64(0); } if (mask & GROUP_UPDATE_FLAG_PET_NAME) @@ -904,15 +904,15 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket &recvData) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_REQUEST_PARTY_MEMBER_STATS"); - ObjectGuid Guid; - recvData >> Guid; + ObjectGuid guid; + recvData >> guid; - Player* player = ObjectAccessor::FindConnectedPlayer(Guid); + Player* player = ObjectAccessor::FindConnectedPlayer(guid); if (!player || !GetPlayer()->IsInSameRaidWith(player)) { WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3+4+2); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related - data << Guid.WriteAsPacked(); + data << guid.WriteAsPacked(); data << uint32(GROUP_UPDATE_FLAG_STATUS); data << uint16(MEMBER_STATUS_OFFLINE); SendPacket(&data); @@ -1004,7 +1004,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket &recvData) data << uint32(pet->GetMaxHealth()); if (updateFlags & GROUP_UPDATE_FLAG_PET_POWER_TYPE) - data << (uint8)pet->GetPowerType(); + data << uint8(pet->GetPowerType()); if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_POWER) data << uint16(pet->GetPower(pet->GetPowerType())); @@ -1036,17 +1036,12 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket &recvData) SendPacket(&data); } -/*!*/void WorldSession::HandleRequestRaidInfoOpcode(WorldPacket & /*recvData*/) +void WorldSession::HandleRequestRaidInfoOpcode(WorldPacket& /*recvData*/) { // every time the player checks the character screen _player->SendRaidInfo(); } -/*void WorldSession::HandleGroupCancelOpcode(WorldPacket& recvData) -{ - TC_LOG_DEBUG("WORLD: got CMSG_GROUP_CANCEL."); -}*/ - void WorldSession::HandleOptOutOfLootOpcode(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_OPT_OUT_OF_LOOT"); diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index 29e6df57af3..3519f5f1811 100644 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -265,7 +265,7 @@ void WorldSession::HandleGuildBankActivate(WorldPackets::Guild::GuildBankActivat return; } - guild->SendBankTabsInfo(this, packet.FullUpdate); + guild->SendBankList(this, 0, packet.FullUpdate); } // Called when opening guild bank tab only (first one) @@ -276,7 +276,7 @@ void WorldSession::HandleGuildBankQueryTab(WorldPackets::Guild::GuildBankQueryTa if (GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK)) if (Guild* guild = GetPlayer()->GetGuild()) - guild->SendBankTabData(this, packet.Tab, true /*packet.FullUpdate*/); + guild->SendBankList(this, packet.Tab, true /*packet.FullUpdate*/); // HACK: client doesn't query entire tab content if it had received SMSG_GUILD_BANK_LIST in this session // but we broadcast bank updates to entire guild when *ANYONE* changes anything, incorrectly initializing clients // tab content with only data for that change diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 7347f0556ba..b22de311602 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -637,41 +637,48 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid) { if (VendorItem const* item = items->GetItem(slot)) { - if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(item->item)) + ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(item->item); + if (!itemTemplate) + continue; + + uint32 leftInStock = !item->maxcount ? 0xFFFFFFFF : vendor->GetVendorItemCurrentCount(item); + if (!_player->IsGameMaster()) // ignore conditions if GM on { - if (!(itemTemplate->AllowableClass & _player->GetClassMask()) && itemTemplate->Bonding == BIND_WHEN_PICKED_UP && !_player->IsGameMaster()) + // Respect allowed class + if (!(itemTemplate->AllowableClass & _player->GetClassMask()) && itemTemplate->Bonding == BIND_WHEN_PICKED_UP) continue; + // Only display items in vendor lists for the team the // player is on. If GM on, display all items. - if (!_player->IsGameMaster() && ((itemTemplate->HasFlag(ITEM_FLAG2_FACTION_HORDE) && _player->GetTeam() == ALLIANCE) || (itemTemplate->HasFlag(ITEM_FLAG2_FACTION_ALLIANCE) && _player->GetTeam() == HORDE))) + if ((itemTemplate->HasFlag(ITEM_FLAG2_FACTION_HORDE) && _player->GetTeam() == ALLIANCE) || + (itemTemplate->HasFlag(ITEM_FLAG2_FACTION_ALLIANCE) && _player->GetTeam() == HORDE)) continue; // Items sold out are not displayed in list - uint32 leftInStock = !item->maxcount ? 0xFFFFFFFF : vendor->GetVendorItemCurrentCount(item); - if (!_player->IsGameMaster() && !leftInStock) + if (leftInStock == 0) continue; + } - if (!sConditionMgr->IsObjectMeetingVendorItemConditions(vendor->GetEntry(), item->item, _player, vendor)) - { - TC_LOG_DEBUG("condition", "SendListInventory: conditions not met for creature entry {} item {}", vendor->GetEntry(), item->item); - continue; - } + if (!sConditionMgr->IsObjectMeetingVendorItemConditions(vendor->GetEntry(), item->item, _player, vendor)) + { + TC_LOG_DEBUG("condition", "SendListInventory: conditions not met for creature entry {} item {}", vendor->GetEntry(), item->item); + continue; + } - // reputation discount - int32 price = item->IsGoldRequired(itemTemplate) ? uint32(floor(itemTemplate->BuyPrice * discountMod)) : 0; + // reputation discount + int32 price = item->IsGoldRequired(itemTemplate) ? uint32(floor(itemTemplate->BuyPrice * discountMod)) : 0; - data << uint32(slot + 1); // client expects counting to start at 1 - data << uint32(item->item); - data << uint32(itemTemplate->DisplayInfoID); - data << int32(leftInStock); - data << uint32(price); - data << uint32(itemTemplate->MaxDurability); - data << uint32(itemTemplate->BuyCount); - data << uint32(item->ExtendedCost); + data << uint32(slot + 1); // client expects counting to start at 1 + data << uint32(item->item); + data << uint32(itemTemplate->DisplayInfoID); + data << int32(leftInStock); + data << uint32(price); + data << uint32(itemTemplate->MaxDurability); + data << uint32(itemTemplate->BuyCount); + data << uint32(item->ExtendedCost); - if (++count >= MAX_VENDOR_ITEMS) - break; - } + if (++count >= MAX_VENDOR_ITEMS) + break; } } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 54ef82b4f26..8b34a4ee0bf 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -583,9 +583,21 @@ class TC_GAME_API WorldSession void UpdateInstanceEnterTimes(); //auction void SendAuctionHello(ObjectGuid guid, Unit const* unit); - void SendAuctionCommandResult(uint32 auctionItemId, AuctionAction command, AuctionError errorCode, InventoryResult bagResult = InventoryResult(0)); + + /** + * @fn void WorldSession::SendAuctionCommandResult(uint32 auctionId, uint32 action, uint32 errorCode, uint32 bagError = 0); + * + * @brief Notifies the client of the result of his last auction operation. It is called when the player bids, creates, or deletes an auction + * + * @param auction The relevant auction data + * @param command The action that was performed. + * @param errorCode The resulting error code. + * @param bagResult (Optional) InventoryResult. + */ + void SendAuctionCommandResult(AuctionEntry const* auction, AuctionAction command, AuctionError errorCode, InventoryResult bagResult = InventoryResult(0)); void SendAuctionBidderNotification(uint32 location, uint32 auctionId, ObjectGuid bidder, uint32 bidSum, uint32 diff, uint32 item_template); void SendAuctionOwnerNotification(AuctionEntry* auction); + void SendAuctionRemovedNotification(uint32 auctionId, uint32 itemEntry, int32 randomPropertyId); //Item Enchantment void SendEnchantmentLog(ObjectGuid target, ObjectGuid caster, uint32 itemId, uint32 enchantId); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 446f4ff3a1c..f1a90646117 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5394,13 +5394,13 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint return SPELL_FAILED_ONLY_BATTLEGROUNDS; // do not allow spells to be cast in arenas - // - with greater than 10 min CD without SPELL_ATTR4_USABLE_IN_ARENA flag - // - with SPELL_ATTR4_NOT_USABLE_IN_ARENA flag - if (m_spellInfo->HasAttribute(SPELL_ATTR4_NOT_USABLE_IN_ARENA) || - (m_spellInfo->GetRecoveryTime() > 10 * MINUTE * IN_MILLISECONDS && !m_spellInfo->HasAttribute(SPELL_ATTR4_USABLE_IN_ARENA))) - if (MapEntry const* mapEntry = sMapStore.LookupEntry(m_caster->GetMapId())) - if (mapEntry->IsBattleArena()) - return SPELL_FAILED_NOT_IN_ARENA; + if (Player* player = m_caster->ToPlayer()) + if (player->InArena()) + { + SpellCastResult castResult = CheckArenaCastRules(); + if (castResult != SPELL_CAST_OK) + return castResult; + } // zone check if (m_caster->GetTypeId() != TYPEID_PLAYER || !m_caster->ToPlayer()->IsGameMaster()) @@ -6395,6 +6395,25 @@ int32 Spell::CalculateDamage(SpellEffectInfo const& spellEffectInfo) const return m_caster->CalculateSpellDamage(spellEffectInfo, m_spellValue->EffectBasePoints + spellEffectInfo.EffectIndex); } +SpellCastResult Spell::CheckArenaCastRules() const +{ + // check USABLE attributes + // USABLE takes precedence over NOT_USABLE + if (m_spellInfo->HasAttribute(SPELL_ATTR4_USABLE_IN_ARENA)) + return SPELL_CAST_OK; + + // check NOT_USABLE attributes + if (m_spellInfo->AttributesEx4 & SPELL_ATTR4_NOT_USABLE_IN_ARENA) + return SPELL_FAILED_NOT_IN_ARENA; + + // check cooldowns + uint32 spellCooldown = m_spellInfo->GetRecoveryTime(); + if (spellCooldown > 10 * MINUTE * IN_MILLISECONDS) // not sure if still needed + return SPELL_FAILED_NOT_IN_ARENA; + + return SPELL_CAST_OK; +} + SpellCastResult Spell::CheckMovement() const { if (IsTriggered()) diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 5ca78741a18..fe8b1a54670 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -338,6 +338,7 @@ class TC_GAME_API Spell SpellCastResult CheckPower() const; SpellCastResult CheckRuneCost(uint32 runeCostID) const; SpellCastResult CheckCasterAuras(uint32* param1) const; + SpellCastResult CheckArenaCastRules() const; SpellCastResult CheckMovement() const; bool CheckSpellCancelsAuraEffect(AuraType auraType, uint32* param1) const; |