From 7bc78be84c9faba9f1e53f770ab1e026956ab749 Mon Sep 17 00:00:00 2001 From: Elmsroth Date: Wed, 29 Dec 2021 12:50:35 +0100 Subject: [PATCH] Several Trading fixes (#169) * FIX : HandleAdditemCommand (delete items in bank) The .additem command was not deleting items in the bank * FIX : HandleAdditemCommand (delete items in buyback tab) The .additem command was not deleting items in the buyback vendor tab for npc vendors * Enchance LANG_REMOVEITEM text * Fix Tabs / spaces in Language.h * Fix Language.h file generator * Trade Fix : For GMs starting a trade session with an opposite faction player Allow a GM to start a trading session with an opposite faction player even if CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_TRADE = false * Trade Fix : Avoid hanging trade sessions for invisible GMs Check visibility in order to avoid hanging trade sessions --- src/game/WorldHandlers/TradeHandler.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/game/WorldHandlers/TradeHandler.cpp b/src/game/WorldHandlers/TradeHandler.cpp index f8eb03cd..3de1eb2f 100644 --- a/src/game/WorldHandlers/TradeHandler.cpp +++ b/src/game/WorldHandlers/TradeHandler.cpp @@ -671,26 +671,39 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) return; } - if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_TRADE) && pOther->GetTeam() != _player->GetTeam()) + // Checking faction restrictions but allow a GM to start a trade even if not in same faction + if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_TRADE) && pOther->GetTeam() != GetPlayer()->GetTeam() && GetSecurity() == SEC_PLAYER) { info.Status = TRADE_STATUS_WRONG_FACTION; SendTradeStatus(info); return; } - if (!pOther->IsWithinDistInMap(_player, TRADE_DISTANCE, false)) + if (!pOther->IsWithinDistInMap(GetPlayer(), TRADE_DISTANCE, false)) { info.Status = TRADE_STATUS_TARGET_TO_FAR; SendTradeStatus(info); return; } + // Check visibility in order to avoid hanging trade sessions + if (GetSecurity() > SEC_PLAYER && GetPlayer()->GetVisibility() == VISIBILITY_OFF && + ( pOther->GetSession()->GetSecurity() < GetSecurity() + || (pOther->GetSession()->GetSecurity() > GetSecurity() && pOther->GetVisibility() == VISIBILITY_OFF) + ) + ) + { + info.Status = TRADE_STATUS_TRADE_CANCELED; + SendTradeStatus(info); + return; + } + // OK start trade - _player->m_trade = new TradeData(_player, pOther); - pOther->m_trade = new TradeData(pOther, _player); + GetPlayer()->m_trade = new TradeData(GetPlayer(), pOther); + pOther->m_trade = new TradeData(pOther, GetPlayer()); info.Status = TRADE_STATUS_BEGIN_TRADE; - info.TraderGuid = _player->GetObjectGuid(); + info.TraderGuid = GetPlayer()->GetObjectGuid(); pOther->GetSession()->SendTradeStatus(info); }