rendered paste bodyIndex: src/game/AuctionHouse.cpp===================================================================--- src/game/AuctionHouse.cpp (revision 4531)+++ src/game/AuctionHouse.cpp (working copy)@@ -245,7 +245,7 @@ return; } - if( GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )+ if( GetSecurity() > SEC_MODERATOR && sWorld.getConfig(CONFIG_GM_LOG_TRADE) ) { sLog.outCommand("GM %s (Account: %u) create auction: %s (Entry: %u Count: %u)", GetPlayerName(),GetAccountId(),it->GetProto()->Name1,it->GetEntry(),it->GetCount());Index: src/game/CharacterHandler.cpp===================================================================--- src/game/CharacterHandler.cpp (revision 4531)+++ src/game/CharacterHandler.cpp (working copy)@@ -186,7 +186,7 @@ } // check name limitations- if(GetSecurity() == SEC_PLAYER && objmgr.IsReservedName(name))+ if(GetSecurity() <= SEC_MODERATOR && objmgr.IsReservedName(name)) { data << (uint8)CHAR_NAME_RESERVED; SendPacket( &data );@@ -268,7 +268,7 @@ data << (uint8)CHAR_CREATE_SUCCESS; SendPacket( &data ); - sLog.outBasic("Account: %d Create New Character:[%s]",GetAccountId(),name.c_str());+ sLog.outChar("Account: %d Create New Character:[%s]",GetAccountId(),name.c_str()); } void WorldSession::HandleCharDeleteOpcode( WorldPacket & recv_data )@@ -298,7 +298,7 @@ if(accountId != GetAccountId()) return; - sLog.outBasic("Account: %d Delete Character:[%s] (guid:%u)",GetAccountId(),name.c_str(),GUID_LOPART(guid));+ sLog.outChar("Account: %d Delete Character:[%s] (guid:%u)",GetAccountId(),name.c_str(),GUID_LOPART(guid)); Player::DeleteFromDB(guid, GetAccountId()); WorldPacket data(SMSG_CHAR_DELETE, 1);@@ -743,7 +743,7 @@ } // check name limitations- if(GetSecurity() == SEC_PLAYER && objmgr.IsReservedName(newname))+ if(GetSecurity() <= SEC_MODERATOR && objmgr.IsReservedName(newname)) { WorldPacket data(SMSG_CHAR_RENAME, 1); data << (uint8)CHAR_NAME_RESERVED;@@ -775,4 +775,5 @@ data << guid; data << newname; SendPacket(&data);+ sLog.outChar("Player %s [Guid: %u] changed name to: %t", newname.c_str(), GUID_LOPART(guid), oldname.c_str()); }Index: src/game/ChatHandler.cpp===================================================================--- src/game/ChatHandler.cpp (revision 4531)+++ src/game/ChatHandler.cpp (working copy)@@ -122,14 +122,14 @@ Player *player = objmgr.GetPlayer(to.c_str()); uint32 tSecurity = GetSecurity(); uint32 pSecurity = player ? player->GetSession()->GetSecurity() : 0;- if(!player || tSecurity == SEC_PLAYER && pSecurity > SEC_PLAYER && !player->isAcceptWhispers())+ if(!player || tSecurity <= SEC_MODERATOR && pSecurity > SEC_MODERATOR && !player->isAcceptWhispers()) { WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, (to.size()+1)); data<<to; SendPacket(&data); return; }- if (!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT) && tSecurity == SEC_PLAYER && pSecurity == SEC_PLAYER )+ if (!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT) && tSecurity <= SEC_MODERATOR && pSecurity <= SEC_MODERATOR ) { uint32 sidea = GetPlayer()->GetTeam(); uint32 sideb = player->GetTeam();Index: src/game/Mail.cpp===================================================================--- src/game/Mail.cpp (revision 4531)+++ src/game/Mail.cpp (working copy)@@ -61,7 +61,7 @@ Player* pl = _player; - sLog.outDetail("Player %u is sending mail to %s with subject %s and body %s includes item %u, %u copper and %u COD copper with unk1 = %u, unk2 = %u",pl->GetGUIDLow(),receiver.c_str(),subject.c_str(),body.c_str(),GUID_LOPART(itemId),money,COD,unk1,unk2);+ sLog.outChar("Player %u is sending mail to %s with subject %s and body %s includes item %u, %u copper and %u COD copper with unk1 = %u, unk2 = %u",pl->GetGUIDLow(),receiver.c_str(),subject.c_str(),body.c_str(),GUID_LOPART(itemId),money,COD,unk1,unk2); uint64 rc = objmgr.GetPlayerGUIDByName(receiver); if(pl->GetGUID() == rc)@@ -154,7 +154,7 @@ // if item send to character at another account, then apply item delivery delay needItemDelay = pl->GetSession()->GetAccountId() != rc_account; - if( GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )+ if( GetSecurity() > SEC_MODERATOR && sWorld.getConfig(CONFIG_GM_LOG_TRADE) ) { sLog.outCommand("GM %s (Account: %u) mail item: %s (Entry: %u Count: %u) and money: %u to player: %s (Account: %u)", GetPlayerName(),GetAccountId(),pItem->GetProto()->Name1,pItem->GetEntry(),pItem->GetCount(),money,receiver.c_str(),rc_account);@@ -340,7 +340,7 @@ pl->ModifyMoney( -int32(m->COD) ); - if( GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )+ if( GetSecurity() > SEC_MODERATOR && sWorld.getConfig(CONFIG_GM_LOG_TRADE) ) { uint32 sender_accId = 0; std::string sender_name;Index: src/game/MiscHandler.cpp===================================================================--- src/game/MiscHandler.cpp (revision 4531)+++ src/game/MiscHandler.cpp (working copy)@@ -168,13 +168,13 @@ // PLAYER see his team only and PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters // MODERATOR, GAME MASTER, ADMINISTRATOR can see all if( pname &&- ( security > SEC_PLAYER || itr->second->GetTeam() == team || allowTwoSideWhoList ) &&+ ( security > SEC_MODERATOR || itr->second->GetTeam() == team || allowTwoSideWhoList ) && (classmask & (1 << class_) ) && (racemask & (1 << race) ) && (lvl >= level_min && lvl <= level_max) && (guild_name.length()?strstr(gname.c_str(), guild_name.c_str())!=0 : true) && (player_name.length()?strstr(pname, player_name.c_str())!=0 : true) && z_show && s_show &&- (itr->second->GetSession()->GetSecurity() == SEC_PLAYER || gmInWhoList && itr->second->IsVisibleGloballyFor(_player) ) &&+ (itr->second->GetSession()->GetSecurity() <= SEC_MODERATOR || gmInWhoList && itr->second->IsVisibleGloballyFor(_player) ) && clientcount < 49) { clientcount++;@@ -204,7 +204,7 @@ sLog.outDebug( "WORLD: Recvd CMSG_LOGOUT_REQUEST Message, security - %u", security ); //instant logout for admins, gm's, mod's- if (security > SEC_PLAYER)+ if (security > SEC_MODERATOR) { LogoutPlayer(true); return;Index: src/game/ObjectMgr.cpp===================================================================--- src/game/ObjectMgr.cpp (revision 4531)+++ src/game/ObjectMgr.cpp (working copy)@@ -271,14 +271,14 @@ gm_accid = GetPlayerAccountIdByGUID(bidder_guid); gm_security = GetSecurityByAccount(gm_accid); - if(gm_security > SEC_PLAYER ) // not do redundant DB requests+ if(gm_security > SEC_MODERATOR ) // not do redundant DB requests { if(!GetPlayerNameByGUID(bidder_guid,gm_name)) gm_name = LANG_UNKNOWN; } } - if( gm_security > SEC_PLAYER )+ if( gm_security > SEC_MODERATOR ) { std::string owner_name; if(!GetPlayerNameByGUID(auction->owner,owner_name))Index: src/game/Player.cpp===================================================================--- src/game/Player.cpp (revision 4531)+++ src/game/Player.cpp (working copy)@@ -90,7 +90,7 @@ SetAcceptTicket(true); // players always and GM if set in config accept whispers by default- if(GetSession()->GetSecurity() == SEC_PLAYER || sWorld.getConfig(CONFIG_GM_WISPERING_TO))+ if(GetSession()->GetSecurity() <= SEC_MODERATOR || sWorld.getConfig(CONFIG_GM_WISPERING_TO)) SetAcceptWhispers(true); m_curTarget = 0;@@ -1248,9 +1248,9 @@ // PLAYER see his team only and PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters // MODERATOR, GAME MASTER, ADMINISTRATOR can see all if( pFriend && pFriend->GetName() &&- ( security > SEC_PLAYER ||+ ( security > SEC_MODERATOR || ( pFriend->GetTeam() == team || allowTwoSideWhoList ) &&- (pFriend->GetSession()->GetSecurity() == SEC_PLAYER || gmInWhoList && pFriend->IsVisibleGloballyFor(this) )))+ (pFriend->GetSession()->GetSecurity() <= SEC_MODERATOR || gmInWhoList && pFriend->IsVisibleGloballyFor(this) ))) { if(pFriend->isAFK()) friendInfo.Status = FRIEND_STATUS_AFK;@@ -3797,9 +3797,9 @@ // PLAYER see his team only and PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters // MODERATOR, GAME MASTER, ADMINISTRATOR can see all if( pFriend && pFriend->IsInWorld() &&- ( pFriend->GetSession()->GetSecurity() > SEC_PLAYER ||+ ( pFriend->GetSession()->GetSecurity() > SEC_MODERATOR || ( pFriend->GetTeam() == team || allowTwoSideWhoList ) &&- (security == SEC_PLAYER || gmInWhoList && IsVisibleGloballyFor(pFriend) )))+ (security <= SEC_MODERATOR || gmInWhoList && IsVisibleGloballyFor(pFriend) ))) { pFriend->GetSession()->SendPacket(packet); }@@ -12296,7 +12296,7 @@ outDebugValues(); // GM state- if(GetSession()->GetSecurity() > SEC_PLAYER)+ if(GetSession()->GetSecurity() > SEC_MODERATOR) { switch(sWorld.getConfig(CONFIG_GM_LOGIN_STATE)) {@@ -14958,7 +14958,7 @@ return true; // GMs are visible for higher gms (or players are visible for gms)- if (u->GetSession()->GetSecurity() > SEC_PLAYER)+ if (u->GetSession()->GetSecurity() > SEC_MODERATOR) return GetSession()->GetSecurity() <= u->GetSession()->GetSecurity(); // non faction visibility non-breakable for non-GMsIndex: src/game/SpellEffects.cpp===================================================================--- src/game/SpellEffects.cpp (revision 4531)+++ src/game/SpellEffects.cpp (working copy)@@ -2189,7 +2189,7 @@ if(!item_owner) return; - if(item_owner!=p_caster && p_caster->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )+ if(item_owner!=p_caster && p_caster->GetSession()->GetSecurity() > SEC_MODERATOR && sWorld.getConfig(CONFIG_GM_LOG_TRADE) ) sLog.outCommand("GM %s (Account: %u) enchanting(perm): %s (Entry: %d) for player: %s (Account: %u)", p_caster->GetName(),p_caster->GetSession()->GetAccountId(), itemTarget->GetProto()->Name1,itemTarget->GetEntry(),@@ -2295,7 +2295,7 @@ if(!item_owner) return; - if(item_owner!=p_caster && p_caster->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )+ if(item_owner!=p_caster && p_caster->GetSession()->GetSecurity() > SEC_MODERATOR && sWorld.getConfig(CONFIG_GM_LOG_TRADE) ) sLog.outCommand("GM %s (Account: %u) enchanting(temp): %s (Entry: %d) for player: %s (Account: %u)", p_caster->GetName(),p_caster->GetSession()->GetAccountId(), itemTarget->GetProto()->Name1,itemTarget->GetEntry(),Index: src/game/TradeHandler.cpp===================================================================--- src/game/TradeHandler.cpp (revision 4531)+++ src/game/TradeHandler.cpp (working copy)@@ -253,7 +253,7 @@ { // logging sLog.outDebug("partner storing: %u",myItems[i]->GetGUIDLow());- if( _player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )+ if( _player->GetSession()->GetSecurity() > SEC_MODERATOR && sWorld.getConfig(CONFIG_GM_LOG_TRADE) ) sLog.outCommand("GM %s (Account: %u) trade: %s (Entry: %d Count: %u) to player: %s (Account: %u)", _player->GetName(),_player->GetSession()->GetAccountId(), myItems[i]->GetProto()->Name1,myItems[i]->GetEntry(),myItems[i]->GetCount(),@@ -277,7 +277,7 @@ { // logging sLog.outDebug("player storing: %u",hisItems[i]->GetGUIDLow());- if( _player->pTrader->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )+ if( _player->pTrader->GetSession()->GetSecurity() > SEC_MODERATOR && sWorld.getConfig(CONFIG_GM_LOG_TRADE) ) sLog.outCommand("GM %s (Account: %u) trade: %s (Entry: %d Count: %u) to player: %s (Account: %u)", _player->pTrader->GetName(),_player->pTrader->GetSession()->GetAccountId(), hisItems[i]->GetProto()->Name1,hisItems[i]->GetEntry(),hisItems[i]->GetCount(),Index: src/game/WorldSocket.cpp===================================================================--- src/game/WorldSocket.cpp (revision 4531)+++ src/game/WorldSocket.cpp (working copy)@@ -431,7 +431,7 @@ recvPacket >> ping; ///- check ping speed for players- if(_session && _session->GetSecurity() == SEC_PLAYER)+ if(_session && _session->GetSecurity() <= SEC_MODERATOR) { uint32 cur_mstime = getMSTime(); uint32 diff_mstime = cur_mstime - m_LastPingMSTime;Index: src/shared/Log.cpp===================================================================--- src/shared/Log.cpp (revision 4531)+++ src/shared/Log.cpp (working copy)@@ -196,7 +196,6 @@ logfile = fopen((logsDir+logfn).c_str(), "w"); }- std::string gmlogname = sConfig.GetStringDefault("GMLogFile", ""); if(gmlogname!="") {@@ -213,6 +212,11 @@ { raLogfile = fopen((logsDir+ralogname).c_str(), "a"); }+ std::string charlogname = sConfig.GetStringDefault("CharLogFile", "");+ if(charlogname!="")+ {+ charLogfile = fopen((logsDir+charlogname).c_str(), "a");+ } m_logLevel = sConfig.GetIntDefault("LogLevel", 0); m_logFileLevel = sConfig.GetIntDefault("LogFileLevel", 0); InitColors(sConfig.GetStringDefault("LogColors", ""));@@ -318,6 +322,8 @@ fflush(stdout); } ++ void Log::outError( const char * err, ... ) { if( !err ) return;@@ -610,3 +616,19 @@ } fflush(stdout); }+void Log::outChar(const char * str, ... )+{++ if(!str) return;+ va_list ap;+ if(charLogfile)+ {+ outTimestamp(charLogfile);+ va_start(ap, str);+ vfprintf(charLogfile, str, ap);+ fprintf(charLogfile, "\n" );+ va_end(ap);+ fflush(charLogfile);+ }+ fflush(stdout);+}Index: src/shared/Log.h===================================================================--- src/shared/Log.h (revision 4531)+++ src/shared/Log.h (working copy)@@ -56,7 +56,7 @@ class Log : public MaNGOS::Singleton<Log, MaNGOS::ClassLevelLockable<Log, ZThread::FastMutex> > { friend class MaNGOS::OperatorNew<Log>;- Log() : raLogfile(NULL), logfile(NULL), gmLogfile(NULL), dberLogfile(NULL), m_colored(false) { Initialize(); }+ Log() : raLogfile(NULL), logfile(NULL), gmLogfile(NULL), dberLogfile(NULL), charLogfile(NULL), m_colored(false) { Initialize(); } ~Log() { if( logfile != NULL )@@ -74,6 +74,9 @@ if (raLogfile != NULL) fclose(raLogfile); raLogfile = NULL;++ if (charLogfile != NULL)+ fclose(charLogfile); } public: void Initialize();@@ -86,6 +89,8 @@ // any log level void outError( const char * err, ... ) ATTR_PRINTF(2,3); // log level >= 1+ void outChar( const char * str, ... ) ATTR_PRINTF(2,3);+ // any log level void outBasic( const char * str, ... ) ATTR_PRINTF(2,3); // log level >= 2 void outDetail( const char * str, ... ) ATTR_PRINTF(2,3);@@ -112,6 +117,7 @@ FILE* logfile; FILE* gmLogfile; FILE* dberLogfile;+ FILE* charLogfile; uint32 m_logLevel; uint32 m_logFileLevel;