void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recv_data) { ObjectGuid playerGuid; recv_data >> playerGuid; Player* pCurrChar = nullptr; pCurrChar = ObjectAccessor::FindPlayer(playerGuid, false); WorldPacket data(SMSG_CHARACTER_LOGIN_FAILED, 1); if (PlayerLoading()) { sLog.outError("HandlePlayerLoginOpcode> Player try to login again while already in loading stage, AccountId = %u", GetAccountId()); data << (uint8)CHAR_LOGIN_DUPLICATE_CHARACTER; SendPacket(data, true); return; } if (_player) { // player is reconnecting if (!pCurrChar) { sLog.outError("HandlePlayerLoginOpcode> %s try to login a second char, AccountId = %u", _player->GetGuidStr().c_str(), GetAccountId()); data << (uint8)CHAR_LOGIN_DUPLICATE_CHARACTER; SendPacket(data, true); return; } if (!isLogingOut()) { sLog.outError("HandlePlayerLoginOpcode> %s try to login again, AccountId = %u", pCurrChar->GetGuidStr().c_str(), GetAccountId()); data << (uint8)CHAR_LOGIN_FAILED; SendPacket(data, true); return; } if (!_player->IsInWorld()) // finish pending transfers before starting the logout while (_player && _player->IsBeingTeleportedFar()) HandleMoveWorldportAckOpcode(); HandlePlayerReconnect(); return; } DEBUG_LOG("WORLD: Received opcode Player Logon Message"); LoginQueryHolder* holder = new LoginQueryHolder(GetAccountId(), playerGuid); if (!holder->Initialize()) { delete holder; // delete all unprocessed queries m_playerLoading = false; return; } CharacterDatabase.DelayQueryHolder(&chrHandler, &CharacterHandler::HandlePlayerLoginCallback, holder); }
void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) { uint64 ID; recvPacket >> ID; if (GetPlayer()->m_trade) return; if (!GetPlayer()->isAlive()) { SendTradeStatus(TRADE_STATUS_YOU_DEAD); return; } if (GetPlayer()->HasUnitState(UNIT_STATE_STUNNED)) { SendTradeStatus(TRADE_STATUS_YOU_STUNNED); return; } if (isLogingOut()) { SendTradeStatus(TRADE_STATUS_YOU_LOGOUT); return; } if (GetPlayer()->isInFlight()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } if (GetPlayer()->getLevel() < sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)) { SendNotification(GetTrinityString(LANG_TRADE_REQ), sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)); return; } Player* pOther = ObjectAccessor::FindPlayer(ID); if (!pOther) { SendTradeStatus(TRADE_STATUS_NO_TARGET); return; } if (pOther == GetPlayer() || pOther->m_trade) { SendTradeStatus(TRADE_STATUS_BUSY); return; } if (!pOther->isAlive()) { SendTradeStatus(TRADE_STATUS_TARGET_DEAD); return; } if (pOther->isInFlight()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } if (pOther->HasUnitState(UNIT_STATE_STUNNED)) { SendTradeStatus(TRADE_STATUS_TARGET_STUNNED); return; } if (pOther->GetSession()->isLogingOut()) { SendTradeStatus(TRADE_STATUS_TARGET_LOGOUT); return; } if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow())) { SendTradeStatus(TRADE_STATUS_IGNORE_YOU); return; } if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_TRADE) && pOther->GetTeam() !=_player->GetTeam()) { SendTradeStatus(TRADE_STATUS_WRONG_FACTION); return; } if (!pOther->IsWithinDistInMap(_player, 10.0f, false)) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } if (pOther->getLevel() < sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)) { SendNotification(GetTrinityString(LANG_TRADE_OTHER_REQ), sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)); return; } // OK start trade _player->m_trade = new TradeData(_player, pOther); pOther->m_trade = new TradeData(pOther, _player); WorldPacket data(SMSG_TRADE_STATUS, 12); data << uint32(TRADE_STATUS_BEGIN_TRADE); data << uint64(_player->GetGUID()); pOther->GetSession()->SendPacket(&data); }
void WorldSession::HandleInitiateTradeOpcode(WorldPackets::Trade::InitiateTrade& initiateTrade) { if (GetPlayer()->m_trade) return; WorldPackets::Trade::TradeStatus info; if (!GetPlayer()->IsAlive()) { info.Status = TRADE_STATUS_DEAD; SendTradeStatus(info); return; } if (GetPlayer()->HasUnitState(UNIT_STATE_STUNNED)) { info.Status = TRADE_STATUS_STUNNED; SendTradeStatus(info); return; } if (isLogingOut()) { info.Status = TRADE_STATUS_LOGGING_OUT; SendTradeStatus(info); return; } if (GetPlayer()->IsInFlight()) { info.Status = TRADE_STATUS_TOO_FAR_AWAY; SendTradeStatus(info); return; } if (GetPlayer()->getLevel() < sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)) { SendNotification(GetTrinityString(LANG_TRADE_REQ), sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)); return; } Player* pOther = ObjectAccessor::FindPlayer(initiateTrade.Guid); if (!pOther) { info.Status = TRADE_STATUS_NO_TARGET; SendTradeStatus(info); return; } if (pOther == GetPlayer() || pOther->m_trade) { info.Status = TRADE_STATUS_PLAYER_BUSY; SendTradeStatus(info); return; } if (!pOther->IsAlive()) { info.Status = TRADE_STATUS_TARGET_DEAD; SendTradeStatus(info); return; } if (pOther->IsInFlight()) { info.Status = TRADE_STATUS_TOO_FAR_AWAY; SendTradeStatus(info); return; } if (pOther->HasUnitState(UNIT_STATE_STUNNED)) { info.Status = TRADE_STATUS_TARGET_STUNNED; SendTradeStatus(info); return; } if (pOther->GetSession()->isLogingOut()) { info.Status = TRADE_STATUS_TARGET_LOGGING_OUT; SendTradeStatus(info); return; } if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetGUID())) { info.Status = TRADE_STATUS_PLAYER_IGNORED; SendTradeStatus(info); return; } if ((pOther->GetTeam() != _player->GetTeam() || pOther->HasFlag(PLAYER_FLAGS_EX, PLAYER_FLAGS_EX_MERCENARY_MODE) || _player->HasFlag(PLAYER_FLAGS_EX, PLAYER_FLAGS_EX_MERCENARY_MODE)) && (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_TRADE) && !HasPermission(rbac::RBAC_PERM_ALLOW_TWO_SIDE_TRADE))) { info.Status = TRADE_STATUS_WRONG_FACTION; SendTradeStatus(info); return; } if (!pOther->IsWithinDistInMap(_player, TRADE_DISTANCE, false)) { info.Status = TRADE_STATUS_TOO_FAR_AWAY; SendTradeStatus(info); return; } if (pOther->getLevel() < sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)) { SendNotification(GetTrinityString(LANG_TRADE_OTHER_REQ), sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)); return; } // OK start trade _player->m_trade = new TradeData(_player, pOther); pOther->m_trade = new TradeData(pOther, _player); info.Status = TRADE_STATUS_PROPOSED; info.Partner = _player->GetGUID(); pOther->GetSession()->SendTradeStatus(info); }
void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) { ObjectGuid guid; guid[2] = recvPacket.ReadBit(); guid[7] = recvPacket.ReadBit(); guid[0] = recvPacket.ReadBit(); guid[6] = recvPacket.ReadBit(); guid[5] = recvPacket.ReadBit(); guid[3] = recvPacket.ReadBit(); guid[1] = recvPacket.ReadBit(); guid[4] = recvPacket.ReadBit(); recvPacket.ReadByteSeq(guid[2]); recvPacket.ReadByteSeq(guid[6]); recvPacket.ReadByteSeq(guid[4]); recvPacket.ReadByteSeq(guid[7]); recvPacket.ReadByteSeq(guid[0]); recvPacket.ReadByteSeq(guid[1]); recvPacket.ReadByteSeq(guid[3]); recvPacket.ReadByteSeq(guid[5]); if (GetPlayer()->m_trade) return; if (!GetPlayer()->isAlive()) { SendTradeStatus(TRADE_STATUS_YOU_DEAD); return; } if (GetPlayer()->HasUnitState(UNIT_STATE_STUNNED)) { SendTradeStatus(TRADE_STATUS_YOU_STUNNED); return; } if (isLogingOut()) { SendTradeStatus(TRADE_STATUS_YOU_LOGOUT); return; } if (GetPlayer()->isInFlight()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } if (GetPlayer()->getLevel() < sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)) { SendNotification(GetTrinityString(LANG_TRADE_REQ), sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)); return; } Player* pOther = ObjectAccessor::FindPlayer(guid); if (!pOther) { SendTradeStatus(TRADE_STATUS_NO_TARGET); return; } if (pOther == GetPlayer() || pOther->m_trade) { SendTradeStatus(TRADE_STATUS_BUSY); return; } if (!pOther->isAlive()) { SendTradeStatus(TRADE_STATUS_TARGET_DEAD); return; } if (pOther->isInFlight()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } if (pOther->HasUnitState(UNIT_STATE_STUNNED)) { SendTradeStatus(TRADE_STATUS_TARGET_STUNNED); return; } if (pOther->GetSession()->isLogingOut()) { SendTradeStatus(TRADE_STATUS_TARGET_LOGOUT); return; } if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow())) { SendTradeStatus(TRADE_STATUS_IGNORE_YOU); return; } if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_TRADE) && pOther->GetTeam() !=_player->GetTeam()) { SendTradeStatus(TRADE_STATUS_WRONG_FACTION); return; } if (!pOther->IsWithinDistInMap(_player, 10.0f, false)) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } if (pOther->getLevel() < sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)) { SendNotification(GetTrinityString(LANG_TRADE_OTHER_REQ), sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)); return; } // OK start trade _player->m_trade = new TradeData(_player, pOther); pOther->m_trade = new TradeData(pOther, _player); WorldPacket data(SMSG_TRADE_STATUS, 2+7); data.WriteBit(0); // unk bit, usually 0 data.WriteBits(TRADE_STATUS_BEGIN_TRADE, 5); ObjectGuid playerGuid = _player->GetGUID(); // WTB StartBitStream... data.WriteBit(playerGuid[2]); data.WriteBit(playerGuid[4]); data.WriteBit(playerGuid[6]); data.WriteBit(playerGuid[0]); data.WriteBit(playerGuid[1]); data.WriteBit(playerGuid[3]); data.WriteBit(playerGuid[7]); data.WriteBit(playerGuid[5]); data.WriteByteSeq(playerGuid[5]); data.WriteByteSeq(playerGuid[7]); data.WriteByteSeq(playerGuid[3]); data.WriteByteSeq(playerGuid[6]); data.WriteByteSeq(playerGuid[4]); data.WriteByteSeq(playerGuid[2]); data.WriteByteSeq(playerGuid[0]); data.WriteByteSeq(playerGuid[1]); pOther->GetSession()->SendPacket(&data); }
void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) { ObjectGuid otherGuid; recvPacket.ReadGuidMask<0, 3, 5, 1, 4, 6, 7, 2>(otherGuid); recvPacket.ReadGuidBytes<7, 4, 3, 5, 1, 2, 6, 0>(otherGuid); if (GetPlayer()->m_trade) return; if (!GetPlayer()->IsAlive()) { SendTradeStatus(TRADE_STATUS_YOU_DEAD); return; } if (GetPlayer()->hasUnitState(UNIT_STAT_STUNNED)) { SendTradeStatus(TRADE_STATUS_YOU_STUNNED); return; } if (isLogingOut()) { SendTradeStatus(TRADE_STATUS_YOU_LOGOUT); return; } if (GetPlayer()->IsTaxiFlying()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } Player* pOther = ObjectAccessor::FindPlayer(otherGuid); if (!pOther) { SendTradeStatus(TRADE_STATUS_NO_TARGET); return; } if (pOther == GetPlayer() || pOther->m_trade) { SendTradeStatus(TRADE_STATUS_BUSY); return; } if (!pOther->IsAlive()) { SendTradeStatus(TRADE_STATUS_TARGET_DEAD); return; } if (pOther->IsTaxiFlying()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } if (pOther->hasUnitState(UNIT_STAT_STUNNED)) { SendTradeStatus(TRADE_STATUS_TARGET_STUNNED); return; } if (pOther->GetSession()->isLogingOut()) { SendTradeStatus(TRADE_STATUS_TARGET_LOGOUT); return; } if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetObjectGuid())) { SendTradeStatus(TRADE_STATUS_IGNORE_YOU); return; } if (pOther->GetTeam() != _player->GetTeam()) { SendTradeStatus(TRADE_STATUS_WRONG_FACTION); return; } if (!pOther->IsWithinDistInMap(_player, 10.0f, false)) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } // OK start trade _player->m_trade = new TradeData(_player, pOther); pOther->m_trade = new TradeData(pOther, _player); WorldPacket data(SMSG_TRADE_STATUS, 12); data.WriteBit(false); data.WriteBits(TRADE_STATUS_BEGIN_TRADE, 5); data.WriteGuidMask<2, 4, 6, 0, 1, 3, 7, 5>(_player->GetObjectGuid()); data.WriteGuidBytes<4, 1, 2, 3, 0, 7, 6, 5>(_player->GetObjectGuid()); data << uint32(0); pOther->GetSession()->SendPacket(&data); }
void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) { ObjectGuid otherGuid; recvPacket >> otherGuid; if (GetPlayer()->m_trade) return; if (!GetPlayer()->isAlive()) { SendTradeStatus(TRADE_STATUS_YOU_DEAD); return; } if (GetPlayer()->hasUnitState(UNIT_STAT_STUNNED)) { SendTradeStatus(TRADE_STATUS_YOU_STUNNED); return; } if (isLogingOut()) { SendTradeStatus(TRADE_STATUS_YOU_LOGOUT); return; } if (GetPlayer()->IsTaxiFlying()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } Player* pOther = ObjectAccessor::FindPlayer( otherGuid ); if (!pOther) { SendTradeStatus(TRADE_STATUS_NO_TARGET); return; } if (pOther == GetPlayer() || pOther->m_trade) { SendTradeStatus(TRADE_STATUS_BUSY); return; } if (!pOther->isAlive()) { SendTradeStatus(TRADE_STATUS_TARGET_DEAD); return; } if (pOther->IsTaxiFlying()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } if (pOther->hasUnitState(UNIT_STAT_STUNNED)) { SendTradeStatus(TRADE_STATUS_TARGET_STUNNED); return; } if (pOther->GetSession()->isLogingOut()) { SendTradeStatus(TRADE_STATUS_TARGET_LOGOUT); return; } if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetObjectGuid())) { SendTradeStatus(TRADE_STATUS_IGNORE_YOU); return; } if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_TRADE) && pOther->GetTeam() !=_player->GetTeam() ) { SendTradeStatus(TRADE_STATUS_WRONG_FACTION); return; } if (!pOther->IsWithinDistInMap(_player, TRADE_DISTANCE, false)) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } // OK start trade _player->m_trade = new TradeData(_player, pOther); pOther->m_trade = new TradeData(pOther, _player); WorldPacket data(SMSG_TRADE_STATUS, 12); data << uint32(TRADE_STATUS_BEGIN_TRADE); data << ObjectGuid(_player->GetObjectGuid()); pOther->GetSession()->SendPacket(&data); }
void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) { ObjectGuid ID; recvPacket >> ID; if (GetPlayer()->m_trade) return; TradeStatusInfo info; if (!GetPlayer()->IsAlive()) { info.Status = TRADE_STATUS_YOU_DEAD; SendTradeStatus(info); return; } if (GetPlayer()->HasUnitState(UNIT_STATE_STUNNED)) { info.Status = TRADE_STATUS_YOU_STUNNED; SendTradeStatus(info); return; } if (isLogingOut()) { info.Status = TRADE_STATUS_YOU_LOGOUT; SendTradeStatus(info); return; } if (GetPlayer()->IsInFlight()) { info.Status = TRADE_STATUS_TARGET_TO_FAR; SendTradeStatus(info); return; } if (GetPlayer()->getLevel() < sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)) { SendNotification(GetTrinityString(LANG_TRADE_REQ), sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)); return; } Player* pOther = ObjectAccessor::FindPlayer(ID); if (!pOther) { info.Status = TRADE_STATUS_NO_TARGET; SendTradeStatus(info); return; } if (pOther == GetPlayer() || pOther->m_trade) { info.Status = TRADE_STATUS_BUSY; SendTradeStatus(info); return; } if (!pOther->IsAlive()) { info.Status = TRADE_STATUS_TARGET_DEAD; SendTradeStatus(info); return; } if (pOther->IsInFlight()) { info.Status = TRADE_STATUS_TARGET_TO_FAR; SendTradeStatus(info); return; } if (pOther->HasUnitState(UNIT_STATE_STUNNED)) { info.Status = TRADE_STATUS_TARGET_STUNNED; SendTradeStatus(info); return; } if (pOther->GetSession()->isLogingOut()) { info.Status = TRADE_STATUS_TARGET_LOGOUT; SendTradeStatus(info); return; } if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow())) { info.Status = TRADE_STATUS_IGNORE_YOU; SendTradeStatus(info); return; } if (pOther->GetTeam() != _player->GetTeam() && (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_TRADE) && !GetPlayer()->GetSession()->HasPermission(rbac::RBAC_PERM_ALLOW_TWO_SIDE_TRADE))) { info.Status = TRADE_STATUS_WRONG_FACTION; SendTradeStatus(info); return; } if (!pOther->IsWithinDistInMap(_player, TRADE_DISTANCE, false)) { info.Status = TRADE_STATUS_TARGET_TO_FAR; SendTradeStatus(info); return; } if (pOther->getLevel() < sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)) { SendNotification(GetTrinityString(LANG_TRADE_OTHER_REQ), sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)); return; } // OK start trade _player->m_trade = new TradeData(_player, pOther); pOther->m_trade = new TradeData(pOther, _player); info.Status = TRADE_STATUS_BEGIN_TRADE; info.TraderGuid = _player->GetGUID(); pOther->GetSession()->SendTradeStatus(info); }
void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) { uint64 ID; recvPacket >> ID; if (GetPlayer()->m_trade) return; if (!GetPlayer()->isAlive()) { SendTradeStatus(TRADE_STATUS_YOU_DEAD); return; } if (GetPlayer()->hasUnitState(UNIT_STAT_STUNNED)) { SendTradeStatus(TRADE_STATUS_YOU_STUNNED); return; } if (isLogingOut()) { SendTradeStatus(TRADE_STATUS_YOU_LOGOUT); return; } if (GetPlayer()->isInFlight()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } Player* pOther = ObjectAccessor::FindPlayer( ID ); if (!pOther) { SendTradeStatus(TRADE_STATUS_NO_TARGET); return; } if (pOther == GetPlayer() || pOther->m_trade) { SendTradeStatus(TRADE_STATUS_BUSY); return; } if (!pOther->isAlive()) { SendTradeStatus(TRADE_STATUS_TARGET_DEAD); return; } if (pOther->isInFlight()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } if (pOther->hasUnitState(UNIT_STAT_STUNNED)) { SendTradeStatus(TRADE_STATUS_TARGET_STUNNED); return; } if (pOther->GetSession()->isLogingOut()) { SendTradeStatus(TRADE_STATUS_TARGET_LOGOUT); return; } if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow())) { SendTradeStatus(TRADE_STATUS_IGNORE_YOU); return; } if (pOther->GetTeam() !=_player->GetTeam() ) { SendTradeStatus(TRADE_STATUS_WRONG_FACTION); return; } if (!pOther->IsWithinDistInMap(_player,10.0f,false)) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } // OK start trade _player->m_trade = new TradeData(_player, pOther); pOther->m_trade = new TradeData(pOther, _player); WorldPacket data(SMSG_TRADE_STATUS, 12); data << (uint32) TRADE_STATUS_BEGIN_TRADE; data << (uint64)_player->GetGUID(); pOther->GetSession()->SendPacket(&data); }
void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) { uint64 ID; recvPacket >> ID; if (GetPlayer()->pTrader) return; if (!GetPlayer()->isAlive()) { SendTradeStatus(TRADE_STATUS_YOU_DEAD); return; } if (GetPlayer()->hasUnitState(UNIT_STAT_STUNNED)) { SendTradeStatus(TRADE_STATUS_YOU_STUNNED); return; } if (isLogingOut()) { SendTradeStatus(TRADE_STATUS_YOU_LOGOUT); return; } if (GetPlayer()->isInFlight()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } Player* pOther = ObjectAccessor::FindPlayer(ID); if (!pOther) { SendTradeStatus(TRADE_STATUS_NO_TARGET); return; } if (pOther == GetPlayer() || pOther->pTrader) { SendTradeStatus(TRADE_STATUS_BUSY); return; } if (!pOther->isAlive()) { SendTradeStatus(TRADE_STATUS_TARGET_DEAD); return; } if (pOther->isInFlight()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } if (pOther->hasUnitState(UNIT_STAT_STUNNED)) { SendTradeStatus(TRADE_STATUS_TARGET_STUNNED); return; } if (pOther->GetSession()->isLogingOut()) { SendTradeStatus(TRADE_STATUS_TARGET_LOGOUT); return; } if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow())) { SendTradeStatus(TRADE_STATUS_IGNORE_YOU); return; } if (!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_TRADE) && pOther->GetTeam() != _player->GetTeam()) { SendTradeStatus(TRADE_STATUS_WRONG_FACTION); return; } if (pOther->GetDistance2d(_player) > 10.0f) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } // OK start trade _player->pTrader = pOther; pOther->pTrader =_player; WorldPacket data(SMSG_TRADE_STATUS, 12); data << (uint32) TRADE_STATUS_BEGIN_TRADE; data << (uint64)_player->GetGUID(); _player->pTrader->GetSession()->SendPacket(&data); }
void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) { ObjectGuid otherGuid; recvPacket >> otherGuid; if (GetPlayer()->m_trade) return; TradeStatusInfo info; if (!GetPlayer()->isAlive()) { info.Status = TRADE_STATUS_YOU_DEAD; SendTradeStatus(info); return; } if (GetPlayer()->hasUnitState(UNIT_STAT_STUNNED)) { info.Status = TRADE_STATUS_YOU_STUNNED; SendTradeStatus(info); return; } if (isLogingOut()) { info.Status = TRADE_STATUS_YOU_LOGOUT; SendTradeStatus(info); return; } if (GetPlayer()->IsTaxiFlying()) { info.Status = TRADE_STATUS_TARGET_TO_FAR; SendTradeStatus(info); return; } Player* pOther = ObjectAccessor::FindPlayer(otherGuid); if (!pOther) { info.Status = TRADE_STATUS_NO_TARGET; SendTradeStatus(info); return; } if (pOther == GetPlayer() || pOther->m_trade) { info.Status = TRADE_STATUS_BUSY; SendTradeStatus(info); return; } if (!pOther->isAlive()) { info.Status = TRADE_STATUS_TARGET_DEAD; SendTradeStatus(info); return; } if (pOther->IsTaxiFlying()) { info.Status = TRADE_STATUS_TARGET_TO_FAR; SendTradeStatus(info); return; } if (pOther->hasUnitState(UNIT_STAT_STUNNED)) { info.Status = TRADE_STATUS_TARGET_STUNNED; SendTradeStatus(info); return; } if (pOther->GetSession()->isLogingOut()) { info.Status = TRADE_STATUS_TARGET_LOGOUT; SendTradeStatus(info); return; } if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetObjectGuid())) { info.Status = TRADE_STATUS_IGNORE_YOU; SendTradeStatus(info); return; } if (pOther->GetTeam() != _player->GetTeam()) { info.Status = TRADE_STATUS_WRONG_FACTION; SendTradeStatus(info); return; } if (!pOther->IsWithinDistInMap(_player, TRADE_DISTANCE, false)) { info.Status = TRADE_STATUS_TARGET_TO_FAR; SendTradeStatus(info); return; } // OK start trade _player->m_trade = new TradeData(_player, pOther); pOther->m_trade = new TradeData(pOther, _player); info.Status = TRADE_STATUS_BEGIN_TRADE; info.TraderGuid = _player->GetObjectGuid(); pOther->GetSession()->SendTradeStatus(info); }
void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) { WorldPacket data; uint64 guid; if( !GetPlayer()->isAlive() ) { data.Initialize(SMSG_TRADE_STATUS); data << (uint32)17; SendPacket(&data); return; } if( isLogingOut() ) { data.Initialize(SMSG_TRADE_STATUS); data << (uint32)19; SendPacket(&data); return; } recvPacket >> guid; Player* pOther = objmgr.GetObject<Player>(guid); if(!pOther) { data.Initialize(SMSG_TRADE_STATUS); data << (uint32)6; SendPacket(&data); return; } if( pOther->pTrader ) { data.Initialize(SMSG_TRADE_STATUS); data << (uint32)0; SendPacket(&data); return; } if( !pOther->isAlive() ) { data.Initialize(SMSG_TRADE_STATUS); data << (uint32)18; SendPacket(&data); return; } if( pOther->GetSession()->isLogingOut() ) { data.Initialize(SMSG_TRADE_STATUS); data << (uint32)20; SendPacket(&data); return; } GetPlayer()->pTrader = pOther; pOther->pTrader = GetPlayer(); data.Initialize(SMSG_TRADE_STATUS); data << (uint32) 1; data << (uint64) GetPlayer()->GetGUID(); GetPlayer()->pTrader->GetSession()->SendPacket(&data); }