898 lines
28 KiB
C
898 lines
28 KiB
C
#ifndef __SERVER_STRUCT_H__
|
|
#define __SERVER_STRUCT_H__
|
|
|
|
#include <Define.h>
|
|
#include <Struct.h>
|
|
#include <StructInPacket.h>
|
|
#include <ServerStructInPacket.h>
|
|
//#include <ArchiveOfStream.h>
|
|
|
|
//==================================================================================================
|
|
// @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]; // 캐릭터 이름 =>클베이후 삭제 예정->DBA요청에 의한 임시!!
|
|
WORD wSvrCode; // 서버 코드
|
|
WORD wPCLevel; // 캐릭터 레벨 =>클베이후 삭제 예정->DBA요청에 의한 임시!!
|
|
BYTE byPCClass; // 캐릭터 클래스 =>클베이후 삭제 예정->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; // 주변 캐릭터 정보 전송시 이동정보를 주는 최소거리
|
|
|
|
// 경쟁헌팅 자동매칭 제어
|
|
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]; // 쪽지를 받을 캐릭터명
|
|
} 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]; // 메시지를 받은 캐릭터명
|
|
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<eWARE_INVEN_FILTER_FLAG_INFO::MAX_INDEX> 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__
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|