#ifndef __SERVER_STRUCT_H__ #define __SERVER_STRUCT_H__ #include #include #include #include //#include //================================================================================================== // @history // ~11.05.21 // 11.05.21, waverix, remove pack directive //================================================================================================== // (WAVERIX)(WARNING)(070525) // MAX_WORLD_NAME_LEN = define.h¿¡µµ Á¤ÀǵǾî ÀÖÀ¸¸ç, 32·Î µÇ¾î ÀÖÀ½. // ¾Æ·¡ Àü󸮱â´Â »ç¿ëÇÏÁö ¾ÊÀ¸¹Ç·Î Á¦°Å //#define MAX_WORLD_NAME_LEN 16 // (WAVERIX) (090728) (ADD-IN) ºÏ¹Ì¸¦ ÇʵηΠ¼¥¼­¹ö¿¡ UserID(unified:50)¸¦ º¸³»´Â ·ÎÁ÷ÀÌ Ãß°¡µÈ´Ù. // °¢ ¹öÀü¿¡ ¸ÂÃç ÀÛ¾÷ÇÒ Çʿ䰡 Á¸ÀçÇÏ°Ô µÇ¾ú´Ù. // (reference) __NA000000_SHOP_USERID_50_PASSING_PROC__ #define ID_MAX_LEN_FOR_SHOP_USER_ID (50) #define PARSER_END_ROW_KEY 7777 #ifdef _NA_0_20100819_AGGRO_RENEWAL #define AGGRO_CHANGE_RATIO_MAX 2 #endif #pragma warning(push) #pragma warning(disable : 4201) typedef struct tagSERVER_KEY { union { struct { BYTE m_WorldID; BYTE m_ChannelID; BYTE m_ServerType; BYTE m_ServerID; }; DWORD m_dwKey; }; tagSERVER_KEY( const DWORD key = 0 ) { m_dwKey = key; } tagSERVER_KEY( BYTE worldID, BYTE channelID, BYTE serverType, BYTE serverID ) { Set(worldID, channelID, serverType, serverID); } operator DWORD() { return m_dwKey; } DWORD Set( BYTE worldID, BYTE channelID, BYTE serverType, BYTE serverID ) { m_WorldID = worldID; m_ChannelID = channelID; m_ServerType = serverType; m_ServerID = serverID; return m_dwKey; } DWORD GetOldServerKey() { // (NOTE) (WAVERIX) À߸øµÈ 󸮸¦ ¼öÇàÇÑ´Ù. Á¤¸» ¹Ý¼ºÇØ¾ß ÇÑ´Ù. Áö±Ý ¿Í¼­ ¹Ù²Ü ¼öµµ ¾ø´Ù. return (((m_dwKey)&0x000000FF << 24) | ((m_dwKey)&0x0000FF00 << 8) | ((m_dwKey)&0x00FF0000 >> 8) | ((m_dwKey)&0xFF000000 >> 24)); //or //return ((m_ServerID << 24) | (m_ServerType << 16) | (m_ChannelID >> 8) | (m_WorldID)); } BYTE GetWorldID() const { return m_WorldID; } BYTE GetChannelID() const { return m_ChannelID; } BYTE GetServerType() const { return m_ServerType; } BYTE GetServerID() const { return m_ServerID; } } SERVER_KEY, *LPSERVER_KEY; #pragma warning(pop) typedef struct tagSERVER_INFO { SERVER_KEY ServerKey; DWORD dwServerGUID; char szIP[MAX_IP_STRING_LEN+1]; WORD wPort; char szInnerIP[MAX_IP_STRING_LEN+1]; WORD wInnerPort; } SERVER_INFO, *LPSERVER_INFO; typedef struct tagGLOBAL_SERVER_INFO_STRUCT { CHAR szMasterIP[MAX_IP_STRING_LEN+1]; SERVER_KEY skServerKey; CHAR szPublicIP[MAX_IP_STRING_LEN+1]; WORD wPublicPort; CHAR szNatIP[MAX_IP_STRING_LEN+1]; CHAR szInnerIP[MAX_IP_STRING_LEN+1]; WORD wInnerPort; } GLOBAL_SERVER_INFO_STRUCT, *LPGLOBAL_SERVER_INFO_STRUCT; struct SERVER_CHARACTER_PART { CHARGUID m_CharGuid; BYTE m_bySlot; TCHAR m_tszCharName[MAX_CHARNAME_LENGTH+1]; //< Agent¿¡¼­ ¹Ù·Î »ç¿ëÇϱâ À§ÇØ BYTE m_byHeight; BYTE m_byFace; BYTE m_byHair; BYTE m_byClass; LEVELTYPE m_LV; BYTE m_CharState; INT m_iRegion; SHORT m_sX; SHORT m_sY; SHORT m_sZ; BYTE m_ChangeOfClassStep; // ±æµå Á¤º¸ : 2005/12/28(taiyo) GUILDGUID m_GuildGuid; eGUILD_DUTY m_eGuildDuty; TCHAR m_tszGuildNicName[MAX_CHARNAME_LENGTH+1]; //__NA001084_PET_IMAGE_DRAW_IN_CHARACTER_SELECT_SCREEN ITEMSTREAMEX m_PetSlotStream; BOOL m_bSummoned; // °¡º¯ ±æÀÌ ÀåÂøÃ¢ Á¤º¸ _EQUIP_TOTAL_INFO m_EquipItemInfo; BYTE m_DelChk; TCHAR m_tszDelDate[MAX_SMALLDATETIME_SIZE+1]; // f100929.4L, removed an unused section //STATE_DETAIL_TOTAL_INFO m_TotalStateInfo; #ifdef _NA_002050_20110216_ADD_GENDER BYTE gender; // ¼ºº° #endif #ifdef _NA_003027_20111013_HONOR_SYSTEM WORD honor_title; #endif //_NA_003027_20111013_HONOR_SYSTEM #ifdef _NA_004035_20120227_COSTUME_ITEM bool is_equipped_costume; // ÄÚ½ºÆ¬ Ȱ¼ºÈ­ ¿©ºÎ POSTYPE costume_item_pos; // ÄÚ½ºÆ¬ Àκ¥Å丮 À§Ä¡ SLOTCODE costume_item_code; // ÄÚ½ºÆ¬ ¾ÆÀÌÅÛ ¹øÈ£ #ifdef _NA_008610_20160104_ADD_DECORATECOSTUME bool is_equipped_deco_costume; // µ¥ÄÚ ÄÚ½ºÆ¬ Ȱ¼ºÈ­ ¿©ºÎ POSTYPE deco_costume_item_pos; // µ¥ÄÚ ÄÚ½ºÆ¬ Àκ¥Å丮 À§Ä¡ SLOTCODE deco_costume_item_code; // µ¥ÄÚ ÄÚ½ºÆ¬ ¾ÆÀÌÅÛ ¹øÈ£ #endif //_NA_008610_20160104_ADD_DECORATECOSTUME #endif // _NA_004035_20120227_COSTUME_ITEM //---------------------------------------------------------------------------------------------- void Output(ArchiveOfStream& archive); void Input(ArchiveOfStream& archive); }; typedef struct tagLOGOUT_AUTH_DATA { DWORD dwAuthUserID; // AuthServer¿¡¼­ ¹ß±ÞÇÑ ½Äº°ÀÚ #ifdef __CH1305_090303_ACCOUNT_ID_LENGTH_EXTENTION__ char szAccountID[ID_MAX_LEN + 1]; // °èÁ¤ ¾ÆÀ̵ð #else char szAccountID[ID_MAX_LEN]; // °èÁ¤ ¾ÆÀ̵ð #endif char szPCName[MAX_CHARNAME_LENGTH]; // ij¸¯ÅÍ À̸§ =>Ŭº£ÀÌÈÄ »èÁ¦ ¿¹Á¤->DBA¿äû¿¡ ÀÇÇÑ ÀÓ½Ã!! WORD wSvrCode; // ¼­¹ö ÄÚµå WORD wPCLevel; // ij¸¯ÅÍ ·¹º§ =>Ŭº£ÀÌÈÄ »èÁ¦ ¿¹Á¤->DBA¿äû¿¡ ÀÇÇÑ ÀÓ½Ã!! BYTE byPCClass; // ij¸¯ÅÍ Å¬·¡½º =>Ŭº£ÀÌÈÄ »èÁ¦ ¿¹Á¤->DBA¿äû¿¡ ÀÇÇÑ ÀÓ½Ã!! BYTE byLogoutType; // ·Î±×¾Æ¿ô ŸÀÔ TCHAR pszLoginTime[MAX_TIMEDATA_SIZE]; } LOGOUT_AUTH_DATA, *LPLOGOUT_AUTH_DATA; struct SUNLOG_INFO { BYTE bySunLogOption; WORD wSunLogfileLevel; char pszSunLogfilePath[MAX_LOGPATH_LEN]; }; struct INI_IOHANDLER_DESC { char szIP[MAX_IPADDRESS_SIZE]; WORD wPort; DWORD dwMaxAcceptSession; DWORD dwMaxConnectSession; DWORD dwSendBufferSize; DWORD dwRecvBufferSize; DWORD dwTimeOut; DWORD dwNumberOfAcceptThreads; DWORD dwNumberOfIoThreads; DWORD dwNumberOfConnectThreads; DWORD dwMaxPacketSize; }; struct SERVER_ENV { //Common Description BOOL bGetServerInfoFromFile; BOOL bGMListApply; BYTE byFieldServerType; BYTE byBattleServerType; BOOL bVillageRenderInfo; BYTE byServiceMode; //¼­ºñ½º ¸ðµå °ü·Ã 0:Äָܼðµå, 1:¼­ºñ½º ¸ðµå....... BYTE byAgeGrade; //0 : 18¼¼¹Ì¸¸,, 1 : 18¼¼ÀÌ»ó ... BYTE byServerStatus; //0 : °³¹ß¿ë ¼­¹ö, 1: ¼­ºñ½º(¶óÀ̺꼭¹ö) ¼­¹ö // IOCP ¼³Á¤ INI_IOHANDLER_DESC ClientIoHandler; INI_IOHANDLER_DESC ServerIoHandler; char pszMasterServerIP[ MAX_IPADDRESS_SIZE ]; WORD wMasterServerPort; char pszAccountDBProxyServerIP[ MAX_IPADDRESS_SIZE ]; WORD wAccountDBProxyServerPort; char pszGameDBProxyServerIP[ MAX_IPADDRESS_SIZE ]; WORD wGameDBProxyServerPort; char pszAgentServerOutSideIP[ MAX_IPADDRESS_SIZE ]; WORD wAgentServerOutSidePort; char pszAgentServerInSideIP[ MAX_IPADDRESS_SIZE ]; WORD wAgentServerInSidePort; char pszPortalServerIP[ MAX_IPADDRESS_SIZE ]; WORD wPortalServerPort; BOOL bEnableAuthAgentServer; WORD wAgentServerID; char pszAuthAgentServerIP[ MAX_IPADDRESS_SIZE ]; WORD wAuthAgentServerPort; char pszWorldServerIP[ MAX_IPADDRESS_SIZE ]; WORD wWorldServerPort; char pszWorldServerClientIP[ MAX_IPADDRESS_SIZE ]; WORD wWorldServerClientPort; char pszGuildServerIP[ MAX_IPADDRESS_SIZE ]; WORD wGuildServerPort; char pszSQLServerIP[ MAX_IPADDRESS_SIZE ]; //WOPS_LOG char pszLogPath[MAX_LOGPATH_LEN]; //·Î±×ÆÄÀÏ °æ·Î ÀúÀå º¯¼ö BYTE byLogOption; //½ã·Î±×°ü·Ã Á¤º¸ BYTE bySunLogOption; BYTE bySunLogfileLevel; char pszSunLogfilePath[MAX_LOGPATH_LEN]; DWORD dwServerInfoCycle; }; // ¼­¹ö ȯ°æ º¯¼ö struct SERVER_COMMON_OPTION { // HP, MP ¸®Á¨ Áֱ⠰ü·Ã WORD m_wPLAYER_HP_REGEN_PERIOD; // Ç÷¹À̾î HP ¸®Á¨ ÁÖ±â WORD m_wPLAYER_MP_REGEN_PERIOD; // Ç÷¹À̾î MP ¸®Á¨ ÁÖ±â //{__NA_001290_20090525_SHIELD_SYSTEM WORD m_wPLAYER_SD_REGEN_PERIOD; // Ç÷¹À̾î SD ¸®Á¨ ÁÖ±â WORD player_fp_regen_period; // Ç÷¹À̾î FP ¸®Á¨ ÁÖ±â WORD player_fp_maintain_time; // Ç÷¹À̾î FP À¯Áö½Ã°£ WORD m_wPLAYER_FIGHTING_TIME; // Ç÷¹À̾î ÀüÅõ »óÅ ½Ã°£ WORD m_wNPC_FIGHTING_TIME; // NPC ÀüÅõ »óÅ ½Ã°£ //} // °ø°Ý °ü·Ã float m_fETHER_SPLASH_DAMAGE_RATIO; // ¹ß۸® ¿¡Å׸£ ¿þÆù ½ºÇ÷¡½¬ µ¥¹ÌÁö ºñÀ² float m_fSTYLE_SPLASH_DAMAGE_RATIO; // ÀÏ¹Ý ½ºÅ¸ÀÏ ½ºÇ÷¡½¬ µ¥¹ÌÁö ºñÀ² // ±âŸ WORD m_wMAX_ROOM_COUNT; // ¹èƲ¼­¹ö Çϳª´ç ÃÖ´ë ¹æ°³¼ö Á¦ÇÑ float m_fFINDPATH_JUMPLIMIT; // ±æÃ£±â JumpLimit WORD m_wFINDPATH_MAX_DISTANCE; // ±æÃ£±â ÃÖ´ë °Å¸® WORD m_wFINDPATH_MAX_NODE_COUNT; // ±æÃ£±â ÃÖ´ë ³ëµå°³¼ö BYTE m_byGRID_MOVEINFO_DISTANCE; // ÁÖº¯ ij¸¯ÅÍ Á¤º¸ Àü¼Û½Ã À̵¿Á¤º¸¸¦ ÁÖ´Â ÃּҰŸ® // °æÀïÇåÆÃ ÀÚµ¿¸ÅĪ Á¦¾î BYTE m_byMATCHING_LEVEL_LIMIT; // ·¹º§ Á¦¾î BYTE m_byMATCHING_WIN_RATIO; // ½Â·ü Á¦¾î BYTE m_byMATCHING_MIN_USER_NUM; // ¸ÅĪ¿¡ ÇÊ¿äÇÑ ÃÖ¼Ò À¯Àú¼ö // °æÀïÇåÆÃ Ç÷¹ÀÌ ½Ã°£ DWORD m_dwTIMEATTACK_PLAY_TIME; // ŸÀÓ¾îÅà Ç÷¹ÀÌ Å¸ÀÓ DWORD m_dwSURVIVAL_PLAY_TIME; // ¼­¹ÙÀ̹ú Ç÷¹ÀÌ Å¸ÀÓ // À̵¿µ¿±â °ü·Ã °Å¸®Â÷ BYTE m_byMOVE_SYNC_WARNING_DISTANCE; // ¼­¹ö¿Í Ŭ¶ó°£ÀÇ Ç÷¹À̾î À§Ä¡ °æ°í °Å¸®(À̵¿ Çã¿ë) BYTE m_byMOVE_SYNC_FAIL_DISTANCE; // ¼­¹ö¿Í Ŭ¶ó°£ÀÇ Ç÷¹À̾î À§Ä¡ ½ÇÆÐ °Å¸®(À̵¿ ½ÇÆÐ) BYTE m_byMOVE_SYNC_THRUST_DISTANCE; // ¼­¹ö¿Í Ŭ¶ó°£ÀÇ Æ®·¯½ºÆ®(¹Ð¸®±â) ÃÖ´ë °Å¸® BYTE m_byMOVE_SYNC_HACKING_DISTANCE; // ¼­¹ö¿Í Ŭ¶ó°£ÀÇ Ç÷¹À̾î À§Ä¡ ÇØÅ· °Å¸®(À̵¿ ½ÇÆÐ ¹× ÇØÅ·À¸·Î °£ÁÖ) WORD m_wFORCED_WARP_MOVE_DELAY; // ¼­¹ö¿¡¼­ Ç÷¹ÀÌ¾î °­Á¦ ¿öÇÁ½Ã À̵¿ µô·¹ÀÌ // PC¹æ °æÇèÄ¡ Ãß°¡ float m_fPCBANG_BONUS_EXP_RATIO; // PC¹æ °æÇèÄ¡ Ãß°¡ ºñÀ² BYTE m_byUseItemShopBattle; // ¹èƲ¼­¹ö¿¡¼­ ¾ÆÀÌÅÛ ¼¥À» ¾µ¼ö ÀÖ°Ô ÇÒ °ÍÀΰ¡? BYTE m_byPCBangSuperBangMasterAddExp; // PC¹æ ½´ÆÛ¹æ ¹æÀå Ãß°¡ °æÇèÄ¡ BYTE m_byPCBangSuperBangNormalAddExp; // PC¹æ ½´ÆÛ¹æ ÀϹÝÀÎ Ãß°¡ °æÇèÄ¡ BYTE m_byItemSuperBangMasterAddExp; // ¾ÆÀÌÅÛ ½´ÆÛ¹æ ¹æÀå Ãß°¡ °æÇèÄ¡ BYTE m_byItemSuperBangNormalAddExp; // ¾ÆÀÌÅÛ ½´ÆÛ¹æ ÀϹÝÀÎ Ãß°¡ °æÇèÄ¡ BYTE m_byPCBangApplyBenefit; // PC¹æ ÇýÅà Àû¿ë À¯¹« BYTE m_byApplyItemOwnerShipByLevel; // ¸ó½ºÅÍ¿ÍÀÇ ·¹º§Â÷¿¡ ÀÇÇÑ ¾ÆÀÌÅÛ¼ÒÀ¯±ÇÀ» Àû¿ëÇÒ °ÍÀΰ¡? BYTE m_byGuildPVPUserCount; // ±æµå PVP½Ã Àοø¼ö WORD m_wVIEWPORT_MAX_USER_COUNT; // ÁÖº¯¿¡ º¸ÀÌ´Â ÃÖ´ë À¯Àú¼ö WORD m_WVIEWPORT_UPDATE_TIME; // ÁÖº¯ À¯ÀúÁ¤º¸¸¦ °»½ÅÇÏ´Â ÁÖ±â BOOL m_byInsDungeonUseConOpt; // Ä«¿ÀÄɸ¯ÀÇ ÀνºÅϽº´øÀü ÀÌ¿ë °¡´É ¼³Á¤ ¿É¼Ç BOOL m_byLoobyUseConOpt; // Ä«¿ÀÄɸ¯ÀÇ ·Îºñ ÀÌ¿ë °¡´É ¼³Á¤ ¿É¼Ç BOOL m_bItemPickUpMsgBrd; // ¾ÆÀÌÅÛ½Àµæ ¸Þ¼¼Áö ÁÖÀ§¿¡°Ô ºê·Îµå ¿©ºÎ. BOOL m_bItemPickUpPartyMsgBrd; // ¾ÆÀÌÅÛ½Àµæ ¸Þ¼¼Áö ÆÄƼ¿øµé¿¡°Ô ºê·Îµå ¿©ºÎ. WORD m_wABUSE_MIN_CLIENT_LOADING_TIME; // Á¤»ó Ŭ¶ó¶ó¸é ¸Ê·Îµù¿¡ ÀÌÁ¤µµÀÇ ½Ã°£Àº °É¸°´Ù //__NA000000_081110_LIVE_SERVICE_TEST_CLINET_SUPPORT__ - unused section BOOLEAN m_bApplyTestClientAccept_UserID; CHAR m_pszTestClientAccept_UserID[ID_MAX_LEN+1]; // ¶óÀ̺꿡¼­ ƯÁ¤ À¯Àú¿¡ ´ëÇÑ C/Sº¸¾È ü°è ¿ÏÈ­ ó¸® ¸ñÀû //__NA001283_20090225_COLLECTION_USE DWORD m_DelayCollectionRespawnTime; DWORD m_DelayDropTime; #if !defined(_NA_20110610_MOVE_DOMINATION_CHANNEL_INFO) BYTE m_byDominationChannel; //_NA001385_20090924_DOMINATION_ETC #endif #ifdef _NA_007135_20140402_MODIFY_BATTLE_GROUND_RESERVATION_AVAILABLE_IN_BATTLE_GROUND_CHANNEL int m_byBattleGroundChannel; //ÀüÀå ¿¹¾à °¡´É ä³Î ¼³Á¤ #endif #ifdef _NA_0_20100929_LANGUAGE_OF_FILTER BYTE m_byLanguageOfFilter; #endif #ifdef _NA_006088_20120910_CHAOS_ZONE_FREE_PVP BYTE free_pvp_max_room_count; // ÀÚÀ¯ÀüÅõ½Ç ÃÖ´ë ¹æ °¹¼ö Á¦ÇÑ. BYTE free_pvp_max_user_count; // ÀÚÀ¯ÀüÅõ½Ç ÃÖ´ë À¯Àú Á¦ÇÑ. #endif // _NA_006088_20120910_CHAOS_ZONE_FREE_PVP #ifdef _NA_007992_20150127_EVENT_MONSTER_INVASION BYTE monster_invasion_channel; //¸ó½ºÅÍħ°ø ä³Î ¼³Á¤ #endif //_NA_007992_20150127_EVENT_MONSTER_INVASION #ifdef _NA_008012_20150204_SUN_RANKING_SYSTEM BYTE sun_ranking_settle_channel; #endif // _NA_008012_20150204_SUN_RANKING_SYSTEM #ifdef _NA_008069_20150210_ADD_SPA_SYSTEM BYTE spa_field_channel; #endif //_NA_008069_20150210_ADD_SPA_SYSTEM //_NA_000000_20130429_DOMINATION_PENALTY struct { WORD minimum_participation_members; // Á¡·ÉÀü ÆÐ³ÎƼ Âü¿© ÃÖ¼Ò Àοø¼ö WORD penalty_days_of_offence_fail; //°ø¼º ½ÇÆÐ½Ã ÀÔÂû ºÒ°¡ ÆÐ³ÎƼ ±â°£(ÀÏ) WORD penalty_days_of_defense_fail; // ¼ö¼º ½ÇÆÐ½Ã ÀÔÂû ºÒ°¡ ÆÐ³ÎƼ ±â°£(ÀÏ) } domination_penalty; }; struct SERVER_POOL_OPTION { BYTE m_byIndex; // À妽º char m_szServerName[16]; // ¼­¹ö±¸ºÐ WORD m_wPlayerPool; WORD m_wNPCPool; WORD m_wItemPool; WORD m_wMapObjectPool; WORD m_wMapNPCPool; WORD m_wMerchantPool; WORD m_wPlayerSkillPool; WORD m_wNPCSkillPool; WORD m_wAbilityPool; WORD m_wPartyPool; WORD m_wSummonPool; WORD m_wStatusPool; WORD m_wCoolTimerCharPool; WORD m_wMapPool; WORD m_wSectorPool; WORD m_wTradePool; WORD m_wObjGroupPool; // ½½·Ô Ç® WORD m_wItemSlotPool; WORD m_wSkillSlotPool; WORD m_wQuickSlotPool; WORD m_wQuickStyleSlotPool; WORD m_wTradeSlotPool; WORD m_wVendorSlotPool; WORD m_wEventSlotPool; // ÆÄ¼­ Ç® WORD m_wItemInfo; WORD m_wNPCInfo; WORD m_wMapInfo; WORD m_wShopInfo; WORD m_wSkillInfo; WORD m_wRegenInfo; WORD m_wGroupInfo; WORD m_wStateInfo; WORD m_wItemCompInfo; WORD m_wItemCompResultInfo; WORD m_wMissionRewardInfo; WORD m_wFormulaRatioInfo; WORD m_wStyleQuickInfo; WORD m_wAITypeInfo; }; struct AI_COMMON_INFO { // Battle Record °ü·Ã BYTE m_byDAMAGE_POINT_REDUCE_RATIO; // µ¥¹ÌÁö Æ÷ÀÎÆ® »è°¨·ü WORD m_wMIN_DAMAGE_POINT; // ÃÖ¼Òµ¥¹ÌÁö Æ÷ÀÎÆ®(ÃÖ¼Òµ¥¹ÌÁö Æ÷ÀÎÆ® ÀÌÇÏÀÌ¸é Æ÷ÀÎÆ®°¡ »è°¨µÉ ¶§ 0À¸·Î ÃʱâÈ­µÈ´Ù.) // ¼Òȯ °ü·Ã float m_fSUMMON_FOLLOW_DISTANCE; // ¼Òȯü°¡ ¼ÒȯÀÚ¸¦ µû¶ó´ó±â´Â °Å¸® float m_fSUMMON_MAX_FOLLOW_DISTANCE; // ¼Òȯü°¡ ÅÚ·¹Æ÷Æ®ÇÏ´Â °Å¸® // »óÅ Áֱ⠽ð£ WORD m_wKNOCKDOWN_TIME; // ´Ù¿î À¯Áö ½Ã°£ WORD m_wTHRUST_TIME; // ¹Ð¸®±â À¯Áö ½Ã°£ // °Å¸® °ü·Ã float m_fMIN_MOVE_DISTANCE; // Çѹø¿¡ À̵¿ÇÏ´Â ÃּҰŸ®(Wander, Return, RunAway ...) float m_fMAX_MOVE_DISTANCE; float m_fMIN_MOVABLE_DISTANCE; // À̼öÄ¡ ÀÌÇÏÀ̸é À̵¿À» ¾ÈÇÑ´Ù. float m_fGROUP_FOLLOWER_MIN_RADIUS; // ±×·ì¸ó½ºÅÍ ¸â¹öµéÀÌ ¸®´õ·ÎºÎÅÍ µû¶ó´ó±â´Â ÃÖ¼Ò¹üÀ§ float m_fGROUP_FOLLOWER_MAX_RADIUS; #if !defined(_NA_003649_20111115_BATTLE_ZONE_HARDMODE) float m_fMOVE_HEIGHT_LIMIT; // ¸ó½ºÅÍ À̵¿ ³ôÀÌ Á¦ÇÑ(ÀÏÁ¤ ³ôÀÌ ÀÌ»ó ¸ø ¿Ã¶ó¿Â´Ù) #endif //_NA_003649_20111115_BATTLE_ZONE_HARDMODE float m_fSIGHT_HEIGHT_LIMIT; // ½Ã¾ß ³ôÀÌ Á¦ÇÑ(ÀÏÁ¤ ³ôÀÌ Â÷À̰¡ ³ª¸é ¸ó½ºÅͰ¡ ¾Ë¾ÆÂ÷¸®Áö ¸øÇÑ´Ù) float m_fATTACK_RANGE_HEIGHT_RATIO; // »ç°Å¸® ³ôÀÌÀû¿ë ºñÀ² // Á¡ÇÁ »óÅ float m_fJUMP_MIN_HEIGHT; // Á¡ÇÁ°¡´ÉÇÑ ÃÖ¼Ò ³ôÀÌ float m_fJUMP_MAX_HEIGHT; float m_fJUMP_MIN_DISTANCE; float m_fJUMP_MAX_DISTANCE; float m_fJUMP_ATTACK_MIN_DISTANCE; float m_fJUMP_ATTACK_MAX_DISTANCE; float m_fJUMP_ATTACK_RANGE_RATIO; // Á¡ÇÁ¸ñÀûÁö °è»ê½Ã °ø°Ý»ç°Å¸® ¸¸Å­ ÆÄ°íµå´Â ºñÀ² // FallApart »óÅ float m_fFALLAPART_MIN_ATTACK_RANGE_LIMIT;// ÃÖ¼Ò °ø°Ý»ç°Å¸®, À̰Ÿ®º¸´Ù °¡±î¿ì¸é ¸ó½ºÅÍ´Â ÇÑ¹ß ¹°·¯³­´Ù. // Retreat »óÅ float m_fRETREAT_MIN_ATTACKRANGE_LIMIT; // °ø°Ý»ç°Å¸®°¡ À̼öÄ¡ ÀÌ»óÀ̾î¾ß ÈÄÅð°ø°ÝÀ» ÇÑ´Ù. float m_fRETREAT_MIN_DISTANCE_LIMIT_RATIO;// ÇöÀç°Å¸®°¡ »ç°Å¸®*Ratio ÀÌÇϰ¡ µÇ¸é ÈÄÅ𸦠ÇÑ´Ù. // Help »óÅ float m_fHELP_SIGHTRANGE_RATIO; // ÇïÇÁ»óÅÂÀÏ ¶§ÀÇ ½Ã¾ß¹üÀ§ ¹è¼ö // ±âŸ float m_fRANGE_TOLERANCE; // »ç°Å¸® °øÂ÷ WORD m_wSEARCH_ROTATE_ANGLE; // Ž»ö ȸÀü°¢ BYTE m_byMAX_OBSERVERS_PER_PLAYER; // Ç÷¹À̾î´ç ¸ó½ºÅÍ ¼ö WORD m_wGROUP_AIMESSAGE_MIN_DELAY; // ±×·ì¸í·É ÃÖ¼Ò µô·¹ÀÌ WORD m_wGROUP_AIMESSAGE_MAX_DELAY; WORD m_wTRACK_INNER_ANGLE; // ÃßÀû ³»°¢ // ³¡À» Ç¥½ÃÇÏ´Â ÆÄ¶ó¹ÌÅÍ WORD m_wEND_ROW_KEY; // ¸¶Áö¸· ¿­ }; #ifdef _NA_0_20100819_AGGRO_RENEWAL struct AGGRO_DISTANCE_INFO { WORD change_point_; WORD change_range_; }; #endif struct AI_TYPE_INFO { WORD m_wCode; // AIType Code // Battle Record °ü·Ã WORD m_wSEARCH_TARGET_TIME; // ÁÖº¯ Ÿ°Ù¸®½ºÆ®¸¦ °»½ÅÇÏ´Â ÁÖ±â WORD m_wAGGRO_TIME; // ¾î±×·Î ÁÖ±â WORD m_wBATTLE_RECORD_UPDATE_TIME; // BattleRecord ¾÷µ¥ÀÌÆ® ÁÖ±â BYTE m_byPOINT_INIT_RANDOM_RATIO; // Æ÷ÀÎÆ®¸¦ ÃʱâÈ­½ÃŰ´Â ·£´ý È®·ü(°Å¸®, µ¥¹ÌÁöÆ÷ÀÎÆ® ÃʱâÈ­) BYTE m_byTARGET_CHANGE_RATIO; // Ÿ°ÙÀ» º¯°æ½ÃųÁö¸¦ °áÁ¤ÇÏ´Â ÃÖÁ¾ È®·ü #ifdef _NA_0_20100819_AGGRO_RENEWAL AGGRO_DISTANCE_INFO m_Distance_Info[AGGRO_CHANGE_RATIO_MAX];// Ŭ·¡½º ±âº» Æ÷ÀÎÆ® #endif // Ŭ·¡½ºº° ±âº» Æ÷ÀÎÆ® WORD m_wCLASS_BASE_POINT[eCHAR_TYPE_MAX];// Ŭ·¡½º ±âº» Æ÷ÀÎÆ® // ¹èƲ Æ÷ÀÎÆ® ÆÄ¶ó¹ÌÅÍ WORD m_wFIRST_ATTACK_POINT; // ¼±°ø Æ÷ÀÎÆ® WORD m_wNEAR_DISTANCE_POINT_INC; // ÃÖ¼Ò °Å¸® Æ÷ÀÎÆ® Áõ°¨ WORD m_wNEAR_DISTANCE_POINT_MAX; // ÃÖ¼Ò °Å¸® Æ÷ÀÎÆ® ÃÖ´ë WORD m_wLOW_LEVEL_POINT_INC; // ÃÖ¼Ò ·¹º§ Æ÷ÀÎÆ® Áõ°¨ WORD m_wLOW_LEVEL_POINT_MAX; // ÃÖ¼Ò ·¹º§ Æ÷ÀÎÆ® ÃÖ´ë WORD m_wLOW_HP_POINT_INC; // ÃÖ¼Ò Ã¼·ÂºñÀ² Æ÷ÀÎÆ® Áõ°¨ WORD m_wLOW_HP_POINT_MAX; // ÃÖ¼Ò Ã¼·ÂºñÀ² Æ÷ÀÎÆ® ÃÖ´ë WORD m_wDAMAGE_POINT_INC; // µ¥¹ÌÁö Æ÷ÀÎÆ® Áõ°¨ WORD m_wDAMAGE_POINT_MAX; // µ¥¹ÌÁö Æ÷ÀÎÆ® ÃÖ´ë // »óÅ Áֱ⠽ð£ WORD m_wSEARCH_PERIOD; // Ž»ö ÁÖ±â WORD m_wRETREAT_PERIOD; // ÈÄÅð ÁÖ±â WORD m_wTRACK_PERIOD; // ÃßÀû ÁÖ±â WORD m_wIDLE_MIN_TIME; // IDLE ÃÖ¼Ò ½Ã°£ WORD m_wIDLE_MAX_TIME; // IDLE ÃÖ´ë ½Ã°£ WORD m_wRUNAWAY_TIME; // µµ¸Á À¯Áö ½Ã°£ // °Å¸® °ü·Ã float m_fREGEN_LOCATION_LIMIT; // ¸ó½ºÅͰ¡ ÃÖ´ë·Î ¹þ¾î³¯ ¼ö ÀÖ´Â ¹Ý°æ float m_fWANDER_RADIUS_FROM_REGENAREA; // ¸®Á¨µÈ ¿µ¿ªÀ¸·ÎºÎÅÍ ¹æÈ²ÇÏ´Â ÃÖ´ë¹üÀ§ #ifdef _NA_003649_20111115_BATTLE_ZONE_HARDMODE // AITypeº°·Î ¼³Á¤ÇÒ¼ö ÀÖ°Ô AICommonInfo.txt¿¡¼­ AITypeInfo.txt·Î À̵¿ÇÔ - arycoat.2012.01.27 float m_fMOVE_HEIGHT_LIMIT; // ¸ó½ºÅÍ À̵¿ ³ôÀÌ Á¦ÇÑ(ÀÏÁ¤ ³ôÀÌ ÀÌ»ó ¸ø ¿Ã¶ó¿Â´Ù) #endif //_NA_003649_20111115_BATTLE_ZONE_HARDMODE // Help »óÅ float m_fHELP_REQUEST_HP_PERCENT; // ü·ÂÀÌ 50ÇÁ·Î ÀÌÇÏÀÏ ¶§ ÇïÇÁ¸¦ ¿äûÇÑ´Ù. // ±âŸ WORD m_wNPC_HPMP_REGEN_PERIOD; // NPC HPMP ¸®Á¨ ÁÖ±â //__NA_001290_20090525_SHIELD_SYSTEM WORD m_wNPC_SD_REGEN_PERIOD; // NPC SD ¸®Á¨ ÁÖ±â // ·°Å°¸ó½ºÅÍ DWORD m_dwLUCKY_MONSTER_RUNAWAY_TIME_MIN; // ÃÖ¼Ò µµ¸Á½Ã°£ DWORD m_dwLUCKY_MONSTER_RUNAWAY_TIME_MAX; // ÃÖ´ë µµ¸Á½Ã°£ DWORD m_dwLUCKY_MONSTER_REGEN_TIME; // µµ¸ÁÈÄ ¸®Á¨½Ã°£ }; // RTT¿¡ º¸³»´Â ¹èƲÁ¸ °ü·Ã Á¤º¸ struct STRUCT_BATTLEZONE_INFO { BYTE byWorldID; BYTE byChannelID; DWORD dwZoneCount[eZONETYPE_MAX]; // °¢ Á¸ °³¼ö // DWORD dwZoneUserCount[eZONETYPE_MAX]; // °¢ Á¸ ÃÑ µ¿Á¢(ÀÏ¹Ý À¯Àú) // DWORD dwZonePCRoomUserCount[eZONETYPE_MAX]; // °¢ Á¸ ÃÑ µ¿Á¢(PC¹æ) /* DWORD dwVillageUserCount; // ¸¶À»Á¸ ÃÑ µ¿Á¢ DWORD dwLobbyZoneCount; // ·Îºñ¹æ °³¼ö DWORD dwLobbyUserCount; // ·Îºñ¹æ ÃÑ µ¿Á¢ DWORD dwHuntingZoneCount; // ÇåÆÃ¹æ °³¼ö DWORD dwHuntingUserCount; // ÇåÆÃ¹æ ÃÑ µ¿Á¢ DWORD dwMissionZoneCount; // ¹Ì¼Ç¹æ °³¼ö DWORD dwMissionUserCount; // ¹Ì¼Ç¹æ ÃÑ µ¿Á¢ DWORD dwQuestZoneCount; // Äù½ºÆ®¹æ °³¼ö DWORD dwQuestUserCount; // Äù½ºÆ®¹æ ÃÑ µ¿Á¢ DWORD dwPVPZoneCount; // PVP¹æ °³¼ö DWORD dwPVPUserCount; // PVP¹æ ÃÑ µ¿Á¢ DWORD dwEventZoneCount; // À̺¥Æ®¹æ °³¼ö DWORD dwEventUserCount; // À̺¥Æ®¹æ ÃÑ µ¿Á¢ DWORD dwGuildZoneCount; // ±æµå¹æ °³¼ö DWORD dwGuildUserCount; // ±æµå¹æ ÃÑ µ¿Á¢ DWORD dwSiegeZoneCount; // °ø¼º¹æ °³¼ö DWORD dwSiegeUserCount; // °ø¼º¹æ ÃÑ µ¿Á¢ DWORD dwVillagePCRoomUserCount; // ¸¶À»Á¸ ÃÑ µ¿Á¢(PC¹æ) DWORD dwLobbyPCRoomUserCount; // ·Îºñ¹æ ÃÑ µ¿Á¢(PC¹æ) DWORD dwHuntingPCRoomUserCount; // ÇåÆÃ¹æ ÃÑ µ¿Á¢(PC¹æ) DWORD dwMissionPCRoomUserCount; // ¹Ì¼Ç¹æ ÃÑ µ¿Á¢(PC¹æ) DWORD dwQuestPCRoomUserCount; // Äù½ºÆ®¹æ ÃÑ µ¿Á¢(PC¹æ) DWORD dwPVPPCRoomUserCount; // PVP¹æ ÃÑ µ¿Á¢(PC¹æ) DWORD dwEventPCRoomUserCount; // À̺¥Æ®¹æ ÃÑ µ¿Á¢(PC¹æ) DWORD dwGuildPCRoomUserCount; // ±æµå¹æ ÃÑ µ¿Á¢(PC¹æ) DWORD dwSiegePCRoomUserCount; // °ø¼º¹æ ÃÑ µ¿Á¢(PC¹æ) */ }; // RTT ¼­¹ö ÅëÈ­·® Á¤º¸ struct SERVER_MONEY_INFO { BYTE byWorldID; BYTE byChannelID; BYTE byServerType; BYTE byServerID; ULONGLONG ui64TotalGetMoney; // ÀÏÁ¤ ½Ã°£ µ¿¾È »ý°Ü³­ µ· ÃѰè ULONGLONG ui64TotalLoseMoney; // ÀÏÁ¤ ½Ã°£ µ¿¾È ¾ø¾îÁø µ· ÃѰè ULONGLONG ui64TotalUserMoney; // ÇöÀç µ¿Á¢ À¯ÀúµéÀÌ °®°í ÀÖ´Â Æò±Õ ±Ý¾× }; // CHANGES: f110725.2L, moved to (World)ChannelManager in WorldServer // struct SERVER_LINKEDZONE_INFO //¾Æ¸ÓŸÀÔº° µ¥ÀÌÁö Á¤º¸ struct ARMOR_DAMAGE_INFO { BYTE byWeaponType; BYTE byArmorType; DAMAGETYPE Damage; // µ¥¹ÌÁö ºñÀ² }; // ±ÝÁö ±â´É °ü·Ã Á¤º¸ struct STRUCT_RESTRICT { DWORD dwFunc; BOOL bAllow; }; // ±ÝÁö ±â´É °ü·Ã Á¤º¸ - È®ÀåÆÇ struct STRUCT_RESTRICT_MASTER { DWORD dwFunc; // ±ÝÁöÇÒ ±â´É À妽º(eFUNCTIONALRESTRICT_TYPE ÂüÁ¶) BOOL bAllow; // Çã¿ëÀ̳Ä?(FALSE: ±ÝÁö TRUE: Çã¿ë) TCHAR ptszDesc[64]; // ¾î¶² ±â´É Á¦ÇÑÀÎÁö¿¡ ´ëÇÑ ¼³¸í }; // ¸Þ¸ð °ü·Ã Á¤º¸ typedef struct { MEMOGUID m_MemoGuid; // ¸Þ¸ð GUID(DB¿¡ ÀúÀåµÈ À¯´ÏÅ©ÇÑ °ª) BYTE m_byRead; // ¸Þ¸ð ÀоúÀ¸¸é 1, ¾Æ´Ï¸é 0 TCHAR m_ptszSenderName[MAX_CHARNAME_LENGTH+1]; // º¸³½ »ç¶÷ À̸§ TCHAR m_ptszSubject[MAX_SUBJECT_STRLENGTH]; // ¸Þ¸ð ¿ä¾à(25ÀÚ). ¸Þ¸ð ¸ñ·Ï ¹Þ´Â Áï½Ã Á¶¸³ÇÏ¿© ³Ö¾îµÐ´Ù TCHAR m_ptszMemo[MAX_MEMO_LENGTH + 1]; // ½ÇÁ¦ ¸Þ¸ð ³»¿ë } STRUCT_MEMO_INFO, *LP_STRUCT_MEMO_INFO; //================================================================================================== //{__NA001254_20090109_RTTG_FUNC_ADD // ¸ÖƼ ¸Þ¸ð °ü·Ã Á¤º¸ typedef struct tag_MMEMO_INFOS { enum{ MAX_MESSAGE_LENGTH = MAX_MEMO_LENGTH, MAX_USER_INFO = 10, }; typedef struct { char m_szRecvCharName[MAX_CHARNAME_LENGTH + 1]; // ÂÊÁö¸¦ ¹ÞÀ» ij¸¯Å͸í } USER_INFO, *LPUSER_INFO; tag_MMEMO_INFOS& operator=(const tag_MMEMO_INFOS& rh); bool ChkRecvCount() const; const TCHAR* GetRecvName(int index) const; int m_nCount; // ÂÊÁö Á¤º¸ °¹¼ö USER_INFO m_arrUserInfoList[MAX_USER_INFO]; // ÂÊÁö Á¤º¸µé (ÆÐŶ¿ë·® ¼ÕÇØ..Áö¸¸... ¶óÀÌºê °³¹ß°ú ¸ÂÃçÁø°Å¶ó ±×³É µÓ´Ï´Ù.) TCHAR m_OperCharName[MAX_CHARNAME_LENGTH + 1]; // ÂÊÁö¸¦ º¸³»´Â Äɸ¯Å͸í TCHAR m_szMessage[MAX_MESSAGE_LENGTH + 1]; // ÂÊÁö ³»¿ë } MMEMO_INFOS, *LPMMEMO_INFO; inline bool tag_MMEMO_INFOS::ChkRecvCount() const { return (m_nCount <= MAX_USER_INFO) && (m_nCount > 0); } inline const TCHAR* tag_MMEMO_INFOS::GetRecvName(int index) const { return index < m_nCount ? m_arrUserInfoList[index].m_szRecvCharName : NULL; } //================================================================================================== typedef struct tag_MMEMO_ERR_RESULT { enum { MAX_RESULT_INFO = 10, MAX_RESULT_DESCRIPTION_LENGTH = 200, }; tag_MMEMO_ERR_RESULT(); tag_MMEMO_ERR_RESULT& operator=(const tag_MMEMO_ERR_RESULT& rh); void SetCharName(const TCHAR* receiver_charname); void SetResult(DWORD result); DWORD m_dwResult; // 0 : Àü¼Û ¼º°ø, 1 : Àü¼Û ½ÇÆÐ TCHAR m_szRecvCharName[MAX_CHARNAME_LENGTH + 1]; // ¸Þ½ÃÁö¸¦ ¹ÞÀº ij¸¯Å͸í TCHAR m_szResultDescription[MAX_RESULT_DESCRIPTION_LENGTH + 1]; // ÂÊÁö Àü¼Û °á°ú Description } MMEMO_ERR_RESULT, *LPMMEMO_ERR_RESULT; inline tag_MMEMO_ERR_RESULT::tag_MMEMO_ERR_RESULT() : m_dwResult(0) { ZeroMemory(this, sizeof(*this)); } inline void tag_MMEMO_ERR_RESULT::SetCharName(const TCHAR* receiver_charname) { _tcsncpy(m_szRecvCharName, receiver_charname, _countof(m_szRecvCharName)); m_szRecvCharName[_countof(m_szRecvCharName) - 1] = '\0'; } //================================================================================================== typedef struct tag_MMEMO_RESULT { tag_MMEMO_RESULT() { ZeroMemory(this, sizeof(*this)); } bool Set(const TCHAR* receiver_charname, DWORD db_result_error, CHARGUID receiver_charguid, MEMOGUID memo_guid, const TCHAR* created_date, const TCHAR* subject); MEMOGUID m_MemoGuid; CHARGUID m_RecvGuid; TCHAR m_ptszSubject[MAX_SUBJECT_STRLENGTH]; TCHAR m_tszCreateDate[21]; // º¸³½ ³¯Â¥ MMEMO_ERR_RESULT m_ErrResult; // ÂÊÁö Àü¼Û °á°ú Á¤º¸µé } MMEMO_RESULT, *LPMMEMO_RESULT; //}__NA001254_20090109_RTTG_FUNC_ADD //================================================================================================== // D->W ÆÐŶ¿¡ µé¾î°¥ Á¤º¸ typedef struct { TCHAR m_SendName[MAX_CHARNAME_LENGTH+1]; BYTE m_byRead; TCHAR m_ptszMemo[MAX_MEMO_LENGTH + 1]; } STRUCT_MEMO_PACKETINFO, *LP_STRUCT_MEMO_PACKETINFO; struct MAP_PARTIAL_LOADING { MAPCODE m_MapKind; TCHAR m_ptszMapName[MAX_MAPNAME_LENGTH]; TCHAR m_ptszZoneType[MAX_MAPNAME_LENGTH]; BOOL m_bLoading; }; struct eWARE_INVEN_FILTER_FLAG_INFO { static const DWORD RESERVED1 = 0; static const DWORD WAREHOUSE_INITIALIZE = 1; // ÃʱâÈ­µÈ »óȲ¿©ºÎ static const DWORD WAREHOUSE_QUERY_TRANSACTION = 2; // â°íPWD DB QueryÁß static const DWORD WAREHOUSE_SET_PWD = 3; // â°í ºñ¹ø ¼³Á¤ ¿©ºÎ static const DWORD WAREHOUSE_PWD_TRANSACTION = 4; static const DWORD WAREHOUSE_USABLE = 5; // ºñ¹ø ¼³Á¤½Ã ¶ô ÇØÁ¦ »óÅ ¿©ºÎ static const DWORD MASK_WAREHOUSE_FLAGS = 0x000000FF; static const DWORD INVENTORY_QUERY_TRANSACTION = 10; // Àκ¥PWD DB QueryÁß static const DWORD INVENTORY_SET_PWD = 11; // Àκ¥ ºñ¹ø ¼³Á¤ ¿©ºÎ static const DWORD INVENTORY_PWD_TRANSACTION = 12; static const DWORD INVENTORY_USABLE = 13; // ºñ¹ø ¼³Á¤½Ã ¶ô ÇØÁ¦ »óÅ ¿©ºÎ static const DWORD MASK_INVENTORY_FLAGS = 0x0000FF00; // static const DWORD MAX_INDEX = 31; }; typedef util::BitSetOperation WAREINVEN_FILTER_BITFLAGS; struct ToggleItemInfos { nsSlot::TOGGLE_ITEMS toggle_item_info_[kToggleItemMax+1]; nsSlot::TOGGLE_ITEMS* begin() { return &toggle_item_info_[0]; }; nsSlot::TOGGLE_ITEMS* end() { return &toggle_item_info_[kToggleItemMax]; }; void init() { for (nsSlot::TOGGLE_ITEMS* it = begin(); it != end(); ++it) { it->clear(); } } }; //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND struct BattleGroundRecordInfos { enum { kRecordMaxCount = 5 }; BattleGroundRecord battle_ground_record[kRecordMaxCount+1]; BattleGroundRecord* begin() { return &battle_ground_record[0]; }; BattleGroundRecord* end() { return &battle_ground_record[kRecordMaxCount]; }; }; #ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH struct GoldRushRecordInfos { enum { kRecordMaxCount = 5 }; GoldRushRecord goldrush_record[kRecordMaxCount+1]; GoldRushRecord* begin() { return &goldrush_record[0]; }; GoldRushRecord* end() { return &goldrush_record[kRecordMaxCount]; }; }; #endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH #ifdef _NA_007086_20140318_MONSTERBOOK struct MonsterBook { enum { MonsterBookMaxCount = 1000 }; DWORD monster_code_count; DWORD monster_code[MonsterBookMaxCount]; void clear() { memset(&monster_code, 0, sizeof(monster_code)); monster_code_count = 0; } void push_back(DWORD _monster_code) { monster_code[monster_code_count++] = _monster_code; } DWORD find(DWORD _monster_code) { for (DWORD i = 0; i < monster_code_count; i++) { if (monster_code[i] == _monster_code) return monster_code[i]; // } return 0; } }; #endif //_NA_007086_20140318_MONSTERBOOK #ifdef _NA_008012_20150204_SUN_RANKING_SYSTEM struct SunRankingPlayerInfo { SunRankingPlayerInfo() { init(); } void init() { for (eSUN_RANKING_TYPE type = eSUN_RANKING_TYPE_START; type < eSUN_RANKING_TYPE_END; ++type) { score[type] = 0; } memset(char_name, 0, MAX_CHARNAME_LENGTH+1); class_code = eCHAR_NONE; char_guid = 0; guild_guid = 0; } SCORE score[eSUN_RANKING_TYPE_END]; char char_name[MAX_CHARNAME_LENGTH+1]; eCHAR_TYPE class_code; GUILDGUID guild_guid; CHARGUID char_guid; }; struct SunRankingGradeInfo { SunRankingGradeInfo() { init(); } void init() { char_guid = 0; ranking_type = 0; grade = eSUN_RANKING_GRADE_NONE; score = 0; } CHARGUID char_guid; int ranking_type; SCORE score; int grade; }; struct LoadControl { LoadControl() { init(0); } void init(int total_load_count = 0) { m_total_load_count = total_load_count; m_loaded_count = 0; } void SetLoaded( int total_msg_count ) { if (m_total_load_count == 0) { m_total_load_count = total_msg_count; } ++m_loaded_count; } bool IsLoaded() { if (m_total_load_count == 0) { return false; } if (m_total_load_count == m_loaded_count) { return true; } return false; } int m_total_load_count; int m_loaded_count; }; #endif // _NA_008012_20150204_SUN_RANKING_SYSTEM #endif // __SERVER_STRUCT_H__