2024-12-21 10:04:04 +08:00
# pragma once
# include "DNPacket.h"
# include "MemPool.h"
/*--------------------------------------------------------------------------
Server쪽에서 쓰 는 모 든 것 들 ( ? )
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
// const ----------------------------------------------------------------------------------------------
# if defined(_CH)
const WCHAR * const SQLPASSWORD = L " 4795CEA6409d492 " ;
const WCHAR * const SQLHOSTNAME = L " A2A375E23370f8a " ;
const WCHAR * const SQLAPPNAME = L " C98D23990E1119a " ;
# elif defined(_JP)
const WCHAR * const SQLPASSWORD = L " 945C437D6632718 " ;
//const WCHAR* const SQLPASSWORD = L"A443131C-2988-4C3E-9974-37033B2A0A33";
const WCHAR * const SQLHOSTNAME = L " E4C874F3D920ced " ;
const WCHAR * const SQLAPPNAME = L " 2001C72210299d0 " ;
# elif defined(_TW)
const WCHAR * const SQLPASSWORD = L " 3A6A7D31A8c6415 " ;
const WCHAR * const SQLHOSTNAME = L " 3B74FB5B269bf5d " ;
const WCHAR * const SQLAPPNAME = L " 4A54A42ED0381e3 " ;
# elif defined(_US)
const WCHAR * const SQLPASSWORD = L " BACF8969BB00b2d " ;
const WCHAR * const SQLHOSTNAME = L " 04B3944622a7c5b " ;
const WCHAR * const SQLAPPNAME = L " 33518A83865e269 " ;
# elif defined(_SG)
const WCHAR * const SQLPASSWORD = L " 4708A804794d233 " ;
const WCHAR * const SQLHOSTNAME = L " D3B8367356e19d7 " ;
const WCHAR * const SQLAPPNAME = L " 3A222498E96c63f " ;
# elif defined(_TH)
const WCHAR * const SQLPASSWORD = L " gozjtoRldi!* " ;
const WCHAR * const SQLHOSTNAME = L " rjfflausenlwlsek@#@ " ;
const WCHAR * const SQLAPPNAME = L " roshatlRl!# " ;
# elif defined(_ID)
const WCHAR * const SQLPASSWORD = L " skQmsgozj!*sha " ;
const WCHAR * const SQLHOSTNAME = L " rhdqntlzlsi)*^ " ;
const WCHAR * const SQLAPPNAME = L " rotoRjwuqjfu!# " ;
# elif defined(_RU)
const WCHAR * const SQLPASSWORD = L " 3A6A7D31A8c6415 " ;
const WCHAR * const SQLHOSTNAME = L " 3B74FB5B269bf5d " ;
const WCHAR * const SQLAPPNAME = L " 4A54A42ED0381e3 " ;
# elif defined(_KAMO) //[OK_Cash]
const WCHAR * const SQLPASSWORD = L " 3A6A7D31A8c6415 " ;
const WCHAR * const SQLHOSTNAME = L " 3B74FB5B269bf5d " ;
const WCHAR * const SQLAPPNAME = L " 4A54A42ED0381e3 " ;
# elif defined(_EU)
const WCHAR * const SQLPASSWORD = L " 110C37F5B9fb934 " ;
const WCHAR * const SQLHOSTNAME = L " D8FA71CD6Ee2479 " ;
const WCHAR * const SQLAPPNAME = L " 518BD8D722e2f6b " ;
# else
const WCHAR * const SQLPASSWORD = L " 428A44DC4Eebd12 " ;
const WCHAR * const SQLHOSTNAME = L " CF0EEDCEF386298 " ;
const WCHAR * const SQLAPPNAME = L " D121240B6419392 " ;
# endif // #if defined( _US )
const WCHAR * const SQLActozMembershipDBPassword = L " dnaccount$dnest7h.o.t.44_2 " ;
const WCHAR * const SQLActozWorldDBPassword = L " dndb$dnest50h.o.t.44_2 " ;
const WCHAR * const SQLActozCommonDBPassword_Test = L " devdb$game9mingi44_2 " ;
const WCHAR * const SQLActozCommonDBPassword = L " dncomdb$game60mingi44_2 " ;
# if defined( PRE_ADD_DWC )
const WCHAR * const DWCPREFIX = L " DWCGM_ " ;
const int DWCPREFIXLEN = 6 ;
# endif // #if defined( PRE_ADD_DWC )
const char DBSERVERMAX = 16 ;
const char THREADMAX = 8 ; // DB THREAD
const char LOGINTIMELENMAX = 20 ; // last login time length max
const char TIMELENMAX = 20 ; // 데이트타임 타입
const int LOGINCOUNTMAX = 64 ; // 총 로그인 서버 개수
const int LOGINCONCOUNTINFOTERM = ( 1 * 30 * 1000 ) ; // 로그인 서버 현재 동시접속자 정보 마스터 서버에 보고 제한간격 (단위:ms)
const int LOGINSERVERLISTSORTTERM = ( 1 * 3 * 1000 ) ; // 로그인 서버 세션 정렬 제한간격 (단위:ms)
const int MASTERCOUNTMAX = 10 ; // 총 마스터 서버 개수
const int DELETECHAR_WAITTIME_MINUTE = 7 * 24 * 60 ; // 7일
const BYTE PROCESSCOUNT = 40 ; // 초당 오브젝트 처리개수
const int INTERNALBUFFERLENMAX = 51200 ;
const UINT PROCESSBUFFERLENMAX = 1024 * 64 ;
const UINT WORKERBUFFERLENMAX = 1024 * 64 ;
const int QUESTSIZEINFO = 2775 ;
const int QUERYOVERTIME = 1000 ;
const int QUERYNAMESIZE = 200 ; // 쿼리 최대 크기
const int GAMEDELAYSIZE = 200 ; // 게임딜레이 로그 최대 크기
const int SERVERDETACHPACKETSIZE = 1024 * 40 ; // 패킷전송시 버퍼사이즈크기
//const variable.
# ifdef _FINAL_BUILD
const unsigned long RUDP_CONNECT_TIME_LIMIT_FOR_PARTY = 120 * 1000 ; //최초 게임서버 컨넥트 대기 시간
const unsigned long RUDP_CONNECT_TIME_LIMIT_FOR_SINGLE = 120 * 1000 ;
const unsigned long WAIT_FOR_ANOTHER_USER_TIME_LIMIT = 15 * 1000 ; //최초인원이 컨넥을 하고 다른인원을 기다리는 시간
const unsigned long WAIT_FOR_LOAD_TIME_LIMIT = 60 * 1000 ; //데이타베이스의 로딩을 기다리는 시간
const unsigned long GOGO_SING_TO_PLAY_FOR_WAIT_TIME_LIMIT = 2 * 60 * 1000 ; //클라이언트 로딩과 싱크를 기다리는 시간
const unsigned long GOGO_SING_TO_FARMPLAY_FOR_WAIT_TIME_LIMIT = 5 * 60 * 1000 ; //농장로딩 시간은 초큼 별개로
# else
const unsigned long RUDP_CONNECT_TIME_LIMIT_FOR_PARTY = 60 * 1000 ; //최초 게임서버 컨넥트 대기 시간
const unsigned long RUDP_CONNECT_TIME_LIMIT_FOR_SINGLE = 120 * 1000 ;
const unsigned long WAIT_FOR_ANOTHER_USER_TIME_LIMIT = 60 * 1000 ; //
const unsigned long WAIT_FOR_LOAD_TIME_LIMIT = 150 * 1000 ; //
const unsigned long GOGO_SING_TO_PLAY_FOR_WAIT_TIME_LIMIT = 5 * 60 * 1000 ; //
const unsigned long GOGO_SING_TO_FARMPLAY_FOR_WAIT_TIME_LIMIT = 5 * 60 * 1000 ; //농장로딩 시간은 초큼 별개로
# endif
const int EACH_GAMESERVER_MAX_ROOM_COUNT = 20 ;
const int EACH_GAMESERVER_MAX_USER_COUNT = 100 ;
const int INTERVALDELETE_TIMINGTICK = 1000 * 60 ; //1분쯤??...-_-;
const int CHECK_ZOMBIE_DISCONNECT_TICK = 1000 * 60 * 5 ;
const int DISTRIBUTE_IDLE_TICK = 1000 * 5 ;
const int DELAYED_PRCESS_CHECKTICK = 1000 * 10 ;
const int DELAYED_PRCESS_LOG_COUNT = 10 ;
const int FRAMEDEADLINE = 17 ;
const int EVENTMAPSTRMAX = 50 ;
const int CHECKLIVETICK = 60000 * 2 ; // * 5; // 핵쉴드 5분 마다 체크 -> 1분으로 바꾸라고 해서 바꿈 -> 2분으로 늘림
const int CHECKRESPONSETICK = 60000 * 3 ; // 핵쉴드 응답 시간 (3분정도?)
const int CHECKGPKFIRSTTICK = 1000 * 60 * 2 ; // 최초 검사타이밍
const int CHECKGPKTICK = 60000 ;
const int MANAGEDMAX = 20 ;
# if !defined(_FINAL_BUILD)
const DWORD CHECK_TCP_PING_TICK = 1000 * 30 * 1 ; // 1분
const DWORD CHECK_UDP_PING_TICK = 1000 * 30 * 1 ; // 1분
# else //#if !defined(_FINAL_BUILD)
const DWORD CHECK_TCP_PING_TICK = 1000 * 60 * 1 ; // 1분
const DWORD CHECK_UDP_PING_TICK = 1000 * 60 * 1 ; // 1분
# endif //#if !defined(_FINAL_BUILD)
# if defined(_CH)
const int CHECKLOGINUSERKICKTICK = 30 * 60 * 1000 ; // 로그인 서버에 30분 동안 머물면 강퇴!(중국만)
# else
const int CHECKLOGINUSERKICKTICK = 15 * 60 * 1000 ; // 로그인 서버에 15분 동안 머물면 강퇴!
# endif //#if defined(_CH)
const int CHECKNOTAUTHLOGINUSERKICKTICK = 5 * 60 * 1000 ; // 로그인 서버에 인증되지 않은체 5분 동안 머물면 강퇴!
const unsigned int DEFAULTUSERSESSIONID = 10000 ;
const unsigned int CASHDELUSERDELAY_LIMITTICK = ( 4 * 30 * 1000 ) ;
// DB 누적작업 관련 개수
const int DBQUERYSTREAMDATAMAX = ( 36 * 1024 ) ; // DB 누적작업 데이터 최대 크기 : DB 서버에 바로 송신되는 대신 큐에 누적 후 일괄처리가 필요한 데이터 구조체 중 가장 큰 것을 기준으로 설정 → 크기가 부족할 경우 지속적인 재조정 필요 예상
const unsigned int DBQUERYAUTOCHKSUM = 0xE41C723F ; // DB 쿼리 직렬화 처리 시 체크값
const int QUESTINVENBLANKCHECKMIN = 2 ; // 퀘스트 인벤토리 체크 시 메시지 발송이 되는 최소 개수
const float MAX_ITEMPRICE_RATE = 0.5f ;
# if defined(_FINAL_BUILD)
const int BEGINAUTHLIMITSEC = ( 9 * 10 ) ; // 최초 인증 제한시간 (단위:초, 0 이하는 무제한 대기 ?)
const int CHECKAUTHLIMITSEC = ( 6 * 10 ) ; // 일반 인증 제한시간 (단위:초)
const int BEGINAUTHLIMITTERM = ( BEGINAUTHLIMITSEC * 1000 ) ; // 최초 인증 제한간격 (단위:ms)
//const int CHECKAUTHLIMITTERM = (CHECKAUTHLIMITSEC*1000); // 일반 인증 제한간격 (단위:ms)
const int CHECKAUTHLIMITTERM = ( 1 * 30 * 1000 ) ; // 일반 인증 제한간격 (단위:ms) // P.S.> 던전, PVP 등 컨텐츠 참여자들의 불편사항을 고려하여 기존 시간보다 짧게 정함
# else // _FINAL_BUILD
const int BEGINAUTHLIMITSEC = ( 6 * 10 ) ; // 최초 인증 제한시간 (단위:초, 0 이하는 무제한 대기 ?)
const int CHECKAUTHLIMITSEC = ( 4 * 10 ) ; // 일반 인증 제한시간 (단위:초)
const int BEGINAUTHLIMITTERM = ( BEGINAUTHLIMITSEC * 1000 ) ; // 최초 인증 제한간격 (단위:ms)
//const int CHECKAUTHLIMITTERM = (CHECKAUTHLIMITSEC*1000); // 일반 인증 제한간격 (단위:ms)
const int CHECKAUTHLIMITTERM = ( 1 * 20 * 1000 ) ; // 일반 인증 제한간격 (단위:ms) // P.S.> 던전, PVP 등 컨텐츠 참여자들의 불편사항을 고려하여 기존 시간보다 짧게 정함
# endif // _FINAL_BUILD
const int RESETAUTHLISTMAX = ( 1000 ) ; // 인증정보 목록 초기화 크기 (주의!!! - 본 전역상수를 사용하는 패킷들이 송신/수신 패킷 크기를 넘지 않아야 함)
const int RESETAUTHLISTTERM = ( 1 * 1000 ) ; // 인증정보 목록 초기화 작업주기 (단위:ms)
const int RESETAUTHSERVERTERM = ( 5 * 1000 ) ; // 인증정보 서버 초기화 작업주기 (단위:ms)
const int RESETAUTHWORLDCHECKTERM = ( 5 * 1000 ) ; // 인증정보 월드 초기화 작업주기 (단위:ms)
const int RESETAUTHWORLDLIMITTERM = ( 2 * 30 * 1000 ) ; // 인증정보 월드 초기화 제한시간 (단위:ms)
const int GETAUTHUSERCOUNT = 1000 * 10 ; // 인증월드유저 카운트 획득주기
const int GUILDMGRCHKTERM = ( 5 * 1000 ) ; // 길드 관리자 체크 주기
const int GUILDMGRUPDTERM = ( 10 * 1000 ) ; // 길드 관리자 갱신 주기
const int GUILDCHKMEMBTERM = ( 30 * 1000 ) ; // 길드 멤버정보 체크 주기
const int GUILDCHKRESCTERM = ( 30 * 1000 ) ; // 길드 자원반납 체크 주기
const int GUILDREQINFOTERM = ( 60 * 1000 ) ; // 길드 정보요청 체크 주기
const int GUILDRFSVIEWTERM = ( 10 * 1000 ) ; // 길드 시각정보 갱신 주기
const int GUILDAPLPOINTTERM = ( 10 * 1000 ) ; // 길드 일반/래더 포인트 DB 적용 주기
const int GUILDCHKRESCLIMIT = ( 2 * 30 * 1000 ) ; // 길드 자원반납 체크 제한
const int PERIODQUESTTERM = ( 60 * 1000 ) ; // 기간제 퀘스트 갱신 주기
const int PERIODGUILDWARTERM = ( 60 * 1000 ) ; // 길드전 갱신 주기
const int GUILDWARMISSION_MAXGROUP = 4 ;
const int SERVICEMANAGER_SERVERDEALY_SIZE = 1000 ;
const int SERVICEMANAGER_REPORT_SIZE = 4096 ;
# define SWAP16(x) (((((x) & 0xff) << 8) | (((x) >> 8) & 0xff)))
# define SWAP32(x) (((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)))
# define SWAP64(x) (((((x) & 0xFF00000000000000ULL) >> 56) | (((x) & 0x00FF000000000000ULL) >> 40) | (((x) & 0x0000FF0000000000ULL) >> 24) | (((x) & 0x000000FF00000000ULL) >> 8) | \
( ( ( x ) & 0x00000000FF000000ULL ) < < 8 ) | ( ( ( x ) & 0x0000000000FF0000ULL ) < < 24 ) | ( ( ( x ) & 0x000000000000FF00ULL ) < < 40 ) | ( ( ( x ) & 0x00000000000000FFULL ) < < 56 ) ) )
struct DNProcessCheck
{
enum eDNProcessCheck
{
Key = 0x00000001 ,
DisconnectInterval = 60 * 1000 * 2 ,
UpdateInterval = 10 * 1000 ,
HeartbeatKey = 0x00000002 ,
SQLHeartbeatInterval = 60 * 1000 * 10 ,
SelectIPMagicInterval = 60 * 1000 * 60 ,
} ;
} ;
// enum ----------------------------------------------------------------------------------------------
enum eServerType
{
SERVERTYPE_LOGIN , // 로그인 서버
SERVERTYPE_DB , // DB 서버
SERVERTYPE_VILLAGE , // 빌리지 서버
SERVERTYPE_GAME , // 게임 서버
SERVERTYPE_MASTER , // 마스터 서버
SERVERTYPE_LOG , // 로그 서버
SERVERTYPE_MAX ,
} ;
enum ePatchType
{
PATCHTYPE_LOGIN , // 로그인 서버
PATCHTYPE_DB , // DB 서버
PATCHTYPE_VILLAGE , // 빌리지 서버
PATCHTYPE_GAME , // 게임 서버
PATCHTYPE_MASTER , // 마스터 서버
PATCHTYPE_LOG , // 로그 서버
PATCHTYPE_PATCHER , // ESM
PATCHTYPE_CASH , // 캐쉬 서버
} ;
enum eConnectionKey
{
CONNECTIONKEY_DEFAULT = 0 ,
CONNECTIONKEY_USER ,
CONNECTIONKEY_LOGIN ,
CONNECTIONKEY_DB ,
CONNECTIONKEY_VILLAGE ,
CONNECTIONKEY_GAME ,
CONNECTIONKEY_MASTER ,
CONNECTIONKEY_LOG ,
CONNECTIONKEY_LAUNCHER ,
CONNECTIONKEY_SERVICEMANAGER ,
CONNECTIONKEY_AUTH , // 인증섭(넥슨)
CONNECTIONKEY_CASH ,
CONNECTIONKEY_BILLING , // 빌링섭(퍼블리셔)
CONNECTIONKEY_SERVICEPATCHER ,
CONNECTIONKEY_SERVERMONITOR ,
CONNECTIONKEY_TW_AUTHLOGIN , // 인증섭(감마니아 1 - Authorization : 사용자 계정 인증 처리, 상태 (블록 여부, 캐쉬 잔여 포인트 ?) 체크)
CONNECTIONKEY_TW_AUTHLOGOUT , // 인증섭(감마니아 2 - Logout : 사용자 로그아웃 처리)
CONNECTIONKEY_TW_QUERY ,
CONNECTIONKEY_TW_SHOPITEM ,
CONNECTIONKEY_TW_COUPON , // 감마니아 쿠폰서버
CONNECTIONKEY_TW_COUPON_ROLLBACK , // 감마니아 쿠폰롤백..징그러운것들 서버를 포트별로 만들다니..ㅠ
CONNECTIONKEY_TH_AUTH ,
CONNECTIONKEY_TH_OTP ,
CONNECTIONKEY_TH_QUERY ,
CONNECTIONKEY_TH_SHOPITEM ,
CONNECTIONKEY_DOORS ,
} ;
enum eAcceptOpenVerifyType
{
ACCEPTOPEN_VERIFY_TYPE_APPINITCOMPLETE = 0 ,
ACCEPTOPEN_VERIFY_TYPE_MASTERCONNECTION ,
ACCEPTOPEN_VERIFY_TYPE_RESETAUTH ,
ACCEPTOPEN_VERIFY_TYPE_MAX ,
} ;
enum eServerLogLevel
{
ServerLogLevel_1 = 1 ,
ServerLogLevel_2 = 2 ,
ServerLogLevel_3 = 3 ,
} ;
enum eUserState // login에서 쓰는 상태값
{
STATE_NONE ,
// login
STATE_CHECKVERSION ,
STATE_CHECKLOGIN , // 아이디 패스워드 확인상태
STATE_SERVERLIST ,
STATE_WAITUSER , // 대기유저
STATE_CHARLIST , // 캐릭터 리스트 상태
STATE_CHANNELLIST ,
STATE_CONNECTVILLAGE , // 빌리지 서버에 접속가능상태
STATE_CONNECTGAME , // 겜 서버에 접속가능상태
STATE_RECONNECTLOGIN , // 리커넥트 상태
// master
STATE_CHECKVILLAGE , //빌리지로 넘어가기전의 상태입니다. 유저가 끊길경우 고아가 되므로 이 스테이트를 통해서 관리됩니다.
STATE_CHECKGAME , //게임으로 넘어가기 전의 상태입니다. 상동
STATE_CHECKRECONNECTLOGIN , //캐릭터선택창으로 넘어가기 전의 상태입니다. 상동
STATE_VILLAGE , // village상태인가
STATE_GAME , // game상태인가
STATE_LOGIN , // login상태인가
// village
STATE_LOADUSERDATA , // 유저데이터 DB에서 불러왔는지
STATE_READY , // 필드 나갈 준비 완료
STATE_READYTOVILLAGE , // village 딴 장비로 옮길때 (준비단계)
STATE_READYTOGAME , // game으로 넘어갈때 (준비단계)
STATE_READYTOLOGIN , // login으로 넘어갈때 (준비단계)
STATE_MOVETOVILLAGE , // village 딴 장비로 옮길때
STATE_MOVETOGAME , // game으로 넘어갈때
STATE_MOVETOLOGIN , // login으로 넘어갈때
STATE_MOVESAMECHANNEL , // 같은 채널 이동
# if defined(_HSHIELD)
HSHIELD_NONE = 0 ,
HSHIELD_RESPONSEVERSION = 1 , // checkversion 패킷 받은 상태
HSHIELD_RECONNECTLOGIN , // 재접속 패킷 받은 상태
HSHIELD_LOADUSER , // 디비 로드 끝낸상태
HSHIELD_REQUEST , // _AhnHS_MakeRequest 요청상태
HSHIELD_RESPONSE , // 응답온 상태
# endif // _HSHIELD
} ;
//enumulation
//GameRoom
enum eGameRoomState
{
_GAME_STATE_NONE , //생성!
_GAME_STATE_READY2CONNECT , //초기화 완료 컨넥션 대기! 상태
_GAME_STATE_CONNECT2CHECKAUTH , //DB 를 이용한 인증정보 체크
_GAME_STATE_CONNECT2LOAD , //연결 및 검증 완료! 로드상태로 전이
_GAME_STATE_LOAD2SYNC , //클라이언트 연결완료 준비상태
_GAME_STATE_SYNC2SYNC ,
_GAME_STATE_SYNC2PLAY , //플레이대기중
_GAME_STATE_PLAY , //게임중!
_GAME_STATE_CANCEL_LOADING , //백그라운드 로더와 싱크
_GAME_STATE_DESTROYED , //방깨졌삼!
_GAME_STATE_FARM_NONE , //농장용 스테이트입니다. 생성 루틴이 달라 일반과 다르게 흘러갑니다 _GAME_STATE_PLAY부터는 동일
_GAME_STATE_FARM_READY2LOAD , //디비에 농장관련 데이타를 요청한 상태
_GAME_STATE_FARM_LOAD2PLAY , //디비에서 농장관련 데이타를 받았다. 세팅하고 마스터에 알리자
_GAME_STATE_FARM_PAUSE , //농장 포우즈~
_GAME_STATE_PVP_SYNC2GAMEMODE , //피빕피일경우 유저가 없는 상태에서 시작시점이 생김(길드전) 접속스테이트를 건너뛰고 모드받고 로드로 넘어가는 중간스테이트
} ;
//GameSession
enum eGameSessionState
{
SESSION_STATE_NONE ,
SESSION_STATE_READY , //객체생성만 되어 있음! 연결은 안되어 있음
SESSION_STATE_RUDP_CONNECTED ,
SESSION_STATE_CONNECTED , //연결 되었음!
SESSION_STATE_LOAD , //연결 되면 디비에 요청합니다.
SESSION_STATE_LOADED , //게임로딩완료!
SESSION_STATE_WAIT_TO_READY , //Ready 상태 기다림
SESSION_STATE_READY_TO_SYNC , //Sync 준비 완료!
SESSION_STATE_SYNC_READY_2_DELAY , //서버가 메세지처리준비가 안되상태에서 메세지를 받았습니다.
SESSION_STATE_READY_TO_PLAY , //Sync 2 Play
SESSION_STATE_GAME_PLAY , //게임플레이중!
SESSION_STATE_READY_TO_VILLAGE , //game -> village (준비단계)
SESSION_STATE_READY_TO_LOGIN , //game -> login char select (준비단계)
SESSION_STATE_RECONNECTLOGIN , //game -> login char select
SESSION_STATE_SERVER_CHANGE , //서버이동중! 이동완료되면 끊김
SESSION_STATE_DISCONNECTED , //짤린상태! (tcp까지 전부 끊긴 상태)
//SESSION_STATE_CRASH, //크래쉬!
} ;
// GameServer Parse Type
enum eGameMsgType
{
MSG_TYPE_MASTER ,
MSG_TYPE_DATABASE ,
} ;
enum eFieldMessage
{
FM_CREATE ,
FM_DESTROY ,
FM_SHOW ,
FM_HIDE ,
FM_MOVE ,
FM_ACTORMSG ,
FM_CHAT ,
FM_CHANGEEQUIP ,
FM_ADDEXP ,
FM_LEVELUP ,
FM_CHANGEAPPELLATION ,
FM_CHANGEHIDE ,
FM_CHANGECASHEQUIP ,
FM_CHANGEGUILDSELFVIEW ,
FM_CHANGEJOB ,
FM_EFFECT ,
FM_CHANGECOLOR ,
FM_CHANGEGLYPH ,
FM_CHATROOMVIEW ,
FM_CHATROOMUSER ,
FM_CHANGEVEHICLE ,
FM_CHANGEVEHICLECOLOR ,
FM_CHANGEPET ,
FM_CHANGEPETBODY ,
FM_RENAME_PET ,
FM_ENTERPARTY ,
FM_LEAVEPARTY ,
FM_CHARACTER_RENAME ,
FM_GUILDWARWINSKILL ,
FM_USE_SOURCE ,
FM_USE_EFFECTSKILL ,
FM_HAVE_NAMEDITEM ,
FM_CHANGE_TRANSFORM ,
FM_CHANGETALISMAN ,
FM_CHANGEDWCTEAM ,
} ;
enum eClass
{
CLASS_NONE = 0 ,
CLASS_WARRIER = 1 ,
CLASS_ARCHER ,
CLASS_SOCERESS ,
CLASS_CLERIC ,
# if defined( PRE_ADD_ACADEMIC )
CLASS_ACADEMIC ,
# endif // #if defined( PRE_ADD_ACADEMIC )
# if defined( PRE_ADD_KALI )
CLASS_KALI ,
# endif // #if defined( PRE_ADD_KALI )
// CLASS_ASSASSIN,
// CLASS_LENCEA,
// CLASS_MACHINA,
CLASS_MAX ,
} ;
enum eJob
{
JOB_NONE ,
JOB_WARRIER = 1 ,
JOB_ARCHER ,
JOB_SOCERESS ,
JOB_CLERIC ,
JOB_BLAZEWARRIER = 11 ,
JOB_SWORDMAN ,
JOB_CHAINSOLDIER ,
JOB_RANGER = 21 ,
JOB_HUNTER ,
JOB_KEEPER ,
JOB_WIZARD = 31 ,
JOB_MAGICIAN ,
JOB_WITCH ,
JOB_PRIEST = 41 ,
JOB_PALADIN ,
JOB_MONK ,
JOB_MAX = 47 ,
} ;
enum eAppendItemString
{
Append_ItemSN ,
Append_Price ,
Append_Limit ,
Append_ItemID ,
Append_Option ,
Append_Refundable ,
# ifdef PRE_ADD_LIMITED_CASHITEM
Append_QuantityLimited ,
# endif //#ifdef PRE_ADD_LIMITED_CASHITEM
Append_Max ,
} ;
enum eModItemBitmap
{
ModItem_Durability = 1 ,
ModItem_Level = ( 1 < < 1 ) ,
ModItem_Potential = ( 1 < < 2 ) ,
ModItem_SoulBound = ( 1 < < 3 ) ,
ModItem_SealCount = ( 1 < < 4 ) ,
ModItem_Option = ( 1 < < 5 ) ,
ModItemAll = ModItem_Durability | ModItem_Level | ModItem_Potential | ModItem_SoulBound | ModItem_SealCount | ModItem_Option ,
} ;
enum eWeaponType
{
WEAPON_SWORD , // 대검
WEAPON_GAUNTLET , // 건틀렛
WEAPON_AXE , // 도끼
WEAPON_HAMMER , // 해머
WEAPON_SMALLBOW , // 소궁
WEAPON_BIGBOW , // 대궁
WEAPON_CROSSBOW , // 석궁
WEAPON_STAFF , // 스테프
WEAPON_BOOK , // 마법서
WEAPON_ORB , // 수정구
WEAPON_PUPPET , // 주술인형
WEAPON_MACE , // 메이스
WEAPON_FLAIL , // 프레일
WEAPON_WAND , // 완드
WEAPON_SHIELD , // 방패
WEAPON_ARROW , // 화살
WEAPON_CANNON , // 캐논
WEAPON_BUBBLEGUN , // 버블건
WEAPON_GLOVE , // 글러브
WEAPON_FAN , // 부채
WEAPON_CHAKRAM , // 차크람
WEAPON_CHARM , // 참
WEAPON_SCIMITER , // 시미터
WEAPON_DAGGER , // 대거
WEAPON_CROOK , // 크룩
WEAPON_SPEAR ,
WEAPON_RESERVED1 ,
WEAPON_BRACELET ,
WEAPON_KNUCKLE ,
WEAPON_RESERVED2 ,
WEAPON_CLAW ,
} ;
enum eParts
{
PARTS_FACE , //
PARTS_HAIR ,
PARTS_HELMET , // 투구
PARTS_BODY , // 상체
PARTS_LEG , // 하체
PARTS_HAND , // 손
PARTS_FOOT , // 발
PARTS_NECKLACE ,
PARTS_EARRING ,
PARTS_RING ,
PARTS_RING2 ,
PARTS_CREST ,
PARTS_FULLSET , // 풀세트
} ;
enum eQuestDataType
{
QUESTDATA_STATE = 1 , // 퀘스트 상태
QUESTDATA_STEP , // 현재 퀘스트 스텝
QUESTDATA_JOURNAL , // 현재 퀘스트 저널
} ;
enum eEtcType // DNEtc table Type
{
ETC_NONE ,
ETC_QUICKSLOT , // TQuickSlot QuickSlot[QUICKSLOTMAX]; // 단축 슬롯창 (10개씩 2줄)
ETC_JOB , // USHORT wJobArray[JOBMAX]; // 직업 (0: 맨처음 직업, 나머지 쭉쭉~ 전직 포함)
ETC_NOTIFIER , // int Notifier[Notifier_MaxCount]; // 알리미 (quest, mission)
ETC_DUNGEONCLEAR , // TDungeonClearData DungeonClear[DUNGEONCLEARMAX]; // 던전 클리어 (120개)
ETC_ETERNITYITEM , // USHORT wEternityItem[ETERNITYITEMMAX]; // 영구아이템
ETC_EQUIPDELAYTIME , // int nEquipDelayTime[EQUIPMAX]; // equip index에 관련된 cooltime
ETC_EQUIPREMAINTIME , // int nEquipRemainTime[EQUIPMAX];
} ;
enum eAuthType
{
AUTHTYPE_BEGINAUTH , // 인증 시작
AUTHTYPE_STOREAUTH , // 인증 저장
AUTHTYPE_CHECKAUTH , // 인증 체크
AUTHTYPE_RESETAUTH , // 인증 리셋
AUTHTYPE_CNT ,
} ;
enum eAbuseCode
{
ABUSE_NONE = 0 ,
ABUSE_MOVE_SERVERS , // 마을 <-> 던젼 워프
ABUSE_MOVE_INSKY , // 공중이동
ABUSE_HACKSHIELD , // 핵쉴드에서 부정이용자
ABUSE_TWN_EXTENDLOG , // 대만용 추가 로그값 #48714 관계 있음
# if defined( PRE_ADD_CHARACTERCHECKSUM )
ABUSE_CHARACTER_CHECKSUM , // #80315 캐릭터 체크섬 이상 발견
# endif // #if defined( PRE_ADD_CHARACTERCHECKSUM )
} ;
struct WorldUserState
{
enum eCode
{
Add = 0 ,
Delete ,
Modify ,
} ;
} ;
namespace DBDNMembership
{
struct OrderStatusCode
{
enum eOrderStatusCode
{
SuccessPayment = 1 , // 결제성공 & pickup 대기
Success = 2 , // 구매완료
FailPayment = 3 , // 결제실패
} ;
} ;
} ;
namespace DBDNWorldDef
{
struct CharacterExpChangeCode
{
enum eCharacterExpChangeCode
{
Quest = 1 , // : 퀘스트 보상 -> FKey = QuestID
Dungeon = 2 , // : 던전 보상 -> FKey = PartyID or NULL
Cheat = 3 , // : 치트 -> FKey = NULL
Admin = 4 , // : 보정 변경
Eternity = 5 , // 영구아이템 -> FKey = ItemSerial
PvP = 6 , // : PvP 피로도 보상 -> FKey = NULL
DungeonMonster = 7 , // :던젼 몬스터 사냥 경험치 -> FKey = PartyID or NULL( 서버에서 구분자로 쓰임..DB에 넘어갈때는 Dungeon 으로 Convert 된다. )
Item = 8 , // : 경험치증가 아이템 -> FKey = ItemID
} ;
} ;
struct CharacterLevelChangeCode
{
enum eCharacterLevelChangeCode
{
Normal = 1 , // : 일반
Cheat = 2 , // : 치트
Admin = 3 , // : 관리자 변경
} ;
} ;
struct CoinChangeCode
{
enum eCoinChangeCode // 주의 : 던전 보상, 우편첨부, 창고 입출금, 아이템 되팔기, 교환 입출금, 교환 수수료, 강화 수수료, 스킬 언락, 상점 구입, 우편 수수료 인 경우 각각의 SP에 포함되어 있습니다.
{
DoNotDBSave = 0 ,
QuestReward = 1 , // : 퀘스트 보상 (FKey: QuestID)
PickUp = 2 , // : 픽업 (FKey: PartyID or NULL)
Cheat = 3 , // : 치트 (FKey: NULL)
Admin = 4 , // : 관리자 변경 (FKey: AuditLogID)
Use = 5 , // : 사용 (FKey: NULL)
// 6: 우편송신첨부 (FKey: MailID)
// 7: 우편수신첨부 (FKey: MailID)
InvenToWare = 8 , // : 창고 입금 (FKey: NULL)
WareToInven = 9 , // : 창고 출금 (FKey: NULL)
// 10: 아이템 되팔기 (FKey: NpcID)
// 11: 교환 입금 (FKey: CharacterID)
// 12: 교환 출금 (FKey: CharacterID)
QuestSub = 13 , // 퀘스트 차감 (FKey: QuestID)
RepairItem = 14 , // 아이템 수리 (FKey: ItemSerial)
// 15: 교환 수수료 (FKey: NULL)
// 16: 강화 수수료 (FKey: ItemEnchantLogID)
// 17: 스킬 언락 (FKey: SkillID)
// 18: 상점 구입 (FKey: ItemSerial)
DisjointTax = 19 , // 분해수수료 (FKey: NULL)
// 20: 우편 수수료 (FKey: MailID)
// 21: 무인상점등록 수수료 (FKey: TradeID)
// 22: 무인상점 아이템 구 (FKey: TradeID)입
// 23: 무인상점 아이템 판매금 (FKey: TradeID)
// 24: 무인상점 거래 성립 수수료 (FKey: TradeID)
CompoundTax = 25 , // 조합수수료 (FKey: NULL)
// 26: 캐릭터 삭제 (FKey: NULL)
MaxLevelExperienceTransGold = 27 , // 만랩 경험치 골드 보상 (FKey: NULL)
Present = 28 , // 선물 (FKey: NpcID)
// 29: 길드 창설 (FKey: GuildID)
GuildLevelup = 30 , // 30: 길드 레벨 업 (FKey: GuildID)
InvenToGuildWare = 31 , // 31: 길드 창고 입금 (FKey: GuildID)
GuildWareToInven = 32 , // 32: 길드 창고 출금 (FKey: GuildID)
GuildRewardBuy = 33 , // 33: 길드 보상 구매 (FKey: GuildItemID)
Donation = 34 , // 기부
// 35: (DOORS) 등록수수료
// 36: (DOORS) 입찰수수료
// 37: (DOORS) 낙찰수수료
// 38: (DOORS) 낙찰결제
// 39: (DOORS) 낙찰정산
// 40: (DOORS) 등록수수료취소
// 41: (DOORS) 입찰수수료취소
// 42: (DOORS) 낙찰수수료취소
// 43: (DOORS) 낙찰결제취소
// 44: (DOORS) 낙찰정산취소
CharmItem = 45 , // 보물상자 (FKey: ItemID)
ChaosItem = 46 , // 카오스 큐브 (FKey: ItemID)
SpecialBox = 47 , // 특수보관함 (FKey: EventRewardID)
// 48: 월드창고 사용 수수료
// 49: C2C 보관
// 50: C2C 회수
// 51: C2C 거래
TalismanSlotOpen = 52 , // 52: 탈리스만 슬롯 오픈(FKey: 슬롯 인덱스)
TalismanSlotChange = 53 , // 53: 탈리스만 슬롯 장착 위치 이동
GamblePrice = 55 , // 55: 도박모드 참가비
GambleFirstWinner = 56 , // 56: 도박모드 1등 골드
GambleSecondWinner = 57 , // 56: 도박모드 2등 골드
DWC = 58 , // 58: DWC 캐릭터 기본 소유 골드
} ;
enum ePetalChangeCode
{
GambleEnterPetal = 9 , // 9: 도박모드 페탈 입장료
GambleFirstWinPetal = 12 , // 12: 도박모드 1등 페탈 상금
GambleSecondWinPetal = 13 , // 13: 도박모드 2등 페탈 상금
} ;
} ;
struct CoinTypeCode
{
enum eCoinTypeCode
{
Coin = 1 , // : 코인
WarehouseCoin = 2 , // : 창고 코인
RebirthCoin = 3 , // : 부활 코인
PCBangRebirthCoin = 4 , // : PC방 부활 코인
} ;
} ;
struct EquipmentAttributeCode
{
enum eEquipmentAttributeCode
{
DelayTime = 1 , // : 딜레이 시간
RemainTime = 2 , // : Remain 시간
} ;
} ;
struct FatigueTypeCode
{
enum eFatigueTypeCode
{
PCBang = 1 , // : PC방 피로도
Daily = 2 , // : 일일 피로도
Weekly = 3 , // : 주간 피로도
Event = 4 , // 이벤트 피로도
VIP = 5 , // VIP피로도
} ;
} ;
struct PublisherCode
{
enum ePublisherCode
{
Studio = 0 ,
KR = 1 ,
CH = 2 ,
JP = 3 ,
TW = 4 ,
US = 5 ,
SG = 6 ,
TH = 7 ,
ID = 8 ,
RU = 9 ,
EU = 10 ,
} ;
} ;
struct QuestStatusCode
{
enum eQuestStatusCode
{
Gain = 0 , // : 퀘스트획득
Progress = 1 , // : 퀘스트진행
} ;
} ;
struct SkillPointCode
{
enum eSkillPointCode
{
LevelUp = 1 , // 스킬레벨업
EternityItem = 2 , // 영구적용아이템
Repair = 10 , // 걍 강제로 복구 세팅
} ;
} ;
struct SkillChangeCode
{
enum eSkillChangeCode
{
Gain = 1 , // : 스킬포인트 획득
Use = 2 , // : 스킬레벨업 & 스킬포인트 사용
Reset = 3 , // : 스킬포인트 리셋
GainByQuest = 4 , // : 스킬 획득 (퀘스트)
GainByDungeon = 5 , // : 스킬 획득 (던전 보상)
GainByBook = 6 , // : 스킬 획득 (스킬북)
GainByEvent = 7 , // : 스킬 획득 (이벤트)
GainByAdmin = 8 , // : 스킬 획득 (by 관리자)
DelByDrop = 9 , // : 스킬 삭제 (드랍)
DelByQuest = 10 , // : 스킬 삭제 (퀘스트)
DelByEvent = 11 , // : 스킬 삭제 (이벤트 만료)
DelByAdmin = 12 , // : 스킬 삭제 (by 관리자)
ModSkillLevelByAdmin = 13 , // : 스킬레벨 조정 (by 관리자)
GainByBuy = 14 , // 14스킬획득(구입)
} ;
} ;
struct TradeStatusCode
{
enum eTradeStatusCode
{
Sell = 0 , // : 판매중
CompleteSellByItem = 1 , // : 판매완료(아이템 수령)
CompleteSellByCoin = 2 , // : 판매완료(판매금 수령)
CancelSell = 3 , // : 판매취소
Expire = 4 , // : 기간만료
} ;
} ;
struct AddMaterializedItem
{
enum eCode
{
Pick = 1 , // 1=줍기 -> FKey: PartyID or NULL
Mission = 2 , // 2=미션 -> FKey: MissionID
QuestReward = 3 , // 3=퀘스트보상 -> FKey: QuestID
Present = 4 , // 4=선물 -> FKey: PurchaseID
PointBuy = 5 , // 5=인게임포인트 구입 -> FKey: NPCID
CashBuy = 6 , // 6=캐쉬 구입 -> FKey: PurchaseID
ReserveMoneyBuy = 7 , // 7=페탈 구입 -> FKey: PurchaseID
GetGachaResultCashItem_JP = 9 , // 9=일본 가챠 돌려서 나온 캐쉬 아이템.
GMGive = 10 , // 10=관리자 지급 -> FKey: AuditLogID
ItemDecompose = 11 , // 11=아이템 분해 -> FKey: NPCID
// ItemEnchantFail = 12, // 12=아이템 강화 실패 -> FKey: ItemEnchantID
ItemCompound = 13 , // 조합
RandomItem = 14 , // 랜덤아이템
DungeonReward = 15 , // 던젼보상
PvPReward = 16 , // pvp보상
CharacterCreate = 17 , // 기본지급
SystemMail = 18 , // 시스템메일 (미션보상)
FixedItem = 19 , // 캐쉬템 (얼굴, 머리) - 기존얼굴/머리 지우고 덮어쓰기 -> FKey: 캐쉬템 사용아이템시리얼 (인벤에 있는애)
CostumeMix = 21 , // 코스튬 합성
FishingReward = 22 , // 낚시보상
Harvest = 23 , // 수확
Cheat = 24 , // 치트
PvPLadderPoint = 25 , // 래더포인트
UnionPoint = 26 , // 연합포인트
Trigger = 27 , // 트리거
GuildWarFestivalPoint = 28 , // 길드 축제 포인트
Repurchase = 29 ,
GuildReversionItem = 30 ,
CostumeRandomMixItem = 31 ,
BestFriendItem = 34 ,
COMEBACKREWARD = 35 , // 복귀유저보상
SpecialBoxReward = 36 ,
NewbieGameQuitReward = 37 , //신규 유저 접속 종료할 때 보상
NewbiewReConnectReward = 38 , //신규 유저 재접속시 보상
ComebackGameQuitReward = 39 , //귀환자 접속 종료할 때 보상
SeedPointBuy = 40 , //시드로 구입
} ;
} ;
struct MailTypeCode
{
enum eCode
{
Normal = MailType : : NormalMail , // 일반 메일
Mission = MailType : : MissionMail , // 미션 보상
Admin = MailType : : AdminMail , // 관리자 메일
EventMail = MailType : : EventMail , // 이벤트 메일
VIP = MailType : : VIPMail , // VIP
MasterSystem = MailType : : MasterSystemMail , // 사제시스템
NpcReputaion = MailType : : NpcReputationMail , // NPC호감도시스템
Quest = MailType : : Quest , // 퀘스트
GuildWarReward = MailType : : GuildWarReward , // 길드전 보상
SpecialBox_Account = MailType : : SpecialBox_Account , // 특수보관함_계정타겟
SpecialBox_Character = MailType : : SpecialBox_Character , // 특수보관함_현캐릭터타겟
Cadge = MailType : : Cadge , // 조르기
GuildMaxLevelReward = MailType : : GuildMaxLevelReward , // 최초길드가입 만랩 길드 보상
AppellationBookReward = MailType : : AppellationBookReward , // 칭호 컬렉션북 완료 보상
} ;
} ;
struct UseItem
{
enum eUseItemCode
{
DoNotDBSave = 0 ,
Use = 1 , // 1=소모성 아이템 사용
Destroy = 2 , // 2=버리기
DeCompose = 4 , // 4=분해
Present = 5 , // 5=선물
GuildReversionItem = 6 , // 6=길드탈퇴나 추방으로 길드귀속아이템 삭제
} ;
} ;
struct ItemLocation
{
enum eCode
{
Equip = 1 ,
Inventory = 2 ,
Warehouse = 3 ,
QuestInventory = 4 ,
CashInventory = 5 ,
GiftRepository = 6 ,
CashEquip = 7 ,
Glyph = 8 ,
VehicleInventory = 9 ,
PetInventory = 10 ,
HarvestDepot = 11 , // 수확창고
ServerWare = 17 , // 서버 일반 아이템 창고
ServerWareCash = 18 , // 서버 캐쉬 아이템 창고
Talisman = 19 , // 탈리스만
PeriodInventory = 20 ,
PeriodWarehouse = 21 ,
} ;
} ;
struct PetType
{
enum eCode
{
Vehicle = 1 ,
Pet = 2 ,
SATIETY_PET = 3 ,
} ;
} ;
struct PayMethodCode
{
enum eCode
{
Coin = 1 , // 1: 코인
Cash = 2 , // 2: 캐쉬
Petal = 3 , // 3: 적립금
Coupon = 4 , // 4: 쿠폰
Admin = 5 , // 5: 관리자 지급
Quest = 6 , // 6: 퀘스트보상
Mission = 7 , // 7: 미션보상
LevelupEvent = 8 , // 8=캐릭터 레벨 업 보상
VIP = 9 , // 9 : VIP 선물
PvP = 10 , // 10 : PVP 래더 포인트
Union_Commerical = 11 , // 11 : 상인 연합 포인트
Union_Royal = 12 , // 12 : 왕성 연합 포인트
Union_Liberty = 13 , // 13 : 자유 연합 포인트
Cash_NexonUSA = 14 , // 14 : 넥슨아메리카 캐쉬
Event = 15 , // 15 : 이벤트
GuildWar_Festival = 16 , // 16 : 길드전 축제 포인트
GuildWar_Reward = 17 , // 17 : 길드전 보상
Comeback = 19 , // 18 : 복귀유저보상
BestFriend = 20 , // 20 : 절친
BeginnerGuild = 21 , // 21 : 초보자길드 선물
GuildSupport = 22 , // 22 : 길드지원보상
ActiveMission = 23 , // 23 : 액티브미션 보상
# if defined( PRE_ADD_STAMPSYSTEM )
Stamp = 24 , // 24 : 스탬프 보상
# endif // #if defined( PRE_ADD_STAMPSYSTEM )
# if defined( PRE_ADD_NEW_MONEY_SEED )
SeedPoint = 25 , // 25 : 시드로 구입
# endif
} ;
} ;
struct CashRebirthCode
{
enum eCode
{
Cash = 1 ,
Petal = 2 ,
Admin = 3 ,
Item = 4 ,
Seed = 5 ,
} ;
} ;
struct EffectItemGetCode
{
enum eCode
{
Cash = 1 ,
Petal = 2 ,
Cooper = 3 ,
Admin = 4 ,
Union = 5 ,
Item = 6 ,
Guild = 7 ,
BestFriend = 8 ,
Seed = 9 ,
} ;
} ;
struct EffectItemLifeSpanType
{
enum eCode
{
New = 0 ,
Extend = 1 ,
Update = 2 ,
} ;
} ;
struct DifficultyCode
{
enum eCode
{
Easy = 1 ,
Normal ,
Hard ,
Master ,
Abyss ,
} ;
} ;
struct ClearGradeCode
{
enum eCode
{
SSS = 10 ,
SS ,
S ,
A ,
B ,
C ,
D ,
} ;
} ;
struct RewardBoxCode
{
enum eCode
{
Wood = 1 ,
Bronze ,
Silver ,
Gold ,
} ;
} ;
struct WhereToGoCode
{
enum eCode
{
StageEntrance = 1 ,
Village ,
} ;
} ;
struct PvPModeCode
{
enum eCode
{
Round = 1 ,
Respawn ,
Captain ,
IndividualRespawn ,
Zombie ,
Ladder1vs1 ,
Ladder2vs2 ,
Ladder3vs3 ,
Ladder4vs4 ,
GuildWar ,
Occupation ,
AllKill ,
Racing ,
Tournament ,
# if defined( PRE_ADD_PVP_COMBOEXERCISE )
ComboExercise ,
# endif // #if defined( PRE_ADD_PVP_COMBOEXERCISE )
# if defined(PRE_ADD_DWC)
DWCRegular ,
DWCPractice ,
# endif
} ;
} ;
struct PvPTeamCode
{
enum eCode
{
A = 1 ,
B ,
} ;
} ;
struct PvPResultCode
{
enum eCode
{
Win = 1 ,
Lose ,
Draw ,
GiveUp ,
} ;
} ;
struct RestraintTargetCode
{
enum eCode
{
Account = 1 , // 계정
Character , // 캐릭터
} ;
} ;
struct RestraintTypeCode
{
enum eCode
{
ConnectRestraint = 1 ,
ChatRestraint ,
TradeRestraint ,
} ;
} ;
struct RestraintDolisReasonCode
{
enum eCode
{
DefaultCode = 110 ,
AbuseRestraintCode = 111 ,
AbuseTradeRestraintCode = 112 ,
} ;
} ;
struct TransactorCode
{
enum eCode
{
Master = 1 ,
Pupil ,
} ;
} ;
struct GetMasterCharacterCode
{
enum eCode
{
MyInfo = 1 , // 자신의 스승 정보
MyMasterInfo , // 내 스승 정보
OptionalMasterInfo , // 임의의 특정 스승 정보
} ;
} ;
# if defined( PRE_ADD_SECONDARY_SKILL )
struct SecondarySkillTypeCode
{
enum eCode
{
ProductionSkill = SecondarySkill : : Type : : ProductionSkill , // 생산스킬
ManufactureSkill = SecondarySkill : : Type : : ManufactureSkill , // 제작스킬
CommonSkill = SecondarySkill : : Type : : CommonSkill , // 공용스킬
} ;
} ;
# endif // #if defined( PRE_ADD_SECONDARY_SKILL )
struct AppellationKind
{
enum eAppellationKind
{
Select = 1 ,
Cover = 2
} ;
} ;
struct EtcPointCode
{
enum eCode
{
None = 0 ,
PvP = 1 ,
Union_Commercial = 2 ,
Union_Royal = 3 ,
Union_Liberty = 4 ,
GuildWar_Festival = 5 , // 길드전 축제 포인트
SeedPoint = 6 , // 시드 머니
Max ,
} ;
} ;
struct GuildWarRewardType
{
enum eGuildWarRewardType
{
GuildWarFestivalWin = 1 , // 길드축제우승
GuildWarFestivalLose , // 길드축제패배
GuildWarFinalUnder4 , // 본선 4강미만
GuildWarFinal4 , // 본선 4강보상
GuildWarFinal2 , // 본선 2위보상
GuildWarFinalWin , // 본선 우승보상
GuildWarFinalAbnormalLose , // 본선 비정상패배(동점때 예선점수?)
} ;
} ;
struct EventRewardType
{
enum eEventRewardType
{
Admin = 1 ,
System = 2 ,
} ;
} ;
} ;
//Exception Report
enum eExceptionRepert
{
_EXCEPTIONTYPE_NONE = 0 ,
//for game
_EXCEPTIONTYPE_ROOMCRASH ,
_EXCEPTIONTYPE_SESSIONCRASH ,
_EXCEPTIONTYPE_ROOMDESTRUCTOR ,
_EXCEPTIONTYPE_GAME_DELAYED ,
//for db
_EXCEPTIONTYPE_DBMW_DELAYED ,
} ;
//GameServerAffinity Type
enum eGameServerAffinityType
{
_GAMESERVER_AFFINITYTYPE_NORMAL = 0 , //그냥 일반 던전이미 머니 그런거
_GAMESERVER_AFFINITYTYPE_HYBRYD , //피비피도 받고 다 받아요
_GAMESERVER_AFFINITYTYPE_PVP , //피비피만 받아요
_GAMESERVER_AFFINITYTYPE_FARM , //게임서버 월드 통합처리용 농장 전용 겜섭!
} ;
// Cash
enum eCashEtc
{
Reason_GameClient = 1 ,
Reason_Web = 2 ,
Reason_PCBangGameClient = 3 ,
Reason_PCBangWeb = 4 ,
Category_Main = 1 ,
Category_Costume = 2 ,
Category_Item = 3 ,
Category_Package = 4 ,
CashItemState_None = 1 ,
CashItemState_Hot = 2 ,
CashItemState_New = 3 ,
CashItemState_Normal = 4 ,
CashItemState_Discount = 5 ,
} ;
# if defined(_CH)
enum eChSndaAuthFlag
{
eChSndaAuthFlag_UseEKey = ( 1 < < 0 ) , // EKey 기능 사용 여부
eChSndaAuthFlag_UseECard = ( 1 < < 1 ) , // ECard 기능 사용 여부
} ;
# endif // _CH
// structure -----------------------------------------------------------------------------------------------
struct TChannelInfo
{
USHORT nChannelID ; //할당된 채널(필드)아이디
USHORT nChannelIdx ;
USHORT nMapIdx ; //담당하는 맵의 아이디
USHORT nChannelMaxUser ;
USHORT nCurrentUser ;
int nAttribute ; //DirtyBit
int nMeritBonusID ; //Merit bonus
bool bVisibility ;
WCHAR wszMapName [ MAPNAMELENMAX ] ;
int nLimitLevel ;
bool bShow ;
USHORT nDependentMapID ;
int nServerID ;
BYTE cThreadID ;
# if defined(PRE_ADD_CHANNELNAME)
WCHAR wszLanguageName [ CHANNELLANGUAGEMAX ] ;
# endif //#if defined(PRE_ADD_CHANNELNAME)
int GetUserPercentage ( ) const
{
if ( nChannelMaxUser > 0 )
return nCurrentUser * 100 / nChannelMaxUser ;
return - 1 ;
}
} ;
struct TVillageInfo
{
BYTE cVillageID ;
int nManagedID ;
char szIP [ IPLENMAX ] ;
USHORT nPort ;
std : : vector < TChannelInfo > vOwnedChannelList ;
TVillageInfo ( )
{
cVillageID = 0 ;
nManagedID = 0 ;
memset ( szIP , 0 , sizeof ( szIP ) ) ;
nPort = 0 ;
}
} ;
struct TGameInfo
{
int nServerID ;
int nServerAttribute ;
ULONG nIP ;
USHORT nPort ;
USHORT nTcpPort ;
int nRoomCnt ;
int nUserCnt ;
bool bHasMargin ;
UINT nFrame ;
bool bComplete ;
UINT uiLastDelayReportTick ;
} ;
// Server Info
struct TServerInfo
{
bool bMergedWorld ;
int nWorldSetID ; // 통합 월드 아이디
char cWorldID ;
WCHAR wszWorldName [ WORLDNAMELENMAX ] ;
UINT nWorldMaxUser ; //대기자용
USHORT nDefaultMaxUser ;
bool bOnline ; // online, offline 상태표시용
bool bOnTop ;
std : : vector < TVillageInfo > vOwnedVillageList ;
TServerInfo ( )
{
bMergedWorld = false ;
nWorldSetID = 0 ;
cWorldID = 0 ;
memset ( wszWorldName , 0 , sizeof ( wszWorldName ) ) ;
nWorldMaxUser = 0 ;
nDefaultMaxUser = 0 ;
bOnline = false ;
bOnTop = false ;
}
} ;
//
struct TChannelInfoEx
{
TChannelInfo Channel ;
BYTE cVillageID ;
char szIP [ IPLENMAX ] ;
USHORT nPort ;
} ;
typedef std : : map < int , TChannelInfoEx > TMapChannel ;
// 서버에서는 float로 바로 쓰지않는다. 클라에서 받은 좌표에 *1000을 해서 사용함
struct TPosition
{
int nX ;
int nY ;
int nZ ;
} ;
struct TLocation
{
UINT nMapIndex ;
TPosition Pos ;
} ;
// npc, user object생성에 해당. 공통된 부분만
struct TBaseData
{
UINT nObjectID ;
WCHAR wszName [ NAMELENMAX ] ;
int nChannelID ;
TPosition CurPos , TargetPos ;
TPosition MoveDir ;
float fRotate ;
bool bBattleMode ;
} ;
struct TParamData
{
eChatType eChatType ;
int nChatSize ;
WCHAR wszChatMsg [ CHATLENMAX ] ;
char Buffer [ 128 ] ;
int nBufSize ;
USHORT wActorProtocol ;
TItemInfo ItemInfo ;
TItemInfo CashItemInfo ;
BYTE cLevel ;
UINT nExp ;
int nJob ;
int nSelectAppellation ;
int nCoverAppellation ;
bool bHide ;
bool bEncrypt ;
DNEncryptPacketSeq sEncrypt ;
char cType ;
char cState ;
DWORD dwColor ;
int nChatRoomParam ;
int nIndex ;
DWORD dwSendSessionID ; // SendSessionID
TItem Vehicle ;
TVehicleCompact PetInfo ;
char cPetPartsType ;
} ;
struct TDefaultCreateData
{
BYTE cClassID ; // 클래스
int cDarkClass ; // rlkt_dark dark class :)
int cDarkClassJobID ; // rlkt_dark dark class :)
int nCreateMapIndex ; // 처음 생성시 시작 맵 인덱스
int nCreateMapStartPositionX [ DEFAULTPOSITIONMAX ] ; // 처음 생성시 시작 위치 X
int nCreateMapStartPositionY [ DEFAULTPOSITIONMAX ] ; // 처음 생성시 시작 위치 Y
int nCreateMapStartRadius [ DEFAULTPOSITIONMAX ] ; // 반경
int nCreateTutorialMapIndex ; // 처음 생성시 튜토리얼 맵 인덱스 (GameServer쪽)
int nCreateTutorialGateNo ; // 처음 생성시 튜토리얼 게이트 (GameServer쪽)
int nDefaultBody ; // 기본몸
int nDefaultLeg ; // 기본다리
int nDefaultHand ; // 기본손
int nDefaultFoot ; // 기본발
int nFace [ DEFAULTPARTSMAX ] ; // 얼굴
int nHair [ DEFAULTPARTSMAX ] ; // 머리
int nHelmet [ DEFAULTPARTSMAX ] ; // 헬멧
int nBody [ DEFAULTPARTSMAX ] ; // 상의
int nLeg [ DEFAULTPARTSMAX ] ; // 하의
int nHand [ DEFAULTPARTSMAX ] ; // 손
int nFoot [ DEFAULTPARTSMAX ] ; // 발
int nWeapon [ WEAPONMAX ] ; // 무기
DWORD dwHairColor [ DEFAULTHAIRCOLORMAX ] ;
DWORD dwSkinColor [ DEFAULTSKINCOLORMAX ] ;
DWORD dwEyeColor [ DEFAULTEYECOLORMAX ] ;
int nDefaultItemID [ DEFAULTITEMMAX ] ; // 소유아이템
int nDefaultItemCount [ DEFAULTITEMMAX ] ; // 소유아이템 개수
int nDefaultSkillID [ DEFAULTSKILLMAX ] ; // 소유스킬
TQuickSlot DefaultQuickSlot [ DEFAULTQUICKSLOTMAX ] ; // 퀵슬롯개수
int nDefaultGestureID [ DEFAULTGESTUREMAX ] ; // 소유 제스처
} ;
# if defined( PRE_ADD_DWC )
struct TDWCCreateData
{
BYTE cClassID ; // 기본 클래스 ID
BYTE cJobCode1 ; // 1차 전직 클래스 ID
BYTE cJobCode2 ; // 2차 전직 클래스 ID
BYTE cLevel ;
int nExp ;
int nCreateMapIndex ; // 처음 생성시 시작 맵 인덱스
int nCreateMapStartPositionX [ DEFAULTPOSITIONMAX ] ; // 처음 생성시 시작 위치 X
int nCreateMapStartPositionY [ DEFAULTPOSITIONMAX ] ; // 처음 생성시 시작 위치 Y
int nCreateMapStartRadius [ DEFAULTPOSITIONMAX ] ; // 반경
int nDefaultBody ; // 기본몸
int nDefaultLeg ; // 기본다리
int nDefaultHand ; // 기본손
int nDefaultFoot ; // 기본발
int nEquipArray [ EQUIPMAX ] ; // 장착 장비
DWORD dwHairColor ;
DWORD dwSkinColor ;
DWORD dwEyeColor ;
int nDefaultItemID [ DEFAULTITEMMAX ] ; // 소유아이템
int nDefaultItemCount [ DEFAULTITEMMAX ] ; // 소유아이템 개수
int nDefaultSkillID [ DEFAULTSKILLMAX ] ; // 소유스킬
TQuickSlot DefaultQuickSlot [ DEFAULTQUICKSLOTMAX ] ; // 퀵슬롯개수
int nDefaultGestureID [ DEFAULTGESTUREMAX ] ; // 소유 제스처
short nSkillPoint ; // 스킬 포인트
int nGold ; // 골드 - 필요 없다면 제거하자
} ;
# endif // #if defined( PRE_ADD_DWC )
struct TMapInfo
{
int nMapID ;
char szMapName [ 10 ] [ 256 ] ;
BYTE GateMapCount [ WORLDMAP_GATECOUNT ] ;
USHORT GateMapIndexs [ WORLDMAP_GATECOUNT ] [ WORLDMAP_GATECOUNT ] ;
BYTE GateStartIndexs [ WORLDMAP_GATECOUNT ] [ WORLDMAP_GATECOUNT ] ;
int nWorldLevel ;
GlobalEnum : : eMapTypeEnum MapType ;
GlobalEnum : : eMapSubTypeEnum MapSubType ;
int nMaxClearCount ;
int nAllowMapType ;
std : : vector < int > vMapAreaIndex ;
bool bExpandable ;
bool bUserReturnSystem ; // 유저 복귀시스템
bool bVehicleMode ;
bool bPetMode ;
bool bAllowFreePass ;
# if defined( PRE_PARTY_DB )
std : : wstring wstrMapName ;
int iEnterConditionTable ;
# endif // #if defined( PRE_PARTY_DB )
# if defined( PRE_NORMALSTAGE_REGULATION )
char cRevisionNum ; //보정넘버
# endif
# if defined(PRE_ADD_VEHICLE_SPECIAL_ACTION)
bool bVehicleSpecalActionMode ;
# endif
} ;
struct TCoinCountData
{
BYTE cLevel ;
int nRebirthCoin [ WORLDCOUNTMAX ] ; // 부활코인
int nCashRebirthCoin [ WORLDCOUNTMAX ] ; // 부활캐쉬코인
int nRebirthCoinLimit ; // 무료코인소지제한개수
int nCashRebirthCoinLimit ; // 유료코인소지제한개수
int nVIPRebirthCoin ; // VIP부활코인
} ;
struct TActorData
{
int nActorID ;
BYTE cClass ; // 유닛 타입 종류
} ;
const int QUEST_MAX_CNT = 20 ;
struct TNpcData
{
int nNpcID ;
int nParam [ 2 ] ;
WCHAR wszName [ EXTDATANAMELENMAX ] ;
char szTalkFile [ 256 ] ; // 대사파일이름
char szScriptFile [ 256 ] ; // script 파일이름
int QuestIndexArr [ QUEST_MAX_CNT ] ; // 퀘스트인덱스
TActorData ActorData ;
} ;
struct TItemData
{
int nItemID ;
WCHAR wszItemName [ EXTDATANAMELENMAX ] ;
int nType ; // 타입
int nTypeParam [ 3 ] ; // 타입파라미터
BYTE cLevelLimit ; // 레벨제한
BYTE cRank ; // 등급
BYTE cReversion ; // 귀속여부
bool IsCash ; // 캐쉬템인가
bool IsDestruction ; // 파괴여부
bool IsAuthentication ; // 인증여부
int nAmount ; // 금액
int nSellAmount ; // 판매금액
int nOverlapCount ; // 중첩개수
std : : vector < int > nNeedJobClassList ; // 직업제한
int nSkillID ; // 스킬 인덱스
char cSkillLevel ; // 스킬 레벨
char cSkillUsingType ; // 스킬 사용 타입
int nMaxCoolTime ; // 최대 쿨타임 (변하지 않는 값)
int nEnchantID ; // 인챈트아이디
int nAllowMapType ; // 사용가능한 맵 타입
char cSealCount ; // 밀봉 횟수
int nSealID ; // SealCountTableID
int nNeedBuyItemID ; // 상점에서 구입할 때 필요한 아이템ID
int nNeedBuyItemCount ; // 상점에서 구입할 때 필요한 아이템개수
int nNeedPvPRank ; // 장착할 때 필요한 PvP 랭크
bool IsSealed ; // 획득 시 밀봉여부
int nCashTradeCount ; // 캐시아이템 교환개수
bool IsEnableCostumeMix ;
int nApplicableValue ;
bool IsCollectingEvent ; // 아이템 수집 API를 호출여부
int nExchangeCode ; // 아이템 카테고리 ID
int iNeedBuyLadderPoint ;
int iUseLevelLimit ;
int iNeedBuyUnionPoint ;
int iNeedBuyGuildWarPoint ;
bool bRebuyable ;
int nPeriod ;
# if defined(PRE_ADD_SERVER_WAREHOUSE)
bool IsWStorage ; // 서버 창고에 넣을 수 있는 예외
# endif
int DragonJewelType ;
void Reset ( )
{
memset ( wszItemName , 0 , sizeof ( wszItemName ) ) ;
memset ( nTypeParam , 0 , sizeof ( nTypeParam ) ) ;
nNeedJobClassList . clear ( ) ;
std : : vector < int > ( ) . swap ( nNeedJobClassList ) ;
nItemID = 0 ;
nType = 0 ;
cLevelLimit = 0 ;
cRank = 0 ;
cReversion = 0 ;
IsCash = 0 ;
IsDestruction = 0 ;
IsAuthentication = 0 ;
nAmount = 0 ;
nSellAmount = 0 ;
nOverlapCount = 0 ;
nSkillID = 0 ;
cSkillLevel = 0 ;
cSkillUsingType = 0 ;
nMaxCoolTime = 0 ;
nAllowMapType = 0 ;
cSealCount = 0 ;
nNeedBuyItemID = 0 ;
nNeedBuyItemCount = 0 ;
nNeedPvPRank = 0 ;
IsSealed = 0 ;
nCashTradeCount = 0 ;
IsEnableCostumeMix = 0 ;
nApplicableValue = 0 ;
IsCollectingEvent = 0 ;
nExchangeCode = 0 ;
iNeedBuyUnionPoint = 0 ;
iNeedBuyGuildWarPoint = 0 ;
bRebuyable = false ;
nPeriod = 0 ;
DragonJewelType = 0 ;
}
} ;
struct TWeaponData
{
int nWeaponIndex ;
char cEquipType ; // 장착타입
int nLength ; // 무기 길이
int nDurability ; // 내구도
int nDurabilityRepairCoin ; // 수리비
int nPermitJob [ 10 ] ;
bool bOneType ;
} ;
struct TPartData
{
int nPartIndex ;
int nParts ; // 파츠
int nDurability ; // 내구도
int nDurabilityRepairCoin ; // 수리비
int nPermitJob [ 10 ] ;
std : : vector < int > nSubPartsList ; // 서브파츠 (한벌옷)
TPartData ( )
{
nPartIndex = 0 ;
nParts = 0 ;
nDurability = 0 ;
nDurabilityRepairCoin = 0 ;
memset ( nPermitJob , 0 , sizeof ( nPermitJob ) ) ;
}
} ;
struct TVehiclePartsData
{
int nItemID ;
int nVehicleClassID ;
int nVehiclePartsType ;
std : : string strSkinName ;
std : : string strAniName ;
std : : string strActName ;
int nSkinColor ;
TVehiclePartsData ( )
{
nItemID = 0 ;
nVehicleClassID = 0 ;
nVehiclePartsType = 0 ;
nSkinColor = 0 ;
}
} ;
struct TVehicleData
{
int nItemID ;
int nVehicleClassID ;
int nVehicleActorID ;
int nDefaultBody ;
int nDefaultParts1 ;
int nDefaultParts2 ;
int nVehicleSummonTime ;
int nVehicleDefaultSpeed ;
int nPetLevelTypeID ; // pet 등급(?)값 등급이 다른 펫을 참조하기위한 키값
int nPetSkillID1 ; //
int nPetSkillID2 ;
int nRange ; // 스캔 범위값. 이를테면 줍기 같은거
int nFoodID ;
} ;
const BYTE PetStateMax = 10 ;
struct TPetLevelDetail
{
int nTableIndex ;
int nPetLevel ;
int nPetExp ;
int nState [ PetStateMax ] ;
char * szStateMin [ PetStateMax ] ;
char * szStateMax [ PetStateMax ] ;
int nVipExp ;
} ;
struct TPetLevelData
{
int nPetLevelType ;
std : : vector < TPetLevelDetail > VecPetLevel ;
} ;
struct TPetFoodData
{
int nItemID ;
int nTickTime ; // 소모 시간(second)
int nFullTic ; // 틱당 소모량
BYTE cFullTimeLogOut ; // 로그아웃시 기존 만복도 나누기값
int nFullMaxCount ; // 만복도 최대 max수치
int nUseExp [ Pet : : MAX_SATIETY_SELECTION ] ;
int nUseState [ Pet : : MAX_SATIETY_SELECTION ] ;
} ;
struct TPotentialJewelData
{
int nItemID ;
int nApplyApplicableValue ;
int nPotentialNo ;
bool bErasable ;
bool bCanApplySealedItem ;
# if defined(PRE_ADD_REMOVE_PREFIX)
bool bSuffix ;
# endif // PRE_ADD_REMOVE_PREFIX
# if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
int nRollbackAmount ; // 잠재력 부여 롤백 수수료
# endif // #if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
} ;
struct TEnchantJewelData
{
int nItemID ;
int nApplyApplicableValue ;
int nRequireMaxItemLevel ;
int nRequireEnchantLevel ;
int nEnchantLevel ;
bool bCanApplySealedItem ;
} ;
struct TItemDropData
{
int nItemDropID ;
bool bIsGroup [ 20 ] ;
int nIndex [ 20 ] ;
int nProb [ 20 ] ;
int nInfo [ 20 ] ;
} ;
struct TGlobalWeightData
{
int nID ;
float fValue ;
} ;
struct TGlobalWeightIntData
{
int nID ;
int nValue ;
} ;
struct TLevelData
{
int nIndex ;
short wStrength ; // 힘
short wAgility ; // 민첩
short wIntelligence ; // 지능
short wStamina ; // 건강
int nExperience ; // 경험치
int nFatigue ; // 피로도
} ;
struct TStat
{
USHORT wStr ;
USHORT wDex ;
USHORT wInt ;
USHORT wHealth ;
USHORT wLuck ;
} ;
struct TSkillLevelData
{
char cSkillLevel ; // 스킬 레벨
char cLevelLimit ; // 제한 레벨
//int nNeedJobClass; // 직업제한 -> 스킬 테이블로 옮겨졌음.
int nDelayTime ; // 스킬딜레이(ms)
int nAddRange ; // 추가 사거리(cm)
int nNeedItemID ; // 소모아이템
int nNeedItemDecreaseCount ; // 소모 아이템 개수
int nDecreaseHP ; // 소모HP
int nDecreaseSP ; // 소모SP
int nNeedSkillPoint ;
int nEffectClassValue1Duration ;
float nMagicDamage ; //rlkt_damage
float nPhyDamage ; //rlkt_damage
} ;
struct TSkillData
{
int nSkillID ; // 스킬id
char cNeedWeaponType [ 2 ] ; // 필요무기
int nMaxLevel ; // 최대레벨
char cSkillType ; // 스킬타입
char cDurationType ; // 지속타입
char cTargetType ; // 타겟타입
char cDissolvable ; // 해제 가능 여부
int nNeedJobID ; // 직업 제한
bool bDefaultLocked ; // 디폴트로 락이 된 건지 여부
int nUnlockSkillBookItemID ; // 언락하는 스킬북의 아이템 ID
int nUnlockPrice ; // 돈으로 언락할 때 비용.
int nExclusiveID ; // 이 아이디가 같은 값인 스킬은 같이 배울 수 없다.
int nGlobalCoolTime ; // 글로벌 스킬 쿨타임 (#36858)
int nGlobalSkillGroup ; // 글로벌 스킬 그룹 (#36858)
std : : vector < TSkillLevelData > vLevelDataList ;
TSkillData ( )
{
nSkillID = 0 ;
memset ( cNeedWeaponType , 0 , sizeof ( cNeedWeaponType ) ) ;
nMaxLevel = 0 ;
cSkillType = 0 ;
cDurationType = 0 ;
cTargetType = 0 ;
cDissolvable = 0 ;
nNeedJobID = 0 ;
bDefaultLocked = false ;
nUnlockSkillBookItemID = 0 ;
nUnlockPrice = 0 ;
nExclusiveID = 0 ;
nGlobalCoolTime = 0 ;
nGlobalSkillGroup = 0 ;
}
} ;
struct TSkillTreeData
{
int nSkillID ;
int nTreeSlotIndex ;
int nParentSkillID [ 3 ] ;
int nNeedParentSkillLevel [ 3 ] ;
# if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP)
int nNeedBasicSP ;
int nNeedFirstSP ;
int nNeedSecondSP ;
# endif // #if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP)
# if defined( PRE_ADD_ONLY_SKILLBOOK )
bool bNeedSkillBook ;
# endif // #if defined( PRE_ADD_ONLY_SKILLBOOK )
} ;
// npc 대화 관련 구조체
struct TALK_QUESTION
{
std : : wstring szQuestion ;
} ;
struct TALK_ANSWER
{
std : : wstring szLinkTarget ;
std : : wstring szLinkIndex ;
std : : wstring szAnswer ;
bool bOtherTargetLink ; // 다른 토크파일로 링크 하는 경우 true
} ;
struct TALK_PARAGRAPH
{
std : : wstring szIndex ;
TALK_QUESTION Question ;
std : : vector < TALK_ANSWER > Answers ;
} ;
// key - 문단스트링인덱스, second - 문단
typedef std : : map < std : : wstring , TALK_PARAGRAPH > TALK_PARAGRAPH_MAP ;
typedef TALK_PARAGRAPH_MAP : : iterator TALK_PARAGRAPH_MAP_IT ;
// key - 대사xml 파일 이름, second - 대사전체
typedef std : : map < std : : wstring , TALK_PARAGRAPH_MAP > TALK_MAP ;
typedef TALK_MAP : : iterator TALK_MAP_IT ;
# include <set>
// key - 문단응답스트링인덱스 (단지 클라이언트 대사요청 무결성 체크 오류메시지를 막는 용도)
typedef std : : set < std : : wstring > TALK_ANSWER_SET ;
typedef TALK_ANSWER_SET : : iterator TALK_ANSWER_SET_IT ;
// key - 대사xml 파일 이름, second - 문단응답스트링집합 (단지 클라이언트 대사요청 무결성 체크 오류메시지를 막는 용도)
typedef std : : map < std : : wstring , TALK_ANSWER_SET > TALK_ANSWER_MAP ;
typedef TALK_ANSWER_MAP : : iterator TALK_ANSWER_MAP_IT ;
// 퀘스트 보상 아이템 테이블 정보
// 돈과 아이템 6종류 까지 세팅할 수 있다. nItemID 과 nItemCount는 세트이다.
struct TQuestRewardBase
{
struct _ITEMSET
{
int nItemID ;
int nItemCount ;
int nItemOptionTableID ;
} ;
} ;
struct TQuestReward : public TQuestRewardBase
{
UINT nIndex ; // 보상테이블 인덱스
UINT nStringIndex ; // 보상테이블 스트링
char cType ; // 보상타입 1이면 전체보상 / 2면 선택보상
char cSelectMax ; // 선택보상일경우 몇개까지 선택할것인지.
UINT nCoin ; // 보상금액
int nExp ; // 보상 경험치
int nQuestID ; // 퀘스트 ID
int nQuestStep ; // 퀘스트 완료 시 스텝
BYTE nClass ; // 보상 클래스
_ITEMSET ItemArray [ QUESTREWARD_INVENTORYITEMMAX ] ;
_ITEMSET LevelCapItemArray [ MAX_QUEST_LEVEL_CAP_REWARD ] ;
int nMailID ;
int nFatigue ;
} ;
struct TQuestLevelCapReward : public TQuestRewardBase
{
UINT uIndex ;
char cType ;
char cClassID ;
_ITEMSET Items [ MAX_QUEST_LEVEL_CAP_REWARD ] ;
} ;
struct TCompleteEventQuest
{
short wCompleteCount ;
int nScheduleID ;
} ;
// Shop
struct TShopItem
{
int nItemID ; // 상점 아이템 아이디
int nCount ; // 상점 아이템 수량
int nMaxCount ; // 아이템 최대수량
int nPrice ; // 아이템 가격
int buyLimitCount ;
# if defined (PRE_ADD_COMBINEDSHOP_PERIOD)
int nPeriod ;
# endif
# if defined( PRE_ADD_LIMITED_SHOP )
int nShopLimitReset ;
# endif
} ;
struct TShopTabData
{
int nTabID ;
std : : vector < TShopItem > vShopItem ; // SHOPTABMAX
TShopTabData ( )
{
Clear ( ) ;
}
void Clear ( )
{
nTabID = 0 ;
vShopItem . clear ( ) ;
}
} ;
struct TShopData
{
int nShopID ; // 샵 아이디 (npc가 가지고 있는 아이디와 비교해서 연결)
std : : vector < TShopTabData > vShopTabData ; // SHOPITEMMAX
TShopData ( )
{
nShopID = 0 ;
}
} ;
// Skill Shop
struct TSkillShopItem
{
int nSkillID ; // 스킬아이디
int nPrice ; // 스킬 가격
} ;
struct TSkillShopData
{
int nShopID ; // 샵 아이디 (npc가 가지고 있는 아이디와 비교해서 연결)
TSkillShopItem SkillShopItem [ SKILLSHOPITEMMAX ] ; // 최대 10개밖에 안된다
} ;
// Enchant
const int ENCHANTITEMMAX = 5 ;
struct TEnchantLevelData
{
int nItemID ;
char cLevel ;
# ifdef PRE_FIX_MEMOPT_ENCHANT
int nNeedItemTableID ;
int nStateTableID ;
int nNeedCoin ;
# else
char cEnchantProb ;
char cBreakRatio ;
char cMinDownLevel ;
char cMaxDownLevel ;
int nNeedItemID [ ENCHANTITEMMAX ] ;
int nNeedItemCount [ ENCHANTITEMMAX ] ;
int nNeedCoin ;
int nFailResultItemID ;
int nPotentialID ;
char cPotentialProb ;
int nProtectItemCount ;
# if defined(PRE_ADD_ENCHANTSHIELD_CASHITEM)
int nShieldItemCount ; // 상위강화보호젤리용(다운그레이드x)
# endif
# endif // PRE_FIX_MEMOPT_ENCHANT
} ;
struct TEnchantData
{
int nEnchantID ;
char cCount ;
std : : map < char , TEnchantLevelData * > pMapLevelData ;
} ;
# ifdef PRE_FIX_MEMOPT_ENCHANT
struct TEnchantNeedItemData
{
char cEnchantProb ;
char cBreakRatio ;
char cMinDownLevel ;
char cMaxDownLevel ;
int nNeedItemID [ ENCHANTITEMMAX ] ;
int nNeedItemCount [ ENCHANTITEMMAX ] ;
float fUpStateRatio ;
int nFailResultItemID ;
int nProtectItemCount ;
# if defined(PRE_ADD_ENCHANTSHIELD_CASHITEM)
int nShieldItemCount ; // 상위강화보호젤리용(다운그레이드x)
# endif
} ;
# endif // PRE_FIX_MEMOPT_ENCHANT
struct TPotentialDataItem
{
int nItemID ;
int nPotentailOffset ;
int nPotentialNo ;
int nProb ;
int nSkillID ;
int nSkillLevel ;
int nSkillUsingType ;
} ;
struct TPotentialData
{
int nPotentialID ;
int nTotalProb ;
std : : vector < TPotentialDataItem * > pVecItemData ;
} ;
// Exchange
struct TExchangeData
{
int nInvenIndex ; // 인벤 인덱스
short wCount ; // 몇개 넣었는지
INT64 biSerial ;
} ;
# ifdef PRE_ADD_GACHA_JAPAN
// gachapon japan
struct TGachaponShopInfoByJob_JP
{
int nGachaponTableID ; // 가챠폰 테이블 ID
int nGachaponIndex ; // 가챠폰 샵 인덱스.
int nJobClassID ; // 이 가챠폰에서 드랍해주는 아이템들의 직업
int nPartsLinkDropTableID [ CASHEQUIPMAX ] ;
} ;
struct TGachaponData_JP
{
int nGachaponIndex ; // 가챠폰 샵 인덱스. npc 테이블에 쓰인 인덱스를 이걸로 찾음. 테이블 인덱스 아님.
TGachaponShopInfoByJob_JP GachaponShopInfo [ CLASSKINDMAX ] ;
} ;
# endif // PRE_ADD_GACHA_JAPAN
struct TCostumeMix
{
int nMinScore ;
int nDropID ;
} ;
//community
//getsimple characterdata patialy enum type
enum eReqCharacterPartialy
{
_REQCHARACTERPARTIALY_FRIEND ,
} ;
//Friend
struct TFriendGroup : public TBoostMemoryPool < TFriendGroup >
{
UINT nGroupDBID ;
WCHAR wszGroupName [ FRIEND_GROUP_NAMELENMAX ] ;
} ;
struct TFriend : public TBoostMemoryPool < TFriend >
{
UINT nFriendAccountDBID ;
INT64 biFriendCharacterDBID ;
UINT nGroupDBID ;
TCommunityLocation Location ;
WCHAR wszCharacterName [ NAMELENMAX ] ;
WCHAR wszGroupName [ FRIEND_GROUP_NAMELENMAX ] ;
WCHAR wszFriendMemo [ FRIEND_MEMO_LEN_MAX ] ;
# ifdef PRE_ADD_DOORS
bool bMobileAuthentication ;
# endif //#ifdef PRE_ADD_DOORS
} ;
//UserState
enum eCummunityState //초대 받는다 안받는다 쪽지 받겠다 안받겠다 등등
{
_COMMUNITY_NONE = 0 ,
_COMMUNITY_MSG_PERMIT , //모든 메세지 받아효~
_COMMUNITY_MSG_NOTPERMIT , //메세지 안받아효~ 나좀 내버려 두삼!
} ;
struct sWorldUserState
{
WCHAR wszCharacterName [ NAMELENMAX ] ;
INT64 biCharacterDBID ; //일단은 혹쉬나 해서 훗훗
int nChannelID ; //
int nMapIdx ;
int nLocationState ; //eLocationState
int nCummunityState ; //eCummunityState
} ;
//ServiceManager NoticeType
enum eSMNoticeType
{
_NOTICETYPE_ALL = 0 ,
_NOTICETYPE_WORLD ,
_NOTICETYPE_EACHSERVER ,
_NOTICETYPE_CHANNEL ,
_NOTICETYPE_ZONE ,
} ;
//VoiceChannelReqType
enum eVoiceChannelReqType
{
_VOICECHANNEL_REQTYPE_PARTY ,
_VOICECHANNEL_REQTYPE_PVP ,
//머 이런식으로 생기지 않을까나..
//_VOICECHANNELTYPE_GUILD,
//_VOICECHANNELTYPE_PRIVATE,
} ;
//Invite PartyInfo
struct TInvitePartyInfo
{
TPARTYID PartyID ;
int nMapIdx ;
BYTE cLimitLevelMin ;
# if defined( PRE_PARTY_DB )
# else
BYTE cLimitLevelMax ;
# endif // #if defined( PRE_PARTY_DB )
BYTE cPartyMemberMax ;
BYTE cPartyMemberCount ;
BYTE cPartyAvrLevel ;
WCHAR wszPartyName [ PARTYNAMELENMAX ] ;
} ;
// PvP
struct TPvPMapTable
{
UINT uiGameType ; // PvPCommon::GameType
std : : vector < UINT > vGameModeTableID ; // PvPGameModeTableID
std : : vector < UINT > vNumOfPlayerOption ; // 인원수 옵션
bool bIsBreakInto ; // 난입가능Flag
UINT uiItemUsageType ; // PvPCommon::ItemUsageType
bool bIsAllowItemDrop ; // 아이템드롭 Flag
bool bIsGuildBattleGround ; // 길드전에서 사용할수 있는지 Flag
bool bIsReleaseShow ; // 릴리즈버전에서노출
LadderSystem : : MatchType : : eCode MatchType ;
// Function
bool CheckMaxUser ( const BYTE cMaxUser ) const
{
for ( UINT i = 0 ; i < vNumOfPlayerOption . size ( ) ; + + i )
{
if ( vNumOfPlayerOption [ i ] = = cMaxUser )
return true ;
}
return false ;
}
bool CheckGameModeTableID ( const UINT uiTableID ) const
{
for ( UINT i = 0 ; i < vGameModeTableID . size ( ) ; + + i )
{
if ( vGameModeTableID [ i ] = = uiTableID )
return true ;
}
return false ;
}
bool CheckBreakIntoOption ( const BYTE cBreakIntoFlag ) const
{
if ( cBreakIntoFlag )
{
if ( ! bIsBreakInto )
return false ;
}
return true ;
}
} ;
struct TPvPGameModeTable
{
int nItemID ;
UINT uiGameMode ; // PvPCommon::GameMode
std : : vector < UINT > vWinCondition ;
std : : vector < UINT > vPlayTimeSec ;
UINT uiRespawnTimeSec ;
UINT uiRespawnNoDamageTimeSec ;
UINT uiRespawnHPPercent ;
UINT uiRespawnMPPercent ;
UINT uiWinXPPerRound ;
UINT uiLoseXPPerRound ;
UINT uiItemDropTableID ;
bool bIsLevelRegulation ;
bool bIsReleaseShow ; // 릴리즈버전에서노출
UINT uiMedalExp ;
UINT uiNumOfPlayersMin ;
UINT uiNumOfPlayersMax ;
std : : vector < UINT > vVictoryExp ;
std : : vector < UINT > vVictoryBonusRate ;
std : : vector < UINT > vDefeatExp ;
std : : vector < UINT > vDefeatBonusRate ;
LadderSystem : : MatchType : : eCode LadderMatchType ;
int iRewardItemID ;
int nFatigueConTime ;
int nFatigueConValue ;
int nFatigueConExp ;
int nFatigueConMedal ;
int iNeedInven ;
int iSkillSetting ;
bool bIsSelectableRegulation ;
bool bIsDefaultRegulation ;
int nBattleGroundTableID ;
bool bAllowedUserCreateMode ;
# if defined( PRE_ADD_RACING_MODE ) || defined( PRE_ADD_PVP_TOURNAMENT )
int nDefaultRewardItem ;
int nDefaultRewardValue ;
std : : vector < int > vRankRewardItem ;
std : : vector < int > vRankRewardValue ;
# endif // #if defined( PRE_ADD_RACING_MODE ) || defined( PRE_ADD_PVP_TOURNAMENT )
// Function
bool CheckWinCondition ( const UINT uiWinCondition ) const
{
if ( vWinCondition . empty ( ) )
return true ;
for ( UINT i = 0 ; i < vWinCondition . size ( ) ; + + i )
{
if ( vWinCondition [ i ] = = uiWinCondition )
return true ;
}
return false ;
}
bool CheckPlayTimeSec ( const UINT uiPlayTime ) const
{
if ( vPlayTimeSec . empty ( ) )
return true ;
for ( UINT i = 0 ; i < vPlayTimeSec . size ( ) ; + + i )
{
if ( vPlayTimeSec [ i ] = = uiPlayTime )
return true ;
}
return false ;
}
// 실패시 -1 리턴
int GetWinconditionIndex ( const UINT uiWinCondition ) const
{
for ( UINT i = 0 ; i < vWinCondition . size ( ) ; + + i )
{
if ( vWinCondition [ i ] = = uiWinCondition )
return i ;
}
return - 1 ;
}
bool CheckMaxUser ( const UINT uiMaxUser ) const
{
return ( uiMaxUser > = uiNumOfPlayersMin & & uiMaxUser < = uiNumOfPlayersMax ) ;
}
} ;
struct TPvPGameStartConditionTable
{
UINT uiMinTeamPlayerNum ; // 최소 시작 팀 인원
UINT uiMaxTeamPlayerDiff ; // 최대 양팀 인원 허용 수
short Check ( const UINT uiATeam , const UINT uiBTeam , const bool bRandomTeam ) const
{
// 최소 시작 팀 인원 검사
if ( uiATeam < uiMinTeamPlayerNum | | uiBTeam < uiMinTeamPlayerNum )
return ERROR_PVP_CANTSTART_LESS_MINTEAMPLAYER ;
if ( ! bRandomTeam ) // 랜덤팀이 아닌 경우 처리한다.
{
// 최대 양팀 인원 허용 수 검사
UINT uiDiff = : : abs ( static_cast < int > ( uiATeam - uiBTeam ) ) ;
if ( uiDiff > uiMaxTeamPlayerDiff )
return ERROR_PVP_CANTSTART_MORE_MAXDIFFTEAMPLAYER ;
}
return ERROR_NONE ;
}
} ;
struct TPvPRankTable
{
UINT uiXP ;
# ifdef PRE_MOD_PVPRANK
BYTE cType ; //PvPCommon::RankTable 참조
BYTE cMinRange ; //rate or rank
BYTE cMaxRange ; //rate or rank
TPvPRankTable ( )
{
uiXP = 0 ;
cType = PvPCommon : : RankTable : : InitValue ;
cMinRange = 0 ;
cMaxRange = 0 ;
}
# endif //#ifdef PRE_MOD_PVPRANK
} ;
struct TAppellationData
{
int nAppellationID ;
int nArrayIndex ;
int nColor ;
int nLevelLimit ;
int nType ;
# if defined( PRE_ADD_NEWCOMEBACK )
int nSkillItemID ;
# endif
# if defined( PRE_MOD_APPELLATIONBOOK_RENEWAL)
std : : vector < int > nUseCollectionBookIndex ;
# endif // #if defined( PRE_MOD_APPELLATIONBOOK_RENEWAL)
} ;
// 미션 시스템 관련
struct TEventCondition
{
char cEvent ;
char cType [ 5 ] ;
int nParam [ 5 ] ;
char cOperator [ 5 ] ;
bool bCheckType ;
} ;
struct TMissionData
{
bool bActivate ;
int nType ; // 미션타입(eMissionType)
int nMailID ;
int nRewardAppellation ;
int nRewardPoint ;
bool bIsAchieveNotice ;
TEventCondition GainCondition ;
TEventCondition AchieveCondition ;
} ;
struct TDailyMissionData
{
int nMailID ;
int nRewardAppellation ;
int nRewardPoint ;
TEventCondition AchieveCondition ;
int nCounterParam ;
char cCounterOperator ;
int nItemID ;
int nType ;
int nTypeParam ;
__time64_t tStartDate ;
# if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
__time64_t tEndDate ;
# endif // #if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
} ;
# if defined(PRE_ADD_REMOTE_QUEST)
struct TRemoteQuestData
{
bool bActivate ;
int nIndex ;
int nQuestID ;
bool bPreQuestCheckType ;
std : : vector < int > nVecPreQuestCondition ;
TEventCondition GainCondition ;
} ;
# endif
# if defined(PRE_ADD_ACTIVEMISSION)
struct TActiveMissionData
{
int nIndex ;
bool bActivate ;
int nMailID ;
TEventCondition AchieveCondition ;
} ;
# endif
// Collection
const char CollectionAppellationMax = 10 ;
struct TCollectionBookData
{
int nID ;
std : : vector < int > nVecAppellationArrayIndex ;
int nRewardAppellationArrayIndex ;
# if defined(PRE_MOD_APPELLATIONBOOK_RENEWAL)
int nMailID [ 2 ] ; // 0 - 50% 넘겼을 때 보내줄 메일 ID, 1- 칭호 컬렉션 완성시 보상 MailID
# endif //#if defined(PRE_MOD_APPELLATIONBOOK_RENEWAL)
} ;
// TaxTable
struct TTaxData
{
char cTaxType ; // 세금종류 (TaxType_PostTax)
int nLevelStart ; // 시작 레벨
int nLevelEnd ; // 끝 레벨
int nAmountStart ; // 시작금액 (골드단위)
int nAmountEnd ; // 끝금액
float fRate ; // 세율
int nTaxAmount ; // 세액
} ;
// Seal
const BYTE SEALENCHANTMAX = 16 ; // 노강화부터 15강까지.
struct TSealCountData
{
int nType1 ;
int nType2 ;
int nLevel [ SEALENCHANTMAX ] ;
char cSuccessRate [ SEALENCHANTMAX ] ;
} ;
// PCBang
const BYTE PCParamMax = 2 ;
struct TPCBangParam
{
int nParam [ PCParamMax ] ;
} ;
struct TPCBangData
{
char cType ; // PCBang 혜택 종류 (ePCBangType)
std : : vector < TPCBangParam > VecPCBangParam ;
std : : vector < TPCBangParam > VecPremiumPCBangParam ;
std : : vector < TPCBangParam > VecGoldPCBangParam ;
std : : vector < TPCBangParam > VecSilverPCBangParam ;
std : : vector < TPCBangParam > VecRedPCBangParam ;
} ;
// CashShop
const BYTE COMMODITYITEMMAX = 5 ;
const BYTE COMMODITYLINKMAX = 5 ;
struct TCashCommodityData
{
int nSN ;
# if defined(_JP)
std : : string strJPSN ;
# endif // #if defined(_JP)
BYTE cCategory ;
int nSubCategory ;
int nItemID [ COMMODITYITEMMAX ] ; // ItemTable 아이템 ID
int nLinkSN [ COMMODITYLINKMAX ] ; // 연계상품
std : : string strName ;
short wPeriod ; // 기간
int nPrice ; // 가격
int nCount ; // 구매시 주어지는 개수
int nPriority ; // 캐시샵에 표시되는 우선순위
bool bOnSale ; // 판매상태
bool bOnSaleReal ; // 진짜(?)판매상태
char cState ; // HOT, NEW등 상태 표시용
bool bLimit ; // 한정 판매
bool bReserveGive ; // 적립금 제공 여부
int nReserve ; // 구매시 주어지는 적립금
int nValidity ; // 유효기간
bool bReserveAble ; // 적립금으로 살수 있는지 여부
bool bPresentAble ; // 선물 가능 여부
char cItemSort ; // 아이템종류
int nPriceFix ; // 정가
bool bCartAble ; // 장바구니에 담을 수 있는지
bool bVIPSell ; // VIP 전용 판매 여부
int nVIPLevel ; // VIP 등급
bool bAutomaticPay ; // 자동결제 여부
int nAutomaticPaySale ; // 자동결제 후 할인적용
int nVIPPoint ; // 구매시 지급하는 VIPPoint
int nOverlapBuy ; // 중복구매방지
# if defined(PRE_ADD_CASH_REFUND)
bool bNoRefund ; // 청약 철회 불가능여부(true : 불가능)
# endif
# if defined(PRE_ADD_CASHSHOP_CREDIT)
bool bCreditAble ; // 미쿡빌링
int nCreditAbleLevel ; // 미쿡빌링 크레딧레벨
# endif // #if defined(PRE_ADD_CASHSHOP_CREDIT)
# if defined(PRE_ADD_SALE_COUPON)
bool bUseCoupon ;
# endif //#if defined(PRE_ADD_SALE_COUPON)
# if defined( PRE_ADD_NEW_MONEY_SEED )
bool bSeedAble ;
int nSeed ;
bool bSeedGive ;
# endif
TCashCommodityData ( )
{
nSN = 0 ; cCategory = 0 ; nSubCategory = 0 ;
memset ( nItemID , 0 , sizeof ( nItemID ) ) ;
memset ( nLinkSN , 0 , sizeof ( nLinkSN ) ) ;
wPeriod = 0 ; nPrice = 0 ; nCount = 0 ; nPriority = 0 ;
bOnSale = false ; bOnSaleReal = false ; cState = 0 ;
bLimit = false ; bReserveGive = false ; nReserve = 0 ;
nValidity = 0 ; bReserveAble = false ; bPresentAble = false ;
cItemSort = 0 ; nPriceFix = 0 ; bCartAble = false ;
bVIPSell = false ; nVIPLevel = 0 ; bAutomaticPay = false ;
nAutomaticPaySale = 0 ; nVIPPoint = 0 ;
nOverlapBuy = 0 ;
# if defined(PRE_ADD_CASH_REFUND)
bNoRefund = true ; // 기본 불가능
# endif
# if defined(PRE_ADD_CASHSHOP_CREDIT)
bCreditAble = false ;
nCreditAbleLevel = 0 ;
# endif // #if defined(PRE_ADD_CASHSHOP_CREDIT)
# if defined(PRE_ADD_SALE_COUPON)
bUseCoupon = false ;
# endif // #if defined(PRE_ADD_SALE_COUPON)
# if defined( PRE_ADD_NEW_MONEY_SEED )
bSeedAble = false ;
nSeed = 0 ;
bSeedGive = false ;
# endif
}
} ;
struct TCashPackageData
{
int nSN ; // 패키지판매SN
std : : vector < int > nVecCommoditySN ;
TCashPackageData ( )
{
nSN = 0 ;
nVecCommoditySN . clear ( ) ;
}
} ;
struct TCashLimitData
{
int nSN ; // 한정판매할 상품 SN
time_t tStartDate ; // _StartDate 시작일
time_t tEndDate ; // _EndDate 종료일
int nBuyAbleCount ; // 캐릭터당 구매가능횟수
# if defined(PRE_ADD_LIMITED_CASHITEM)
int nLimitedSellCount ; //갯수한정아이템!
# endif //#if defined(PRE_ADD_LIMITED_CASHITEM)
} ;
struct TVIPData
{
int nVipID ; // VIPTable에서의 ID
int nMonthItemSN ; // 캐시 아이템 상품 넘버 (30일 결제시 한번 주기)
int nMailID [ 4 ] ; // 0:서비스만료 7일전, 1:서비스만료 1일전, 2:서비스만료시, 3:자동결제시 캐시 부족할때
int nAutoPayItemSN ; // 자동결제할때 결제할 아이템SN
} ;
// DL Table
struct TDLMapData
{
int nTotalRound ;
int nFloor ;
# if defined( PRE_ADD_CHALLENGE_DARKLAIR )
bool bChallengeDarkLair ;
# endif // #if defined( PRE_ADD_CHALLENGE_DARKLAIR )
} ;
struct TDLClearDataItem
{
int nLevelMin ;
int nLevelMax ;
int nRoundMin ;
int nRoundMax ;
int nRewardExperience ;
int nShowBoxCount ;
int nSelectBoxCount ;
char cTreasureBoxRatio [ 4 ] ;
int nRewardItemID [ 4 ] ;
int nReturnWorldSetID ;
int nReturnWorldGateID ;
int nRewardGP ;
} ;
struct TDLClearData
{
std : : vector < TDLClearDataItem * > pVecClearItem ;
} ;
// Levelup Event
struct TLevelupEvent
{
enum eEventType
{
Levelup = 1 , // 일반 레벨업이벤트
ShandaPromotion = 2 , // 샨다 프로모션이벤트
CombackUser = 3 , // 복귀유저이벤트
LevelupNew = 4 , // 레벨업이벤트 새거 (한번 받으면 더이상 못받는 버젼)
ComeBackUserInven = 5 , // 귀환자에게 바로 넣어주는 아이템 타입
NewbieQuitReward = 6 , //신규 유저 접속 종료 보상
NewbieReconnectReward = 7 , //신규 유저 재접속 보상
ComeBackUserQuitReward = 8 , //귀환자 접속 종료 보상
} ;
int nLevel ; // Player 캐릭터의 레벨
char cClassID ; // 클래스
BYTE cJob ;
int nMailID ;
int nCashMailID ;
int nEventType ; // eEventType
TLevelupEvent ( )
{
nLevel = 0 ;
cClassID = 0 ;
nMailID = 0 ;
nCashMailID = 0 ;
cJob = 0 ;
}
} ;
struct TItemOptionTableData
{
int iEnchant ;
int iOption ;
int iPotential ;
TItemOptionTableData ( )
{
iEnchant = 0 ;
iOption = 0 ;
iPotential = 0 ;
}
} ;
# if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
struct TReputeTableData
{
# if defined( PRE_ADD_REPUTATION_EXPOSURE )
int iMissionID ;
int iNpcPresentRepute1 ; // 선물1 지급 호감도 달성 조건
int iNpcPresentRepute2 ; // 선물2 지급 호감도 달성 조건
int iNpcPresentID1 ; // NpcPresentRepute1 달성 시 NPC가 주는 선물 1 ItemID
int iNpcPresentID2 ; // NpcPresentRepute1 달성 시 NPC가 주는 선물 2 ItemID
# else
std : : vector < int > iQuestIDs ;
# endif // #if defined( PRE_ADD_REPUTATION_EXPOSURE )
int iMaxFavor ; // 호의 최대치
int iTakeFavorPerDay ; // 1일당 깎이는 호의 수치
int iMaxMalice ; // 악의 최대치
int iAddMalicePerDay ; // 1일당 올라가는 악의 수치
int iPresentIDArr [ 6 ] ; // 받을 수 있는 선물 리스트
std : : vector < int > vFavorNpcID ; // 호의 NPC 리스트
std : : vector < int > vMaliceNpcID ; // 악의 NPC 리스트
int iFavorGroupBomb ;
int iMaliceGroupBomb ;
int iMailID [ NpcReputation : : Common : : MaxMailCount ] ;
int iMailRand [ NpcReputation : : Common : : MaxMailCount ] ;
int iPlusItemID ;
int iPlusProb ;
int iUnionID ;
int iPresentPointArr [ 6 ] ; // 선물마다 받을수 있는 연합포인트
TReputeTableData ( )
{
# if defined( PRE_ADD_REPUTATION_EXPOSURE )
iMissionID = 0 ;
iNpcPresentRepute1 = 0 ;
iNpcPresentRepute2 = 0 ;
iNpcPresentID1 = 0 ;
iNpcPresentID2 = 0 ;
# else
# endif // #if defined( PRE_ADD_REPUTATION_EXPOSURE )
iMaxFavor = 0 ;
iTakeFavorPerDay = 0 ;
iMaxMalice = 0 ;
iAddMalicePerDay = 0 ;
iFavorGroupBomb = 0 ;
iMaliceGroupBomb = 0 ;
for ( UINT i = 0 ; i < _countof ( iPresentIDArr ) ; + + i )
iPresentIDArr [ i ] = 0 ;
for ( UINT i = 0 ; i < NpcReputation : : Common : : MaxMailCount ; + + i )
{
iMailID [ i ] = 0 ;
iMailRand [ i ] = 0 ;
}
vFavorNpcID . clear ( ) ;
vMaliceNpcID . clear ( ) ;
iPlusItemID = 0 ;
iPlusProb = 0 ;
iUnionID = 0 ;
for ( UINT i = 0 ; i < _countof ( iPresentPointArr ) ; + + i )
iPresentPointArr [ i ] = 0 ;
}
int GetUnionPointByPresent ( const int iPresentID )
{
for ( UINT i = 0 ; i < _countof ( iPresentIDArr ) ; + + i )
{
if ( iPresentIDArr [ i ] = = iPresentID )
{
// 혹시 몰라서 사이즈 검사 한번더!
if ( 0 < = i & & i < _countof ( iPresentPointArr ) )
return iPresentPointArr [ i ] ;
}
}
return 0 ;
}
bool CheckPresentID ( const int iPresentID )
{
for ( UINT i = 0 ; i < _countof ( iPresentIDArr ) ; + + i )
{
if ( iPresentIDArr [ i ] = = iPresentID )
return true ;
}
return false ;
}
bool bIsFavorNpc ( const int iNpcID )
{
for ( UINT i = 0 ; i < vFavorNpcID . size ( ) ; + + i )
{
if ( vFavorNpcID [ i ] = = iNpcID )
return true ;
}
return false ;
}
bool bIsMaliceNpc ( const int iNpcID )
{
for ( UINT i = 0 ; i < vMaliceNpcID . size ( ) ; + + i )
{
if ( vMaliceNpcID [ i ] = = iNpcID )
return true ;
}
return false ;
}
} ;
struct TPresentTableData
{
enum eType
{
Normal = 0 ,
Cash = 1 ,
Coin = 2 ,
Max ,
} ;
eType Type ;
int iTypeID ;
int iCount ;
int iAddFavorPoint ;
int iTakeMalicePoint ;
int iFavorGroupPoint ;
int iMaliceGroupPoint ;
TPresentTableData ( )
{
Type = Max ;
iTypeID = 0 ;
iCount = 0 ;
iAddFavorPoint = 0 ;
iTakeMalicePoint = 0 ;
iFavorGroupPoint = 0 ;
iMaliceGroupPoint = 0 ;
}
} ;
struct TMailTableData
{
DBDNWorldDef : : MailTypeCode : : eCode Code ;
bool IsCash ;
int nSenderUIStringIndex ;
int nTitleUIStringIndex ;
int nTextUIStringIndex ;
int ItemIDArr [ MAILATTACHITEMMAX ] ;
int ItemCountArr [ MAILATTACHITEMMAX ] ;
int ItemSNArr [ MAILATTACHITEMMAX ] ;
int nPresentMoney ;
# if defined(PRE_SPECIALBOX)
int nKeepBoxReceive ;
int nKeepBoxType ;
int nKeepBoxLevelMin ;
int nKeepBoxLevelMax ;
int nKeepBoxClass ;
# endif // #if defined(PRE_SPECIALBOX)
TMailTableData ( )
{
Code = static_cast < DBDNWorldDef : : MailTypeCode : : eCode > ( 0 ) ;
IsCash = false ;
nSenderUIStringIndex = 0 ;
nTitleUIStringIndex = 0 ;
nTextUIStringIndex = 0 ;
nPresentMoney = 0 ;
memset ( ItemIDArr , 0 , sizeof ( ItemIDArr ) ) ;
memset ( ItemCountArr , 0 , sizeof ( ItemCountArr ) ) ;
memset ( ItemSNArr , 0 , sizeof ( ItemSNArr ) ) ;
# if defined(PRE_SPECIALBOX)
nKeepBoxReceive = 0 ;
nKeepBoxType = 0 ;
nKeepBoxLevelMin = 0 ;
nKeepBoxLevelMax = 0 ;
nKeepBoxClass = 0 ;
# endif // #if defined(PRE_SPECIALBOX)
}
} ;
struct TStoreBenefitData
{
// 아래의 순서는 StoreBenefit 테이블의 정의와 맞춘 것이기 때문에 절대로 순서가 바뀌면 안됨.
enum eType
{
EnchantFeeDiscount = NpcReputation : : StoreBenefit : : EnchantFeeDiscount ,
RepairFeeDiscount = NpcReputation : : StoreBenefit : : RepairFeeDiscount ,
SellingPriceUp = NpcReputation : : StoreBenefit : : SellingPriceUp ,
BuyingPriceDiscount = NpcReputation : : StoreBenefit : : BuyingPriceDiscount ,
FishProficiencyUp = NpcReputation : : StoreBenefit : : FishProficiencyUp ,
CookProficiencyUp = NpcReputation : : StoreBenefit : : CookProficiencyUp ,
CultivateProficiencyUp = NpcReputation : : StoreBenefit : : CultivateProficiencyUp ,
Max = NpcReputation : : StoreBenefit : : Max ,
} ;
int iNpcID ;
eType Type ;
int aiFavorThreshold [ STORE_BENEFIT_MAX ] ;
int aiAdjustPercent [ STORE_BENEFIT_MAX ] ;
TStoreBenefitData ( void ) : iNpcID ( 0 ) , Type ( Max )
{
memset ( aiFavorThreshold , 0 , sizeof ( aiFavorThreshold ) ) ;
memset ( aiAdjustPercent , 0 , sizeof ( aiAdjustPercent ) ) ;
}
} ;
# endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
struct TShopPurchaseType
{
Shop : : PurchaseType : : eCode PurchaseType ;
int iPurchaseItemID ;
int iPurchaseItemValue ;
} ;
struct TCombinedShopTableData
{
TShopItem ShopItem ;
TShopPurchaseType PurchaseType [ Shop : : Max : : PurchaseType ] ;
Shop : : PurchaseLimitType : : eCode PurchaseLimitType ;
int iPurchaseLimitValue ;
# if defined(PRE_SAMPLEITEMNPC)
int nSampleVersion ; // 샘플아이템 회차
# endif //#if defined(PRE_SAMPLEITEMNPC)
} ;
struct TMasterSystemDecreaseTableData
{
int iPupilLevel ;
int iPupilFavor ;
int iFavorUpDecreaseRespectPoint ;
int iFavorDownDecreaseRespectPoint ;
int iMasterSuccessMailID ;
int iMasterFailureMailID ;
int iPupilSuccessMailID ;
int iPupilFailureMailID ;
int GetDecreaseRespectPoint ( int iFavorPoint )
{
if ( iFavorPoint > = iPupilFavor )
return iFavorUpDecreaseRespectPoint ;
return iFavorDownDecreaseRespectPoint ;
}
} ;
struct TMasterSystemGainTableData
{
int iFavorPoint ;
int iRepectPoint ;
} ;
# if defined( PRE_ADD_SECONDARY_SKILL )
struct TSecondarySkillTableData
{
int iSkillID ;
SecondarySkill : : Type : : eType Type ;
SecondarySkill : : SubType : : eType SubType ;
SecondarySkill : : ExecuteType : : eType ExecuteType ;
} ;
struct TSecondarySkillLevelTableData
{
int iSkillID ;
SecondarySkill : : Grade : : eType Grade ;
int iLevel ;
int iExp ;
int iNextID ;
int iParam ;
} ;
struct TSecondarySkillRecipeTableData
{
public :
int iManufactureItemID [ SecondarySkill : : ManufactureSkill : : MaxManufactureItemTypeCount ] ;
int iMinExp [ SecondarySkill : : ManufactureSkill : : MaxManufactureItemTypeCount ] ;
int iMaxExp [ SecondarySkill : : ManufactureSkill : : MaxManufactureItemTypeCount ] ;
SecondarySkill : : Grade : : eType RequireGrade ;
int iRequireSkillLevel ;
int iToolItemID [ SecondarySkill : : ManufactureSkill : : MaxToolItemCount ] ;
int iMasterExp ;
int iStartExp ;
int iMaxTime ; // 단위(ms)
int iSuccessProbability ;
int iSuccessUpExp ;
int iRecipeUpExp ;
int iMaterialItemID [ SecondarySkill : : ManufactureSkill : : MaxMaterialItemCount ] ;
int iMaterialItemCount [ SecondarySkill : : ManufactureSkill : : MaxMaterialItemCount ] ;
int iSuccessCount ;
// 경험치로 생산될 ItemID 얻기
int GetManufactureItemID ( int iExp , int iMaxValue )
{
int iExpRate = static_cast < int > ( iExp / static_cast < float > ( iMaxValue ) * 100 ) ;
for ( int i = 0 ; i < SecondarySkill : : ManufactureSkill : : MaxManufactureItemTypeCount ; + + i )
{
if ( iExpRate > = iMinExp [ i ] & & iExpRate < = iMaxExp [ i ] )
return iManufactureItemID [ i ] ;
}
_ASSERT_EXPR ( 0 , L " [GetManufactureItemID] can not find ItemID " ) ;
return - 1 ;
}
} ;
# endif // #if defined( PRE_ADD_SECONDARY_SKILL )
# ifdef PRE_ADD_CASHFISHINGITEM
struct TFishingMeritInfo
{
int nRodItemID ;
bool bUseCashBait ;
INT64 biBaitSerial ;
int nBaitIndex ;
int nMeritReduceFishingTime ;
int nMeritSuccessRate ;
} ;
# endif //#ifdef PRE_ADD_CASHFISHINGITEM
struct TFarmCultivateTableData
{
int iCultivateMaxTimeSec ;
int iMaxWater ;
int iConsumeWater ;
int iHarvestNeedItemID ;
int iHarvestDropRate [ Farm : : Max : : HARVESTITEM_COUNT ] ;
int iHarvestDropTableID ;
int iSkillPointPlant ; // 씨앗심기 시 경험치
int iSkillPointWater ; // 물주기 시 경험치
int iCatalystCount ; // 필요 성장촉진제 개수
SecondarySkill : : Grade : : eType RequiredSkillGrade ;
int iRequiredSkillLevel ;
int iOverlap ;
} ;
struct TFishingTableData
{
int nMaxTime ;
# ifdef PRE_ADD_CASHFISHINGITEM
int nAutoMaxTime ;
# endif //#ifdef PRE_ADD_CASHFISHINGITEM
int nPullingTargetMin ;
int nPullingTargetMax ;
int nPullingTargetSpeed ;
int nPullingTargetUpTime ;
int nSkillPointSuccess ;
int nSkillPointFailure ;
int nSuccessProbability ;
int nSuccessDropTableID ;
} ;
struct TFishingPattern
{
int nPatternID ;
int nProbabillity ;
} ;
struct TFishingPointTableData
{
int nSecondarySkillClass ; //낚시보조스킬등급
int nSecondarySkillLevel ; //낚시보조스킬레벨
int nRequireItemType1 ;
int nRequireItemType2 ;
TFishingPattern Pattern [ Fishing : : Max : : FISHINGPATTERNMAX ] ;
} ;
struct TFishingAreaTableData
{
int nMatchedMapID ;
int nMatchedFishingAreaID ;
int nFishingPointID ;
} ;
struct TJobTableData
{
char cJobNumber ;
char cBaseClass ;
char cParentJob ;
float afMaxUsingSP [ 5 ] ;
char cClass ;
} ;
struct TGlyphSkillData
{
int nGlyphID ;
int nGlyphType ;
int nSkillID ;
int nSkillLevelID ;
} ;
struct TGlyphSlotData
{
int nID ;
char cSlotID ;
char cLevelLimit ;
char cSlotType ;
bool IsCash ;
} ;
struct TGlyphChargeData
{
char cGlyphType ; // 1: 강화문장 2: 스킬문장 3: 특수스킬문장 (eGlyphType)
char cGlyphRank ; // 1: 매직 2: 레어 3: 에픽 4: 유니크 (eItemRank)
int nCharge ;
} ;
struct TCharmItem
{
# if defined(PRE_FIX_68828)
int nCharmID ; // 참테이블 ID
# endif
int nItemID ; // 아이템
int nCount ; // 유저가 획득할 개수
int nProb ; // 확률
int nPeriod ; // 기간
int nAccumulationProb ;
int nGold ;
bool bMsg ;
} ;
struct TCharmItemData
{
int nCharmNo ; // 매력아이템 번호
std : : vector < TCharmItem > CharmItemList ;
} ;
const BYTE CharmItemKeyMax = 5 ;
struct TCharmItemKeyData
{
int nCharmItemID ; // 상자 아이템 아이디
std : : vector < int > nKeyList ;
} ;
struct TCharmCountData
{
int nID ;
int nMin ;
int nMax ;
} ;
# if defined (PRE_ADD_CHAOSCUBE)
struct TChaosStuffItem
{
int nItemID ;
int nCount ;
int nChaosNo ;
} ;
struct TChaosResultItem
{
int nItemID ; // 아이템
int nCount ; // 유저가 획득할 개수
int nProb ; // 확률
int nPeriod ; // 기간
int nAccumulationProb ;
int nGold ;
bool bMsg ;
} ;
struct TChaosItemData
{
int nChaosNo ;
std : : vector < TChaosResultItem > ChaosItemList ;
} ;
# endif // #if defined (PRE_ADD_CHAOSCUBE)
//ServerMonitor
enum eServerMonitorLevel
{
SERVERMONITOR_LEVEL_NONE = 0 ,
SERVERMONITOR_LEVEL_MONITOR , //동접정보와 서버의상태
SERVERMONITOR_LEVEL_ADMIN , //동접정보와 서버상태 및 프로세스 시작만 가능
SERVERMONITOR_LEVEL_SUPERADMIN , //동접정보와 서버상태 및 모든컨트롤 가능
} ;
enum eServerMonitorNotice
{
SERVERMONITOR_UPDATENOTICE_CHANNELINFO ,
SERVERMONITOR_UPDATENOTICE_SERVERINFO ,
SERVERMONITOR_UPDATENOTICE_MERITINFO ,
SERVERMONITOR_UPDATENOTICE_WOLRDINFO ,
} ;
enum eSIDConnectionType
{
SID_CONNECTION_TYPE_LOG = 1 ,
SID_CONNECTION_TYPE_DB ,
} ;
struct TPromotionData
{
int nID ;
int nConditionType ; //ePromotionConditionType
int nConditionValue ;
int nPromotionType ; //ePromotionType
int nRewardValue ; //Percent
} ;
struct TUserPromotionData
{
int nType ; //ePromotionType
int nValue ; //Percent
} ;
struct TSchedule
{
char cHour ;
char cMinute ;
int nCycle ;
} ;
struct TGuildLevel
{
int nLevel ;
int nReqGold ;
int nReqGuildPoint ;
int nDailyGuildPointLimit ;
int nDailyMissionPointLimit ;
bool bApplicable ;
} ;
struct TGuildWarPoint
{
int nRank ;
int nRewardGuildPoint ;
} ;
struct TGuildWarMapInfo
{
UINT uiMapTableID ;
char cGuildWarUseMonth ;
} ;
struct TGuildWarEventInfo
{
//char cEventStep;
__time64_t tBeginTime ;
__time64_t tEndTime ;
} ;
// 길드전 보상 메일관련
struct TGuildWarRewardData
{
char cType ; // 보상 타입..eGuildWarRewardType
char cClass ; // 클래스(워리어,아처, 소서리스, 클래릭)
int nMailID ; // 우편 아이디
int nPresentID ; // 선물함 아이디
int nGuildFestivalPoint ; // 본선에서 지급할 길드축제포인트
int nGuildPoint ; // 본선에서 지급할 길드포인트
} ;
struct TPeriodQuestDate
{
int nPeriodType ;
__time64_t tAssignDate ;
} ;
struct TExchangeTrade
{
int nItemID ;
int nCategoryType ;
int nGroupID ;
int ExchangeType ;
} ;
struct TPvPMissionRoom
{
int nItemID ;
int nGroupID ;
int nMapID ;
int nModeID ;
int nWinCondition ;
int nPlayTime ;
int nMaxPlayers ;
int nStartPlayers ;
int nRoomNameIndex ;
bool bDropItem ;
# ifdef PRE_ADD_COLOSSEUM_BEGINNER
int nChannelType ;
# endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
} ;
typedef std : : vector < TPvPMissionRoom > TVecPvPMissionRoom ;
struct TGhoulConditionData
{
int nItemID ;
int nItemIdx ;
int nPlayerMaxNum [ PvPCommon : : Common : : GhouConditionColCount ] ;
int nGhoulCount [ PvPCommon : : Common : : GhouConditionColCount ] ;
int nMatchingMutationGroupID [ PvPCommon : : Common : : GhouConditionColCount ] ;
} ;
struct TMonsterMutationGroup
{
int nGroupID ;
int nGourpIdx ;
int nMonsterID [ PvPCommon : : Common : : MonsterMutationColCount ] ;
int nProbability [ PvPCommon : : Common : : MonsterMutationColCount ] ;
} ;
struct TMonsterMutationData
{
int nMutationID ;
int nMutationIdx ;
int nMutationActorID ;
int nMutationHP ;
int nMutationStrPMax ;
int nMutationStrMMax ;
int nMutationDefP ;
int nMutationDefM ;
int nMutationStiff ;
int nMutationStiffResis ;
int nMutationCriticalResis ;
int nMutationStunResis ;
int nMutationWeaponIdx1 ;
int nMutationWeaponIdx2 ;
int nMutationSkillTableID ;
int nMutationSuperArmor ;
int nSizeMin ;
int nSizeMax ;
int nMoveSpeed ;
} ;
struct TMonsterMutationSkill
{
int nMonsterID ;
int nMonsterIdx ;
int nMonsterSkillIndex [ PvPCommon : : Common : : MonsterMutationSkillColCount ] ;
int nMonsterSkillLevel [ PvPCommon : : Common : : MonsterMutationSkillColCount ] ;
} ;
struct TOccupationModeInfo
{
int nVictoryCondition [ PvPCommon : : Common : : MaximumVitoryCondition ] ; //PvPCommon::BattleGroundVictoryState
int nVictoryParam [ PvPCommon : : Common : : MaximumVitoryCondition ] ; //PvPCommon::BattleGroundVictoryState
int nBossID [ PvPCommon : : TeamIndex : : Max ] ; //생성보스아이디
int nBossSpawnAreaID [ PvPCommon : : TeamIndex : : Max ] ; //보스생성시 스폰위치
} ;
struct TBattleGourndModeInfo
{
int nID ;
int nWaitingMin ;
int nFinishingMin ;
int nPvPSkillPoint ;
int nMaximumResourceLimit ;
int nAllOcuupationBonusGain ;
int nOccupationBonusGain [ PvPCommon : : Common : : MaximumCapturePosition ] ;
int nCaptureScore ;
int nStealScore ;
int nKillScore ;
int nClimaxTime ;
int nClimaxRespawnTime ;
TOccupationModeInfo ModeInfo ;
} ;
struct TPositionAreaInfo
{
int nID ;
int nMapID ;
int nPvPModeID ;
int nAreaID ;
int nGainResourceTermTick ; //점령시 획득텀
int nGainResource ; //획특텀시 획득량
int nRequireTryTick ; //획득시도시 클릭상태지속 유지필요시간
int nCompleteOccupationTick ; //클릭완료후 점령권 넘어가기 전의 대기시간
int nBonusBuffID ;
//클라이막스~
int nClimaxGainTermTick ;
int nClimaxGainVal ;
int nClimaxTryTick ;
int nClimaxCompleteOccupationTick ;
} ;
struct TBattleGroundEffectValue
{
int nSkillID ;
int nSkillLevel ;
int nNeedSkillPoint ; //획득시필요포인트
int nUseResPoint ; //스킬사용시 소모 점령전 포인트
std : : string strEffectValue [ PvPCommon : : Common : : MaximumEffectCount ] ;
int nEffectValueDuration [ PvPCommon : : Common : : MaximumEffectCount ] ;
//int nMonsterID;
//int nSummonDist;
std : : string strActionName ;
int nCoolTime ;
void Reset ( )
{
nSkillID = 0 ;
nSkillLevel = 0 ;
nNeedSkillPoint = 0 ; //획득시필요포인트
nUseResPoint = 0 ; //스킬사용시 소모 점령전 포인트
for ( int i = 0 ; i < PvPCommon : : Common : : MaximumEffectCount ; i + + )
{
strEffectValue [ i ] . clear ( ) ; ;
nEffectValueDuration [ i ] = 0 ;
}
//nMonsterID = 0;
//nSummonDist = 0;
strActionName . clear ( ) ;
nCoolTime = 0 ;
}
} ;
struct TBattleGroundSkillInfo
{
int nSkillID ;
int nSkillMaxLevel ;
int nSkillType ; //CDnSkill::SkillTypeEnum //점령전 스킬은 스킬타입에 그닥 영향을 받지 않지만 추가확장시 필요할까 해서 읽어둠
int nSkillDurationType ; //CDnSkill::DurationTypeEnum
int nSkillTargetType ; //CDnSkill::TargetTypeEnum
int nEffectType [ PvPCommon : : Common : : MaximumEffectCount ] ;
int nEffectApplyType [ PvPCommon : : Common : : MaximumEffectCount ] ;
int nProcess ; //프로세스타입은 하나만 사용
int nCanDuplicate ; //중첩가능?
} ;
struct TBattleGroundSkill
{
} ;
struct TUnionReputeBenefitData
{
int nItemID ;
int nPeriod ;
int nBenefitType [ NpcReputation : : Common : : MaxBenefitCount ] ;
int nBenefitNum [ NpcReputation : : Common : : MaxBenefitCount ] ;
} ;
struct TGuildMarkData
{
int nItemID ;
int nType ;
bool bCash ;
bool bMarkOnly ;
bool bMarkView ;
} ;
struct TPlayerCommonLevelTableInfo
{
int iFatigue10000Ratio ; // 10000배율
float fMasterGainExp ;
//int nMasterGainItemID;
//int nMasterGainItemCount;
float fAddGainExp ;
float fDefense ;
float fCritical ;
float fFinalDamage ;
# if defined(PRE_ADD_TALISMAN_SYSTEM)
int iTalismanCost ; // 탈리스만 장착 해제, 위치교환 비용
# endif
} ;
struct TMasterSysFeelTableInfo
{
int nMinFeel ;
int nMaxFeel ;
int nAddExp ; //(%값임)
} ;
struct TGlobalEventData
{
int nItemID ;
int nCollectItemID ;
int nScheduleID ;
int nCollectTotalCount ;
int nNoticeCount [ MAX_NOTICE_WORLDEVENT ] ;
bool bCheckNotice [ MAX_NOTICE_WORLDEVENT ] ;
time_t tCollectStartDate ;
time_t tCollectEndDate ;
time_t tRewardDate ;
} ;
struct TEveryDayEventData
{
int nEventID ;
int nEventOnOff ;
int nSquenceDateCount ;
int nMailID ;
int nCashMailID ;
int nNumber ;
time_t tStartDate ;
time_t tEndDate ;
} ;
enum eDBJobSystem //g_szDBJobSystem
{
DBJOB_GUILDWAR_INIT = 0 , // 길드전 초기화
DBJOB_GUILDWAR_STATS , // 길드전 통계
DBJOB_SYSTEM_MAX ,
} ;
enum eDBJobSystemStatus
{
JOB_STATUS_RESERVE , // 예약
JOB_STATUS_COMPLETED , // 완료
JOB_STATUS_DOING , // 실행중
JOB_STATUS_FAIL , // 실패
} ;
struct TGuildRewardItemData
{
int nItemID ; // 길드보상테이블에 있는 아이디
short nNeedGuildLevel ; // 구입하기위한 길드레벨
int nNeedGold ; // 구입하기위한 골드
int nItemType ; // 길드보상아이템 타입
int nTypeParam1 ;
int nTypeParam2 ;
bool bCheckInven ; // 이미 구입한건지 체크
bool bEternity ; // 0:기간제 1:영구
int nPeriod ; // 기간
bool bCheckMaster ; // 마스터체크 여부
int nCheckType ; // 필요 조건 체크(0:NONE 1:ITEMID 2:길드마크
int nCheckID ; // 필요한 이전 아이템아이디
} ;
struct TExpData
{
int nExperience ;
int nEventExperience ;
int nPcBangExperience ;
int nVIPExperience ;
int nPromotionExperience ;
int nItemExperience ;
int nGuildExp ;
TExpData ( )
{
nExperience = 0 ;
nEventExperience = 0 ;
nPcBangExperience = 0 ;
nVIPExperience = 0 ;
nPromotionExperience = 0 ;
nItemExperience = 0 ;
nGuildExp = 0 ;
}
void set ( float Exp , float EventBonusExp = 0 , float PcBangExp = 0 , float VIPExp = 0 , float PromotionBonusExp = 0 , float ItemExp = 0 , float GuildExp = 0 )
{
nExperience = ( int ) Exp ;
nEventExperience = ( int ) EventBonusExp ;
nPcBangExperience = ( int ) PcBangExp ;
nVIPExperience = ( int ) VIPExp ;
nPromotionExperience = ( int ) PromotionBonusExp ;
nItemExperience = ( int ) ItemExp ;
nGuildExp = ( int ) GuildExp ;
}
} ;
# if defined(PRE_ADD_SALE_COUPON)
struct TSaleCouponData
{
int nItemID ; // 쿠폰 ID
int nUseItemSN [ MAX_SALE_USEITEM ] ; // 쿠폰이 적용될 아이템 SN
} ;
# endif
# if defined( PRE_PARTY_DB )
namespace Party
{
struct QueryOutPartyType
{
enum eCode
{
Normal = 0 ,
Disconnect ,
Kick ,
EternityKick ,
} ;
} ;
struct AddPartyAndMemberGame
{
Party : : Data PartyData ;
UINT nKickedMemberList [ PARTYKICKMAX ] ;
INT64 biCharacterDBID [ PARTYMAX ] ;
UINT nSessionID [ PARTYMAX ] ;
# if defined( PRE_ADD_NEWCOMEBACK )
bool bCheckComebackAppellation [ PARTYMAX ] ;
# endif
} ;
struct PartyMemberVillageData
{
UINT nAccountDBID ;
INT64 biCharacterDBID ;
BYTE cMemberIndex ;
BYTE cVoiceAvailable ;
# if defined( PRE_ADD_NEWCOMEBACK )
bool bCheckComebackAppellation ;
# endif
UINT nMutedList [ PARTYCOUNTMAX ] ;
} ;
struct AddPartyAndMemberVillage
{
Party : : Data PartyData ;
UINT nVoiceChannelID ;
WCHAR wszPartyName [ PARTYNAMELENMAX ] ;
UINT nKickedMemberList [ PARTYKICKMAX ] ;
PartyMemberVillageData MemberData [ PARTYMAX ] ;
} ;
} ;
# endif // #if defined( PRE_PARTY_DB )
# if defined( PRE_ADD_NAMEDITEM_SYSTEM )
struct TNamedItemData
{
int nItemID ; // 네임드아이템아이디
int nMaxCount ; // 최대 갯수
int nSwapItemID ; // 대체할 아이템아이디
} ;
namespace EffectSkillNameSpace
{
struct SearchType
{
enum eType
{
ItemType = 0 ,
ItemID ,
SkillID ,
} ;
} ;
struct BuffType
{
enum eType
{
Partybuff = 0 ,
SelfBuff ,
} ;
} ;
struct ShowEffectType
{
enum eType
{
NONEEFFECT = 0 ,
BUFFEFFECT ,
SPELLEFFECT ,
} ;
} ;
} ;
# endif
# ifdef PRE_ADD_EXCHANGE_POTENTIAL
struct TPotentialTransferData
{
int nItemID ;
int nExtractItemLevel ;
int nExtractItemRank ;
int nInjectItemLevel ;
int nInjectItemRank ;
int nConsumptionCount ;
int nMainType ;
int nSubType ;
} ;
# endif //#ifdef PRE_ADD_EXCHANGE_POTENTIAL
# if defined(PRE_ADD_INSTANT_CASH_BUY)
const int CashBuyShortcutMax = 10 ;
struct TCashBuyShortcutData
{
int nType ;
int nAllowMapTypes ;
int nShow ;
std : : vector < int > nSNList ;
} ;
# endif // #if defined(PRE_ADD_INSTANT_CASH_BUY)
# if defined(PRE_ADD_EXCHANGE_ENCHANT)
struct TExchangeEnchantData
{
BYTE cRank ; // 아이템 등급
BYTE cLevelLimit ; // 제한 레벨
BYTE cEnchantLevel ; // 강화 레벨
int nNeedCoin ; // 수수료
int nNeedItemID1 ; // 필요아이템1
short wNeedItemCount1 ; // 필요아이템 카운트1
int nNeedItemID2 ; // 필요아이템2
short wNeedItemCount2 ; // 필요아이템 카운트2
} ;
# endif //#if defined(PRE_ADD_EXCHANGE_ENCHANT)
# if defined( PRE_WORLDCOMBINE_PARTY )
namespace WorldCombineParty
{
enum eType
{
MAXSKILLCOUNT = 2 ,
} ;
struct WrldCombinePartyData
{
BYTE cIndex ; // 인덱스
BYTE cGroupIndex ; // 그룹인덱스
WCHAR wszPartyName [ PARTYNAMELENMAX ] ;
int nWorldMap ; // 월드존
int nTargetMap ; // 타겟맵(기준값)
ePartyType PartyType ; // 파티타입
BYTE cPartyMemberMax ;
int nItemID ; // 입장권아이템
TDUNGEONDIFFICULTY Difficulty ;
TPARTYITEMLOOTRULE ItemLootRule ; //ePartyItemLootRule 참조
TITEMRANK ItemRank ; //아이템랭크(루트룰기획참조)
BYTE cUserLvLimitMin ; //민맥스값이 있단다.
int iBitFlag ;
int nSkillID [ MAXSKILLCOUNT ] ; // 스킬아이디
} ;
}
# endif
# if defined(PRE_ADD_PCBANG_RENTAL_ITEM)
struct TPcBangRentItem
{
int nItemID ;
BYTE cLevelStart ;
BYTE cLevelEnd ;
BYTE cClassID ;
BYTE cJob ;
BYTE cGrade ;
int nItemOption ;
} ;
# endif
# if defined( PRE_PRIVATECHAT_CHANNEL )
struct TPrivateChatChannelInfo
{
INT64 nPrivateChatChannelID ;
WCHAR wszName [ PrivateChatChannel : : Common : : MaxNameLen ] ;
INT64 biMasterCharacterDBID ;
int nMemberCount ;
int nPassWord ;
} ;
struct TPrivateChatChannelMember
{
time_t tJoinDate ;
UINT nAccountDBID ;
INT64 biCharacterDBID ;
bool bMaster ;
WCHAR wszCharacterName [ NAMELENMAX ] ;
} ;
struct TPrivateMemberDelServer
{
INT64 nPrivateChatChannelID ;
INT64 biCharacterDBID ;
WCHAR wszCharacterName [ NAMELENMAX ] ;
} ;
# endif
# if defined(PRE_ADD_WEEKLYEVENT)
namespace WeeklyEvent
{
struct TWeeklyEventData
{
int nStartTime ;
int nEndTime ;
BYTE cRaceType ; // eRaceType
BYTE cClassType ; // eClass
int nEventType ;
int nValue ; // %값
} ;
struct TWeeklyEvent
{
int nDayOfWeek ; // eDayType
std : : vector < TWeeklyEventData > VecEventData ;
} ;
enum eDayType
{
Monday = 1 ,
Tuesday = 2 ,
Wednesday = 3 ,
Thursday = 4 ,
Friday = 5 ,
Saturday = 6 ,
Sunday = 7 ,
} ;
enum eRaceType
{
Player = 1 ,
Monster = 2 ,
} ;
enum eEventType
{
Event_1 = 1 , // 1. hp상승 및 하락
Event_2 = 2 , // 2. 공격력 강화 및 약화
Event_3 = 3 , // 3. 방어력 강화 및 약화
Event_4 = 4 , // 4. 강화 확률 증가
Event_5 = 5 , // 5. 경험치 증가
Event_6 = 6 , // 6. 파티유지 경험치 증가
Event_7 = 7 , // 7. 친구 경험치 증가 (절친아님, 서로친구)
Event_8 = 8 , // 8. 호감도 증가
Event_9 = 9 , // 9. 연합 포인트획득량 증가
Event_10 = 10 , // 10. 아이템 드랍률 증가
} ;
}
# endif // #if defined(PRE_ADD_WEEKLYEVENT)
# if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
namespace TotalLevelSkill
{
struct TTotalSkillLevelTable
{
int nSkillID ;
int nTotalLevelLimit ;
int nUseLevelLimit ;
int nSkillType ;
} ;
struct TTotalSkillBlowTable
{
int nSkillID ;
int nBlowID ;
float fBlowValue ;
int nBlowValue ; // 농장 아이템 아이디문에 사용
} ;
struct TTotalSkillSlotTable
{
int nSlotIndex ;
int nLevelLimit ;
bool bCash ;
} ;
}
# endif
# if defined(PRE_SPECIALBOX)
struct TProvideItemData
{
int nCashSN ;
int nItemID ;
int nCount ;
int nSealCount ;
int nOption ;
} ;
struct TKeepBoxProvideItemData
{
int nType ;
std : : vector < TProvideItemData > VecProvideItem ;
} ;
# endif // #if defined(PRE_SPECIALBOX)
# ifdef PRE_ADD_JOINGUILD_SUPPORT
struct TGuildSupportData
{
int nID ;
int nJoinMinLevel ; //최초길드가입시 최소레벨
int nJoinMaxLevel ; //최초길드가입시 최대레벨
int nFirstJoinMailID ; //최초가입시 보상메일아이디
int nMaxLevelGuildSupportMailID ; //최초가입한 길드에서 만랩시 보상아이디
} ;
# endif //#ifdef PRE_ADD_JOINGUILD_SUPPORT
# if defined( PRE_FIX_67546 )
struct TChannelDBInfo
{
int nDBConnectionID ;
BYTE cThreadID ;
} ;
struct TDBConnectionInfo
{
int nThreadCount [ THREADMAX ] ;
} ;
# endif
# if defined( PRE_WORLDCOMBINE_PVP )
struct TWorldPvPMissionRoom
{
int nItemID ;
int nMapID ;
BYTE cModeID ;
int nWinCondition ;
int nPlayTime ;
BYTE cMaxPlayers ;
int nStartPlayers ;
int nRoomNameIndex ;
bool bDropItem ;
USHORT unRoomOptionBit ;
WorldPvPMissionRoom : : Common : : eReqType eWorldReqType ;
int nMinLevel ;
int nMaxLevel ;
int nChannelType ;
WCHAR wszRoomName [ PARTYNAMELENMAX ] ;
int nRoomPW ;
} ;
struct TWorldPvPRoomDBData
{
int nDBRoomID ;
int nWorldID ;
int nServerID ;
int nRoomID ;
BYTE cModeID ;
WCHAR wszRoomName [ PARTYNAMELENMAX ] ;
BYTE cMaxPlayers ;
int nMapID ;
int nWinCondition ;
UINT nPlayTimeSec ;
bool bBreakIntoFlag ;
bool bDropItem ;
bool bRegulationFlag ;
bool bObserverFlag ;
bool bRandomFlag ;
BYTE cMinLevel ;
BYTE cMaxLevel ;
int nPassWord ;
int nRoomMemberCount ;
BYTE cChannelType ;
} ;
typedef std : : vector < TWorldPvPMissionRoom > TVecWorldPvPMissionRoom ;
# endif
# if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
struct TBonusDropTable
{
int nIndex ;
int nMapID ; //맵ID
int nDropType ;
int nNeedItemID [ 3 ] ; //필요한 열쇠 아이템 ID
int nDropItemGroupID [ 3 ] ; //드랍될 드랍아이템그룹ID
} ;
# endif // #if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
namespace ActozCommon
{
struct CharacterStatus
{
enum eCharacterStatus
{
Revive = 0 ,
Create = 0 ,
Delete = 1 ,
} ;
} ;
struct UpdateType
{
enum eUpdateType
{
Login = 1 ,
Logout = 2 ,
Levelup = 3 ,
Sync = 4 ,
} ;
} ;
} ;
# if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
struct TItemDropEnchantData
{
int nIndex ; //IDX
int nDropID ; // ItemDropTable의 ID와 매칭되는 값
int nEnchantCount ; //인챈트가 몇개인지 카운트
int nEnchantOption [ 20 ] ; //인챈트 정보
int nEnchantProb [ 20 ] ; //인챈트가 선택될 확률
} ;
# endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
# if defined( PRE_ALTEIAWORLD_EXPLORE )
struct TAlteiaWorldMapInfo
{
int nIndex ;
int nMapID ;
TDUNGEONDIFFICULTY Difficulty ;
} ;
# endif // #if defined( PRE_ALTEIAWORLD_EXPLORE )
# if defined( PRE_ADD_STAMPSYSTEM )
namespace StampSystem
{
struct ChallengeType
{
enum eType
{
DailyQuest = 1 ,
DailyMission = 2 ,
} ;
} ;
struct RewardCount
{
enum eCount
{
Day3 = 3 ,
Day5 = 5 ,
} ;
} ;
struct TStampChallenge // 스탬프 도전과제
{
BYTE cType ;
std : : set < int > setAssignmentID ; // 도전과제 목록
int nMailID4 ; // 3일 보상
int nMailID7 ; // 5일 보상
} ;
struct TStampTableData // 스탬프 테이블
{
INT64 biStartTime ;
std : : vector < TStampChallenge > vChallengeList ;
} ;
}
# endif // #if defined( PRE_ADD_STAMPSYSTEM )
# if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
struct TPrevPotentialData
{
int nItemID ; //아이템 ID
INT64 nSerial ; //시리얼
char cPotential ; //이전 잠재력데이터
char cOption ; //이전 잠재력데이터
char cNowPotential ; //새로 부여된 잠재력
char cPotentialMoveCount ; //(이전)잠재 이전 카운트
INT64 nPotentialItemSerial ; //잠재력 부여에 사용한 코드 시리얼
int nPotentialItemID ; //잠재력 부여에 사용한 아이템 ID
} ;
# endif // #if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
struct TEffectItemData
{
int nItemSN ;
int nItemID ;
int nCount ;
bool bFail ;
INT64 nGiftDBID ;
} ;
# if defined(PRE_ADD_TALISMAN_SYSTEM)
struct TTalismanData
{
int nTalismanID ;
int nType ;
int nPeriod ;
} ;
struct TTalismanSlotData
{
bool bService ;
int nLevel ;
int nAmount ;
int nItem ;
int nNeedItemCount ;
float fEfficiency ;
int nType ;
} ;
# endif
# if defined( PRE_PVP_GAMBLEROOM )
struct TPvPGambleRoomData
{
int nRoomIndex ;
bool bRegulation ;
BYTE cGambleType ;
int nPrice ;
} ;
struct TPvPGambleRoomWinData
{
INT64 biCharacterDBID ;
int nPrice ;
} ;
# endif // #if defined( PRE_PVP_GAMBLEROOM )
# if defined(PRE_ADD_EQUIPLOCK)
struct TDBLockItemInfo
{
BYTE cItemCode ;
BYTE cItemSlotIndex ;
INT64 biItemSerial ;
EquipItemLock : : TLockItem ItemData ;
} ;
# endif // #if defined(PRE_ADD_EQUIPLOCK)
# if defined( PRE_ADD_STAGE_WEIGHT )
struct TStageWeightData
{
float fHPRate ;
float fAttackRate ;
float fSuperArmorRate ;
float fItemDropRate ;
} ;
# endif // #if defined( PRE_ADD_STAGE_WEIGHT )
# if defined( PRE_ADD_CHARACTERCHECKSUM )
struct CheckSumReason
{
enum eReason
{
LogoutCharacter = 1 ,
C2C_KeepGameMoney = 2 ,
C2C_TransferGameMoney = 3 ,
} ;
} ;
# endif // #if defined( PRE_ADD_CHARACTERCHECKSUM )
# if defined(PRE_ADD_STAGECLEAR_TIMECHECK)
namespace StageClearCheckTime
{
enum eCheckMinTime // 최소 클리어 타임
{
CheckMinTime = 60 * 1000 , // 1분
} ;
enum eAbuseCount // 증가할 AbuseCount값
{
AbuseCount = 10 ,
} ;
// CheckTime을 사용하지 않을 맵(보스맵ID를 기준으로 판별한다
struct IgnoreMapIndex
{
enum eIgnoreMapIndex
{
MAP_CHAOSE_FIELD_BossA = 15157 , //혼돈의 틈 파르마
MAP_CHAOSE_FIELD_32Lv_BossA = 15167 , //혼돈의 틈 바이라
MAP_CHAOSE_FIELD_24Lv_BossA = 15174 , // 혼돈의 틈 카말라
} ;
} ;
} ;
# endif // #if defined(PRE_ADD_STAGECLEAR_TIMECHECK)