Files
Sun1602/Server/GameServer/GameLog.cpp
T
2022-10-26 12:25:11 +08:00

4162 lines
130 KiB
C++

#include "StdAfx.h"
#include ".\gamelog.h"
#include <boost/static_assert.hpp>
#include "ItemManager.h"
#include "SkillManager.h"
#include "MissionManager.h"
#include "SCItemSlotContainer.h"
#include "SCSkillSlotContainer.h"
#include "SkillInfoParser.h"
#include "WarehouseSlotContainer.h"
#include "Map.h"
#include <CommonCharacterFormula.h>
#include <ServerStruct.h>
#include <SCItemSlot.h>
#include "GameServerEx.h"
#include "GameZone.h"
#include "RewardManager.h"
#include "SkillManager.h"
#include "Player.h"
#include <QuestDefine.h>
#include "QuestManager_Concrete.h"
#include <AreaConquestCommonHeader.h>
#include "ChaoState.h"
#include "SkillSlotManager.h"
#include "GameGuildManager.h"
#include "GameGuild.h"
#include "GameDominationManager.h"
#include "SystemMemo.h" //_NA_20100901_ADD_GAMELOG_FOR_SYSTEM_MEMO_TYPE
#ifdef _NA_008124_20150313_AWAKENING_SYSTEM
#include "AwakeningInfoParser.h"
#endif // _NA_008124_20150313_AWAKENING_SYSTEM
#ifdef _NA_008299_20150519_MAX_DAMAGE_LOG
#include "Skill_Info.h"
#endif // _NA_008299_20150519_MAX_DAMAGE_LOG
GameLog::GameLog()
{
}
//////////////////////////////////////////////////////////////////////////
// 경험치 로그
// 1. 레벨업 로그
void GameLog::WriteLevelUp( Player* pPlayer, WORD wOldLevel, WORD wNewLevel )
{
if( !IsRun() || !pPlayer ) return;
m_ExpData.Init();
m_ExpData.SetLogType( EXP_LEVELUP );
m_ExpData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ExpData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ExpData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
// m_ExpData.SetOldExp( dwOldExp );
// m_ExpData.SetNewExp( dwNewExp );
m_ExpData.SetOldLevel( wOldLevel );
m_ExpData.SetNewLevel( wNewLevel );
// SetRoomKey( m_ExpData, pPlayer );
// SetPlayerPosAddInfo( m_ExpData, pPlayer );
#ifdef _NA_007750_20141113_WZDAT_MODIFY_LOG
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, _T("Class:%u"),
(pPlayer->GetCharInfo() != NULL) ? pPlayer->GetCharInfo()->m_byClassCode : eCLASS_NONE);
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ExpData.AddAddInfo(m_pTmpBuffer);
#endif // _NA_007750_20141113_WZDAT_MODIFY_LOG
m_LogMng.Serialize( m_ExpData );
}
// NOTE: f110602.3L
void GameLog::WritePerkLevelUp(Player* player,
int perk_group, LEVELTYPE old_level, LEVELTYPE new_level)
{
if (player == NULL || IsRun() == false) {
return;
};
m_ExpData.Init();
m_ExpData.SetLogType(EXP_PERK_LEVEL);
m_ExpData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ExpData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ExpData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
m_ExpData.SetOldLevel(old_level);
m_ExpData.SetNewLevel(new_level);
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "Code:%u", perk_group);
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ExpData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize(m_ExpData);
}
// 2. 레벨 10 이상시 경험치 10등분 로그
void GameLog::LogExp( Player* pPlayer, WORD wCurLevel, EXPTYPE OldExp, EXPTYPE NewExp, MAPCODE Mapcode )
{
if( !IsRun() || !pPlayer ) return;
// 레벨이 10이상이 되야 로그를 남긴다.
if( wCurLevel < MAX_EXP_DIVIDE_LOG_AT_LEVEL )
return;
// 이전 레벨의 경험치 누적값
EXPTYPE CurAccumExp = pPlayer->GetAccumExp( wCurLevel ) ;
// 새로운 레벨의 경험치 누적값
EXPTYPE NextAccumExp = pPlayer->GetAccumExp( wCurLevel +1 );
BYTE byCurDivide = 0, byNextDivide = 0;
if( wCurLevel < MAX_EXP_FULL_LOG_AT_LEVEL
#ifdef _NA_000000_20131031_GAMELOG_REDUCE
|| (g_pGameServer->GetGuid() == FIELD_SERVER)
#endif //_NA_000000_20131031_GAMELOG_REDUCE
)
{
// 1/10등분의 경험치 값
EXPTYPE DifExp = (NextAccumExp - CurAccumExp) / 10;
ASSERT(DifExp > 0);
if( DifExp <= 0 ) return;
byCurDivide = (BYTE)( ( OldExp - CurAccumExp ) / DifExp );
byNextDivide = (BYTE)( ( NewExp - CurAccumExp ) / DifExp );
//현재 경험치에 의한 등분보다 업된 경험치에 의한 등분이 같다면
if( byCurDivide == byNextDivide ) return;
}
m_ExpData.Init();
m_ExpData.SetLogType( EXP_DIVIDECNT );
m_ExpData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ExpData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ExpData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
m_ExpData.SetDivideCount( byNextDivide );
m_ExpData.SetOldExp( NewExp - OldExp );
m_ExpData.SetNewExp( NewExp );
m_ExpData.SetOldLevel( wCurLevel );
// 레벨업이라면
if( NewExp >= NextAccumExp )
m_ExpData.SetNewLevel( wCurLevel + 1 );
else
m_ExpData.SetNewLevel( wCurLevel );
if( Mapcode )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "MCode:%u", Mapcode );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ExpData.AddAddInfo(m_pTmpBuffer); // CHANGES: f110602.3L, fixed the invalid data setting.
}
m_LogMng.Serialize( m_ExpData );
}
// 3. 경험치 다운
void GameLog::WriteDownExp( Player* pPlayer, EXPTYPE NewExp, EXPTYPE OldExp )
{
if( !IsRun() || !pPlayer ) return;
// 현재의 인터페이스로는 불가능..
// 현 플레이어의 전체 경험치와 다운된 경험치를 요구하는데, 현재 인자로는 불가능.
// AddInfo에 삽입할 경우, 다운된 경험치를 넣을것인가?
m_ExpData.Init();
m_ExpData.SetLogType( EXP_DOWN );
m_ExpData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ExpData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ExpData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
m_ExpData.SetNewExp( NewExp );
m_ExpData.SetOldExp( OldExp );
m_LogMng.Serialize( m_ExpData );
}
void GameLog::LogExp( int iLogType, Player* pPlayer, EXPTYPE NewExp, EXPTYPE OldExp )
{
if( !IsRun() || !pPlayer ) return;
// 현재의 인터페이스로는 불가능..
// 현 플레이어의 전체 경험치와 다운된 경험치를 요구하는데, 현재 인자로는 불가능.
// AddInfo에 삽입할 경우, 다운된 경험치를 넣을것인가?
m_ExpData.Init();
m_ExpData.SetLogType( iLogType );
m_ExpData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ExpData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ExpData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
m_ExpData.SetNewExp( NewExp );
m_ExpData.SetOldExp( OldExp );
m_LogMng.Serialize( m_ExpData );
}
// implemented by _NA_20100423_GROUPSYSTEM_MONEY_AND_EXP_GAMELOG
void GameLog::LogExp (int log_type, Player* player, EXPTYPE new_exp, EXPTYPE old_exp,
const TCHAR* char_name)
{
if (!IsRun() || !player) return;
m_ExpData.Init();
m_ExpData.SetLogType(log_type);
m_ExpData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ExpData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ExpData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
m_ExpData.SetNewExp(new_exp);
m_ExpData.SetOldExp(old_exp);
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "Low Member:%s", char_name);
m_pTmpBuffer[_countof(m_pTmpBuffer)-1]='\0';
m_ExpData.AddAddInfo(m_pTmpBuffer); // CHANGES: f110602.3L, fixed the invalid data setting.
m_LogMng.Serialize(m_ExpData);
}
void GameLog::LogExpPerk(Player* player, int perk_group, EXPTYPE new_exp, EXPTYPE old_exp)
{
if (player == NULL || IsRun() == false) {
return;
};
m_ExpData.Init();
m_ExpData.SetLogType(EXP_PERK);
m_ExpData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ExpData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ExpData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
m_ExpData.SetNewExp(new_exp);
m_ExpData.SetOldExp(old_exp);
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "Code:%u", perk_group);
m_pTmpBuffer[_countof(m_pTmpBuffer)-1]='\0';
m_ExpData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize(m_ExpData);
}
//
//class aaab
//{
//public:
// void CopyOut( ITEMSTREAMEX & aa ) const
// {
// aa.OptionPart.Block =1;
// }
//};
//void aaa(const aaab & rItemSlot)
//{
// ITEMSTREAMEX ItemStreamEx;
// rItemSlot.CopyOut(ItemStreamEx);
//}
void GameLog::LogMonsterMoneyDrop( int iLogType, DWORD64 dw64Money,
DWORD dwMonsterCode, DWORD dwMonsterLevel, WORD wMapCode, const WzVector& vecPos, KEYTYPE RoomKey )
{
// 로그양 줄이기 위해 몬스터 드랍 우선 로그 안남김
// 20060802 오후 5:30:13
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
return;
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#if SUN_CODE_BACKUP
if( !IsRun() ) return;
m_MoneyData.Init();
m_MoneyData.SetLogType( iLogType );
m_MoneyData.SetMapCode( wMapCode );
m_MoneyData.SetMapX( (SHORT)vecPos.x );
m_MoneyData.SetMapY( (SHORT)vecPos.y );
m_MoneyData.SetMapZ( (SHORT)vecPos.z );
m_MoneyData.SetMoney( dw64Money );
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "Room:%u,Mon:%u,MonLV:%u", RoomKey, dwMonsterCode, dwMonsterLevel );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "RmKy:%u,Mon:%u,MonLV:%u", RoomKey, dwMonsterCode, dwMonsterLevel );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_MoneyData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_MoneyData );
#endif
}
void GameLog::LogTotalMoney( DWORD64 dw64Money, DWORD64 dw64ToMoney, WORD PlayerNum, DWORD64 dw64PlayerTotalMoney )
{
if( !IsRun() ) return;
m_MoneyData.Init();
m_MoneyData.SetLogType( MONEY_TOTAL );
m_MoneyData.SetAccountID( NULL, ID_MAX_LEN );
m_MoneyData.SetCharName( NULL, MAX_CHARNAME_LENGTH );
m_MoneyData.SetUserIP( NULL, MAX_IPADDRESS_SIZE );
m_MoneyData.SetMoney( dw64Money );
m_MoneyData.SetToMoney( dw64ToMoney );
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "PlayerNum:%u,TotMoney:%I64u", PlayerNum, dw64PlayerTotalMoney );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "PlyNo:%u,TotMny:%I64u", PlayerNum, dw64PlayerTotalMoney );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_MoneyData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_MoneyData );
}
void GameLog::LogTotalWarehouseMoney( DWORD64 dw64Money, DWORD64 dw64ToMoney, WORD PlayerNum, DWORD64 dw64PlayerTotalMoney )
{
if( !IsRun() ) return;
m_MoneyData.Init();
m_MoneyData.SetLogType( MONEY_TOTALWAREHOUSE );
m_MoneyData.SetAccountID( NULL, ID_MAX_LEN );
m_MoneyData.SetCharName( NULL, MAX_CHARNAME_LENGTH );
m_MoneyData.SetUserIP( NULL, MAX_IPADDRESS_SIZE );
m_MoneyData.SetMoney( dw64Money );
m_MoneyData.SetToMoney( dw64ToMoney );
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "PlayerNum:%u,TotMoney:%I64u", PlayerNum, dw64PlayerTotalMoney );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "PlyNo:%u,TotMny:%I64u", PlayerNum, dw64PlayerTotalMoney );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_MoneyData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_MoneyData );
}
// implemented by _NA_20100901_ADD_GAMELOG_FOR_SYSTEM_MEMO_TYPE
void GameLog::LogMemoReward(eSYSTEM_MEMO_TYPE memo_type, Player* player, WORD reward_item_code,
ULONGLONG amount_item, const TCHAR* memo_contents)
{
if (!IsRun() || !player)
{
return;
}
//-- 보상은 아이템 or 돈
int log_type = (reward_item_code == 0) ? MONEY_MAX : ITEM_MAX;
switch(memo_type)
{
case SYSMEMO_LOTTO_WIN:
case SYSMEMO_LOTTO_WIN_NEW:
{
log_type = MONEY_LOTTO_REWARD;
}
break;
case SYSMEMO_DOMINATION_RETURN_MONEY:
case SYSMEMO_DOMINATION_RETURN_MONEY_NEW:
{
log_type =
(reward_item_code == 0) ?
MONEY_DOMINATION_ACTIONMONEY_RETURN :
ITEM_DOMINATION_AUCTION_RETURN_ITEM_BY_SYSTEM_MEMO;
}
break;
case SYSMEMO_DOMINATION_REWARD_MONEY:
case SYSMEMO_DOMINATION_REWARD_MONEY_NEW:
{
log_type =
(reward_item_code == 0) ?
MONEY_DOMINATION_ACTIONMONEY_REWARD :
ITEM_DOMINATION_AUCTION_REWARD_ITEM_BY_SYSTEM_MEMO;
}
break;
default:
{
log_type =
(reward_item_code == 0) ?
MONEY_DEFAULT_SYSTEM_MEMO_REWARD :
ITEM_DEFAULT_SYSTEM_MEMO_REWARD;
}
break;
}
if(reward_item_code == 0)
{
LogMemoRewardMoney(log_type, player, amount_item, memo_contents);
}
else
{
WORD item_num = static_cast<WORD>(amount_item);
LogMemoRewardItem(log_type, player, reward_item_code, item_num, memo_contents);
}
return;
}
void GameLog::LogMemoRewardMoney(int log_type, Player* player, ULONGLONG amount_Heim,
const TCHAR* memo_contents)
{
if (!IsRun() || !player)
{
return;
}
ASSERT(log_type >= MONEY_TOTAL || log_type < MONEY_MAX);
SystemMemo system_memo;
m_MoneyData.Init();
m_MoneyData.SetLogType(log_type);
m_MoneyData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_MoneyData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_MoneyData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
m_MoneyData.SetMoney(player->GetMoney());
m_MoneyData.SetToMoney(amount_Heim);
GameZone *zone = player->GetGameZonePtr();
if (zone)
{
WzVector vector_pos;
player->GetPos( &vector_pos );
m_MoneyData.SetMapCode( (WORD)zone->GetMapCode() );
m_MoneyData.SetMapX( (short)vector_pos.x );
m_MoneyData.SetMapY( (short)vector_pos.y );
m_MoneyData.SetMapZ( (short)vector_pos.z );
}
//-- 메모별 AddInfo 작성 : 메모별로 필요한 정보를 얻을때 시스템
//메모내에 지정된 포맷의 몇번째 정보인지 미리 알아야 한다.
if (log_type == MONEY_DOMINATION_ACTIONMONEY_RETURN ||
log_type == MONEY_DOMINATION_ACTIONMONEY_REWARD)
{
GameGuild* guild = g_GameGuildManager.FindGuild(player->GetGuildGuid());
if(guild != NULL)
{
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "Guild:%s, Map:%d, Money:%I64u",
guild->GetGuildName(),
system_memo.GetMemoDataToINT(memo_contents, 2),
amount_Heim);//메모 내용중 2번째가 맵코드
m_pTmpBuffer[_countof(m_pTmpBuffer) - 1] = '\0';
m_MoneyData.AddAddInfo(m_pTmpBuffer);
}
}
else if(log_type == MONEY_LOTTO_REWARD)
{
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "Name:%s, Money:%I64u",
player->GetCharName(), amount_Heim);
m_pTmpBuffer[_countof(m_pTmpBuffer) - 1] = '\0';
m_MoneyData.AddAddInfo(m_pTmpBuffer);
}
m_LogMng.Serialize(m_MoneyData);
}
void GameLog::LogMemoRewardItem(int log_type, Player* player, WORD reward_item_code,
WORD amount_item, const TCHAR* memo_contents)
{
if (!IsRun() || !player)
{
return;
}
ASSERT(log_type < ITEM_MAX);
SystemMemo system_memo;
m_ItemData.Init();
m_ItemData.SetLogType(log_type);
m_ItemData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ItemData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ItemData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
m_ItemData.SetItemCode(reward_item_code);//코드가 0이면 하임
m_ItemData.SetItemNum(amount_item);
GameZone *zone = player->GetGameZonePtr();
if (zone)
{
WzVector vector_pos;
player->GetPos(&vector_pos);
m_ItemData.SetMapCode((WORD)zone->GetMapCode());
m_ItemData.SetMapX((short)vector_pos.x);
m_ItemData.SetMapY((short)vector_pos.y);
m_ItemData.SetMapZ((short)vector_pos.z);
}
//-- 메모별 AddInfo 작성 : 메모별로 필요한 정보를 얻을때 시스템
//메모내에 지정된 포맷의 몇번째 정보인지 미리 알아야 한다.
if (log_type == ITEM_DOMINATION_AUCTION_RETURN_ITEM_BY_SYSTEM_MEMO ||
log_type == ITEM_DOMINATION_AUCTION_REWARD_ITEM_BY_SYSTEM_MEMO)
{
GameGuild* guild = g_GameGuildManager.FindGuild(player->GetGuildGuid());
if(guild != NULL)
{
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "Guild:%s, Map:%d, ItemNum:%d",
guild->GetGuildName(),
system_memo.GetMemoDataToINT(memo_contents, 2),
amount_item);//메모 내용중 2번째가 맵코드
m_pTmpBuffer[_countof(m_pTmpBuffer) - 1] = '\0';
m_ItemData.AddAddInfo(m_pTmpBuffer);
}
}
m_LogMng.Serialize(m_ItemData);
}
void GameLog::LogMoney( int iLogType, Player * pPlayer, DWORD64 dw64Money, DWORD64 dw64ToMoney,
const TCHAR * ptszToUserID, const TCHAR * ptszToCharName )
{
if( !IsRun() || !pPlayer ) return;
ASSERT( iLogType >= MONEY_TOTAL || iLogType < MONEY_MAX );
m_MoneyData.Init();
m_MoneyData.SetLogType( iLogType );
m_MoneyData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_MoneyData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_MoneyData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
m_MoneyData.SetToAccountID( ptszToUserID , ID_MAX_LEN );
m_MoneyData.SetToCharName( ptszToCharName, MAX_CHARNAME_LENGTH );
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_MoneyData.SetMapCode( (WORD)pZone->GetMapCode() );
m_MoneyData.SetMapX( (short)vecPos.x );
m_MoneyData.SetMapY( (short)vecPos.y );
m_MoneyData.SetMapZ( (short)vecPos.z );
}
if( iLogType == MONEY_TRADE )
{
//가진 돈
m_MoneyData.SetMoney( pPlayer->GetMoney() );
//줄 돈
m_MoneyData.SetToMoney( dw64Money );
//받을 돈은 AddInfo에
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",FromMny:%I64d", dw64ToMoney );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_MoneyData.AddAddInfo( m_pTmpBuffer );
}
else
{
// 플레이어의 현재 총 머니값
if( 0 == dw64ToMoney )
{
m_MoneyData.SetMoney( pPlayer->GetMoney() );
// 플레이어의 변화 머니값
m_MoneyData.SetToMoney( dw64Money );
}
else
{
m_MoneyData.SetMoney( dw64Money );
m_MoneyData.SetToMoney( dw64ToMoney );
}
}
GameZone * pGameZone = pPlayer->GetGameZonePtr();
if( pGameZone )
{
m_MoneyData.SetRoomKey( pGameZone->GetKey() );
}
if( iLogType == MONEY_WAREHOUSE_PUT || iLogType == MONEY_WAREHOUSE_GET )
{
if( pPlayer->GetWarehouseContainer() )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",WrHusMny:%I64u", pPlayer->GetWarehouseContainer()->GetCurMoney() );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_MoneyData.AddAddInfo( m_pTmpBuffer );
}
}
if( iLogType == MONEY_GUILD_WAREHOUSE_PUT || iLogType == MONEY_GUILD_WAREHOUSE_GET )
{
if(GameGuild* pGuild = g_GameGuildManager.FindGuild(pPlayer->GetGuildGuid()))
{
MONEY curMoney(0);
if(pPlayer->GetGuildWarehouseContainer())
{
curMoney = pPlayer->GetGuildWarehouseContainer()->GetCurMoney();
}
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "GuildName:%s, GuildGuid:%u, CurMoney:%I64u",
pGuild->GetGuildName(), pGuild->GetGuildGuid(), curMoney);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_MoneyData.AddAddInfo(m_pTmpBuffer);
}
}
//_KR_001385_20091211_DOMINATION_GAMELOG_MONEY
if( iLogType == MONEY_DOMINATION_ACTIONMONEY_RETURN ||
iLogType == MONEY_DOMINATION_ACTIONMONEY_REWARD ||
iLogType == MONEY_DOMINATION_ACTIONMONEY_APPLY)
{
if(GameGuild* pGuild = g_GameGuildManager.FindGuild(pPlayer->GetGuildGuid()))
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "%s", pGuild->GetGuildName() );
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_MoneyData.AddAddInfo(m_pTmpBuffer);
}
}
//_NA_20100423_GROUPSYSTEM_MONEY_AND_EXP_GAMELOG
if (iLogType == MONEY_GROUPSYSTEM_GETMONEY)
{
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "High Member : %s", ptszToCharName);
m_pTmpBuffer[_countof(m_pTmpBuffer)-1] = '\0';
m_MoneyData.AddAddInfo(m_pTmpBuffer);
}
m_LogMng.Serialize( m_MoneyData );
// 큰 하임일 경우 로그 중복 남김, 100만 하임이상일 경우 - 07.11.13 금액 1억 변경
if( dw64Money >= LOG_TRADE_OVER_MONEY || dw64ToMoney >= LOG_TRADE_OVER_MONEY )
{
m_MoneyData.SetLogType( MONEY_GREATE_MONEY );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",LogType:%u", iLogType );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_MoneyData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_MoneyData );
}
}
void GameLog::LogACItem( int iLogType, Player * pPlayer, const SCItemSlot * pItemSlot, float fPercentage )
{
if( !IsRun() || !pPlayer ) return;
ASSERT( iLogType >= ITEM_MONSTER_DROP || iLogType < ITEM_MAX );
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
// 아이템 정보
if( pItemSlot )
{
m_ItemData.SetItemCode( pItemSlot->GetItemCode() );
m_ItemData.SetItemSerial( pItemSlot->GetWorldSerial() );
m_ItemData.SetItemNum( (BYTE)pItemSlot->GetNum() );
ITEMSTREAMEX ItemStreamEx;
pItemSlot->CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
}
// addinfo에 방키
// SetRoomKey( m_ItemData, pPlayer );
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Percent:%f%%", fPercentage );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",P:%f%%", fPercentage );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogItemWarehouse( int iLogType, Player * pPlayer, const SCItemSlot * pItemSlot, DURATYPE byItemNum,
SLOTIDX f_idx, POSTYPE f_pos, SLOTIDX t_idx, POSTYPE t_pos )
{
if( !IsRun() || !pPlayer ) return;
ASSERT( iLogType >= ITEM_MONSTER_DROP || iLogType < ITEM_MAX );
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
// 아이템 정보
if( pItemSlot )
{
m_ItemData.SetItemCode( pItemSlot->GetItemCode() );
m_ItemData.SetItemSerial( pItemSlot->GetWorldSerial() );
m_ItemData.SetItemNum( (BYTE)byItemNum );
ITEMSTREAMEX ItemStreamEx;
pItemSlot->CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
}
// addinfo에 방키
// SetRoomKey( m_ItemData, pPlayer );
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",FSlotIdx:%u,FPos:%u,TSlotIdx:%u,TPos:%u,Tick:%u", f_idx, f_pos, t_idx, t_pos, GetTickCount() ); //< 아이템를 살때 가격.
// m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
// m_ItemData.AddAddInfo( m_pTmpBuffer );
if(iLogType == ITEM_GUILD_WAREHOUSE_GET || iLogType == ITEM_GUILD_WAREHOUSE_PUT)
{
if(GameGuild* pGuild = g_GameGuildManager.FindGuild(pPlayer->GetGuildGuid()))
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "GuildName:%s, GuildGuid:%u", pGuild->GetGuildName(), pGuild->GetGuildGuid());
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ItemData.AddAddInfo(m_pTmpBuffer);
}
}
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogItem_Pos( int iLogType, Player * pPlayer, const SCItemSlot * pItemSlot, MONEY ullMoney, DURATYPE byItemNum,
SLOTIDX f_idx, POSTYPE f_pos, SLOTIDX t_idx, POSTYPE t_pos )
{
if( !IsRun() || !pPlayer ) return;
ASSERT( iLogType >= ITEM_MONSTER_DROP || iLogType < ITEM_MAX );
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
m_ItemData.SetMoney( ullMoney );
// 아이템 정보
if( pItemSlot )
{
m_ItemData.SetItemCode( pItemSlot->GetItemCode() );
m_ItemData.SetItemSerial( pItemSlot->GetWorldSerial() );
m_ItemData.SetItemNum( (BYTE)byItemNum );
ITEMSTREAMEX ItemStreamEx;
pItemSlot->CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
}
// addinfo에 방키
// SetRoomKey( m_ItemData, pPlayer );
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",FSlotIdx:%u,FPos:%u,TSlotIdx:%u,TPos:%u,Tick:%u", f_idx, f_pos, t_idx, t_pos, GetTickCount() ); //< 아이템를 살때 가격.
// m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
// m_ItemData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogItem(int log_type, Player* player, uint use_count, const SCItemSlot* use_slot, const SCItemSlot* target_slot)
{
if (!IsRun() || !player)
{
return;
}
ASSERT(log_type == ITEM_USE);
if (log_type != ITEM_USE)
{
return;
}
m_ItemData.Init();
m_ItemData.SetLogType(log_type);
m_ItemData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ItemData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ItemData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
GameZone* zone = player->GetGameZonePtr();
if (zone)
{
WzVector vecPos;
player->GetPos(&vecPos);
m_ItemData.SetMapCode((WORD)zone->GetMapCode());
m_ItemData.SetMapX((short)vecPos.x);
m_ItemData.SetMapY((short)vecPos.y);
m_ItemData.SetMapZ((short)vecPos.z);
}
m_ItemData.SetMoney(0);
if (use_slot)
{
m_ItemData.SetItemCode(use_slot->GetItemCode());
m_ItemData.SetItemSerial(use_slot->GetWorldSerial());
m_ItemData.SetItemNum(use_count);
ITEMSTREAMEX ItemStreamEx;
use_slot->CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1((const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx));
}
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "Target Item, Code : %d, Serial : %d", target_slot->GetItemCode(), target_slot->GetWorldSerial());
m_pTmpBuffer[_countof(m_pTmpBuffer) - 1]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ItemData );
}
#ifdef _NA_20110303_ADD_TYPE_OF_NPCSHOP
void GameLog::LogItem(int log_type, Player * player, const SCItemSlot* item_slot,
DURATYPE item_num, WORD price_of_goods, SHOPINFO* shop_info)
{
if (!IsRun() || !player)
{
return;
}
ASSERT(log_type >= ITEM_MONSTER_DROP || log_type < ITEM_MAX);
if (log_type < ITEM_MONSTER_DROP || log_type >= ITEM_MAX)
{
return;
}
m_ItemData.Init();
m_ItemData.SetLogType(log_type);
m_ItemData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ItemData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ItemData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
GameZone* zone = player->GetGameZonePtr();
if (zone)
{
WzVector vecPos;
player->GetPos(&vecPos);
m_ItemData.SetMapCode((WORD)zone->GetMapCode());
m_ItemData.SetMapX((short)vecPos.x);
m_ItemData.SetMapY((short)vecPos.y);
m_ItemData.SetMapZ((short)vecPos.z);
}
m_ItemData.SetMoney(price_of_goods);
if (item_slot)
{
m_ItemData.SetItemCode(item_slot->GetItemCode());
m_ItemData.SetItemSerial(item_slot->GetWorldSerial());
m_ItemData.SetItemNum((BYTE)item_num);
ITEMSTREAMEX ItemStreamEx;
item_slot->CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1((const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx));
}
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE,
"ShopID:%u, ShopType:%d, NeedItem:%u",
shop_info->GetShopListID(),
shop_info->GetShopType(),
shop_info->GetCurrencyItemCode());
m_pTmpBuffer[_countof(m_pTmpBuffer) - 1]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ItemData );
}
#endif
void GameLog::LogItem( int iLogType, Player * pPlayer, const SCItemSlot * pItemSlot, MONEY ullMoney, DURATYPE byItemNum,
const TCHAR * ptszToUserID, const TCHAR * ptszToCharName, const TCHAR* ptszAddInfo )
{
if( !IsRun() || !pPlayer ) return;
ASSERT( iLogType >= ITEM_MONSTER_DROP || iLogType < ITEM_MAX );
//switch( iLogType )
//{
////case ITEM_MAKE_SERIAL:
////case ITEM_PICK:
// {
// if( pItemSlot && eITEMTYPE_WASTE == pItemSlot->GetItemInfo()->m_wType )
// {
// // 소모성 아이템 경우 로그 안남김 : 로그양 줄이기 위해
// return;
// }
// }
// break;
//}
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
m_ItemData.SetToAccountID( ptszToUserID, ID_MAX_LEN);
m_ItemData.SetToCharName( ptszToCharName, MAX_CHARNAME_LENGTH);
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
m_ItemData.SetMoney( ullMoney );
// 아이템 정보
if( pItemSlot )
{
m_ItemData.SetItemCode( pItemSlot->GetItemCode() );
m_ItemData.SetItemSerial( pItemSlot->GetWorldSerial() );
m_ItemData.SetItemNum( (BYTE)byItemNum );
ITEMSTREAMEX ItemStreamEx;
pItemSlot->CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
}
// addinfo에 방키
// SetRoomKey( m_ItemData, pPlayer );
if (ptszAddInfo != NULL) {
m_ItemData.AddAddInfo((TCHAR*)ptszAddInfo);
}
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogItemEx( int iLogType, Player * pPlayer, const SCItemSlot & rItemSlot1, const SCItemSlot & rItemSlot2,
MONEY ullMoney, DURATYPE byItemNum,
const TCHAR * ptszToUserID, const TCHAR * ptszToCharName )
{
if( !IsRun() || !pPlayer ) return;
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
m_ItemData.SetToAccountID( ptszToUserID, ID_MAX_LEN);
m_ItemData.SetToCharName( ptszToCharName, MAX_CHARNAME_LENGTH);
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
m_ItemData.SetMoney( ullMoney );
// 아이템 정보
m_ItemData.SetItemCode( rItemSlot1.GetItemCode() );
m_ItemData.SetItemSerial( rItemSlot1.GetWorldSerial() );
m_ItemData.SetItemNum((BYTE) byItemNum );
ITEMSTREAMEX ItemStreamEx;
rItemSlot1.CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
rItemSlot2.CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx2( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
// addinfo에 방키
// SetRoomKey( m_ItemData, pPlayer );
if( iLogType == ITEM_GET_BY_LOTTERY )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ", Lottery Serial = %I64u", rItemSlot2.GetWorldSerial() );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
}
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogItemEx2( int iLogType, Player * pPlayer, const SCItemSlot & rItemSlot1,
MONEY ullMoney, DURATYPE byItemNum,
DBWLDSERIAL dwItem2WorldSerial, SLOTCODE Item2Code, DURATYPE Item2Num,
const TCHAR * ptszToUserID, const TCHAR * ptszToCharName )
{
if( !IsRun() || !pPlayer ) return;
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
m_ItemData.SetToAccountID( ptszToUserID, ID_MAX_LEN);
m_ItemData.SetToCharName( ptszToCharName, MAX_CHARNAME_LENGTH);
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
m_ItemData.SetMoney( ullMoney );
// 아이템 정보
m_ItemData.SetItemCode( rItemSlot1.GetItemCode() );
m_ItemData.SetItemSerial( rItemSlot1.GetWorldSerial() );
m_ItemData.SetItemNum( (BYTE)byItemNum );
ITEMSTREAMEX ItemStreamEx;
rItemSlot1.CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
ItemStreamEx.Part.dwSerial = dwItem2WorldSerial;
ItemStreamEx.Part.wCode = Item2Code;
ItemStreamEx.Part.byDura = Item2Num;
m_ItemData.SetItemStreamEx2( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
// addinfo에 방키
// SetRoomKey( m_ItemData, pPlayer );
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogCrystalizeSuccess( Player * pPlayer, const SCItemSlot & rItemSlot,
DURATYPE byTotalCount, SLOTCODE * IN pObtainItemCode, DURATYPE * IN pObtainItemNum )
{
if( !IsRun() || !pPlayer ) return;
m_ItemData.Init();
m_ItemData.SetLogType( ITEM_CRYSTALIZE_SUCCESS );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
// 아이템 정보
m_ItemData.SetItemCode( rItemSlot.GetItemCode() );
m_ItemData.SetItemSerial( rItemSlot.GetWorldSerial() );
m_ItemData.SetItemNum( (BYTE)rItemSlot.GetNum() );
ITEMSTREAMEX ItemStreamEx;
rItemSlot.CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
// addinfo에 방키
// SetRoomKey( m_ItemData, pPlayer );
for( BYTE i = 0 ; i < byTotalCount ; ++i )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Item:%u,Num:%u", pObtainItemCode[i], pObtainItemNum[i] );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
}
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogCompose( BOOL bSuccess, Player * pPlayer, SCItemSlot * pItemSlot1, DURATYPE byMatCount,
sITEM_COMPOSE_LIST::sITEM_FOR_COMPOSE * pMaterials, MONEY ullMoney, DBWLDSERIAL *pSerial, DURATYPE ComposeNum )
{
if( !IsRun() || !pPlayer ) return;
int iLogType = ITEM_COMPOSE_SUCCESS;
if( !bSuccess ) iLogType = ITEM_COMPOSE_FAILED;
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
if( pItemSlot1 )
{
// 아이템 정보
m_ItemData.SetItemCode( pItemSlot1->GetItemCode() );
m_ItemData.SetItemSerial( pItemSlot1->GetWorldSerial() );
#ifdef _NA_007257_20140527_GAMELOG_ITEM_COMPOSE_SUCCESS_COUNT
// pItemSlot1->GetNum() 은 인벤토리에 있는 총 개수, ComposeNum에 성공한 개수를 넘기자
m_ItemData.SetItemNum((BYTE)ComposeNum );
#else
m_ItemData.SetItemNum( pItemSlot1->GetNum() );
#endif //_NA_007257_20140527_GAMELOG_ITEM_COMPOSE_SUCCESS_COUNT
ITEMSTREAMEX ItemStreamEx;
pItemSlot1->CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
}
m_ItemData.SetMoney( ullMoney*ComposeNum );
// addinfo에 방키
// SetRoomKey( m_ItemData, pPlayer );
for( BYTE i = 0 ; i < byMatCount ; ++i )
{
#ifdef _NA_0_20091020_COMPACT_COMPOSITION_LOG_
if (i > 0) { m_ItemData.AddAddInfo(","); }
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "%u:%u:%u", \
pMaterials[i].m_ItemCode, pMaterials[i].m_byItemNum*ComposeNum, pSerial[i]);
#else
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Item:%u,Num:%u,Serial:%u",
pMaterials[i].m_ItemCode, pMaterials[i].m_byItemNum*ComposeNum, pSerial[i] );
#endif
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
}
#ifdef _NA_007257_20140527_GAMELOG_ITEM_COMPOSE_SUCCESS_COUNT
if (byMatCount == 0) {
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "TotalItemNum: %d", pItemSlot1->GetNum());
}
#endif //_NA_007257_20140527_GAMELOG_ITEM_COMPOSE_SUCCESS_COUNT
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogFillSocket( Player * pPlayer, const SCItemSlot & rSocketSlot, const SCItemSlot & rTargetSlot,
BYTE bySocketLevel, int iAttrIndex, int iValue )
{
if( !IsRun() || !pPlayer ) return;
m_ItemData.Init();
m_ItemData.SetLogType( ITEM_SOCKETOPT_FILL );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
// 아이템 정보
m_ItemData.SetItemCode( rSocketSlot.GetItemCode() );
m_ItemData.SetItemSerial( rSocketSlot.GetWorldSerial() );
ITEMSTREAMEX ItemStreamEx;
rSocketSlot.CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
rTargetSlot.CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx2( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
// addinfo에 방키
// SetRoomKey( m_ItemData, pPlayer );
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",SockLV:%u,AttrIdx:%d,AttrVal:%u", bySocketLevel, iAttrIndex, iValue );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",SockLV:%u,AttrIdx:%d,AttVal:%u", bySocketLevel, iAttrIndex, iValue );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogItemExtrackSocket( Player * pPlayer, const SCItemSlot & rTargetSlot, WORD ItemCode, DURATYPE ItemNum )
{
if( !IsRun() || !pPlayer ) return;
m_ItemData.Init();
m_ItemData.SetLogType( ITEM_SOCKETOPT_EXTRACT );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
// 아이템 정보
m_ItemData.SetItemCode( rTargetSlot.GetItemCode() );
m_ItemData.SetItemSerial( rTargetSlot.GetWorldSerial() );
ITEMSTREAMEX ItemStreamEx;
rTargetSlot.CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
// addinfo에 방키
// SetRoomKey( m_ItemData, pPlayer );
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",ItemCode:%u,Num:%u", ItemCode, ItemNum );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",ItemCd:%u,Num:%u", ItemCode, ItemNum );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogMonsterItemDrop( const SCItemSlot & rItemSlot, DWORD dwMonsterCode, DWORD dwMonsterLevel,
WORD wMapCode, const WzVector& vecPos, KEYTYPE RoomKey )
{
// 로그양 줄이기 위해 몬스터 드랍 우선 로그 안남김
// 20060802 오후 5:30:13
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
return;
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#if SUN_CODE_BACKUP
if( !IsRun() ) return;
m_ItemData.Init();
m_ItemData.SetLogType( ITEM_MONSTER_DROP );
m_ItemData.SetMapCode( wMapCode );
m_ItemData.SetMapX( (SHORT)vecPos.x );
m_ItemData.SetMapY( (SHORT)vecPos.y );
m_ItemData.SetMapZ( (SHORT)vecPos.z );
m_ItemData.SetItemCode( rItemSlot.GetItemCode() );
ITEMSTREAMEX ItemStreamEx;
rItemSlot.CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "Room:%u", RoomKey );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ItemData );
#endif
}
void GameLog::LogUseStorageItem(int iLogType, Player* player, SLOTCODE item_code, uint item_count, uint date_time)
{
if( !IsRun() || !player ) return;
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( player->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( player->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( player->GetUserIP(), MAX_IPADDRESS_SIZE );
GameZone *pZone = player->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
player->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Item:%u,Num:%u,Date:%u", item_code, item_count, date_time);
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogMultiItem( int iLogType, Player * pPlayer,
DURATYPE byCount, WORD * pItemCode IN, DURATYPE * pItemNum IN, DWORD * pDateTime IN )
{
if( !IsRun() || !pPlayer ) return;
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
// addinfo에 방키
// SetRoomKey( m_ItemData, pPlayer );
for( BYTE i = 0 ; i < byCount ; ++i )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Item:%u,Num:%u", pItemCode[i], pItemNum[i] );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
if( pDateTime )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Date:%u", pDateTime[i] );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
}
}
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogShopItem( int iLogType, Player * pPlayer,
DWORD dwPriceGuid, DWORD dwTransactionGuid, DWORD dwErrorCode )
{
if( !IsRun() || !pPlayer ) return;
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
// addinfo에 방키
// SetRoomKey( m_ItemData, pPlayer );
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",PriceGuid:%u,TransactionGuid:%u,ErrorCode:%u", dwPriceGuid, dwTransactionGuid, dwErrorCode );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",PrcGuid:%u,TrnGuid:%u,ErrCd:%u", dwPriceGuid, dwTransactionGuid, dwErrorCode );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogShop_RecvItem( int iLogType, Player * pPlayer,
DWORD GiftGuid, DWORD dwResult )
{
if( !IsRun() || !pPlayer ) return;
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
// addinfo에 방키
// SetRoomKey( m_ItemData, pPlayer );
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",GiftGuid:%u,Result:%u", GiftGuid, dwResult );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",PakageSequence:%u,Rt:%u", GiftGuid, dwResult );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ItemData );
}
//_KR_0_20091021_FIRENDINVITATION_EXTEND
void GameLog::LogItemInvitatedFriendReward( Player * pPlayer, BYTE ItemCount, SLOTCODE RewardItemCode, LEVELTYPE RewardLevel)
{
if( !IsRun() || !pPlayer ) return;
int iLogType = ITEM_REWARD_EVENT;
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
// addinfo에 방키
SetRoomKey( m_ItemData, pPlayer );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Item:%u,Num:%u,level:%u", RewardItemCode, ItemCount, RewardLevel );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogItemReward( BYTE byRewardType, Player * pPlayer, DURATYPE totalCount, WORD * IN pRewardItemCode, DURATYPE * IN pRewardItemNum,
BYTE * IN pRewardItemEnchant, BYTE * IN pRewardItemSet, BYTE * IN pRewardItemRank, CODETYPE reward_code )
{
if( !IsRun() || !pPlayer )
return;
int iLogType = ITEM_MAX;
switch( byRewardType )
{
case RewardManager::eREWARD_QUEST: iLogType = ITEM_REWARD_QUEST; break;
case RewardManager::eREWARD_AC: iLogType = ITEM_REWARD_AC; break;
case RewardManager::eREWARD_MISSION: iLogType = ITEM_REWARD_MISSION; break;
case RewardManager::eREWARD_EVENT: iLogType = ITEM_REWARD_EVENT; break;
case RewardManager::eREWARD_COMPETITION: iLogType = ITEM_REWARD_COMPETITION; break;
case RewardManager::eREWARD_MISSIONRANKING: iLogType = ITEM_REWARD_RANKING; break;
#ifdef _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM
case RewardManager::eREWARD_ATTENDANCE: iLogType = ITEM_REWARD_ATTENDANCE; break;
#endif // _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM
#ifdef _NA_008404_20150712_MINIGAME_SYSTEM
case RewardManager::eREWARD_MINIGAME_BINGO: iLogType = ITEM_REWARD_MINIGAME_BINGO; break;
#endif //_NA_008404_20150712_MINIGAME_SYSTEM
}
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
m_ItemData.SetMapCode( (WORD)pZone->GetMapCode() );
m_ItemData.SetMapX( (short)vecPos.x );
m_ItemData.SetMapY( (short)vecPos.y );
m_ItemData.SetMapZ( (short)vecPos.z );
}
// addinfo에 방키
SetRoomKey( m_ItemData, pPlayer );
//C_NA_0_20100520_ACSYSTEM_CHANGED
if (RewardManager::eREWARD_AC == byRewardType)
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Location:%u,Object:%u",
m_ACInfoData.location, m_ACInfoData.index_number);
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
}
for( BYTE i = 0 ; i < totalCount ; ++i )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",RewardCode:%d,Item:%u,Num:%u,Encht:%u,Set:%u,Rank:%u",
reward_code, pRewardItemCode[i], pRewardItemNum[i],
pRewardItemEnchant[i], pRewardItemSet[i], pRewardItemRank[i] );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
}
m_LogMng.Serialize( m_ItemData );
}
//
////////////////////////////////////////////////////////////////////////////
//// 아이템 로그
//// 1. 아이템 드롭 로그(버림과 죽어서 떨구는것과 몬스터 죽여서 떨구는 것의 차이?)
//// 1. 아이템 드롭(땅에 떨굼) 과 줍기
//void GameLog::WriteItemOwner( Player* pPlayer, BOOL bPickUp, const SCItemSlot & rItemSlot )
//{
// if( !IsRun() || !pPlayer ) return;
//
// m_ItemData.Init();
//
// if( bPickUp == TRUE ) m_ItemData.SetBaseData( ITEM_PICK, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
// else m_ItemData.SetBaseData( ITEM_DROP, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
//
// SetItemInfo( m_ItemData, rItemSlot );
// SetPlayerPosInfo( m_ItemData, pPlayer );
//
// SetRoomKey( m_ItemData, pPlayer );
// SetBaseItemAddInfo( m_ItemData, rItemSlot );
//
// m_LogMng.Serialize( m_ItemData );
//}
//
//// 2. 인첸트 성공 / 실패
//void GameLog::WriteEnchantResult( Player* pPlayer, BOOL bSuccess, const SCItemSlot & rItemSlot )
//{
// if( !IsRun() || !pPlayer ) return;
//
// m_ItemData.Init();
//
// if( bSuccess == TRUE) m_ItemData.SetBaseData( ITEM_ENCHANTSUCCESS, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
// else m_ItemData.SetBaseData( ITEM_ENCHANTFAIL, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
//
// SetItemInfo( m_ItemData, rItemSlot );
// SetPlayerPosInfo( m_ItemData, pPlayer );
//
// SetRoomKey( m_ItemData, pPlayer );
// SetBaseItemAddInfo( m_ItemData, rItemSlot );
// SetItemSlotPos( m_ItemData, rItemSlot );
//
//
// m_LogMng.Serialize( m_ItemData );
//}
//
//// 3. NPC와의 거래
//void GameLog::WriteItemTradeWithNPC( Player* pPlayer, BOOL bSell, const SCItemSlot & rItemSlot )
//{
// if( !IsRun() || !pPlayer ) return;
//
// m_ItemData.Init();
// if( bSell == TRUE ) m_ItemData.SetBaseData( ITEM_SELLNPC, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
// else m_ItemData.SetBaseData( ITEM_BUYNPC, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
//
// SetItemInfo( m_ItemData, rItemSlot );
// SetPlayerPosInfo( m_ItemData, pPlayer );
//
// SetRoomKey( m_ItemData, pPlayer );
// SetBaseItemAddInfo( m_ItemData, rItemSlot );
// SetBaseItemPriceInfo( m_ItemData, pPlayer, rItemSlot, bSell );
//
// m_LogMng.Serialize( m_ItemData );
//}
//
////개인거래
//void GameLog::WriteItemTradeWithPlayer( Player* pPlayer1, BOOL bGive, const SCItemSlot & rItemSlot, Player* pPlayer2 )
//{
// if( !IsRun() || !pPlayer1 || !pPlayer2 ) return;
//
// m_ItemData.Init();
// if( bGive == TRUE ) m_ItemData.SetBaseData( ITEM_TRADE_GIVE, pPlayer1->GetUserID(), pPlayer1->GetCharName(), pPlayer1->GetUserIP() ); // 상대 플레이어에게 주기
// else m_ItemData.SetBaseData( ITEM_TRADE_RECEIVE, pPlayer1->GetUserID(), pPlayer1->GetCharName(), pPlayer1->GetUserIP() ); // 상대에게서 받기
//
// SetItemInfo( m_ItemData, rItemSlot );
// SetOtherPlayerInfo( m_ItemData, pPlayer2 );
// SetPlayerPosInfo( m_ItemData, pPlayer1 );
//
// SetRoomKey( m_ItemData, pPlayer1 );
// SetBaseItemAddInfo( m_ItemData, rItemSlot );
// SetItemSlotPos( m_ItemData, rItemSlot );
//
// m_LogMng.Serialize( m_ItemData );
//}
//
//// 5. 돈 개인거래
//void GameLog::WriteMoneyTradeWithPlayer( Player* pPlayer1, BOOL bGive, DWORD dwMoney, Player* pPlayer2 )
//{
// if( !IsRun() || !pPlayer1 || !pPlayer2 ) return;
//
// m_ItemData.Init();
//
// //아직 돈 주기 받기 구분이 안 되어 있다. 추후 고려해서 나눈다.
// if( bGive == TRUE ) m_ItemData.SetBaseData( ITEM_MONEY, pPlayer1->GetUserID(), pPlayer1->GetCharName(), pPlayer1->GetUserIP() ); // 상대 플레이어에게 주기
// else m_ItemData.SetBaseData( ITEM_MONEY, pPlayer1->GetUserID(), pPlayer1->GetCharName(), pPlayer1->GetUserIP() ); // 상대 플레이어에게 받기
//
// SetOtherPlayerInfo( m_ItemData, pPlayer2 );
// SetPlayerPosInfo( m_ItemData, pPlayer1 );
//
// SetRoomKey( m_ItemData, pPlayer1 );
//
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",%u,%I64u", dwMoney, pPlayer1->GetMoney() ); //< 거래한 돈, 소지 하임값
// m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
// m_ItemData.AddAddInfo( m_pTmpBuffer );
//
//
// m_LogMng.Serialize( m_ItemData );
//}
//
//// 6. 개인상점 거래
//void GameLog::WriteItemVendorWithPlayer( Player* pPlayer1, BOOL bSell, const SCItemSlot & rItemSlot, DWORD dwMoney, Player* pPlayer2 )
//{
// if( !IsRun() || !pPlayer1 || !pPlayer2 ) return;
//
// m_ItemData.Init();
// if( bSell == TRUE ) m_ItemData.SetBaseData( ITEM_SELLPC, pPlayer1->GetUserID(), pPlayer1->GetCharName(), pPlayer1->GetUserIP() ); // 개인삼정에서 물건 팔기
// else m_ItemData.SetBaseData( ITEM_BUYPC, pPlayer1->GetUserID(), pPlayer1->GetCharName(), pPlayer1->GetUserIP() ); // 개인상점에서 물건 사기
//
// SetItemInfo( m_ItemData, rItemSlot );
// SetOtherPlayerInfo( m_ItemData, pPlayer2 );
// SetPlayerPosInfo( m_ItemData, pPlayer1 );
//
// SetRoomKey( m_ItemData, pPlayer1 );
//
// SetBaseItemAddInfo( m_ItemData, rItemSlot );
// SetTradeItemPriceInfo( m_ItemData, rItemSlot, dwMoney, bSell );
//
//
// m_LogMng.Serialize( m_ItemData );
//}
//
//void GameLog::LogRankUp_Before( Player * pPlayer, const SCItemSlot & rItemSlot1, const SCItemSlot & rItemSlot2 )
//{
// if( !IsRun() || !pPlayer ) return;
//
// m_ItemData.Init();
// m_ItemData.SetBaseData( ITEM_RANKUP_BEFORE, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
//
// ITEMSTREAMEX ItemStreamEx;
// rItemSlot1.CopyOut(ItemStreamEx);
// m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx );
//
// rItemSlot2.CopyOut(ItemStreamEx);
// m_ItemData.SetItemStreamEx2( (const BYTE*)&ItemStreamEx );
//
// m_LogMng.Serialize( m_ItemData );
//}
//// 7. 아이템 랭크업
//void GameLog::WriteItemRankUpResult( Player* pPlayer, const SCItemSlot & rItemSlot, DWORD dwMoney )
//{
// if( !IsRun() || !pPlayer ) return;
//
// m_ItemData.Init();
// m_ItemData.SetBaseData( ITEM_RANKUPSUCCESS, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
// SetItemInfo( m_ItemData, rItemSlot );
//
// SetRoomKey( m_ItemData, pPlayer );
// SetBaseItemAddInfo( m_ItemData, rItemSlot );
//
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",%u", dwMoney ); //< 사용 하임 값
// m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
// m_ItemData.AddAddInfo( m_pTmpBuffer );
// SetItemSlotPos( m_ItemData, rItemSlot ); //아이템 슬롯 위치
//
// m_LogMng.Serialize( m_ItemData );
//}
//
//// 8. 창고에 맞기기 / 찾기
//// dwMoney : 창고 보관료
//void GameLog::WriteItemMoveInWareHouse( Player* pPlayer, BOOL bKeep, const SCItemSlot & rItemSlot )
//{
// if( !IsRun() || !pPlayer ) return;
//
// m_ItemData.Init();
//
// if( bKeep == TRUE ) m_ItemData.SetBaseData( ITEM_PUTSTORAGE, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() ); // 창고에 보관
// else m_ItemData.SetBaseData( ITEM_GETSTORAGE, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() ); // 창고에서 꺼내기
// SetItemInfo( m_ItemData, rItemSlot );
// SetPlayerPosInfo( m_ItemData, pPlayer );
//
// SetRoomKey( m_ItemData, pPlayer );
// SetBaseItemAddInfo( m_ItemData, rItemSlot );
//
// if( bKeep == TRUE ) //보관
// {
//
// }
// else //< 찾을때
// {
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",%I64u", rItemSlot.GetPriceForBuy() ); //< 아이템를 살때 가격.
// m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
// m_ItemData.AddAddInfo( m_pTmpBuffer );
// }
//
//
//
// m_LogMng.Serialize( m_ItemData );
//}
//
void GameLog::LogEnchant( int iLogType, Player* pPlayer, const SCItemSlot & rItemSlot,
MONEY ullMoney, STLX_VECTOR<COMPOSITEMATERIAL> & vecMatInfo, BYTE byDownLV )
{
if( !IsRun() || !pPlayer ) return;
if( ITEM_ENCHANT_SUCCESS != iLogType &&
ITEM_ENCHANT_FAILED != iLogType &&
ITEM_ENCHANT_FAILED_DOWN != iLogType
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
&& ITEM_ENCHANT_FAILED_DESTROY != iLogType
&& ITEM_ENCHANT_FAILED_PREVENT != iLogType
#endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
)
{
return;
}
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
// 아이템 정보
m_ItemData.SetItemCode( rItemSlot.GetItemCode() );
m_ItemData.SetItemSerial( rItemSlot.GetWorldSerial() );
m_ItemData.SetItemNum( (BYTE)rItemSlot.GetNum() );
m_ItemData.SetMoney( ullMoney );
ITEMSTREAMEX ItemStreamEx;
rItemSlot.CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
//인첸트 재료
for( int i = 0 ; i < (int)vecMatInfo.size() ; ++i )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "Item:%u,Num:%u", vecMatInfo[i].MaterialCode, vecMatInfo[i].MaterialNum ); //< 아이템를 살때 가격.
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
}
if( byDownLV )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "ItemDownLV:%d", byDownLV ); //< 아이템다운값이 있을시 추가해준다.
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
}
m_LogMng.Serialize( m_ItemData );
}
//// 9. 인첸트 시도
//void GameLog::WriteEnchantStart( Player* pPlayer, const SCItemSlot & rItemSlot, STLX_VECTOR<COMPOSITEMATERIAL> vecMatInfo )
//{
// if( !IsRun() || !pPlayer ) return;
//
// m_ItemData.Init();
// m_ItemData.SetBaseData( ITEM_ENCHANTTRY, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
//
// SetItemInfo( m_ItemData, rItemSlot );
// SetPlayerPosInfo( m_ItemData, pPlayer );
//
// SetRoomKey( m_ItemData, pPlayer );
//
// SetBaseItemAddInfo( m_ItemData, rItemSlot );
// SetItemPrice( m_ItemData, rItemSlot, FALSE ); //아이템 살때 가격
// SetItemSlotPos( m_ItemData, rItemSlot ); //아이템슬롯 위치
//
// //인첸트 재료
// for(int i = 0; i < (int)vecMatInfo.size(); i++)
// {
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",%u,%u", vecMatInfo[i].MaterialCode, vecMatInfo[i].MaterialNum ); //< 아이템를 살때 가격.
// m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
// m_ItemData.AddAddInfo( m_pTmpBuffer );
// }
//
//
// m_LogMng.Serialize( m_ItemData );
//}
//
//// 10. 몬스터 아이템 드랍
//void GameLog::WriteMonsterItemDrop( const SCItemSlot & rItemSlot, DWORD dwMonsterCode, DWORD dwMonsterLevel, int nMapCode, WzVector& vecPos, KEYTYPE RoomKey )
//{
// if( !IsRun() ) return;
//
// m_ItemData.Init();
// m_ItemData.SetLogType( ITEM_MONSTER_ITEMDROP );
// SetItemInfo( m_ItemData, rItemSlot );
// m_ItemData.SetMapCode( nMapCode );
// m_ItemData.SetMapX( (short)vecPos.x );
// m_ItemData.SetMapY( (short)vecPos.y );
// m_ItemData.SetMapZ( (short)vecPos.z );
//
// //1. RoomKey
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",%u", RoomKey ); //< 아이템를 살때 가격.
// m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
// m_ItemData.AddAddInfo( m_pTmpBuffer );
//
// //2. Item
// SetBaseItemAddInfo( m_ItemData, rItemSlot );
//
//
// m_LogMng.Serialize( m_ItemData );
//}
//
//// 11. 아이템 개인거래 요청 / 승인 / 요청거부
//// nType (0 : 거래 요청, 1 : 승인, 2 : 거절)
//void GameLog::WriteItemTradeStatus( Player * pPlayer1, Player * pPlayer2, int nType )
//{
// if( !IsRun() || !pPlayer1 || !pPlayer2 ) return;
//
// m_ItemData.Init();
//
// switch( nType ) // 아이템 거래 요청
// {
// case 0:
// m_ItemData.SetBaseData( ITEM_REQUEST, pPlayer1->GetUserID(), pPlayer1->GetCharName(), pPlayer1->GetUserIP() );
// break;
// case 1: // 승인
// m_ItemData.SetBaseData( ITEM_ACCEPT, pPlayer1->GetUserID(), pPlayer1->GetCharName(), pPlayer1->GetUserIP() );
// break;
// case 2: // 거절
// m_ItemData.SetBaseData( ITEM_REJECT, pPlayer1->GetUserID(), pPlayer1->GetCharName(), pPlayer1->GetUserIP() );
// break;
// default:
// return;
// }
//
// SetOtherPlayerInfo( m_ItemData, pPlayer2 );
// SetRoomKey( m_ItemData, pPlayer1 );
//
// m_LogMng.Serialize( m_ItemData );
//}
//
//// 12. 개인상점 개설/폐쇄
//void GameLog::WriteItemVendorStatus( Player* pPlayer, BOOL bOpen )
//{
// if( !IsRun() || !pPlayer ) return;
//
// m_ItemData.Init();
//
// if( bOpen == TRUE ) m_ItemData.SetBaseData( ITEM_NEWPC, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
// else m_ItemData.SetBaseData( ITEM_DELPC, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
//
// SetPlayerPosInfo( m_ItemData, pPlayer );
//
// SetRoomKey( m_ItemData, pPlayer );
//
// m_LogMng.Serialize( m_ItemData );
//}
//
//// 13. 개인상점 보기
//void GameLog::WriteViewItemVendor( Player* pPlayer1, Player* pPlayer2 )
//{
// if( !IsRun() || !pPlayer1 || !pPlayer2 ) return;
//
// m_ItemData.Init();
//
// m_ItemData.SetBaseData( ITEM_WATCHPC, pPlayer1->GetUserID(), pPlayer1->GetCharName(), pPlayer1->GetUserIP() );
// SetOtherPlayerInfo( m_ItemData, pPlayer2 );
//
// SetRoomKey( m_ItemData, pPlayer1);
//
// m_LogMng.Serialize( m_ItemData );
//}
//
// 14. 창고 정보
void GameLog::WriteWareHouseInfo( Player* pPlayer, BOOL bOpen )
{
if( !IsRun() || !pPlayer ) return;
m_WareHouseData.Init();
if( bOpen == TRUE )
{
m_WareHouseData.SetLogType( SNAPSHOT_WAREHOUSE_OEPN );
m_WareHouseData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_WareHouseData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_WareHouseData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
}
else
{
m_WareHouseData.SetLogType( SNAPSHOT_WAREHOUSE_CLOSE );
m_WareHouseData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_WareHouseData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_WareHouseData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
}
// 창고 시작 상태로 바꿈
if( m_WareHouseData.GetWareHouseSize() >= MAX_WAREHOUSESTREAM_SIZE )
{
CWarehouseSlotContainer * pContainer = pPlayer->GetWarehouseContainer();
if( !pContainer ) return;
pContainer->SerializeItemInfo( m_WareHouseData.GetWareHousePtr(), m_WareHouseData.GetWareHouseSize(), SERIALIZE_LOAD );
m_WareHouseData.SetMoney( pContainer->GetCurMoney() );
m_LogMng.Serialize( m_WareHouseData );
}
}
//
//// 15. 개인상점 정보(가격설정)
//void GameLog::WriteVendorInfo( Player* pPlayer, const SCItemSlot & rItemSlot, DWORD dwMoney )
//{
// if( !IsRun() || !pPlayer ) return;
//
// m_ItemData.Init();
//
// m_ItemData.SetBaseData( ITEM_SETPRICE_PC, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
// SetItemInfo( m_ItemData, rItemSlot );
// SetPlayerPosInfo( m_ItemData, pPlayer );
//
// SetRoomKey( m_ItemData, pPlayer );
// SetBaseItemAddInfo( m_ItemData, rItemSlot );
// SetTradeItemPriceInfo( m_ItemData, rItemSlot, dwMoney, FALSE );
//
// m_LogMng.Serialize( m_ItemData );
//}
//
//// 16. 랭크업 시도
//void GameLog::WriteItemRankUpStart( Player* pPlayer, POSTYPE pos1, POSTYPE pos2 )
//{
// if( !IsRun() || !pPlayer ) return;
//
// SCSlotContainer* pInventory = (SCSlotContainer*)pPlayer->GetItemManager()->GetItemSlotContainer( SI_INVENTORY );
// if( !pInventory ) return;
//
// SCItemSlot& rTargetSlot1 = (SCItemSlot &)pInventory->GetSlot(pos1);
// SCItemSlot& rTargetSlot2 = (SCItemSlot &)pInventory->GetSlot(pos2);
//
// m_ItemData.Init();
// m_ItemData.SetBaseData( ITEM_RANKUPTRY, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
//
// //1번째 사용된 아이템
// SetItemInfo( m_ItemData, rTargetSlot1 );
//
// SetRoomKey( m_ItemData, pPlayer );
// SetBaseItemAddInfo( m_ItemData, rTargetSlot1 ); //1번재 사용된 아이템 추가정보.
// SetFullItemAddInfo( m_ItemData, rTargetSlot2 ); //2번째 사용된 아이템.
//
// m_LogMng.Serialize( m_ItemData );
//}
void GameLog::LogAction( int iLogType, Player * pPlayer, Player* pOtherPlayer, DWORD64 dwReservedData1, DWORD64 dwReservedData2 )
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
m_ActionData.SetLogType( iLogType );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_ActionData, pPlayer );
// SetRoomKey( m_ActionData, pPlayer );
if( 0 != dwReservedData1 )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",%I64u,%I64u", dwReservedData1, dwReservedData2 );
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
if( pOtherPlayer )
{
SetBasePlayerAddInfo( m_ActionData, pOtherPlayer );
}
if( iLogType == ACT_JOIN_MAP )
{
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone ) {
#ifdef _NA_007750_20141113_WZDAT_MODIFY_LOG
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "Class:%u",
(pPlayer->GetCharInfo() != NULL) ? pPlayer->GetCharInfo()->m_byClassCode : eCLASS_NONE);
#else // _NA_007750_20141113_WZDAT_MODIFY_LOG
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "MapCode:%u", pZone->GetMapCode() );
#endif // _NA_007750_20141113_WZDAT_MODIFY_LOG
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
}
else if( iLogType == ACT_QUEST_REWARD || iLogType == ACT_QUEST_ACCEPT )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "QuestCode:%u", dwReservedData1 );
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
else if (iLogType == ACT_DOMINATION_KILL ||
iLogType == ACT_DOMINATION_DIE)
{
if (pOtherPlayer)
{
GameZone* pZone = pPlayer->GetGameZonePtr();
const GUILDGUID guildGuid = pOtherPlayer->GetGuildGuid();
GameGuild* const pGuild = g_GameGuildManager.FindGuild(guildGuid);
if (NULL != pZone)
{
const MAPCODE mapCode = pZone->GetMapCode();
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "MapCode:%u", mapCode);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
if (NULL != pGuild)
{
const TCHAR* guildName = pGuild->GetGuildName();
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, ", GuildName:%s", guildName);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
}
}
//_KR_0_20091021_FIRENDINVITATION_EXTEND
else if(iLogType == ACT_FRIENDINVITATION_RECALL)
{
if( pOtherPlayer )
{
GameZone *pZone = pOtherPlayer->GetGameZonePtr();
if( pZone )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ", Map:%u", pZone->GetMapCode());
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
}
}
m_LogMng.Serialize( m_ActionData );
}
void GameLog::LogSimpleAction( int iLogType, Player* pPlayer, const TCHAR* tszAddInfo )
{
if( !IsRun() || !pPlayer ) {
return;
}
m_ActionData.Init();
m_ActionData.SetLogType( iLogType );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_ActionData, pPlayer );
if (tszAddInfo != NULL) {
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "%s", tszAddInfo );
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
m_LogMng.Serialize( m_ActionData );
}
void GameLog::LogAction_Ranking( int iLogType, Player * pPlayer, RANKINGNO MissionNo, BYTE Ranking, DWORD ClearTime, BYTE Error )
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
m_ActionData.SetLogType( iLogType );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_ActionData, pPlayer );
// SetRoomKey( m_ActionData, pPlayer );
/*
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE,
",MissionNo:%u,Ranking:%u,Time:%u,Error:%u", MissionNo, Ranking, ClearTime, Error );
*/
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE,
",MisnNo:%u,Rnkg:%u,Time:%u,Err:%u", MissionNo, Ranking, ClearTime, Error );
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize( m_ActionData );
}
void GameLog::LogKillSpecialMonster( Player * pPlayer, MONSTERCODE MonCode, BYTE MonsterType )
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
m_ActionData.SetLogType( ACT_KILL_SPECIAL_MONSTER );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_ActionData, pPlayer );
// SetRoomKey( m_ActionData, pPlayer );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "MonCode:%u, MonType:%u", MonCode, MonsterType );
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize( m_ActionData );
}
void GameLog::LogFatigue( Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
// 일정 주기로 로그를 남기기 위해
m_ActionData.Init();
SetPlayerPosInfo( m_ActionData, pPlayer );
m_ActionData.SetLogType( ACT_FATIGUE_PLAY_TIME );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "Time:%d", pPlayer->GetFatigueManager()->GetPlayTime() );
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize( m_ActionData );
}
void GameLog:: LogRankingPoint( Player *pPlayer, DWORD GetPoint, DWORD SumPoint )
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
SetPlayerPosInfo( m_ActionData, pPlayer );
m_ActionData.SetLogType( ACT__RANKING_POINT );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "Get:%u, Sum:%u", GetPoint, SumPoint );
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize( m_ActionData );
}
//지역 점령전 관련 아이템 사용시 로그
void GameLog::LogDomination(int log_type, Player * player, SLOTCODE item_code,
BYTE item_num, MAPCODE map_code)
{
if (!IsRun() || !player)
{
return;
}
assert(log_type >= ITEM_MONSTER_DROP || log_type < ITEM_MAX );
m_ItemData.Init();
m_ItemData.SetLogType(log_type);
m_ItemData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ItemData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ItemData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
GameZone *pZone = player->GetGameZonePtr();
if (pZone)
{
WzVector vecPos;
player->GetPos(&vecPos);
m_ItemData.SetMapCode((WORD)pZone->GetMapCode());
m_ItemData.SetMapX((short)vecPos.x);
m_ItemData.SetMapY((short)vecPos.y);
m_ItemData.SetMapZ((short)vecPos.z);
}
m_ItemData.SetItemCode(item_code);
m_ItemData.SetItemNum(item_num);
if (log_type == ITEM_DOMINATION_AUCTION_APPLY || log_type == ITEM_DOMINATION_AUCTION_DUP_APPLY)
{
GameGuild* guild = g_GameGuildManager.FindGuild(player->GetGuildGuid());
if (guild == NULL)
{
return;
}
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "Domination Map:%d, Guild Name:%s",
map_code, guild->GetGuildName());
m_pTmpBuffer[_countof(m_pTmpBuffer) - 1] = '\0';
m_ItemData.AddAddInfo(m_pTmpBuffer);
}
//_NA_20110216_INCREASE_DOMINATION_DEFFENSEWALL_POINT
else if (log_type == ACT_DOMINATION_ADD_DEFFENSEWALL_POINT)
{
GameGuild* guild = g_GameGuildManager.FindGuild(player->GetGuildGuid());
if(guild == NULL)
{
return;
}
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "Domination Map:%d, Guild Name : %s",
map_code, guild->GetGuildName());
m_pTmpBuffer[_countof(m_pTmpBuffer) - 1] = '\0';
m_ItemData.AddAddInfo(m_pTmpBuffer);
}
m_LogMng.Serialize(m_ItemData);
}
void GameLog::LogDomination(int iLogType, MAPCODE map_code)
{
if (FALSE == IsRun())
{
return;
}
GameDominationManager* const domination_manager = GameDominationManager::Instance();
m_ActionData.Init();
m_ActionData.SetLogType(iLogType);
const DOMINATION_INFO* domination_info = domination_manager->GetDominationInfo(map_code);
if (NULL == domination_info)
{
return;
}
TCHAR* guildName = NULL;
if (iLogType == ACT_DOMINATION_SUCCESS_DEFENCE)
{
const TCHAR* guildName = domination_info->m_inGuildInfo.m_tszGuildName;
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "MapCode:%u, GuildName:%s", map_code, guildName);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
else if (iLogType == ACT_DOMINATION_SUCCESS_OFFENCE)
{
const TCHAR* guildName = domination_info->m_disGuildInfo.m_tszGuildName;
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, "MapCode:%u, GuildName:%s", map_code, guildName);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
else if (iLogType == ACT_DOMINATION_REWORD_EVENT_START)
{
const TCHAR* guild_name = (domination_info->m_inGuildInfo.m_tszGuildName[0] != '\0') ?
domination_info->m_inGuildInfo.m_tszGuildName : _T("NULL");
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, _T("MapCode:%u, GuildName:%s"), map_code, guild_name);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
else if (iLogType == ACT_DOMINATION_SET_ATTACK_GUILD)
{
const TCHAR* guild_name = (domination_info->m_disGuildInfo.m_tszGuildName[0] != '\0') ?
domination_info->m_disGuildInfo.m_tszGuildName : _T("NULL");
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, _T("Map_code:%u, AttackGuildName:%s"),
domination_info->m_FieldCode, guild_name);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
m_LogMng.Serialize( m_ActionData );
}
void GameLog::LogDomination(int iLogType, Player* pPlayer, NPC* pNpc,
BYTE gate1, BYTE gate2, BYTE gate3)
{
if (FALSE == IsRun() ||
NULL == pPlayer)
return;
m_ActionData.Init();
m_ActionData.SetLogType(iLogType);
m_ActionData.SetAccountID(pPlayer->GetUserID(), ID_MAX_LEN);
m_ActionData.SetCharName(pPlayer->GetCharName(), MAX_CHARNAME_LENGTH);
m_ActionData.SetUserIP(pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE);
SetPlayerPosInfo( m_ActionData, pPlayer );
MAPCODE mapCode = 0;
const GameZone* pZone = pPlayer->GetGameZonePtr();
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, ".");
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
const GUILDGUID guildGuid = pPlayer->GetGuildGuid();
GameGuild* const pGuild = g_GameGuildManager.FindGuild(guildGuid);
if (NULL != pGuild)
{
const TCHAR* guildName = pGuild->GetGuildName();
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, ", GuildName:%s", guildName);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
if (NULL != pNpc)
{
GameZone* pZone = pNpc->GetGameZonePtr();
if (NULL != pZone)
{
WzVector vecPos;
pNpc->GetPos(&vecPos);
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE,
", X:%0.3f,Y:%0.3f,Z:%0.3f", vecPos.x, vecPos.y, vecPos.z);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
}
switch(iLogType)
{
case ACT_DOMINATION_DESTROY_OBJECT:
if (NULL != pNpc)
{
const TCHAR* charName = pNpc->GetCharName();
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, ", ObjectName:%s", charName);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
break;
case ACT_DOMINATION_SET_GATE:
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, ", L:%u,C:%u,R:%u", gate1,gate2,gate3);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
break;
}
m_LogMng.Serialize( m_ActionData );
}
#ifdef _NA_1419_20100121_ACCUMULATE_POINT
void GameLog::LogAccumulatePoint( int iLogType, Player* pPlayer, WORD IncreasePoint, SLOTCODE RewardItemCode )
{
if( !IsRun() || !pPlayer ) return;
BASE_PLAYERINFO* pInfo = pPlayer->GetCharInfo();
ASSERT(pInfo);
if ( !pInfo )
return;
WORD PreviousPoint = pInfo->m_wAccumulatePoint;
switch(iLogType)
{
case ACCUM_ACQUISITION_TIME:
case ACCUM_ACQUISITION_QUEST:
PreviousPoint = max((pInfo->m_wAccumulatePoint - IncreasePoint), 0);
break;
case ACCUM_CONSUMPTION_ROULETTE:
PreviousPoint = min((pInfo->m_wAccumulatePoint + IncreasePoint), 65000);
break;
}
m_AccumulatePointData.Init();
m_AccumulatePointData.SetLogType( iLogType );
m_AccumulatePointData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AccumulatePointData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AccumulatePointData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
m_AccumulatePointData.SetAccumulateYear(pInfo->m_wAccumulateYear);
m_AccumulatePointData.SetAccumulateTime(pInfo->m_dwAccumulateTime);
m_AccumulatePointData.SetOldAccumulatePoint(PreviousPoint);
m_AccumulatePointData.SetNewAccumulatePoint(pInfo->m_wAccumulatePoint);
m_AccumulatePointData.SetRewardItemCode(RewardItemCode);
m_LogMng.Serialize( m_AccumulatePointData );
}
void GameLog::LogAccumulatePoint_GM( int iLogType, Player* pPlayer, WORD IncreasePoint, SLOTCODE RewardItemCode )
{
if( !IsRun() || !pPlayer ) return;
BASE_PLAYERINFO* pInfo = pPlayer->GetCharInfo();
ASSERT(pInfo);
if ( !pInfo )
return;
WORD PreviousPoint = pInfo->m_wAccumulatePoint;
switch(iLogType)
{
case GM_ACQUISITION_ACCMULATE_POINT_BY_QUEST:
case GM_ACQUISITION_ACCMULATE_POINT:
PreviousPoint = max((pInfo->m_wAccumulatePoint - IncreasePoint), 0);
break;
case GM_CONSUMPTION_ACCMULATE_POINT:
PreviousPoint = min((pInfo->m_wAccumulatePoint + IncreasePoint), 65000);
break;
}
m_AdminData.Init();
m_AdminData.SetLogType( iLogType );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Year:%u,Time:%u,PreviousPoint:%u,CurrentPoint:%u,RewardItem:%u",
pInfo->m_wAccumulateYear, pInfo->m_dwAccumulateTime, PreviousPoint, pInfo->m_wAccumulatePoint, RewardItemCode );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_AdminData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_AdminData );
}
#endif
//////////////////////////////////////////////////////////////////////////
// 유저액션 로그
//1. 부활 로그
void GameLog::WritePlayerResurrection( Player* pPlayer, Player *pHealer )
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
m_ActionData.SetLogType( ACT_REBIRTH_CHAR );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_ActionData, pPlayer );
// SetRoomKey( m_ActionData, pPlayer );
// 부활시켜준 사람의 정보
if( pHealer )
{
SetBasePlayerAddInfo( m_ActionData, pHealer );
}
m_LogMng.Serialize( m_ActionData );
}
//캐릭터 사망
void GameLog::WritePlayerDead( Player* pPlayer, MAPCODE Mapcode )
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
m_ActionData.SetLogType( ACT_DEAD_CHAR );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_ActionData, pPlayer );
// SetRoomKey( m_ActionData, pPlayer );
if( Mapcode )
{
#ifdef _NA_007750_20141113_WZDAT_MODIFY_LOG
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE,_T("MCode:%u,Class:%u"), Mapcode,
(pPlayer->GetCharInfo() != NULL) ? pPlayer->GetCharInfo()->m_byClassCode : eCLASS_NONE);
#else // _NA_007750_20141113_WZDAT_MODIFY_LOG
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "MCode:%u", Mapcode );
#endif // _NA_007750_20141113_WZDAT_MODIFY_LOG
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ActionData.AddAddInfo(m_pTmpBuffer); // CHANGES: f110602.3L, fixed the invalid data setting.
}
m_LogMng.Serialize( m_ActionData );
}
//스텟사용
void GameLog::WriteUseStat( Player* pPlayer, BYTE byStatType )
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
m_ActionData.SetLogType( ACT_USE_STAT );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "StatPt:%u,StatType:%u", pPlayer->GetRemainStatPoint(), byStatType );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ActionData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ActionData );
}
//스텟 감소
void GameLog::WriteDecreaseStat( Player* pPlayer, BYTE byStatType, SHORT Decrease )
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
m_ActionData.SetLogType( ACT_DECREASE_STAT );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
/*
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "RemainStatPt:%u,StatType:%u,Decrease:%u",
pPlayer->GetRemainStatPoint(), byStatType, Decrease );
*/
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "RmnStatPt:%u,StatType:%u,Dec:%u",
pPlayer->GetRemainStatPoint(), byStatType, Decrease );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ActionData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ActionData );
}
//스텟 초기화
void GameLog::WriteInitStatAll( Player* pPlayer, eLOG_ACTION eLogAction )
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
m_ActionData.SetLogType( eLogAction );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "RemainStatPt:%u", pPlayer->GetRemainStatPoint() );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "RmnStatPt:%u", pPlayer->GetRemainStatPoint() );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ActionData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ActionData );
}
// 7. 스킬레벨업
void GameLog::WriteSkillLevelUp( Player* pPlayer, SLOTCODE SkillCode, BOOL bLevelUp )
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
//레벨업이 아니면, 처음 스킬을 배우는 거다.
if( bLevelUp == FALSE )
{
m_ActionData.SetLogType( ACT_ACQUIRE_SKILL );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
}
else
{
m_ActionData.SetLogType( ACT_SKILLLV_UP );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
}
ROOT_SKILLINFO *pRootInfo = SkillInfoParser::Instance()->GetInfo( SkillCode );
if( !pRootInfo ) return;
if( pRootInfo->IsSkill() )
{
SkillScriptInfo *pBaseSkillInfo = (SkillScriptInfo*)pRootInfo;
/*
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "SkillPt:%d,Skill:%u,ReqSKillPt:%u",
pPlayer->GetRemainSkillPoint(), SkillCode, pBaseSkillInfo->m_byRequireSkillPoint );
*/
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "SklPt:%d,Skill:%u,ReqSklPt:%u",
pPlayer->GetRemainSkillPoint(), SkillCode, pBaseSkillInfo->m_byRequireSkillPoint );
}
else
{
BASE_STYLEINFO *pBaseStyleInfo = (BASE_STYLEINFO*)pRootInfo;
/*
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "SkillPt:%d,Skill:%u,ReqSKillPt:%u",
pPlayer->GetRemainSkillPoint(), SkillCode, pBaseStyleInfo->m_byRequireSkillPoint );
*/
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "SklPt:%d,Skill:%u,ReqSklPt:%u",
pPlayer->GetRemainSkillPoint(), SkillCode, pBaseStyleInfo->m_byRequireSkillPoint );
}
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ActionData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ActionData );
}
//8. PVP 상대방 죽이기 로그
void GameLog::WritePVPKillUser( Player* pPlayer, Player* pOtherPlayer, BOOL bKill )
{
if( !IsRun() || !pPlayer || !pOtherPlayer ) return;
m_ActionData.Init();
if( bKill == TRUE )
{
m_ActionData.SetLogType( ACT_PVPKILL );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
}
else
{
m_ActionData.SetLogType( ACT_PVPDIE );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
}
SetRoomKey( m_ActionData, pPlayer );
SetBasePlayerAddInfo( m_ActionData, pOtherPlayer );
m_LogMng.Serialize( m_ActionData );
}
//9. PVP 시작
void GameLog::WritePVPStart( Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
m_ActionData.SetLogType( ACT_PVP_START );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetRoomKey( m_ActionData, pPlayer );
m_LogMng.Serialize( m_ActionData );
}
//스킬 레벨 다운
void GameLog::WriteSkillLevelDown( Player* pPlayer, SLOTCODE SkillCode, BOOL bLevelDown )
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
//레벨다운이 아니면, 스킬을 잊는거다.
if( bLevelDown == FALSE )
{
m_ActionData.SetLogType( ACT_SKILL_UNLEARN );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
}
else
{
m_ActionData.SetLogType( ACT_SKILLLV_DOWN );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
}
ROOT_SKILLINFO *pRootInfo = SkillInfoParser::Instance()->GetInfo( SkillCode );
if( !pRootInfo ) return;
if( pRootInfo->IsSkill() )
{
SkillScriptInfo *pBaseSkillInfo = (SkillScriptInfo*)pRootInfo;
/*
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "SkillPt:%d,Skill:%u,ReqSKillPt:%u",
pPlayer->GetRemainSkillPoint(), SkillCode, pBaseSkillInfo->m_byRequireSkillPoint );
*/
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "SklPt:%d,Skill:%u,ReqSklPt:%u",
pPlayer->GetRemainSkillPoint(), SkillCode, pBaseSkillInfo->m_byRequireSkillPoint );
}
else
{
BASE_STYLEINFO *pBaseStyleInfo = (BASE_STYLEINFO*)pRootInfo;
/*
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "SkillPt:%d,Skill:%u,ReqSKillPt:%u",
pPlayer->GetRemainSkillPoint(), SkillCode, pBaseStyleInfo->m_byRequireSkillPoint );
*/
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "SklPt:%d,Skill:%u,ReqSklPt:%u",
pPlayer->GetRemainSkillPoint(), SkillCode, pBaseStyleInfo->m_byRequireSkillPoint );
}
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ActionData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ActionData );
}
//체인지업
void GameLog::CharacterChangeUpLog( Player* pPlayer, BYTE byClassType, BYTE byChangeUpCode )
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
m_ActionData.SetLogType( ACT_CHARACTER_CHANGE_UP );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_ActionData, pPlayer );
m_LogMng.Serialize( m_ActionData );
}
// 4. 캐릭터 접속
void GameLog::WriteCharConnect( Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
m_SessionData.Init();
m_SessionData.SetLogType( SESSION_CHAR_CONNECT );
m_SessionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_SessionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_SessionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
m_LogMng.Serialize( m_SessionData );
}
//
////로그인/아웃시 인벤토리 정보(스냅샷 로그로 대체)
//void GameLog::LogInvenInfo( int iLogType, Player * pPlayer )
//{
// if( !IsRun() || !pPlayer ) return;
//
// m_InventoryData.Init();
//
//
// m_InventoryData.SetBaseData( iLogType, pPlayer->GetUserID(), pPlayer->GetCharName(), pPlayer->GetUserIP() );
//
// m_InventoryData.SetMoney( pPlayer->GetMoney() );
//
// /************************************************************************/
// /* 인벤토리 */
// /************************************************************************/
// // 인벤토리 정보
// //Inventory
// if( m_InventoryData.GetInventorySize() == MAX_INVENTORYITEMSTREAM_SIZE )
// {
// ITEMSTREAMEX* pItemStrem = (ITEMSTREAMEX*)m_InventoryData.GetInventoryPtr();
//
// SCItemSlotContainer* pItemContainer = (SCItemSlotContainer*)pPlayer->GetItemManager()->GetItemSlotContainer( SI_INVENTORY );
// if( !pItemContainer ) return;
//
// pItemContainer->SerializeItemStreamAll( pItemStrem, MAX_INVENTORYITEM_SIZE, SERIALIZE_LOAD );
// }
//
// if( m_InventoryData.GetTempInventorySize() == MAX_TEMPINVENTORYITEMSTREAM_SIZE )
// {
// // 템프인벤토리
// ITEMSTREAMEX* pTempItemStrem = (ITEMSTREAMEX*)m_InventoryData.GetTempInventoryPtr();
//
// SCItemSlotContainer* pTempItemContainer = (SCItemSlotContainer*)pPlayer->GetItemManager()->GetItemSlotContainer( SI_TEMPINVENTORY );
// if( !pTempItemContainer ) return;
//
// pTempItemContainer->SerializeItemStreamAll( pTempItemStrem, MAX_TEMPINVENTORYITEM_SIZE, SERIALIZE_LOAD );
// }
//
//
// m_LogMng.Serialize( m_InventoryData );
//}
// 스냅샷 로그
void GameLog::LogSnapShot( Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
// 일정 주기로 로그를 남기기 위해
pPlayer->GetSnapShotLogTimer().Reset( SNAPSHOT_LOG_CYCLE );
m_SnapShotData.Init();
// 기본정보
m_SnapShotData.SetLogType( SNAPSHOT_REGULAR );
m_SnapShotData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_SnapShotData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_SnapShotData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
int nSize = 0;
/************************************************************************/
/* 캐릭터 정보 */
/************************************************************************/
BASE_PLAYERINFO* pCharInfo = NULL;
pCharInfo = pPlayer->GetCharInfo();
nSize = sizeof(BASE_PLAYERINFO);
//ASSERT( nSize <= MAX_CHAR_STAT_SIZE );
// if( nSize <= MAX_CHAR_STAT_SIZE )
m_SnapShotData.SetCharStat( (BYTE*)pCharInfo, pCharInfo->GetLogSize() );
/************************************************************************/
/* 미션정보 */
/************************************************************************/
if( m_SnapShotData.GetMissionSize() == MAX_MISSIONSTREAM_SIZE )
{
pPlayer->GetMissionManager()->SerializeStream( m_SnapShotData.GetMissionPtr(), m_SnapShotData.GetMissionSize(), SERIALIZE_LOAD );
}
else
{
ASSERT(FALSE);
}
//#ifdef _DEV_TAIYO_ADD_SNAPSHOT_AC
/************************************************************************/
/* 퀘스트 */
/************************************************************************/
// 퀘스트는 추후 추가..
if( m_SnapShotData.GetProgrQuestSize() == MAX_PROGR_QUESTSTREAM_SIZE )
{
pPlayer->GetQuestManager()->SerializeProgrStream( m_SnapShotData.GetProgrQuestPtr(), m_SnapShotData.GetProgrQuestSize(), QSERIALIZE_LOAD );
}
else
{
ASSERT(FALSE);
}
if( m_SnapShotData.GetComplQuestSize() == MAX_COMPL_QUESTSTREAM_SIZE )
{
pPlayer->GetQuestManager()->SerializeComplStream( m_SnapShotData.GetComplQuestPtr(), m_SnapShotData.GetComplQuestSize(), QSERIALIZE_LOAD );
}
else
{
ASSERT(FALSE);
}
/************************************************************************/
/* AC스트림 */
/************************************************************************/
if( m_SnapShotData.GetACSize() == MAX_ACSTREAM_SIZE )
{
//C_NA_0_20100520_ACSYSTEM_CHANGED
//새로운 업적에는 스넵샷에서 AC 정보를 뺀다. (용량이 너무 커서)
//pPlayer->GetACManager()->Serialize( m_SnapShotData.GetACPtr(), SERIALIZE_LOAD );
}
else
{
ASSERT(FALSE);
}
//#endif
/************************************************************************/
/* 장비 */
/************************************************************************/
//Inventory
if( m_SnapShotData.GetEquipItemSize() >= MAX_EQUIPITEMSTREAM_SIZE )
{
ITEMSTREAMEX* pEquipItemStrem = (ITEMSTREAMEX*)m_SnapShotData.GetEquipItemPtr();
SCItemSlotContainer* pEquipContainer = (SCItemSlotContainer*)pPlayer->GetItemManager()->GetItemSlotContainer( SI_EQUIPMENT );
if( !pEquipItemStrem ) return;
pEquipContainer->SerializeItemStreamAll( pEquipItemStrem, m_SnapShotData.GetEquipItemSize(), SERIALIZE_LOAD );
}
else
{
ASSERT(FALSE);
}
/************************************************************************/
/* 스킬 */
/************************************************************************/
if( m_SnapShotData.GetSkillSize() == MAX_SKILLSTREAM_SIZE )
{
SKILLSTREAM* pSkillStrem = (SKILLSTREAM*)m_SnapShotData.GetSkillPtr();
SCSkillSlotContainer* pSkillContainer = (SCSkillSlotContainer*)pPlayer->GetSkillSlotManager()->GetSkillSlotContainer();
if( !pSkillContainer ) return;
pSkillContainer->SerializeSkillStreamAll( pSkillStrem, m_SnapShotData.GetSkillSize(), SERIALIZE_LOAD );
}
else
{
ASSERT(FALSE);
}
/************************************************************************/
/* 인벤토리 */
/************************************************************************/
// 인벤토리 정보
//Inventory
if( m_SnapShotData.GetInventorySize() >= MAX_INVENTORYITEMSTREAM_SIZE )
{
ITEMSTREAMEX * pItemStrem = (ITEMSTREAMEX*)m_SnapShotData.GetInventoryPtr();
SCItemSlotContainer* pItemContainer = (SCItemSlotContainer*)pPlayer->GetItemManager()->GetItemSlotContainer( SI_INVENTORY );
if( !pItemContainer ) return;
int Size = m_SnapShotData.GetInventorySize();
pItemContainer->SerializeItemStreamAll( pItemStrem, m_SnapShotData.GetInventorySize(), SERIALIZE_LOAD );
}
else
{
ASSERT(FALSE);
}
if( m_SnapShotData.GetTempInventorySize() >= MAX_TEMPINVENTORYITEMSTREAM_SIZE )
{
// 템프인벤토리
ITEMSTREAMEX* pTempItemStrem = (ITEMSTREAMEX*)m_SnapShotData.GetTempInventoryPtr();
SCItemSlotContainer* pTempItemContainer = (SCItemSlotContainer*)pPlayer->GetItemManager()->GetItemSlotContainer( SI_TEMPINVENTORY );
//youngmoon 템프인벤토리가 없어졌으므로 NULL 이어도 스넵샷은 찍어야 한다.
if( pTempItemContainer )
{
pTempItemContainer->SerializeItemStreamAll( pTempItemStrem, m_SnapShotData.GetTempInventorySize(), SERIALIZE_LOAD );
}
}
else
{
ASSERT(FALSE);
}
m_LogMng.Serialize( m_SnapShotData );
}
// 정기적으로 게임 로그를 남긴다.
// 여기서 실행되지 않으면, 로그데이터를 이 클래스로 넘겨도, 기록되지 않는다.
void GameLog::StartRegularLog( int nLogType )
{
if( nLogType == REGULAR_SKILL ) //스킬로그를 시작시킨다면..
{
// 여기서 쓰레드를 실행시키고,
// 쓰레드 내에서 Timer를 실행시킨다.
/*unsigned int nThreadID = 1;
HANDLE hSkillThread = (HANDLE)_beginthreadex( NULL, 0, SkillWorkThread, NULL, 0, &nThreadID );*/
}
}
/*
//아이템 기본정보를 얻는다.
VOID GameLog::SetItemInfo( ItemData & rData, const SCItemSlot & rItemSlot )
{
rData.SetItemCode( rItemSlot.GetItemCode() );
rData.SetItemSerial( rItemSlot.GetSerial() );
rData.SetItemNum( rItemSlot.GetNum() );
}
*/
//플레이어의 위치정보(맵코드, 위치)를 얻는다.
VOID GameLog::SetPlayerPosInfo( ItemData & rData, Player* pPlayer)
{
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
rData.SetMapCode( (WORD)pZone->GetMapCode() );
rData.SetMapX( (short)vecPos.x );
rData.SetMapY( (short)vecPos.y );
rData.SetMapZ( (short)vecPos.z );
}
}
//플레이어의 위치정보(맵코드, 위치)를 저장한다.
VOID GameLog::SetPlayerPosInfo( ActionData & rData, Player* pPlayer )
{
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
rData.SetMapCode( pZone->GetMapCode() );
rData.SetMapX( (short)vecPos.x );
rData.SetMapY( (short)vecPos.y );
rData.SetMapZ( (short)vecPos.z );
}
}
//플레이어의 위치정보(맵코드, 위치)를 저장한다.
VOID GameLog::SetPlayerPosInfo( AdminData & rData, Player * pPlayer )
{
GameZone *pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
rData.SetMapCode( pZone->GetMapCode() );
rData.SetMapX( (short)vecPos.x );
rData.SetMapY( (short)vecPos.y );
rData.SetMapZ( (short)vecPos.z );
}
}
//플레이어의 위치정보를 AddInfo에 저장한다.
VOID GameLog::SetPlayerPosAddInfo( BaseLogData & rLogData, Player* pPlayer )
{
GameZone * pZone = pPlayer->GetGameZonePtr();
if( pZone )
{
WzVector vecPos;
pPlayer->GetPos( &vecPos );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Map:%u,X:%0.2f,Y:%0.2f", pZone->GetMapCode(), vecPos.x, vecPos.y );
}
else
{
m_pTmpBuffer[0]=',';
m_pTmpBuffer[1]='\0';
}
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
}
/*
//pPlayer : 상대방 플레이어 정보
void GameLog::SetOtherPlayerInfo( ItemData & rData, Player* pPlayer )
{
rData.SetToAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
rData.SetToCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
}
*/
VOID GameLog::SetRoomKey( BaseLogData & rLogData, Player* pPlayer )
{
//방번호
GameZone * pGameZone = pPlayer->GetGameZonePtr();
if( pGameZone )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",MapCode:%d,Room:%u", pGameZone->GetMapCode(),
pGameZone->GetKey() );
}
else
{
m_pTmpBuffer[0] = ',';
m_pTmpBuffer[1] = '\0';
}
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
}
/*
VOID GameLog::SetBaseItemPriceInfo( BaseLogData & rLogData, Player * pPlayer, const SCItemSlot & rItemSlot, BOOL bSell )
{
DWORD dwPrice = 0;
if( bSell ) dwPrice = (DWORD)rItemSlot.GetPriceForSell();
else dwPrice = (DWORD)rItemSlot.GetPriceForBuy();
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Price:%u,Money:%I64u", dwPrice, pPlayer->GetMoney() );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
}
//개인거래 아이템의 가격정보
VOID GameLog::SetTradeItemPriceInfo( BaseLogData & rLogData, const SCItemSlot & rItemSlot, DWORD dwPrice, BOOL bSell )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Price:%u", dwPrice );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
}
VOID GameLog::SetItemSlotPos( BaseLogData & rLogData, const SCItemSlot & rItemSlot )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Pos:%u", rItemSlot.GetPos() );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
}
VOID GameLog::SetFullItemAddInfo( BaseLogData & rLogData, const SCItemSlot & rItemSlot ) // 아이템의 모든 정보를 AddInfo에 넣는다.
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Code:%u,Serial:%u,Num:%u",
rItemSlot.GetItemCode(), rItemSlot.GetSerial(), rItemSlot.GetNum() );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
SetBaseItemAddInfo( rLogData, rItemSlot );
}
VOID GameLog::SetBaseItemAddInfo( BaseLogData & rLogData, const SCItemSlot & rItemSlot )
{
eRANK rank = rItemSlot.GetRank();
if( rank > RANK_E )
{
// 현재랭크,랭크옵션인덱스,랭크옵션값
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Rank:%u,AttrIdx:%u,AttrValue:%u",
rank, rItemSlot.GetRankAttrIndex(rank), rItemSlot.GetRankAttrValue(rank) );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
}
else
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Rank:%u,,", rank );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
}
if(rItemSlot.WithDura())
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Dura:%u", (BYTE)rItemSlot.GetDura() );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
}
else
{
m_pTmpBuffer[0]=',';
m_pTmpBuffer[1]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
}
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",SockNum:%u", rItemSlot.GetSocketNum() ); //소켓의 개수
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
//소켓 옵션은 최대 3개이다.
for( int i = 0; i < SOCKET_MAX ; i++ )
{
if( 0 != rItemSlot.GetSocketAttrIndex((eSOCKET)i) )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",AttrIdx:%d,AttrValue:%d",
rItemSlot.GetSocketAttrIndex((eSOCKET)i), rItemSlot.GetSocketAttrValue((eSOCKET)i) ); //< 소켓의 속성(불, 물.... )
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
}
else
{
m_pTmpBuffer[0]=',';
m_pTmpBuffer[1]=',';
m_pTmpBuffer[2]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
}
}
}
// 아이템의 상점에서 살때, 팔때 가격를 설정한다.
VOID GameLog::SetItemPrice( BaseLogData & rLogData, const SCItemSlot & rItemSlot, BOOL bSell )
{
MONEY Price = 0;
if( bSell )
Price = rItemSlot.GetPriceForSell();
else
Price = rItemSlot.GetPriceForBuy();
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Price:%u", Price );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
}
*/
// 플레이어의 기본정보를 AddInfo에 넣는다.
VOID GameLog::SetBasePlayerAddInfo( BaseLogData & rLogData, Player * pPlayer )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",UsrID:%s,ChrName:%s", pPlayer->GetUserID(), pPlayer->GetCharName() );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
rLogData.AddAddInfo( m_pTmpBuffer );
}
//
////Thread Argument
//unsigned int __stdcall SkillWorkThread(void* pArg)
//{
// GameLog* pLog = (GameLog*)pArg;
//
// while(TRUE)
// {
//
// }
//}
// 입장
void GameLog::WriteEntrance( Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_ENTRANCE );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
SetRoomKey( m_AdminData, pPlayer );
m_LogMng.Serialize( m_AdminData );
}
// 투명
void GameLog::WriteTransparent( Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_TRANSPARENT );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
// SetRoomKey( m_AdminData, pPlayer );
m_LogMng.Serialize( m_AdminData );
}
// 무적
void GameLog::WriteInvincibility( Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_INVINCIBILITY );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
// SetRoomKey( m_AdminData, pPlayer );
m_LogMng.Serialize( m_AdminData );
}
// 방정보
void GameLog::WriteRoomInfo( Player* pPlayer, DWORD dwRoomKey )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_ROOMINFO );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
SetRoomKey( m_AdminData, pPlayer );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Room:%u", dwRoomKey ); //< 찾는 방번호
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_AdminData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_AdminData );
}
// 부활
void GameLog::WriteRebirth( Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_REBIRTH );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
// SetRoomKey( m_AdminData, pPlayer );
m_LogMng.Serialize( m_AdminData );
}
// 아이템제거
void GameLog::WriteRemovalItem( Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_REMOVALITEM );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
// SetRoomKey( m_AdminData, pPlayer );
m_LogMng.Serialize( m_AdminData );
}
// 몬스터제거
void GameLog::WriteRemovalMonster( Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_REMOVALMONSTER );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
// SetRoomKey( m_AdminData, pPlayer );
m_LogMng.Serialize( m_AdminData );
}
// 회복
void GameLog::WriteRecovery( Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_RECOVERY );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
// SetRoomKey( m_AdminData, pPlayer );
m_LogMng.Serialize( m_AdminData );
}
// 레벨업
void GameLog::WriteLevelUp( Player* pPlayer, WORD wOldLevel )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_LEVELUP );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
// SetRoomKey( m_AdminData, pPlayer );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",LV:%u,OldLV:%u", pPlayer->GetLevel(), wOldLevel ); //< 현재레벨,이전레벨
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_AdminData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_AdminData );
}
// 스텟업
void GameLog::WriteStatPointUp( Player* pPlayer, WORD wPlusPoint )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_STATPOINTUP );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
// SetRoomKey( m_AdminData, pPlayer );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",PlusPt:%u,StatPt:%d", wPlusPoint, pPlayer->GetStatPoint() );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_AdminData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_AdminData );
}
// 스킬포인트업
void GameLog::WriteSkillPointUp( Player* pPlayer, WORD wPlusPoint )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_SKILLPOINTUP );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
// SetRoomKey( m_AdminData, pPlayer );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",PlusPt:%u,SkillRemainPt:%d", wPlusPoint, pPlayer->GetRemainSkillPoint() );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_AdminData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_AdminData );
}
// 몬스터소환
void GameLog::WriteCreateMonster( Player* pPlayer, DWORD dwMonsterCode, WORD wMonsterCount )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_CREATEMONSTER );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
// SetRoomKey( m_AdminData, pPlayer );
// _sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",MonCode:%u,MonNum%u", dwMonsterCode, wMonsterCount );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",MonCd:%u,MonNum%u", dwMonsterCode, wMonsterCount );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_AdminData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_AdminData );
}
// 제거
void GameLog::WriteRemoval( Player* pPlayer, const TCHAR* pszMonsterName ) // 제거
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_REMOVAL );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
m_AdminData.SetToCharName( pszMonsterName, MAX_MONSTERNAME_LENGTH );
// SetRoomKey( m_AdminData, pPlayer );
m_LogMng.Serialize( m_AdminData );
}
// 생성
void GameLog::WriteCreateItem( Player* pPlayer, WORD wItemCode, WORD wItemCount )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_CREATEITEM );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
// SetRoomKey( m_AdminData, pPlayer );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",Item:%u,Num:%u", wItemCode, wItemCount );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_AdminData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_AdminData );
}
// 하임
void GameLog::WriteCreateHeim( Player* pPlayer, MONEY amount )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_CREATEHEIM );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "Money : %I64u", amount );
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_AdminData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_AdminData );
}
// 킬
void GameLog::WriteKill( Player* pPlayer, const TCHAR* pszMonsterName )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_KILL );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
m_AdminData.SetToCharName( pszMonsterName, MAX_MONSTERNAME_LENGTH );
// SetRoomKey( m_AdminData, pPlayer );
m_LogMng.Serialize( m_AdminData );
}
//속도
void GameLog::WriteSpeed( Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_SPEED );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
// SetRoomKey( m_AdminData, pPlayer );
m_LogMng.Serialize( m_AdminData );
}
//어카운트
void GameLog::WriteAccount( Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( GM_KILL );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
m_LogMng.Serialize( m_AdminData );
}
void GameLog::LogGM( int nLogType, Player* pPlayer )
{
if( !IsRun() || !pPlayer ) return;
m_AdminData.Init();
m_AdminData.SetLogType( nLogType );
m_AdminData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_AdminData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_AdminData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_AdminData, pPlayer );
m_LogMng.Serialize( m_AdminData );
}
void GameLog:: PreProcess()
{
BOOST_STATIC_ASSERT( MAX_ITEMPARTEX_SIZE == sizeof(ITEMSTREAMEX) );
BOOST_STATIC_ASSERT( MAX_BASE_PLAYER_INFO_SIZE == sizeof(BASE_PLAYERINFO_LOG) );
}
//C_NA_0_20100520_ACSYSTEM_CHANGED
void GameLog::SetAchievementInfo( WORD location, WORD index_number )
{
m_ACInfoData.location = location;
m_ACInfoData.index_number = index_number;
}
#ifdef _NA004034_20120102_POINT_WALLET_SYSTEM
void GameLog::LogPointWallet( Player* pPlayer, eLOG_ACTION action_type, DWORD point_code, \
DWORD previous_point, DWORD point_diffrence, DWORD current_point )
{
if( !IsRun() || !pPlayer )
return;
m_ActionData.Init();
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
m_ActionData.SetLogType( action_type );
SetPlayerPosInfo( m_ActionData, pPlayer );
memset(m_pTmpBuffer, 0, sizeof(m_pTmpBuffer));
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE,
"MoneyCode:%d,Before:%d,Use:%d,Total:%d", \
point_code, previous_point, point_diffrence, current_point);
m_ActionData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize( m_ActionData );
}
#endif //_NA004034_20120102_POINT_WALLET_SYSTEM
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
void GameLog::LogChaosZone(eLOG_ACTION log_type, Player* player,
const TCHAR* target_character_name, const TCHAR * add_info)
{
if( !IsRun() || !player )
return;
m_ActionData.Init();
m_ActionData.SetLogType(log_type);
m_ActionData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ActionData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ActionData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
SetPlayerPosInfo(m_ActionData, player);
SetRoomKey(m_ActionData, player);
if (target_character_name != NULL)
{
m_ActionData.SetCharName(target_character_name, MAX_CHARNAME_LENGTH);
}
if (add_info != NULL)
{
m_ActionData.AddAddInfo((TCHAR*)add_info);
}
m_LogMng.Serialize(m_ActionData);
}
#ifdef _NA_007237_20140519_GAMELOG_DONATION_GUILDCOIN
void GameLog::LogGuild( eLOG_ACTION log_type, Player* player, const WORD donated_point, const TCHAR* add_info /*= NULL*/ )
{
if( !IsRun() || !player )
return;
m_ActionData.Init();
m_ActionData.SetLogType(log_type);
m_ActionData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ActionData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ActionData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
SetPlayerPosInfo(m_ActionData, player);
memset(m_pTmpBuffer, 0, sizeof(m_pTmpBuffer));
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE,
"DonatedPoint: %d", donated_point);
m_ActionData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize( m_ActionData );
}
#endif //_NA_007237_20140519_GAMELOG_DONATION_GUILDCOIN
#ifdef _JP_007387_20140702_GAMELOG_GOLDRUSH_GOLDPOINT
// 골드러시를 위한 DB로그
// changed_point, total_point -- 골드포인트관련 로그를 남길 경우 사용
// monster_code -- 몬스터킬 로그를 남길 경우 사용
void GameLog::LogGoldRush( eLOG_ACTION log_type, Player* player, WORD changed_point, WORD total_point,
MONSTERCODE monster_code /*= 0*/, const TCHAR* add_info /* = NULL */)
{
if( !IsRun() || !player )
return;
m_ActionData.Init();
m_ActionData.SetLogType(log_type);
m_ActionData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ActionData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ActionData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
SetPlayerPosInfo(m_ActionData, player);
GameZone * game_zone = player->GetGameZonePtr();
ZONEKEY room_key = 0;
if (game_zone) {
room_key = game_zone->GetKey();
}
memset(m_pTmpBuffer, 0, sizeof(m_pTmpBuffer));
switch (log_type)
{
case ACT_GOLDRUSH_MONSTERKILL:
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",MonsterCode:%d Room:%u",
monster_code ,room_key );
break;
case ACT_GOLDRUSH_GOLDPOINT_GET:
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",ChangedPoint: %d, TotalPoint: %d, Room:%u",
changed_point, total_point, room_key );
break;
case ACT_GOLDRUSH_GOLDPOINT_LOSE: //골드포인트 손실
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",ChangedPoint: %d, TotalPoint: %d, Room:%u",
changed_point * -1, total_point, room_key );
break;
case ACT_GOLDRUSH_BATTLERESULT:
if (add_info != NULL) {
_tcscpy(m_pTmpBuffer, add_info);
}
break;
}
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ActionData.AddAddInfo((TCHAR*)m_pTmpBuffer);
m_LogMng.Serialize(m_ActionData);
}
#endif //_JP_007387_20140702_GAMELOG_GOLDRUSH_GOLDPOINT
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
void GameLog::LogGuildFacility( eLOG_ACTION log_type, Player* player, GameGuild* const guild, FCODE code, FLEVEL level )
{
if( !IsRun() || !player )
return;
m_ActionData.Init();
m_ActionData.SetLogType(log_type);
m_ActionData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ActionData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ActionData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
SetPlayerPosInfo(m_ActionData, player);
if (guild != NULL)
{
memset(m_pTmpBuffer, 0, sizeof(m_pTmpBuffer));
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "Guild Guid : %d, Guild Name : %s",
guild->GetGuildGuid(), guild->GetGuildName());
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
memset(m_pTmpBuffer, 0, sizeof(m_pTmpBuffer));
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "Facility Code : %d, Facility Level : %d",
code, level);
m_ActionData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize( m_ActionData );
}
#endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
#ifdef _NA_007086_20140318_MONSTERBOOK
void GameLog::LogMonsterBook( eLOG_ACTION log_type, Player* player, MONSTERCODE monster_code )
{
if( !IsRun() || !player )
return;
m_ActionData.Init();
m_ActionData.SetLogType(log_type);
m_ActionData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ActionData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ActionData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
SetPlayerPosInfo(m_ActionData, player);
memset(m_pTmpBuffer, 0, sizeof(m_pTmpBuffer));
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE,
"MonsterCode: %d", monster_code);
m_ActionData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize( m_ActionData );
}
#endif //_NA_007086_20140318_MONSTERBOOK
#ifdef _NA_007750_20141113_WZDAT_MODIFY_LOG
void GameLog::LogWzDat( eLOG_ACTION log_type, const TCHAR* add_info /*= NULL*/ )
{
if( !IsRun())
{
return;
}
m_ActionData.Init();
m_ActionData.SetLogType(log_type);
m_ActionData.SetAccountID("WzDat", ID_MAX_LEN);
m_ActionData.SetCharName("WzDat", MAX_CHARNAME_LENGTH);
if (add_info != NULL)
{
m_ActionData.AddAddInfo((TCHAR*)add_info);
}
m_LogMng.Serialize(m_ActionData);
}
#endif // _NA_007750_20141113_WZDAT_MODIFY_LOG
#ifdef _NA_008119_20150310_CHECK_ONESHOT_ONEKILL_SITUATION
void GameLog::LogAction_PK( int iLogType, Player * pPlayer, Player* pOtherPlayer/*=NULL*/,
DAMAGETYPE _damage_value /*= 0*/)
{
if( !IsRun() || !pPlayer ) return;
m_ActionData.Init();
m_ActionData.SetLogType( iLogType );
m_ActionData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ActionData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ActionData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
SetPlayerPosInfo( m_ActionData, pPlayer );
if( pOtherPlayer ) {
SetBasePlayerAddInfo( m_ActionData, pOtherPlayer );
}
// 처치 시의 데미지 기록
if (_damage_value != 0)
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ", LastHitDmg: %d", _damage_value);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
if (iLogType == ACT_PK_KILL)
{
time_t cur_time; util::TimeSync::time( &cur_time );
DWORD dwLeavedTime = max( 0, pPlayer->GetChaoState().GetChaoEndTime() - cur_time );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ",%I64u", dwLeavedTime);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
// PK 킬 로그면 카오상태 표시
if( pOtherPlayer != NULL && (iLogType == ACT_PK_KILL || iLogType == ACT_PK_DIE) )
{
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, ", CaoStat:%u/%u,OtherCaoStat:%u/%u",
pPlayer->GetChaoState().GetChaoState(), pPlayer->GetChaoState().IsBoradori(),
pOtherPlayer->GetChaoState().GetChaoState(), pOtherPlayer->GetChaoState().IsBoradori() );
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
else if (pOtherPlayer != NULL && (iLogType == ACT_DOMINATION_KILL ||iLogType == ACT_DOMINATION_DIE))
{
GameZone* pZone = pPlayer->GetGameZonePtr();
const GUILDGUID guildGuid = pOtherPlayer->GetGuildGuid();
GameGuild* const pGuild = g_GameGuildManager.FindGuild(guildGuid);
if (NULL != pZone)
{
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, ".");
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
if (NULL != pGuild)
{
const TCHAR* guildName = pGuild->GetGuildName();
_sntprintf(m_pTmpBuffer, MAX_ADDINFO_SIZE, ", GuildName:%s", guildName);
m_pTmpBuffer[MAX_ADDINFO_SIZE] = '\0';
m_ActionData.AddAddInfo(m_pTmpBuffer);
}
}
m_LogMng.Serialize( m_ActionData );
}
#endif //_NA_008119_20150310_CHECK_ONESHOT_ONEKILL_SITUATION
#ifdef _NA_008124_20150313_AWAKENING_SYSTEM
void GameLog::LogAwakening( int iLogType, Player * pPlayer, SCItemSlot& equip_item,
const CODETYPE material_item_code, const BYTE material_awakening,
const BYTE result_awakening, const BYTE prev_awakening,
const CODETYPE additive_item_code )
{
if( !IsRun() || !pPlayer ) return;
if( ITEM_AWAKENING_SUCCESS != iLogType &&
ITEM_AWAKENING_FAILED != iLogType
)
{
return;
}
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
m_ItemData.SetItemCode( equip_item.GetItemCode() );
m_ItemData.SetItemSerial( equip_item.GetWorldSerial() );
m_ItemData.SetItemNum( (BYTE)equip_item.GetNum() );
ITEMSTREAMEX ItemStreamEx;
equip_item.CopyOut(ItemStreamEx);
m_ItemData.SetItemStreamEx1( (const BYTE*)&ItemStreamEx, sizeof(ItemStreamEx) );
int need_additive_number = 0;
const AwakeningInfo* awakening_info =
AwakeningInfoParser::Instance()->FindData(equip_item.GetCode());
if ( awakening_info != NULL )
{
need_additive_number = result_awakening - prev_awakening;
need_additive_number *= awakening_info->additive_count;
}
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE,
"Material:%d,ResultAwakening:%d,PrevAwakening:%d,Additive:%d,NeedAdditive:%d",
material_item_code, result_awakening, prev_awakening, additive_item_code, need_additive_number);
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ItemData );
}
void GameLog::LogEvolution( int iLogType, Player * pPlayer, const CODETYPE result_item_code,
const CODETYPE prev_item_code,const CODETYPE additive_item_code )
{
if( !IsRun() || !pPlayer ) return;
if( ITEM_EVOLUTION_SUCCESS != iLogType &&
ITEM_EVOLUTION_FAILED != iLogType
)
{
return;
}
m_ItemData.Init();
m_ItemData.SetLogType( iLogType );
m_ItemData.SetAccountID( pPlayer->GetUserID(), ID_MAX_LEN );
m_ItemData.SetCharName( pPlayer->GetCharName(), MAX_CHARNAME_LENGTH );
m_ItemData.SetUserIP( pPlayer->GetUserIP(), MAX_IPADDRESS_SIZE );
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE,
"ResultItemCode:%d,PrevItemCode:%d,Additive:%d",
result_item_code, prev_item_code, additive_item_code);
m_pTmpBuffer[MAX_ADDINFO_SIZE]='\0';
m_ItemData.AddAddInfo( m_pTmpBuffer );
m_LogMng.Serialize( m_ItemData );
}
#endif // _NA_008124_20150313_AWAKENING_SYSTEM
#ifdef _NA_008299_20150519_MAX_DAMAGE_LOG
void GameLog::LogMaxDamage( eLOG_ACTION log_type, Character* attacked_character, Character* attacker, DamageArgs* damage_arg )
{
if( !IsRun() || !attacked_character || !attacker || !damage_arg ) return;
m_ActionData.Init();
m_ActionData.SetLogType(log_type);
if (attacker->IsEqualObjectKind(PLAYER_OBJECT))
{
Player* attacker_player = static_cast<Player*>(attacker);
if (attacker_player != NULL)
{
m_ActionData.SetAccountID(attacker_player->GetUserID(), ID_MAX_LEN);
m_ActionData.SetCharName(attacker_player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ActionData.SetUserIP(attacker_player->GetUserIP(), MAX_IPADDRESS_SIZE);
SetPlayerPosInfo(m_ActionData, attacker_player);
}
}
int npc_code = 0;
if (attacked_character->IsEqualObjectKind(NPC_OBJECT))
{
NPC* npc = static_cast<NPC*>(attacked_character);
if (npc != NULL)
{
const BASE_NPCINFO* pInfo = npc->GetBaseInfo();
if (pInfo != NULL)
{
npc_code = pInfo->m_MonsterCode;
}
}
}
MAPCODE map_code = 0;
GameZone *pZone = attacked_character->GetGameZonePtr();
if (pZone != NULL)
{
map_code = pZone->GetMapCode();
}
memset(m_pTmpBuffer, 0, sizeof(m_pTmpBuffer));
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "NpcCode:%d, MapCode:%d, Damage:%d, SkillCode:%d, AttackType:%d",
npc_code, map_code, damage_arg->damage_, damage_arg->skill_code_, damage_arg->attack_type_);
m_ActionData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize( m_ActionData );
}
#endif // _NA_008299_20150519_MAX_DAMAGE_LOG
#ifdef _NA_008334_20150608_SONNENSCHEIN
VOID GameLog::LogSonnenSchein( eLOG_ACTION log_type, GUILDGUID guild_guid, Player* player )
{
if( !IsRun() ) {
return;
}
m_ActionData.Init();
m_ActionData.SetLogType(log_type);
CHARGUID stamper_guid = 0;
if (player != NULL)
{
m_ActionData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ActionData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ActionData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
SetPlayerPosInfo(m_ActionData, player);
CHARGUID stamper_guid = player->GetCharGuid();
}
memset(m_pTmpBuffer, 0, sizeof(m_pTmpBuffer));
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "GuildGuid:%d, StamperGuid:%d",
guild_guid, stamper_guid);
m_ActionData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize( m_ActionData );
}
#endif //_NA_008334_20150608_SONNENSCHEIN
//_NA_008506_20150923_LOG_LOGOUT_IN_GAMESERVER
VOID GameLog::LogLogout( Player* player )
{
if( !IsRun() ) {
return;
}
m_ActionData.Init();
m_ActionData.SetLogType(SESSION_LOGOUT_GAMESERVER);
MAPCODE map_code = 0;
if (player != NULL)
{
m_ActionData.SetAccountID(player->GetUserID(), ID_MAX_LEN);
m_ActionData.SetCharName(player->GetCharName(), MAX_CHARNAME_LENGTH);
m_ActionData.SetUserIP(player->GetUserIP(), MAX_IPADDRESS_SIZE);
SetPlayerPosInfo(m_ActionData, player);
GameZone* zone = player->GetGameZonePtr();
if (zone != NULL)
{
map_code = zone->GetMapCode();
}
}
memset(m_pTmpBuffer, 0, sizeof(m_pTmpBuffer));
_sntprintf( m_pTmpBuffer, MAX_ADDINFO_SIZE, "Last Location:%d", map_code);
m_ActionData.AddAddInfo(m_pTmpBuffer);
m_LogMng.Serialize( m_ActionData );
}