#pragma once //======================================================================================================================= /// GameLog /** @history - 2006.5.15 : [taiyo] ¹ö±× ¼öÁ¤ ¹× À§ÇèÇÑ ¹®ÀÚ¿­ ó¸® ¼öÁ¤ */ //======================================================================================================================= #include #include #include #include #include #include #include #include #include #include #include #include #include #include class NPC; class Player; class SCItemSlot; class SystemMemo; #ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION class GameGuild; #endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION #ifdef _NA_008299_20150519_MAX_DAMAGE_LOG struct DamageArgs; #endif // _NA_008299_20150519_MAX_DAMAGE_LOG //ÀÎþƮ½Ã »ç¿ë º¸¼®Á¤º¸ struct COMPOSITEMATERIAL { SLOTCODE MaterialCode; POSTYPE MaterialNum; }; //¾ÆÀÌÅÛ°Å·¡½Ã »ç¿ëµÇ´Â ¾ÆÀÌÅÛ Á¤º¸ struct ITEMLOGINFO { int nItemCode; int nItemSerial; int nItemCount; }; enum eREGULAR_LOGTYPE { REGULAR_SKILL = 0, }; //C_NA_0_20100520_ACSYSTEM_CHANGED struct ACHIEVEMENT_LOGINFO { WORD location; WORD index_number; }; //Thread Argument //unsigned int __stdcall SkillWorkThread(void* pArg); class GameLog : public BaseLog { enum { MAX_EXP_FULL_LOG_AT_LEVEL = 50, }; enum { MAX_EXP_DIVIDE_LOG_AT_LEVEL = 10, }; public: GameLog(); virtual ~GameLog() {} private: ItemData m_ItemData; ExpData m_ExpData; SnapShotData m_SnapShotData; SessionData m_SessionData; ActionData m_ActionData; InventoryData m_InventoryData; WareHouseData m_WareHouseData; AdminData m_AdminData; MoneyData m_MoneyData; TCHAR m_pTmpBuffer[MAX_ADDINFO_SIZE+1]; AccumulatePointData m_AccumulatePointData; ACHIEVEMENT_LOGINFO m_ACInfoData; //C_NA_0_20100520_ACSYSTEM_CHANGED private: VOID SetItemInfo( ItemData & rData, const SCItemSlot & rItemSlot ); //¾ÆÀÌÅÛ ±âº»Á¤º¸¸¦ ÀúÀåÇÑ´Ù. VOID SetPlayerPosInfo( ItemData & rData, Player* pPlayer ); //Ç÷¹À̾îÀÇ À§Ä¡Á¤º¸(¸ÊÄÚµå, À§Ä¡)¸¦ ÀúÀåÇÑ´Ù. VOID SetPlayerPosInfo( ActionData & rData, Player* pPlayer ); //Ç÷¹À̾îÀÇ À§Ä¡Á¤º¸(¸ÊÄÚµå, À§Ä¡)¸¦ ÀúÀåÇÑ´Ù. VOID SetPlayerPosInfo( AdminData & rData, Player* pPlayer ); //Ç÷¹À̾îÀÇ À§Ä¡Á¤º¸(¸ÊÄÚµå, À§Ä¡)¸¦ ÀúÀåÇÑ´Ù. VOID SetOtherPlayerInfo( ItemData & rData, Player* pPlayer ); //ItemDataÀÇ »ó´ë¹æ Á¤º¸¸¦ ÀúÀåÇÑ´Ù. VOID SetRoomKey( BaseLogData & rLogData, Player* pPlayer ); VOID SetPlayerPosAddInfo( BaseLogData & rLogData, Player* pPlayer ); //Ç÷¹À̾îÀÇ À§Ä¡Á¤º¸¸¦ AddInfo¿¡ ÀúÀåÇÑ´Ù. VOID SetBaseItemPriceInfo( BaseLogData & rLogData, Player* pPlayer, const SCItemSlot & rItemSlot, BOOL bSell ); //»óÁ¡ ¾ÆÀÌÅÛÀÇ °¡°ÝÁ¤º¸ VOID SetTradeItemPriceInfo( BaseLogData & rLogData, const SCItemSlot & rItemSlot, DWORD dwPrice, BOOL bSell ); //°³Àΰŷ¡ ¾ÆÀÌÅÛÀÇ °¡°ÝÁ¤º¸ VOID SetItemSlotPos( BaseLogData & rLogData, const SCItemSlot & rItemSlot ); //¾ÆÀÌÅÛ ½½·ÔÀ§Ä¡ VOID SetBaseItemAddInfo( BaseLogData & rLogData, const SCItemSlot & rItemSlot ); VOID SetFullItemAddInfo( BaseLogData & rLogData, const SCItemSlot & rItemSlot ); // ¾ÆÀÌÅÛÀÇ ¸ðµç Á¤º¸¸¦ AddInfo¿¡ ³Ö´Â´Ù. VOID SetItemPrice( BaseLogData & rLogData, const SCItemSlot & rItemSlot, BOOL bSell ); // ¾ÆÀÌÅÛÀÇ »óÁ¡¿¡¼­ »ì¶§, ÆÈ¶§ °¡°Ý¸¦ ¼³Á¤ÇÑ´Ù. VOID SetBasePlayerAddInfo( BaseLogData & rLogData, Player* pPlayer ); // Ç÷¹À̾îÀÇ ±âº»Á¤º¸¸¦ AddInfo¿¡ ³Ö´Â´Ù. public: ////////////////////////////////////////////////////////////////////////// // °æÇèÄ¡ ·Î±× // 1. ·¹º§¾÷ ·Î±× void WriteLevelUp( Player* pPlayer, WORD wOldLevel, WORD wNewLevel ); // NOTE: f110602.3L void WritePerkLevelUp(Player* player, int perk_group, LEVELTYPE old_level, LEVELTYPE new_level); // 2. ·¹º§ 50ÀÌ»ó½Ã °æÇèÄ¡ 10µîºÐ ·Î±× void LogExp( Player* pPlayer, WORD wCurLevel, EXPTYPE OldExp, EXPTYPE NewExp, MAPCODE Mapcode = 0); // 3. °æÇèÄ¡ ´Ù¿î void WriteDownExp( Player* pPlayer, EXPTYPE NewExp, EXPTYPE OldExp ); void LogExp( int iLogType, Player * pPlayer, EXPTYPE NewExp, EXPTYPE OldExp ); void LogExp (int log_type, Player* player, EXPTYPE new_exp, EXPTYPE old_exp, const TCHAR* char_name); void LogExpPerk(Player* player, int perk_group, EXPTYPE new_exp, EXPTYPE old_exp); void LogTotalMoney( DWORD64 dw64Money, DWORD64 dw64ToMoney, WORD PlayerNum, DWORD64 dw64PlayerTotalMoney ); void LogTotalWarehouseMoney( DWORD64 dw64Money, DWORD64 dw64ToMoney, WORD PlayerNum, DWORD64 dw64PlayerTotalMoney ); void LogMoney( int iLogType, Player * pPlayer, DWORD64 dw64Money, DWORD64 dw64ToMoney=0, const TCHAR * ptszToUserID = NULL, const TCHAR * ptszToCharName = NULL ); // implemented by _NA_20100901_ADD_GAMELOG_FOR_SYSTEM_MEMO_TYPE = { void LogMemoReward(eSYSTEM_MEMO_TYPE memo_type, Player* player, WORD reward_item_code, ULONGLONG amount_item, const TCHAR* memo_contents); void LogMemoRewardItem(int log_type, Player* player, WORD reward_item_code, WORD amount_item, const TCHAR* memo_contents); void LogMemoRewardMoney(int log_type, Player* player, ULONGLONG amount_item, const TCHAR* memo_contents); // } // ÅëÇÕ ¾ÆÀÌÅÛ ·Î±× void LogItemWarehouse( int iLogType, Player * pPlayer, const SCItemSlot * pItemSlot, DURATYPE byItemNum, SLOTIDX f_idx, POSTYPE f_pos, SLOTIDX t_idx, POSTYPE t_pos ); #ifdef _NA_20110303_ADD_TYPE_OF_NPCSHOP void LogItem(int log_type, Player* player, const SCItemSlot* item_slot, DURATYPE item_num, WORD price_of_goods, SHOPINFO* shop_info); #endif void LogItem(int log_type, Player* player, uint use_count, const SCItemSlot* use_slot, const SCItemSlot* target_slot); void LogItem( int iLogType, Player * pPlayer, const SCItemSlot * pItemSlot, MONEY ullMoney = 0, DURATYPE ItemNum = 1, const TCHAR * ptszToUserID = NULL, const TCHAR * ptszToCharName = NULL, const TCHAR * ptszAddInfo = NULL ); void LogItemEx( int iLogType, Player * pPlayer, const SCItemSlot & rItemSlot1, const SCItemSlot & rItemSlot2, MONEY ullMoney = 0, DURATYPE byItemNum = 1, const TCHAR * ptszToUserID = NULL, const TCHAR * ptszToCharName = NULL ); void GameLog::LogItemEx2( int iLogType, Player * pPlayer, const SCItemSlot & rItemSlot1, MONEY ullMoney, DURATYPE byItemNum, DBWLDSERIAL dwItem2WorldSerial, SLOTCODE Item2Code, DURATYPE Item2Num, const TCHAR * ptszToUserID = NULL, const TCHAR * ptszToCharName = NULL); void 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 ); // AC¾ÆÀÌÅÛ ·Î±× void LogACItem( int iLogType, Player * pPlayer, const SCItemSlot * pItemSlot, float fPercentage ); // ÀÎþƮ ·Î±× void LogEnchant( int iLogType, Player * pPlayer, const SCItemSlot & rItemSlot, MONEY ullMoney, STLX_VECTOR & vecMatInfo, BYTE byDownLV = 0 ); // ·©Å©¾÷ Àü ·Î±× //void LogRankUp_Before( Player* pPlayer, const SCItemSlot & rItemSlot1, const SCItemSlot & rItemSlot2 ); void LogCrystalizeSuccess( Player * pPlayer, const SCItemSlot & rItemSlot, DURATYPE byTotalCount, SLOTCODE * IN pObtainItemCode, DURATYPE * IN pObtainItemNum ); void GameLog::LogCompose( BOOL bSuccess, Player * pPlayer, SCItemSlot * pItemSlot1, DURATYPE byMatCount, sITEM_COMPOSE_LIST::sITEM_FOR_COMPOSE * pMaterials, MONEY ullMoney, DBWLDSERIAL *pSerial = NULL , DURATYPE ComposeNum = 1); void LogFillSocket( Player * pPlayer, const SCItemSlot & rSocketSlot, const SCItemSlot & rTargetSlot, BYTE bySocketLevel, int iAttrIndex, int iValue ); void LogItemExtrackSocket( Player * pPlayer, const SCItemSlot & rTargetSlot, WORD ItemCode, DURATYPE ItemNum ); // ¸ó½ºÅÍ ¾ÆÀÌÅÛ µå¶ø void LogMonsterItemDrop( const SCItemSlot & rItemSlot, DWORD dwMonsterCode, DWORD dwMonsterLevel, WORD wMapCode, const WzVector& vecPos, KEYTYPE RoomKey ); void LogMonsterMoneyDrop( int iLogType, DWORD64 dw64Money, DWORD dwMonsterCode, DWORD dwMonsterLevel, WORD wMapCode, const WzVector& vecPos, KEYTYPE RoomKey ); void LogUseStorageItem(int iLogType, Player* player, SLOTCODE item_code, uint item_count, uint date_time); void LogMultiItem( int iLogType, Player * pPlayer, DURATYPE byCount, WORD * pItemCode IN, POSTYPE * pItemNum IN, DWORD * pDateTime = NULL IN ); void LogShopItem( int iLogType, Player * pPlayer, DWORD dwPriceGuid, DWORD dwTransactionGuid, DWORD dwErrorCode ); void LogShop_RecvItem( int iLogType, Player * pPlayer, DWORD GiftGuid, DWORD dwResult ); void 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 ); //_KR_0_20091021_FIRENDINVITATION_EXTEND //Ä£±¸ Ãßõ ½Ã½ºÅÛ¿¡¼­ º¸»ó ¾ÆÀÌÅÛÀ» ¹Þ¾ÒÀ»¶§ ·Î±× ÀÛ¼º void LogItemInvitatedFriendReward( Player * pPlayer, BYTE ItemCount, SLOTCODE RewardItemCode, LEVELTYPE RewardLevel); //////////////////////////////////////////////////////////////////////////// //// ½º³À¼¦ //// 14. â°í Á¤º¸ void WriteWareHouseInfo( Player* pPlayer, BOOL bOpen ); // ½º³À¼¦ ·Î±× void LogSnapShot( Player* pPlayer ); //LogSnapShot·Î±×·Î ´ëü //void LogInvenInfo( int iLogType, Player* pPlayer ); ////////////////////////////////////////////////////////////////////////// void LogAction( int iLogType, Player * pPlayer, Player* pOtherPlayer=NULL, DWORD64 dwReservedData1=0, DWORD64 dwReservedData2=0 ); void LogSimpleAction( int iLogType, Player* pPlayer, const TCHAR* tszAddInfo = NULL ); void LogAction_Ranking( int iLogType, Player * pPlayer, RANKINGNO MissionNo, BYTE Ranking, DWORD ClearTime, BYTE Error ); #ifdef _NA_008119_20150310_CHECK_ONESHOT_ONEKILL_SITUATION //Ç÷¹À̾ ų/µ¥½º¸¦ À§ÇÑ ·Î±×¾²±âÇÔ¼ö void LogAction_PK(int iLogType, Player * pPlayer, Player* pOtherPlayer=NULL, DAMAGETYPE _damage_value = 0); #endif //_NA_008119_20150310_CHECK_ONESHOT_ONEKILL_SITUATION void LogKillSpecialMonster( Player * pPlayer, MONSTERCODE MonCode, BYTE MonsterType ); void LogFatigue( Player* pPlayer ); void LogRankingPoint( Player *pPlayer, DWORD GetPoint, DWORD SumPoint ); //gamelulu_dev_note : Á¡·ÉÀü ¾ÆÀÌÅÛ ÀÔÂû ·Î±× void LogDomination(int iLogType, Player * player, SLOTCODE item_code, BYTE item_num, MAPCODE map_code); void LogDomination(int iLogType, MAPCODE mapCode); void LogDomination(int iLogType, Player* pPlayer, NPC* pNpc, BYTE gate1=0, BYTE gate2=0, BYTE gate3=0); #ifdef _NA_1419_20100121_ACCUMULATE_POINT // Àû¸³ Æ÷ÀÎÆ® ·Î±× void LogAccumulatePoint( int iLogType, Player* pPlayer, WORD IncreasePoint, SLOTCODE RewardItemCode = 0 ); void LogAccumulatePoint_GM( int iLogType, Player* pPlayer, WORD IncreasePoint, SLOTCODE RewardItemCode = 0 ); #endif //C_NA_0_20100520_ACSYSTEM_CHANGED void SetAchievementInfo(WORD location, WORD index_number); #ifdef _NA004034_20120102_POINT_WALLET_SYSTEM void LogPointWallet( Player* pPlayer, eLOG_ACTION action_type, DWORD point_code, \ DWORD previous_point, DWORD point_diffrence, DWORD current_point ); #endif //_NA004034_20120102_POINT_WALLET_SYSTEM //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND void LogChaosZone(eLOG_ACTION log_type, Player* player, const TCHAR* target_character_name = NULL, const TCHAR * add_info = NULL); #ifdef _JP_007387_20140702_GAMELOG_GOLDRUSH_GOLDPOINT void LogGoldRush(eLOG_ACTION log_type, Player* player, WORD changed_point, WORD total_point, MONSTERCODE monster_code = 0, const TCHAR * add_info = NULL); #endif //_JP_007387_20140702_GAMELOG_GOLDRUSH_GOLDPOINT #ifdef _NA_007237_20140519_GAMELOG_DONATION_GUILDCOIN void LogGuild(eLOG_ACTION log_type, Player* player, const WORD donated_point, const TCHAR* add_info = NULL); #endif //_NA_007237_20140519_GAMELOG_DONATION_GUILDCOIN #ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION void LogGuildFacility(eLOG_ACTION log_type, Player* player, GameGuild* const guild, FCODE code, FLEVEL level); #endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION #ifdef _NA_007086_20140318_MONSTERBOOK void LogMonsterBook(eLOG_ACTION log_type, Player* player, MONSTERCODE monster_code); #endif //_NA_007086_20140318_MONSTERBOOK #ifdef _NA_007750_20141113_WZDAT_MODIFY_LOG void LogWzDat(eLOG_ACTION log_type, const TCHAR* add_info = NULL); #endif // _NA_007750_20141113_WZDAT_MODIFY_LOG #ifdef _NA_008124_20150313_AWAKENING_SYSTEM // °¢¼º Àåºñ ·Î±× void 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); void LogEvolution(int iLogType, Player * pPlayer, const CODETYPE result_item_code, const CODETYPE prev_item_code, const CODETYPE additive_item_code); #endif // _NA_008124_20150313_AWAKENING_SYSTEM #ifdef _NA_008299_20150519_MAX_DAMAGE_LOG // ÃÖ´ë µ¥¹ÌÁö ·Î±× Damaged¿¡¼­ È£ÃâµÇ¾î attacker¸¦ ±âÁØÀ¸·Î ³²±ä´Ù void LogMaxDamage(eLOG_ACTION log_type, Character* attacked_character, Character* attacker, DamageArgs* damage_arg); #endif // _NA_008299_20150519_MAX_DAMAGE_LOG #ifdef _NA_008334_20150608_SONNENSCHEIN VOID LogSonnenSchein(eLOG_ACTION log_type, GUILDGUID guild_guid, Player* player); #endif //_NA_008334_20150608_SONNENSCHEIN //_NA_008506_20150923_LOG_LOGOUT_IN_GAMESERVER VOID LogLogout(Player* player); // À¯Àú¾×¼Ç ·Î±× // 1. ºÎȰ ·Î±× void WritePlayerResurrection( Player* pPlayer, Player *pHealer ); // 2. »ç¸Á ·Î±× void WritePlayerDead( Player* pPlayer, MAPCODE Mapcode = 0 ); // 4. ½ºÅÝ»ç¿ë ·Î±× void WriteUseStat( Player* pPlayer, BYTE byStatType ); // 7. ½ºÅ³·¹º§¾÷ void WriteSkillLevelUp( Player* pPlayer, SLOTCODE SkillCode, BOOL bLevelUp ); // 8. PVP( bKillÀÌ TRUE¸é ³»°¡ Á×ÀΰŰí, FALSE¸é »ó´ë¹æ¿¡°Ô ³»°¡ Á×ÀΰŴÙ. ) void WritePVPKillUser( Player* pPlayer, Player* pOtherPlayer, BOOL bKill ); // 9. PVP ½ÃÀÛ void WritePVPStart( Player* pPlayer ); void WriteSkillLevelDown( Player* pPlayer, SLOTCODE SkillCode, BOOL bLevelDown ); //< bLevelDownÀÌ FALSE ¸é UNLEARN void WriteDecreaseStat( Player* pPlayer, BYTE byStatType, SHORT Decrease ); void WriteInitStatAll( Player* pPlayer, eLOG_ACTION eLogAction ); void CharacterChangeUpLog( Player* pPlayer, BYTE byClassType, BYTE byChangeUpCode ); ////////////////////////////////////////////////////////////////////////// // ¼¼¼Ç ·Î±× // 4. ij¸¯ÅÍ Á¢¼Ó void WriteCharConnect( Player* pPlayer ); ////////////////////////////////////////////////////////////////////////// // GM·Î±× void WriteAccount( Player* pPlayer ); // ¾îÄ«¿îÆ® void WriteEntrance( Player* pPlayer ); // ÀÔÀå void WriteTransparent( Player* pPlayer ); // Åõ¸í void WriteInvincibility( Player* pPlayer ); // ¹«Àû void WriteRoomInfo( Player* pPlayer, DWORD dwRoomKey ); // ¹æÁ¤º¸ void WriteSpeed( Player* pPlayer ); // ¼Óµµ void WriteRebirth( Player* pPlayer ); // ºÎȰ void WriteRemovalItem( Player* pPlayer ); // ¾ÆÀÌÅÛÁ¦°Å void WriteRemovalMonster( Player* pPlayer ); // ¸ó½ºÅÍÁ¦°Å void WriteRecovery( Player* pPlayer ); // ȸº¹ void WriteLevelUp( Player* pPlayer, WORD wOldLevel ); // ·¹º§¾÷ void WriteStatPointUp( Player* pPlayer, WORD wPlusPoint ); // ½ºÅݾ÷ void WriteSkillPointUp( Player* pPlayer, WORD wSkillPoint ); // ½ºÅ³Æ÷ÀÎÆ®¾÷ void WriteCreateMonster( Player* pPlayer, DWORD dwMonsterCode, WORD wMonsterCount ); void WriteRemoval( Player* pPlayer, const TCHAR* pszMonsterName ); // Á¦°Å void WriteCreateItem( Player* pPlayer, WORD wItemCode, WORD wItemCount ); // »ý¼º void WriteCreateHeim( Player* pPlayer, MONEY amount ); // ÇÏÀÓ void WriteKill( Player* pPlayer, const TCHAR* pszMonsterName ); // ų void LogGM( int nLogType, Player* pPlayer ); ////////////////////////////////////////////////////////////////////////// // Á¤±âÀûÀÎ °ÔÀÓ·Î±× void StartRegularLog( int nLogType ); ////////////////////////////////////////////////////////////////////////// // Á¤±âÀûÀÎ °ÔÀÓ·Î±× ¾²·¹µå friend unsigned int __stdcall SkillWorkThread(void* pArg); ///////////////////////////////////////////////////////////////////////// //Àüó¸® void PreProcess(); };