Files
2022-10-26 12:25:11 +08:00

686 lines
22 KiB
C++

#include "StdAfx.h"
#include ".\gamelog.h"
#using <mscorlib.dll>
CGameLog::CGameLog(void)
{
m_bWriteText = TRUE;
}
CGameLog::~CGameLog(void)
{
}
BOOL CGameLog::Init( TCHAR* pszDirName, TCHAR* pszFilenamePrefix, TCHAR* pszTextDirName )
{
BOOL bRet = m_LogMng.Init( pszDirName, pszFilenamePrefix, pszTextDirName );
return bRet;
}
void CGameLog::WriteBaseData( BaseData* pData, TCHAR* szAccountID, TCHAR* szCharName )
{
if( szAccountID == NULL ) _tcscpy( pData->szAccountID, "" );
else _tcscpy( pData->szAccountID, szAccountID );
if( szCharName == NULL ) _tcscpy( pData->szCharName, "" );
else _tcscpy( pData->szCharName, szCharName );
}
//////////////////////////////////////////////////////////////////////////
// 경험치 로그
// 1. 레벨업 로그
void CGameLog::WriteLevelUp( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, DWORD dwOldExp, DWORD dwNewExp,
WORD wOldLevel, WORD wNewLevel )
{
ExpData data;
data.iExpCode = EXP_LEVELUP;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
data.iOldExp = dwOldExp;
data.iNewExp = dwNewExp;
data.iOldLevel = wOldLevel;
data.iNewLevel = wNewLevel;
m_LogMng.WriteExp( data, m_bWriteText, NULL );
}
// 2. 경험치 10등분 로그
void CGameLog::WriteDivideExp( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, DWORD dwOldExp, DWORD dwNewExp,
WORD wOldLevel, WORD wNewLevel, WORD wDivideCount )
{
ExpData data;
data.iExpCode = EXP_DIVIDECNT;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
data.iDivideCount = wDivideCount;
data.iOldExp = dwOldExp;
data.iNewExp = dwNewExp;
data.iOldLevel = wOldLevel;
data.iNewLevel = wNewLevel;
m_LogMng.WriteExp( data, m_bWriteText, NULL );
}
// 3. 경험치 추가/다운
void CGameLog::WriteDownExp( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, DWORD dwTotalExp, DWORD dwChangeExp,
WORD wLevel )
{
// 현재의 인터페이스로는 불가능..
// 현 플레이어의 전체 경험치와 다운된 경험치를 요구하는데, 현재 인자로는 불가능.
// AddInfo에 삽입할 경우, 다운된 경험치를 넣을것인가?
ExpData data;
data.iExpCode = EXP_DOWN;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
data.iNewExp = dwTotalExp;
data.iNewLevel = wLevel;
m_LogMng.WriteExp( data, m_bWriteText, "Change Exp = %d", dwChangeExp );
}
//////////////////////////////////////////////////////////////////////////
// 아이템 로그
// 1. 아이템 드롭 로그(버림과 죽어서 떨구는것과 몬스터 죽여서 떨구는 것의 차이?)
// 1. 아이템 드롭(땅에 떨굼) 과 줍기
void CGameLog::WriteItemOwner( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, BOOL bOwner, int nItemCode, int nItemSerial
,int nItemCount, int nMapCode, int nPosX, int nPosY, int nPosZ)
{
ItemData data;
if( bOwner == TRUE ) data.iItemCode = ITEM_PICKUP; // 줍기
else data.iItemCode = ITEM_CAST; // 버리기
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
data.iItemBaseCode = nItemCode;
data.iItemSeq = nItemSerial;
data.iItemCount = nItemCount;
data.siMapCode = nMapCode;
data.siMapX = nPosX;
data.siMapY = nPosY;
data.siMapZ = nPosZ;
m_LogMng.WriteItem( data, m_bWriteText, "" );
}
// 2. 인첸트
void CGameLog::WriteEnchantResult( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, BOOL bSuccess, int nItemCode, int nItemSerial, vector<COMPOSITEMATERIAL> vecMatInfo )
{
ItemData data;
if( bSuccess == TRUE)
data.iItemCode = ITEM_ENCHANTSUCCESS;
else
data.iItemCode = ITEM_ENCHANTFAIL;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
data.iItemBaseCode = nItemCode;
data.iItemSeq = nItemSerial;
int nSize = (int)vecMatInfo.size();
string strInfo;
for(int i = 0; i < nSize; i++)
{
COMPOSITEMATERIAL info = vecMatInfo[i];
char szInfo[128];
wsprintf( szInfo, "MATCODE = %d, MATNUM = %d ", info.nMaterialCode, info.wCntMaterial );
strInfo += szInfo;
}
m_LogMng.WriteItem( data, m_bWriteText, strInfo.data() );
}
// 3. NPC와의 거래
void CGameLog::WriteItemTradeWithNPC( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, BOOL bSell, int nItemCode,
int nItemSerial, int nItemCount, DWORD dwMoney )
{
ItemData data;
if( bSell == TRUE ) data.iItemCode = ITEM_SELLNPC; // NPC에게 팔기
else data.iItemCode = ITEM_BUYNPC; // NPC에게 사기
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
data.iItemBaseCode = nItemCode;
data.iItemSeq = nItemSerial;
data.iItemCount = nItemCount;
m_LogMng.WriteItem( data, m_bWriteText, " Money = %d ", dwMoney );
}
void CGameLog::WriteItemTradeWithPlayer( TCHAR* szPlayer1_ID, TCHAR* szPlayer1_CharName, int nServerCode, BOOL bGive,
ITEMLOGINFO ItemInfo, TCHAR* szPlayer2_ID, TCHAR* szPlayer2_CharName)
{
ItemData data;
if( bGive == TRUE ) data.iItemCode = ITEM_GIVE; // 상대 플레이어에게 주기
else data.iItemCode = ITEM_RECEIVE; // 상대에게서 받기
data.iServerCode = nServerCode;
WriteBaseData( &data, szPlayer1_ID, szPlayer1_CharName );
data.iItemBaseCode = ItemInfo.nItemCode;
data.iItemSeq = ItemInfo.nItemSerial;
data.iItemCount = ItemInfo.nItemCount;
if( szPlayer2_ID == NULL ) _tcscpy( data.szToUserID, "" );
else _tcscpy( data.szToUserID, szPlayer2_ID );
if( szPlayer2_CharName == NULL ) _tcscpy(data.szToCharName, "");
else _tcscpy( data.szToCharName, szPlayer2_CharName );
m_LogMng.WriteItem( data, m_bWriteText, NULL );
}
// 5. 돈 개인거래
void CGameLog::WriteMoneyTradeWithPlayer( TCHAR* szPlayer1_ID, TCHAR* szPlayer1_CharName, int nServerCode, BOOL bGive, DWORD dwMoney,
TCHAR* szPlayer2_ID, TCHAR* szPlayer2_CharName)
{
ItemData data;
if( bGive == TRUE ) // 상대 플레이어에게 주기
{
data.iItemCode = ITEM_MONEY;
}
else // 상대에게서 받기
{
data.iItemCode = ITEM_MONEY;
}
data.iServerCode = nServerCode;
WriteBaseData( &data, szPlayer1_ID, szPlayer1_CharName );
if( szPlayer2_ID == NULL ) _tcscpy( data.szToUserID, "" );
else _tcscpy( data.szToUserID, szPlayer2_ID );
if( szPlayer2_CharName == NULL ) _tcscpy(data.szToCharName, "");
else _tcscpy( data.szToCharName, szPlayer2_CharName );
if( bGive == TRUE ) //Player1이 Player2에게 돈을 dwMoney만큼 주다.
m_LogMng.WriteItem( data, m_bWriteText, "Give Money = %d", dwMoney );
else //Player1이 Player2에게서 돈을 dwMoney만큼 받다.
m_LogMng.WriteItem( data, m_bWriteText, "Receive Money = %d", dwMoney );
}
// 6. 개인상점 거래
void CGameLog::WriteItemVendorWithPlayer( TCHAR* szPlayer1_ID, TCHAR* szPlayer1_CharName, int nServerCode, BOOL bSell, ITEMLOGINFO ItemInfo,
DWORD dwMoney, TCHAR* szPlayer2_ID, TCHAR* szPlayer2_CharName)
{
ItemData data;
if( bSell == TRUE ) data.iItemCode = ITEM_SELLPC; // 개인삼정에서 물건 팔기
else data.iItemCode = ITEM_BUYPC; // 개인상점에서 물건 사기
data.iServerCode = nServerCode;
WriteBaseData( &data, szPlayer1_ID, szPlayer1_CharName );
data.iItemBaseCode = ItemInfo.nItemCode;
data.iItemSeq = ItemInfo.nItemSerial;
data.iItemCount = ItemInfo.nItemCount;
if( szPlayer2_ID == NULL ) _tcscpy( data.szToUserID, "" );
else _tcscpy( data.szToUserID, szPlayer2_ID );
if( szPlayer2_CharName == NULL ) _tcscpy(data.szToCharName, "");
else _tcscpy( data.szToCharName, szPlayer2_CharName );
if( bSell == TRUE )
m_LogMng.WriteItem( data, m_bWriteText, "RECEIVE MONEY = %d", dwMoney );
else
m_LogMng.WriteItem( data, m_bWriteText, "PAY MONEY = %d", dwMoney );
}
// 7. 아이템 랭크업
void CGameLog::WriteItemRankUpResult( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, ITEMLOGINFO ItemInfo,
DWORD dwMoney, BOOL bCreateSocket )
{
ItemData data;
data.iItemCode = ITEM_RANKUPSUCCESS; // 랭크업 성공
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
data.iItemBaseCode = ItemInfo.nItemCode;
data.iItemSeq = ItemInfo.nItemSerial;
data.iItemCount = ItemInfo.nItemCount;
if( bCreateSocket )
m_LogMng.WriteItem( data, m_bWriteText, "소켓 생성 됨" );
else
m_LogMng.WriteItem( data, m_bWriteText, "소켓 생성 안됨" );
}
// 8. 창고에 맞기기 / 찾기
// dwMoney : 창고 보관료
void CGameLog::WriteItemMoveInWareHouse( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, BOOL bKeep, ITEMLOGINFO ItemInfo )
{
ItemData data;
if( bKeep == TRUE ) data.iItemCode = ITEM_PUTSTORAGE; // 창고에 보관
else data.iItemCode = ITEM_GETSTORAGE; // 창고에서 꺼내기
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
data.iItemBaseCode = ItemInfo.nItemCode;
data.iItemSeq = ItemInfo.nItemSerial;
data.iItemCount = ItemInfo.nItemCount;
m_LogMng.WriteItem( data, m_bWriteText, NULL );
}
// 9. 인첸트 시도
void CGameLog::WriteEnchantStart( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, vector<COMPOSITEMATERIAL> vecMatInfo )
{
ItemData data;
data.iItemCode = ITEM_ENCHANTTRY;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
int nSize = (int)vecMatInfo.size();
string strInfo;
for(int i = 0; i < nSize; i++)
{
COMPOSITEMATERIAL info = vecMatInfo[i];
char szInfo[128];
wsprintf( szInfo, "MATCODE = %d, MATNUM = %d ", info.nMaterialCode, info.wCntMaterial );
strInfo += szInfo;
}
m_LogMng.WriteItem( data, m_bWriteText, strInfo.data() );
}
// 10. 몬스터 아이템 드랍
void CGameLog::WriteMonsterItemDrop( int nServerCode, ITEMLOGINFO ItemInfo, DWORD dwMonsterCode, DWORD dwMonsterLevel, int nMapCode,
int nPosX, int nPosY, int nPosZ )
{
ItemData data;
data.iItemCode = ITEM_MONSTER_ITEMDROP;
data.iServerCode = nServerCode;
data.iItemBaseCode = ItemInfo.nItemCode;
data.iItemSeq = ItemInfo.nItemSerial;
data.iItemCount = ItemInfo.nItemCount;
data.siMapCode = nMapCode;
data.siMapX = nPosX;
data.siMapY = nPosY;
data.siMapZ = nPosZ;
m_LogMng.WriteItem( data, m_bWriteText, "MONSTER CODE = %d, LEVEL = %d", dwMonsterCode, dwMonsterLevel );
}
// 11. 아이템 개인거래 요청 / 승인 / 요청거부
// nType (0 : 거래 요청, 1 : 승인, 2 : 거절)
void CGameLog::WriteItemTradeStatus( TCHAR* szPlayer1_ID, TCHAR* szPlayer1_CharName, int nServerCode, TCHAR* szPlayer2_ID,
TCHAR* szPlayer2_CharName, int nType )
{
ItemData data;
if( nType == 0 ) // 아이템 거래 요청
data.iItemCode = ITEM_REQUEST;
else if( nType == 1 ) // 승인
data.iItemCode = ITEM_ACCEPT;
else if( nType == 2 ) // 거절
data.iItemCode = ITEM_REJECT;
else
return;
data.iServerCode = nServerCode;
WriteBaseData( &data, szPlayer1_ID, szPlayer1_CharName );
if( szPlayer2_ID == NULL ) _tcscpy( data.szToUserID, "" );
else _tcscpy( data.szToUserID, szPlayer2_ID );
if( szPlayer2_CharName == NULL ) _tcscpy( data.szToCharName, "" );
else _tcscpy( data.szToCharName, szPlayer2_CharName );
m_LogMng.WriteItem( data, m_bWriteText, NULL );
}
// 12. 개인상점 개설/폐쇄
void CGameLog::WriteItemVendorStatus( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, BOOL bOpen, DWORD dwMoney,
int nMapCode, int nPosX, int nPosY, int nPosZ )
{
ItemData data;
if( bOpen == TRUE )
data.iItemCode = ITEM_NEWPC;
else
data.iItemCode = ITEM_DELPC;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
data.siMapCode = nMapCode;
data.siMapX = nPosX;
data.siMapY = nPosY;
data.siMapZ = nPosZ;
m_LogMng.WriteItem( data, m_bWriteText, "Money = %d", dwMoney );
}
// 13. 개인상점 보기
void CGameLog::WriteViewItemVendor( TCHAR* szPlayer1_ID, TCHAR* szPlayer1_CharName, int nServerCode, TCHAR* szPlayer2_ID,
TCHAR* szPlayer2_CharName )
{
ItemData data;
data.iItemCode = ITEM_WATCHPC;
data.iServerCode = nServerCode;
WriteBaseData( &data, szPlayer1_ID, szPlayer1_CharName );
if( szPlayer2_ID == NULL ) _tcscpy( data.szToUserID, "" );
else _tcscpy( data.szToUserID, szPlayer2_ID );
if( szPlayer2_CharName == NULL ) _tcscpy( data.szToCharName, "" );
else _tcscpy( data.szToCharName, szPlayer2_CharName );
m_LogMng.WriteItem( data, m_bWriteText, NULL );
}
// 14. 창고 정보
void CGameLog::WriteWareHouseInfo( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, vector<ITEMLOGINFO> vecItem,
DWORD dwMoney )
{
ItemData data;
data.iItemCode = ITEM_WATCHPC;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
string strInfo;
int nSize = (int)vecItem.size();
for(int i = 0; i < nSize ; i++)
{
ITEMLOGINFO item = vecItem[i];
TCHAR szInfo[128];
wsprintf( szInfo, "ITEM_CODE = %d, ITEM_SERIAL = %d, ITEM_COUNT = %d, ", item.nItemCode, item.nItemSerial,
item.nItemCount );
strInfo += szInfo;
}
TCHAR szMoney[128];
wsprintf( szMoney, "MONEY = %d ", dwMoney );
strInfo += szMoney;
m_LogMng.WriteItem( data, m_bWriteText, strInfo.data() );
}
// 15. 개인상점 정보(가격설정)
void CGameLog::WriteVendorInfo( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, vector<ITEMLOGINFO> vecItem )
{
ItemData data;
data.iItemCode = ITEM_SETPRICE_PC;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
string strInfo;
int nSize = (int)vecItem.size();
for(int i = 0; i < nSize ; i++)
{
ITEMLOGINFO item = vecItem[i];
TCHAR szInfo[128];
wsprintf( szInfo, "ITEM_CODE = %d, ITEM_SERIAL = %d, ITEM_COUNT = %d, ITEM_MONEY = %d", item.nItemCode, item.nItemSerial,
item.nItemCount, item.dwMoney );
strInfo += szInfo;
}
m_LogMng.WriteItem( data, m_bWriteText, strInfo.data() );
}
//////////////////////////////////////////////////////////////////////////
// 유저액션 로그
//1. 부활 로그
void CGameLog::WritePlayerResurrection( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, DWORD dwExp, int nMapCode, int nPosX,
int nPosY, int nPosZ )
{
ActionData data;
data.iActionCode = ACT_REBIRTH_CHAR;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
data.siMapCode = nMapCode;
data.siMapX = nPosX;
data.siMapY = nPosY;
data.siMapZ = nPosZ;
m_LogMng.WriteUserAction( data, m_bWriteText, NULL );
}
void CGameLog::WritePlayerDead( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, DWORD dwExp, int nMapCode, int nPosX,
int nPosY, int nPosZ )
{
ActionData data;
data.iActionCode = ACT_DEAD_CHAR;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
data.siMapCode = nMapCode;
data.siMapX = nPosX;
data.siMapY = nPosY;
data.siMapZ = nPosZ;
m_LogMng.WriteUserAction( data, m_bWriteText, NULL );
}
void CGameLog::WriteInvenInfoOnLogin( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode )
{
ActionData data;
data.iActionCode = ACT_INVENLOGIN;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
m_LogMng.WriteUserAction( data, m_bWriteText, NULL );
// 인벤정보를 어떻게 남길 것인가?
}
void CGameLog::WriteUseStat( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, byte byStatType )
{
ActionData data;
data.iActionCode = ACT_USE_STAT;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
m_LogMng.WriteUserAction( data, m_bWriteText, " STATCODE = %d", byStatType );
}
void CGameLog::WriteCharacter( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, BOOL bCreate )
{
ActionData data;
if( bCreate == TRUE )
data.iActionCode = ACT_CREATE_CHAR;
else
data.iActionCode = ACT_DELETE_CHAR;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
m_LogMng.WriteUserAction( data, m_bWriteText, NULL );
}
// 6. 마을로 이동
void CGameLog::WriteMoveVillage( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, int nMapCode )
{
ActionData data;
data.iActionCode = ACT_MOVE_TOWN;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
data.siMapCode = nMapCode;
m_LogMng.WriteUserAction( data, m_bWriteText, NULL );
}
// 7. 스킬레벨업
void CGameLog::WriteSkillLevelUp( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, int nSkillCode, BOOL bLevelUp )
{
ActionData data;
if( bLevelUp == FALSE ) //레벨업이 아니면, 처음 스킬을 배우는 거다.
data.iActionCode = ACT_ACQUIRE_SKILL;
else
data.iActionCode = ACT_SKILLLV_UP;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
m_LogMng.WriteUserAction( data, m_bWriteText, "SKILL CODE = %d", nSkillCode );
}
//////////////////////////////////////////////////////////////////////////
// 세션 로그
//1. 플레이어 로그인 ]
void CGameLog::WritePlayerLogin( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, TCHAR* szIP,
WORD wClass, WORD wLevel )
{
SessionData data;
data.iConnectCode = CONN_LOGIN;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
if( szIP == NULL ) _tcscpy( data.szClientIP, "" );
else _tcscpy( data.szClientIP, szIP );
m_Time.GetTime( 3, data.szLoginTime, 16 );
data.byClassCode = (BYTE)wClass;
data.siLevel = wLevel;
m_LogMng.WriteSession( data, m_bWriteText, NULL );
}
//2. 플레이어 로그인 실패
void CGameLog::WritePlayerLoginFail( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, TCHAR* szIP )
{
SessionData data;
data.iConnectCode = CONN_LOGIN_FAIL;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
if( szIP == NULL ) _tcscpy( data.szClientIP, "" );
else _tcscpy( data.szClientIP, szIP );
m_Time.GetTime( 3, data.szLoginTime, 16 );
m_LogMng.WriteSession( data, m_bWriteText, NULL );
}
// 3. 로그아웃
void CGameLog::WritePlayerLogOut( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, TCHAR* szIP, TCHAR* szLoginTime,
WORD wClass, WORD wLevel )
{
SessionData data;
data.iConnectCode = CONN_LOGOUT;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
if( szIP == NULL ) _tcscpy( data.szClientIP, "" );
else _tcscpy( data.szClientIP, szIP );
if( szLoginTime == NULL ) _tcscpy( data.szLoginTime, "" );
else _tcscpy( data.szLoginTime, szLoginTime );
m_Time.GetTime( 3, data.szLogoutTime, 16 );
//로그인 타임과 로그아웃 타임을 계산하고, 사용시간을 남긴다.
//다음 함수는 타입 3, 4를 모두 사용할수 있다.
if( data.szLogoutTime != NULL )
{
int nUsedTime = WZTime::GetDiffTimeType4( data.szLoginTime, data.szLogoutTime );
data.iUseTime = nUsedTime;
}
data.byClassCode = (BYTE)wClass;
data.siLevel = wLevel;
m_LogMng.WriteSession( data, m_bWriteText, NULL );
}
// 4. 캐릭터 접속 / 종료
void CGameLog::WriteCharConnect( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, BOOL bConnect )
{
SessionData data;
if( bConnect == TRUE ) //접속
data.iConnectCode = CONN_CHAR_CONNECT;
else
data.iConnectCode = CONN_CHAR_DISCONNECT;
data.iServerCode = nServerCode;
WriteBaseData( &data, szAccountID, szCharName );
m_LogMng.WriteSession( data, m_bWriteText, NULL );
}
//////////////////////////////////////////////////////////////////////////
// 채팅 로그
// 1. 마을 채팅
void CGameLog::WriteVillageChat( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, short sMapCode, TCHAR* szChatMsg )
{
ChatData data;
data.iChannel = nServerCode; // 채널명
data.byChatCode = CHAT_EYERANGE; // 시야 범위 채팅이다
data.siMapCode = sMapCode;
memcpy( data.szContext, szChatMsg, sizeof(TCHAR) * 100 );
WriteBaseData( &data, szAccountID, szCharName );
m_LogMng.WriteChat( data, m_bWriteText, NULL );
}
// 2. 외치기
void CGameLog::WriteShoutChat( TCHAR* szAccountID, TCHAR* szCharName, int nServerCode, short sMapCode, TCHAR* szChatMsg )
{
ChatData data;
data.iChannel = nServerCode;
data.byChatCode = CHAT_SHOUT;
data.siMapCode = sMapCode;
memcpy( data.szContext, szChatMsg, sizeof(TCHAR) * 100 );
WriteBaseData( &data, szAccountID, szCharName );
m_LogMng.WriteChat( data, m_bWriteText, NULL );
}
// 3. 배틀존 채팅
void CGameLog::WriteBattleZoneChat( TCHAR* szAccountID, TCHAR* szCharName, int nRoomNo, int nServerCode, short sMapCode, TCHAR* szChatMsg )
{
ChatData data;
data.iChannel = nServerCode;
data.byChatCode = CHAT_SHOUT;
data.siMapCode = sMapCode;
memcpy( data.szContext, szChatMsg, sizeof(TCHAR) * 100 );
data.iRoomNo = nRoomNo;
WriteBaseData( &data, szAccountID, szCharName );
m_LogMng.WriteChat( data, m_bWriteText, NULL );
}
// 4. 길드 채팅
void CGameLog::WriteGuildChat( TCHAR* szAccountID, TCHAR* szCharName, TCHAR* szGuildName, int nServerCode, short sMapCode, TCHAR* szChatMsg )
{
ChatData data;
data.iChannel = nServerCode;
data.byChatCode = CHAT_SHOUT;
memcpy( data.szContext, szChatMsg, sizeof(TCHAR) * 100 );
memcpy( data.szListenCharName, szGuildName, sizeof(TCHAR) * MAX_CHAR_NAME_STR_SIZE );
WriteBaseData( &data, szAccountID, szCharName );
m_LogMng.WriteChat( data, m_bWriteText, NULL );
}
// 5. 귓속말
void CGameLog::WriteWhisperChat( TCHAR* szAccountID, TCHAR* szCharName, TCHAR* szRecvCharName, int nServerCode, TCHAR* szChatMsg )
{
ChatData data;
data.iChannel = nServerCode;
data.byChatCode = CHAT_SHOUT;
memcpy( data.szContext, szChatMsg, sizeof(TCHAR) * 100 );
memcpy( data.szListenCharName, szRecvCharName, sizeof(TCHAR) * MAX_CHAR_NAME_STR_SIZE );
WriteBaseData( &data, szAccountID, szCharName );
m_LogMng.WriteChat( data, m_bWriteText, NULL );
}
// 6. 친구 채팅
void CGameLog::WriteFriendChat( TCHAR* szAccountID, TCHAR* szCharName, TCHAR* szRecvCharName, int nServerCode, TCHAR* szChatMsg )
{
ChatData data;
data.iChannel = nServerCode;
data.byChatCode = CHAT_SHOUT;
memcpy( data.szContext, szChatMsg, sizeof(TCHAR) * 100 );
memcpy( data.szListenCharName, szRecvCharName, sizeof(TCHAR) * MAX_CHAR_NAME_STR_SIZE );
WriteBaseData( &data, szAccountID, szCharName );
m_LogMng.WriteChat( data, m_bWriteText, NULL );
}
// 정기적으로 게임 로그를 남긴다.
// 여기서 실행되지 않으면, 로그데이터를 이 클래스로 넘겨도, 기록되지 않는다.
void CGameLog::StartRegularLog( int nLogType )
{
if( nLogType == REGULAR_SKILL ) //스킬로그를 시작시킨다면..
{
// 여기서 쓰레드를 실행시키고,
// 쓰레드 내에서 Timer를 실행시킨다.
unsigned int nThreadID = 1;
HANDLE hSkillThread = (HANDLE)_beginthreadex( NULL, 0, SkillWorkThread, NULL, 0, &nThreadID );
}
}
//Thread Argument
unsigned int __stdcall SkillWorkThread(void* pArg)
{
CGameLog* pLog = (CGameLog*)pArg;
while(TRUE)
{
}
}