Index: 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<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-GMs Index: 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 > { friend class MaNGOS::OperatorNew; - 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;