Index: src/game/Creature.cpp =================================================================== --- src/game/Creature.cpp (revision 5691) +++ src/game/Creature.cpp (working copy) @@ -573,7 +573,7 @@ cantalking=false; break; case GOSSIP_OPTION_TAXIVENDOR: - if ( pPlayer->GetSession()->SendLearnNewTaxiNode(GetGUID()) ) + if ( pPlayer->GetSession()->SendLearnNewTaxiNode(this) ) return; break; case GOSSIP_OPTION_BATTLEFIELD: @@ -688,7 +688,7 @@ player->SendPetSkillWipeConfirm(); break; case GOSSIP_OPTION_TAXIVENDOR: - player->GetSession()->SendTaxiMenu(guid); + player->GetSession()->SendTaxiMenu(this); break; case GOSSIP_OPTION_INNKEEPER: player->PlayerTalkClass->CloseGossip(); Index: src/game/Player.cpp =================================================================== --- src/game/Player.cpp (revision 5691) +++ src/game/Player.cpp (working copy) @@ -5033,7 +5033,12 @@ if(!factionTemplateEntry) return; - FactionEntry const *factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction); + SetFactionVisibleForFactionId(factionTemplateEntry->faction); +} + +void Player::SetFactionVisibleForFactionId(uint32 FactionId) +{ + FactionEntry const *factionEntry = sFactionStore.LookupEntry(FactionId); if(!factionEntry) return; @@ -11319,6 +11324,9 @@ GiveQuestSourceItem( pQuest ); AdjustQuestReqItemCount( pQuest ); + if( pQuest->GetRepObjectiveFaction() ) + SetFactionVisibleForFactionId(pQuest->GetRepObjectiveFaction()); + uint32 qtime = 0; if( pQuest->HasFlag( QUEST_MANGOS_FLAGS_TIMED ) ) { Index: src/game/Player.h =================================================================== --- src/game/Player.h (revision 5691) +++ src/game/Player.h (working copy) @@ -915,12 +915,23 @@ void InitTaxiNodesForLevel(); uint32 GetTaximask( uint8 index ) const { return m_taximask[index]; } void SetTaximask( uint8 index, uint32 value ) { m_taximask[index] = value; } - void SetTaximaskNode(uint32 nodeidx) + bool IsTaximaskNodeKnown(uint32 nodeidx) const { uint8 field = uint8((nodeidx - 1) / 32); uint32 submask = 1<<((nodeidx-1)%32); + return (m_taximask[field] & submask) == submask; + } + bool SetTaximaskNode(uint32 nodeidx) + { + uint8 field = uint8((nodeidx - 1) / 32); + uint32 submask = 1<<((nodeidx-1)%32); if ((m_taximask[field] & submask) != submask ) + { m_taximask[field] = (submask | m_taximask[field]); + return true; + } + else + return false; } void ClearTaxiDestinations() { m_TaxiDestinations.clear(); } void AddTaxiDestination(uint32 dest) { m_TaxiDestinations.push_back(dest); } @@ -1650,6 +1661,7 @@ void SetFactionInactive(uint32 repListID, bool inactive); void SetFactionVisible(uint32 repListID); void SetFactionVisibleForFactionTemplateId(uint32 FactionTemplateId); + void SetFactionVisibleForFactionId(uint32 FactionId); void UpdateMaxSkills(); void UpdateSkillsToMaxSkillsForLevel(); // for .levelup void ModifySkillBonus(uint32 skillid,int32 val, bool talent); Index: src/game/TaxiHandler.cpp =================================================================== --- src/game/TaxiHandler.cpp (revision 5691) +++ src/game/TaxiHandler.cpp (working copy) @@ -46,15 +46,15 @@ void WorldSession::SendTaxiStatus( uint64 guid ) { - uint32 curloc; - uint8 field; - uint32 submask; + // cheating checks + Creature *unit = ObjectAccessor::GetCreature(*_player, guid); + if (!unit) + { + sLog.outDebug( "WorldSession::SendTaxiStatus - Unit (GUID: %u) not found.", uint32(GUID_LOPART(guid)) ); + return; + } - curloc = objmgr.GetNearestTaxiNode( - GetPlayer( )->GetPositionX( ), - GetPlayer( )->GetPositionY( ), - GetPlayer( )->GetPositionZ( ), - GetPlayer( )->GetMapId( ) ); + uint32 curloc = objmgr.GetNearestTaxiNode(unit->GetPositionX(),unit->GetPositionY(),unit->GetPositionZ(),unit->GetMapId()); // not found nearest if(curloc == 0) @@ -62,17 +62,9 @@ sLog.outDebug( "WORLD: current location %u ",curloc); - field = (uint8)((curloc - 1) / 32); - submask = 1<<((curloc-1)%32); - WorldPacket data( SMSG_TAXINODE_STATUS, 9 ); data << guid; - - if ( (GetPlayer( )->GetTaximask(field) & submask) != submask ) - data << uint8( 0 ); - else - data << uint8( 1 ); - + data << uint8( GetPlayer( )->IsTaximaskNodeKnown(curloc) ? 1 : 0 ); SendPacket( &data ); sLog.outDebug( "WORLD: Sent SMSG_TAXINODE_STATUS" ); } @@ -99,21 +91,17 @@ GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); // unknown taxi node case - if( SendLearnNewTaxiNode(guid) ) + if( SendLearnNewTaxiNode(unit) ) return; // known taxi node case - SendTaxiMenu( guid ); + SendTaxiMenu( unit ); } -void WorldSession::SendTaxiMenu( uint64 guid ) +void WorldSession::SendTaxiMenu( Creature* unit ) { // find current node - uint32 curloc = objmgr.GetNearestTaxiNode( - GetPlayer( )->GetPositionX( ), - GetPlayer( )->GetPositionY( ), - GetPlayer( )->GetPositionZ( ), - GetPlayer( )->GetMapId( ) ); + uint32 curloc = objmgr.GetNearestTaxiNode(unit->GetPositionX(),unit->GetPositionY(),unit->GetPositionZ(),unit->GetMapId()); if ( curloc == 0 ) return; @@ -121,7 +109,8 @@ sLog.outDebug( "WORLD: CMSG_TAXINODE_STATUS_QUERY %u ",curloc); WorldPacket data( SMSG_SHOWTAXINODES, (4+8+4+8*4) ); - data << uint32( 1 ) << guid; + data << uint32( 1 ); + data << uint64( unit->GetGUID() ); data << uint32( curloc ); if(GetPlayer()->isTaxiCheater()) @@ -158,36 +147,28 @@ SendPath(flight->GetPath(),flight->GetCurrentNode(),flight->GetPathAtMapEnd()); } -bool WorldSession::SendLearnNewTaxiNode( uint64 guid ) +bool WorldSession::SendLearnNewTaxiNode( Creature* unit ) { // find current node - uint32 curloc = objmgr.GetNearestTaxiNode( - GetPlayer( )->GetPositionX( ), - GetPlayer( )->GetPositionY( ), - GetPlayer( )->GetPositionZ( ), - GetPlayer( )->GetMapId( ) ); + uint32 curloc = objmgr.GetNearestTaxiNode(unit->GetPositionX(),unit->GetPositionY(),unit->GetPositionZ(),unit->GetMapId()); if ( curloc == 0 ) return true; // `true` send to avoid WorldSession::SendTaxiMenu call with one more curlock seartch with same false result. - uint8 field = (uint8)((curloc - 1) / 32); - uint32 submask = 1<<((curloc-1)%32); - - if ( (GetPlayer( )->GetTaximask(field) & submask) != submask ) + if( GetPlayer()->SetTaximaskNode(curloc) ) { - GetPlayer()->SetTaximask(field, (submask | GetPlayer( )->GetTaximask(field)) ); - WorldPacket msg(SMSG_NEW_TAXI_PATH, 0); - _player->GetSession()->SendPacket( &msg ); + SendPacket( &msg ); WorldPacket update( SMSG_TAXINODE_STATUS, 9 ); - update << guid; + update << uint64( unit->GetGUID() ); update << uint8( 1 ); SendPacket( &update ); return true; - } else - return false; + } + else + return false; } void WorldSession::HandleActivateTaxiFarOpcode ( WorldPacket & recv_data ) @@ -260,12 +241,8 @@ // Add to taximask middle hubs in taxicheat mode (to prevent having player with disabled taxicheat and not having back flight path) if (GetPlayer()->isTaxiCheater()) { - uint8 field = (uint8)((sourcenode - 1) / 32); - uint32 submask = 1<<((sourcenode-1)%32); - if((GetPlayer( )->GetTaximask(field) & submask) != submask ) + if(GetPlayer()->SetTaximaskNode(sourcenode)) { - GetPlayer()->SetTaximask(field, (submask | GetPlayer( )->GetTaximask(field)) ); - WorldPacket data(SMSG_NEW_TAXI_PATH, 0); _player->GetSession()->SendPacket( &data ); } Index: src/game/WorldSession.h =================================================================== --- src/game/WorldSession.h (revision 5691) +++ src/game/WorldSession.h (working copy) @@ -163,9 +163,9 @@ //Taxi void SendTaxiStatus( uint64 guid ); - void SendTaxiMenu( uint64 guid ); + void SendTaxiMenu( Creature* unit ); void SendDoFlight( uint16 MountId, uint32 path, uint32 pathNode = 0 ); - bool SendLearnNewTaxiNode( uint64 guid ); + bool SendLearnNewTaxiNode( Creature* unit ); // Guild/Arena Team void SendGuildCommandResult(uint32 typecmd,std::string str,uint32 cmdresult);