상용화를 위한 서버 프로젝트 이슈 정리
1. Protocol 설계와 분석
1.1. Keep Alive의 직접 구현과 암호화 처리를 해야 하는 이유
프로토콜 분석을 위한 Keep Alive Packet 조작을 예방 하는 방법
WinSock에서 제공하는 Keep Alive 검사의 경우 외부 조작이 상대적으로 쉽게 되어 보안에 취약해 질 수가 있습니다. 좀더 안전한 구현을 위해서는 Keep Alive 역시 RC5 등으로 암호화 한 Packet을 전송 하는 것이 보다 안전한 방법이 될 것 입니다.
Keep Alive 구현과 서버 기준의 연결 검사
Tick 검사 후 연결 지속 또는 종료 처리를 하는 순서
1.2. Speed Hack 검사를 위한 적용 위치
Speed Hack의 작동 원리
Speed Gear 참고 화면
Cheat Engine 참고 화면
스피드 핵은 시스템의 시간을 배속에 의해 느리거나 빠르게 작동 하도록 매번 설정해 주는 단순한 기능을 가지고 있습니다. 하지만 이로 인해 시스템의 시간 값을 응용한 Tick 간격 처리 프로그램 들은 실행 타이밍이 느리거나 빠르게 작동 될 수 있습니다. 특히 게임 프로그램 에서의 속력 계산 식은 대부분 V = S / T 식에만 근거 하고 있어 이에 영향이 심각해 지게 됩니다.
PING/PONG에 구현된 현재 방식의 문제점 분석
DoS 공격으로 잘못 된 용어를 사용 중인 Speed Hack 검사 코드는 실제 PING Packet을 Client에서 보내지 않도록 조작 할 경우 무력화 시킬 수 있게 됩니다.
Speed Hack 검사 코드의 위치는 Packet Reader의 조립 완성 분기 코드에 있어야 하며 검사 시간은 서버 Tick을 기준으로 최소(0.n or 0.0n) 보다 작거나 최대(Keep Alive Interval+지연 예상 시간) 보다 클 경우를 감지 하여 강제 접속 종료를 시켜야 합니다.
1.3. 보안 강화를 위한 Random Serial Key 활용 방법
Random Serial Key 생성의 목적
Client가 접속 할 때 마다 Server Tick과 Socket(or Index) 번호를 조합 하여 Handshake 과정에서 서로 가지고 있게 되면 접속을 할 때 마다 다른 암호화/복호화 Key를 가질 수 있게 할 수 있다는 것에서 착안 하여 적용 하기 시작 하였습니다. Protocol 분석을 어렵게 만드는 방법 중 한가지 입니다.
연결 정보 요청을 Client에서 먼저 보낼 경우의 문제점
현재 Client 에서는 Network 연결이 이뤄 질 경우 OnConnectServerComplete 함수가 호출 되면서 첫 Handshake 정보를 Server에게 전달 하는 구조가 됩니다. 이러한 경우 사용자에게 Handshake Packet의 분석을 할 수 있는 Timing을 주게 되어 보안에 취약한 설계라고 할 수 있습니다.
서버가 Connection에 대한 감지를 했을 때 처음 해야 할 일
GetQueuedCompletionStatus를 감지 할 경우 Server는 연결 Flag가 도착 했다면 Handshake를 위한 첫 정보를 보내야 하고 이에 대한 응답이 없거나 잘못된 Packet이 도착 할 경우 즉시 Disconnecting 처리를 해야 합니다. 하지만 현재 Server의 경우 Client에서 첫 Packet이 도착 하기만을 기다리게 되어 사용자로 하여금 Protocol 분석을 할 수 있는 Timing을 주게 됩니다.
1.4. Protocol 암호화를 위한 주의 사항
Header와 Data의 안전한 구성
Header Name | Type | Size |
Mark | WORD | 2 Byte |
size | WORD | 2 Byte |
ptcl | WORD | 2 Byte |
encrypt | BYTE | 1 Byte |
CheckSum | WORD | 2 Byte |
struct ANS_MOVE_PLACE : PACKET {
enum {
SUCCESS_MOVE_SECTOR = 0,
FAIL_MOVE_SECTOR,
SECTOR_IS_NULL,
UNKNOWN_MOVE_TYPE,
TO_HQ_ERROR_QESDESTINATION,
DEST_SECTOR_IS_NULL,
DESTINATION_IS_WRONG_POSITION,
DESTINATION_IS_WRONG_TO_SECTOR_POSITION,
DESTINATION_IS_WRONG_SECTOR_POSITION,
DESTINATION_IS_WRONG_TO_VILLAGE,
HQSECTOR_IS_WRONG, //본부섹터 널일때..에러
};
BYTE ErrCode;
enum {
TO_HQ = 1, ///< 본부 이동 : 이동타입만 전달
TO_SECTOR, ///< 섹터간 이동 : 이동타입과 섹터ID 전달
TO_VILLAGE ///< 마을간 이동 : 이동타입과 마을ID 전달
};
BYTE MoveType;
WORD DestinationID;
DWORD SendPacketTime;
int MoveUserUkey; ///< 이동한 놈의 유키
...
};
잘못 된 Protocol Data 구성MTU | |||||
Built-in | Packet Header | Packet Data | |||
Ethernet | IP | TCP | Protocol Header | Command Header | Command Data |
1.5. Packet Header를 암호화 해야 하는 이유
Command | Location |
PTCL_REQ_GAME_CONNECTION | GamePacket.h |
PTCL_ANS_GAME_CONNECTION | GamePacket.h |
PTCL_ANS_CHARACTER_LIST | GamePacket.h |
PTCL_ANS_LOAD_CHARACTER_DATA | GamePacket.h |
PTCL_ANS_LOAD_EQUIP_EQUIPMENT_DATA | GamePacket.h |
PTCL_ANS_QUICK_SLOT_DATA | GamePacket.h |
PTCL_ANS_LOAD_INVENTORY_DATA | GamePacket.h |
PTCL_ANS_LOAD_WAREHOUSE_ITEM_DATA | GamePacket.h |
PTCL_REQ_CHANGE_ITEM_ENHANCE | GamePacket.h |
PTCL_ANS_CHANGE_ITEM_ENHANCE | GamePacket.h |
PTCL_REQ_CHANGE_MAIL_DATA | GamePacket.h |
PTCL_ANS_CHANGE_MAIL_DATA | GamePacket.h |
PTCL_REQ_SEND_MAIL | GamePacket.h |
PTCL_ANS_SEND_MAIL | GamePacket.h |
PTCL_REQ_BUY_ITEM | GamePacket.h |
PTCL_ANS_BUY_ITEM | GamePacket.h |
PTCL_REQ_REBUY_ITEM | GamePacket.h |
PTCL_ANS_REBUY_ITEM | GamePacket.h |
PTCL_REQ_SALE_ITEM | GamePacket.h |
PTCL_ANS_SALE_ITEM | GamePacket.h |
PTCL_NOTIFY_OBTAIN_COORDINATE | GamePacket.h |
PTCL_NOFITY_OBTAIN_ITEM | GamePacket.h |
PTCL_EVENT_GET_ITEM | GamePacket.h |
PTCL_DUNGEON_REWARD_SELECT | GamePacket.h |
PTCL_REQ_IDENTIFY_ITEM | GamePacket.h |
PTCL_EVENT_MY_SKILL_DATA | GamePacket.h |
PTCL_REQ_BETTING_SHOP_LIST | GamePacket.h |
PTCL_ANS_BETTING_SHOP_LIST | GamePacket.h |
PTCL_ANS_BETTING_SHOP_AVERAGE_PRICE | GamePacket.h |
PTCL_REQ_BETTING_SHOP_INSERT | GamePacket.h |
PTCL_ANS_BETTING_SHOP_INSERT | GamePacket.h |
PTCL_REQ_BETTING_SHOP_DELETE | GamePacket.h |
PTCL_ANS_BETTING_SHOP_DELETE | GamePacket.h |
PTCL_REQ_BETTING_MY_LIST | GamePacket.h |
PTCL_ANS_BETTING_MY_LIST | GamePacket.h |
PTCL_REQ_BETTING_SHOP_BETTING | GamePacket.h |
PTCL_ANS_BETTING_SHOP_BETTING | GamePacket.h |
PTCL_REQ_BETTING_SHOP_BUY | GamePacket.h |
PTCL_ANS_BETTING_SHOP_BUY | GamePacket.h |
PTCL_REQ_ACHIEVEMENT_GET_REWARD | GamePacket.h |
PTCL_ANS_ACHIEVEMENT_GET_REWARD | GamePacket.h |
PTCL_REQ_CHANGE_ITEM_MELT | GamePacket.h |
PTCL_ANS_CHANGE_ITEM_MELT | GamePacket.h |
PTCL_REQ_CHANGE_ITEM_COMPOSE | GamePacket.h |
PTCL_ANS_CHANGE_ITEM_COMPOSE | GamePacket.h |
PTCL_REQ_CHANGE_ITEM_EXTRACT | GamePacket.h |
PTCL_ANS_CHANGE_ITEM_EXTRACT | GamePacket.h |
PTCL_REQ_ITEM_EXTRACT | GamePacket.h |
PTCL_ANS_ITEM_EXTRACT | GamePacket.h |
PTCL_REQ_ITEM_SOCKET_INSERT | GamePacket.h |
PTCL_ANS_ITEM_SOCKET_INSERT | GamePacket.h |
PTCL_REQ_ITEM_SOCKET_DESTROY | GamePacket.h |
PTCL_ANS_ITEM_SOCKET_DESTROY | GamePacket.h |
PTCL_ANS_CHECK_LOAD_CHARACTER_DATA | GamePacket.h |
PTCL_REQ_ROUTING_CONNECTION | RoutingPacket.h |
PTCL_ANS_ROUTING_CONNECTION | RoutingPacket.h |
PTCL_REQ_TCLS_LOGIN_INFO | RoutingPacket.h |
PTCL_ANS_TCLS_LOGIN_INFO | RoutingPacket.h |
Command | Location |
PTCL_REQ_MOVE_PLACE | GamePacket.h |
PTCL_ANS_MOVE_PLACE | GamePacket.h |
PTCL_ANS_MAIL_PREVIEW_DATA | GamePacket.h |
PTCL_ANS_MAIL_DETAIL_DATA | GamePacket.h |
PTCL_ANS_SERVER_TIMECODE | GamePacket.h |
PTCL_REQ_NPC_SHOP_ITEM_DATA | GamePacket.h |
PTCL_ANS_NPC_SHOP_ITEM_DATA | GamePacket.h |
PTCL_REQ_USE_ITEM | GamePacket.h |
PTCL_ANS_USE_ITEM | GamePacket.h |
PTCL_REQ_CHANGE_PARTY | GamePacket.h |
PTCL_ANS_CHANGE_PARTY | GamePacket.h |
PTCL_ANS_START_GAME | GamePacket.h |
PTCL_ANS_SECTOR_MONSTER_DATA | GamePacket.h |
PTCL_ANS_SECTOR_MONSTER_DATA_NEW | GamePacket.h |
PTCL_NOTIFY_ATTACK_RECORDING | GamePacket.h |
PTCL_ANS_ATTACK_RECORDING | GamePacket.h |
PTCL_EVENT_ACTIVE_SKILL | GamePacket.h |
PTCL_NOTIFY_BUFF_REMOVE | GamePacket.h |
PTCL_EVENT_RECOVERY_RESULT | GamePacket.h |
PTCL_EVENT_RECORDING_RESULT | GamePacket.h |
PTCL_EVENT_BOSS_CLEAR_RESULT | GamePacket.h |
PTCL_NOTIFY_USING_SKILL | GamePacket.h |
PTCL_NOTIFY_KEEP_GUARD_SKILL | GamePacket.h |
PTCL_ANS_KEEP_GUARD_SKILL | GamePacket.h |
PTCL_REQ_SEND_CHAT | GamePacket.h |
PTCL_ANS_SEND_CHAT | GamePacket.h |
PTCL_NOTIFY_BUFF_EFFECT | GamePacket.h |
PTCL_EVENT_BUFF_EFFECT | GamePacket.h |
PTCL_EVENT_BUFF_END | GamePacket.h |
PTCL_ANS_USER_FRIEND_LOAD_FRIEND_LIST | GamePacket.h |
PTCL_ANS_USER_FRIEND_LOAD_BLOCK_LIST | GamePacket.h |
PTCL_REQ_USER_FRIEND_ADD_FRIEND | GamePacket.h |
PTCL_ANS_USER_FRIEND_ADD_FRIEND | GamePacket.h |
PTCL_REQ_MAN_TO_MAN_CHAT | GamePacket.h |
PTCL_ANS_MAN_TO_MAN_CHAT | GamePacket.h |
PTCL_REQ_CHANNEL_LIST_STATUS | GamePacket.h |
PTCL_ANS_CHANNEL_LIST_STATUS | GamePacket.h |
PTCL_REQ_WALL_BOUND_ADD_DAMAGE | GamePacket.h |
PTCL_ANS_WALL_BOUND_ADD_DAMAGE | GamePacket.h |
PTCL_REQ_CHANNEL_LIST | RoutingPacket.h |
PTCL_ANS_CHANNEL_LIST | RoutingPacket.h |
1.6. Zombie Client를 고려해야 하는 이유
1.7. 보안 프로그램의 적용 위치
2. 인공지능 설계와 분석
2.1. Client로 구현 된 FSM 구성의 문제점
분류 | 상태 |
IDLE | FSMS_IDLE |
FSMS_QUEST_TARGET_POS | |
FSMS_WAIT | |
FSMS_PATROL | |
FSMS_REACTION | |
FSMS_WANDER | |
IDLE or MOVE | FSMS_IDLE_MOVE_AI |
FSMS_ATTACK_MOVE_AI | |
FSMS_QUEST_PATH_MOVE | |
FSMS_RANDOM_MOVE | |
FSMS_CIRCLE_MOVE | |
FSMS_LONG_CIRCLE_MOVE | |
FSMS_TARGET_BACKSIDE_MOVE | |
ATTACK | FSMS_ATTACK_AI |
FSMS_SELECT_SKILL | |
FSMS_SELECT_SKILL1 | |
FSMS_SELECT_SKILL2 | |
FSMS_SELECT_SKILL3 | |
FSMS_SELECT_SKILL4 | |
FSMS_SELECT_SKILL5 | |
FSMS_SELECT_SKILL6 | |
FSMS_SELECT_SKILL7 | |
FSMS_SELECT_SKILL8 | |
FSMS_SELECT_SKILL9 | |
FSMS_SELECT_SKILL10 | |
FSMS_SELECTSKILL_IN_ORDER | |
FSMS_SELECTSKILL_IN_ORDER1 | |
FSMS_USE_SKILL | |
FSMS_USE_SKILL_FORCE1 | |
FSMS_USE_SKILL_FORCE2 | |
FSMS_USE_SKILL_FORCE3 | |
FSMS_USE_SKILL_FORCE4 | |
FSMS_USE_SKILL_FORCE5 | |
FSMS_USE_SKILL_FORCE6 | |
FSMS_USE_SKILL_FORCE7 | |
FSMS_USE_SKILL_FORCE8 | |
FSMS_USE_SKILL_FORCE9 | |
FSMS_USE_SKILL_FORCE10 | |
FSMS_DAMAGE | |
CHASE | FSMS_CHASE |
FSMS_CHASE_NEAR | |
FSMS_CHASE_FAR | |
FSMS_CHASE_X | |
FSMS_CHASE_Y | |
FSMS_CHASE_DIRECTION | |
FSMS_RUSH | |
FSMS_BOOSTER_DASH | |
FSMS_BOOSTER_DODGE | |
RETURN | FSMS_ESCAPE |
All State | FSMS_DETECT |
FSMS_RECOVERY | |
FSMS_TARGET_RESET | |
FSMS_RECURRENCE | |
ATTACK and CHASE | FSMS_ESCAPE_WAIT |
FSMS_FURYMODE | |
FOLLOW | FSMS_FOLLOW |
2.2. Lua Script 기반의 NPC Server 적용 구조
대상 | 역할 |
Player | Connect |
Start | |
Stop | |
Delete | |
Sync | |
Dialog | Open |
Close | |
Message | |
Quest | |
Item | Shop |
Buy | |
Sell | |
Pick | |
Leave | |
Actor | Attack |
Move | |
Change | |
Quit | |
Other | Attack |
Move | |
Change | |
Rebirth | |
Warp In | |
Warp Out | |
Level Up | |
Sync | |
NPC | Start |
Stop | |
Attack | |
Move | |
Change | |
Forward | |
Aggro | |
Recall | |
Sell | |
Sync | |
Quest | Give up |
Complete | |
Finish | |
Use | |
Skill | Use |
DOT (Damage Over Time) | |
Warehouse | Query |
module(State) [
class_<Class Name 1>("Script Class Name 1")
.def("Script Function Name 1", (Out(Class Name 1::*)(In1)&Class Name 1::Function Name 1)
.def("Script Function Name 2", (Out(Class Name 1::*)(In1,In2)&Class Name 1::Function Name 2)
.def("Script Function Name 3", (Out(Class Name 1::*)(In1,In2,In3)&Class Name 1::Function Name 3)
.def("Script Function Name 4", (Out(Class Name 1::*)(In1,In2,In4)&Class Name 1::Function Name 4)
.def("Script Function Name 5", (Out(Class Name 1::*)(In1,In2,In5)&Class Name 1::Function Name 5)
,
class_<Class Name 2>("Script Class Name 2")
.def("Script Function Name 1", (Out(Class Name 2::*)(In1)&Class Name 2::Function Name 1)
.def("Script Function Name 2", (Out(Class Name 2::*)(In1,In2)&Class Name 2::Function Name 2)
.def("Script Function Name 3", (Out(Class Name 2::*)(In1,In3)&Class Name 2::Function Name 3)
.def("Script Function Name 4", (Out(Class Name 2::*)(In1,In4)&Class Name 2::Function Name 4)
.def("Script Function Name 5", (Out(Class Name 2::*)(In1,In5)&Class Name 2::Function Name 5)
];
Lua Script에서 사용 할 함수 등록 방법2.3. Script용 API 예제
함수 | 설명 |
ChangeState | State 전환 |
ChangeAttackType | 공격 방식 변경 |
ClearPath | Path Stack 제거 |
SetPath | 최 단거리 추적 또는 복귀를 위한 경로 저장 |
CheckPath | 경로 상태 확인 |
Idle | 휴식 상태로 최소 단위 실행 |
Return | 복귀 상태로 최소 단위 실행 |
Chase | 추적 상태로 최소 단위 실행 |
Escape | 탈출 상태로 최소 단위 실행 |
Wander | 배회 상태로 최소 단위 실행 |
Patrol | 순찰 상태로 최소 단위 실행 |
Attack | 공격 상태로 최소 단위 실행 |
Dead | 죽은 상태로 최소 단위 실행 |
Recall | 소환 기능 실행 |
HasEnemy | Aggro 기준으로 적이 있는지 확인 후 Target 고정 |
CheckInSight | 시야 범위 확인 |
InAttackRange | 공격 가능 거리인지 확인 |
IsAlive | 살아있는지 확인 |
IsAttacked | 공격 가능 한지 확인 |
GiveExp | Target에게 경험치 주기 |
DropItem | Item 떨어뜨리기 |
Life | HP 설정 |
Recovery | 회복 실행 |
ChangeItem | Item 교환 |
DeleteItem | Item 삭제 |
CheckItem | 소지한 Item 확인 |
AwardItem | Item 보상 |
CheckQuestItem | Quest Item 확인 |
SetQuest | Quest 설정 |
StartQuestStep | Quest 단계 설정 |
SetQuestFail | Quest 실패 |
GetQuestStatus | Quest 상태 확인 |
ClearQuest | Quest 정보 제거 |
AwardExp | 경험치 보상 |
AwardPoint | 포인트 보상 |
function CHASE_OnEnter()
end
function CHASE_OnUpdate()
if(false == Npc:IsAlive()) then
Npc:ChangeState(DEAD, 0);
return;
end
if(FULL == Npc:CheckPath()) then
Npc:ChangeState(RETURN, 0);
return;
end
if(true == Npc:IsAttacked()) then
Npc:ChangeState(ATTACK, 0);
return;
end
if(0 == Npc:CheckInSight()) then
local AttackRange = Npc:InAttackRange();
if((-1) == AttackRange) then
if(false == Npc:Chase()) then
Npc:ChangeState(RETURN, 0);
return;
end
elseif(1 == AttackRange) then
Npc:ChangeState(ATTACK, 0);
return;
elseif(0 == AttackRange) then
Npc:ChangeState(RETURN, 0);
return;
end
else
Npc:ChangeState(RETURN, 0);
return;
end
end
function CHASE_OnExit()
end
];
3. 그 외 미구현 된 기능의 목록
3.1. Hack 방지를 위한 충돌 검사 구현
<LineList>
<Line PortalId="2" X="100" Y="707" X2="70" Y2="820" TransPos="1" TransOffX="10" TransOffY="0" />
<Line PortalId="0" X="70" Y="820" X2="700" Y2="835" TransPos="0" TransOffX="0" TransOffY="0" />
<Line PortalId="0" X="700" Y="835" X2="5434" Y2="820" TransPos="0" TransOffX="0" TransOffY="0" />
<Line PortalId="1" X="5434" Y="820" X2="5363" Y2="707" TransPos="1" TransOffX="-10" TransOffY="0" />
<Line PortalId="0" X="5363" Y="707" X2="5050" Y2="700" TransPos="2" TransOffX="-10" TransOffY="0" />
<Line PortalId="0" X="5050" Y="700" X2="4953" Y2="675" TransPos="0" TransOffX="0" TransOffY="0" />
<Line PortalId="0" X="4953" Y="675" X2="4630" Y2="675" TransPos="0" TransOffX="0" TransOffY="0" />
<Line PortalId="4" X="4630" Y="675" X2="4470" Y2="675" TransPos="2" TransOffX="0" TransOffY="20" />
<Line PortalId="0" X="4470" Y="675" X2="4145" Y2="675" TransPos="0" TransOffX="0" TransOffY="0" />
<Line PortalId="0" X="4145" Y="675" X2="2954" Y2="675" TransPos="0" TransOffX="0" TransOffY="0" />
<Line PortalId="0" X="2954" Y="675" X2="1670" Y2="675" TransPos="0" TransOffX="0" TransOffY="0" />
<Line PortalId="3" X="1670" Y="675" X2="1510" Y2="675" TransPos="2" TransOffX="0" TransOffY="20" />
<Line PortalId="0" X="1510" Y="675" X2="1205" Y2="675" TransPos="0" TransOffX="0" TransOffY="0" />
<Line PortalId="0" X="1205" Y="675" X2="610" Y2="675" TransPos="0" TransOffX="0" TransOffY="0" />
<Line PortalId="0" X="610" Y="675" X2="390" Y2="700" TransPos="0" TransOffX="0" TransOffY="0" />
<Line PortalId="0" X="390" Y="700" X2="100" Y2="707" TransPos="0" TransOffX="0" TransOffY="0" />
</LineList>
<LineGroupList>
<Group ID="group1" ConnectEndLines="1" NoCollision="0">
<Line X="40" Y="40" />
<Line X="2060" Y="40" />
<Line X="2060" Y="1500" />
<Line X="40" Y="1500" />
</Group>
</LineGroupList>
대상 | 역할 |
ASTAR | 적 감지 후 최단 거리 길 찾기 |
Return Path | 최단 거리 태어난 위치 기록 |
Path Following | 최단 거리 주인 위치 기록 |
3.2. 공간 분할과 Packet 중계의 우선 순위 문제
3.3. Player Data의 보관 및 저장
3.4. NPC에 대한 Host 처리 구현
3.5. Multiple NIC에 대한 Bind 처리
3.6. 풀기 어려운 암호화 생성 방식 구현
3.7. Free Server 방지용 서버 인증기 구현
3.8. Reconnecting 보완을 위한 Session 서버 구현
Command | Value | Direction |
ROUTING_PROTOCOL_VERSION | 8 | Under |
DEFINE_LOGIN_PROTOCOL | 10000 | Nothing |
PTCL_REQ_ROUTING_CONNECTION | Under | |
PTCL_ANS_ROUTING_CONNECTION | Upper | |
PTCL_REQ_TCLS_LOGIN_INFO | Under | |
PTCL_ANS_TCLS_LOGIN_INFO | Upper | |
PTCL_REQ_SERVER_LIST | Under | |
PTCL_ANS_SERVER_LIST | Upper | |
PTCL_REQ_CHANNEL_LIST | Under | |
PTCL_ANS_CHANNEL_LIST | Upper | |
END_LOGIN_DEFINITION | Nothing |
Command | Value | Direction |
RELAY_PROTOCOL_VERSION | 4 | Under |
START_DEFINE_RELAY_P2P_PROTOCOL | 1000 | Nothing |
END_DEFINE_RELAY_P2P_PROTOCOL | 9999 | Nothing |
DEFINE_RELAY_PROTOCOL | 60000 | Nothing |
PTCL_REQ_RELAY_SERVER_REGISTER | Under | |
PTCL_ANS_RELAY_SERVER_REGISTER | Upper | |
PTCL_REQ_USER_CREATE_GAMEROOM | Under | |
PTCL_ANS_USER_CREATE_GAMEROOM | Upper | |
PTCL_REQ_USER_INSERT_GAME_ROOM | Under | |
PTCL_ANS_USER_INSERT_GAME_ROOM | Upper | |
PTCL_REQ_USER_LEAVE_GAME_ROOM | Under | |
PTCL_ANS_USER_LEAVE_GAME_ROOM | Upper | |
PTCL_NOTIFY_USER_DISCONNECT | Under | |
END_RELAY_DEFINITION | Nothing |
Command | Value | Direction |
GAME_PROTOCOL_VERSION | 231 | Under |
START_DEFINE_P2P_PROTOCOL | 1000 | Nothing |
END_DEFINE_P2P_PROTOCOL | 9999 | Nothing |
DEFINE_GAME_PROTOCOL | 20000 | Nothing |
PTCL_REQ_GAME_CONNECTION | Under | |
PTCL_ANS_GAME_CONNECTION | Upper | |
PTCL_REQ_SECOND_PASSWORD_STATE | Under | |
PTCL_ANS_SECOND_PASSWORD_STATE | Upper | |
PTCL_REQ_RELAY_SERVER_INFO | Under | |
PTCL_ANS_RELAY_SERVER_INFO | Upper | |
PTCL_NOTIFY_RELAY_CONNECTION_ID | Upper | |
PTCL_REQ_CHARACTER_LIST | Under | |
PTCL_ANS_CHARACTER_LIST | Upper | |
PTCL_ANS_ERRCODE_CHARACTER_LIST | Upper | |
PTCL_REQ_CHANGE_CHARACTER_SLOT | Under | |
PTCL_ANS_CHANGE_CHARACTER_SLOT | Upper | |
PTCL_REQ_CREATE_CHARACTER | Under | |
PTCL_ANS_CREATE_CHARACTER | Upper | |
PTCL_REQ_RESTORE_CHARACTER | Under | |
PTCL_ANS_RESTORE_CHARACTER | Upper | |
PTCL_REQ_DELETE_CHARACTER | Under | |
PTCL_ANS_DELETE_CHARACTER | Upper | |
PTCL_REQ_CHANGE_USER_CLASS | Under | |
PTCL_ANS_CHANGE_USER_CLASS | Upper | |
PTCL_REQ_CHARACTER_LOGOUT | Under | |
PTCL_ANS_CHARACTER_LOGOUT | Upper | |
PTCL_REQ_LOAD_CHARACTER_DATA | Under | |
PTCL_ANS_LOAD_CHARACTER_DATA | Upper | |
PTCL_REQ_LOAD_CHARACTER_KEY_CUSTOMIZE_DATA | Under | |
PTCL_ANS_LOAD_CHARACTER_KEY_CUSTOMIZE_DATA | Upper | |
PTCL_REQ_SAVE_CHARACTER_KEY_CUSTOMIZE_DATA | Under | |
PTCL_ANS_SAVE_CHARACTER_KEY_CUSTOMIZE_DATA | Upper | |
PTCL_REQ_LOAD_EQUIP_EQUIPMENT_DATA | Under | |
PTCL_ANS_LOAD_EQUIP_EQUIPMENT_DATA | Upper | |
PTCL_REQ_QUICK_SLOT_DATA | Under | |
PTCL_ANS_QUICK_SLOT_DATA | Upper | |
PTCL_REQ_LOAD_INVENTORY_DATA | Under | |
PTCL_ANS_LOAD_INVENTORY_DATA | Upper | |
PTCL_REQ_LOAD_PASSIVE_SKILL_DATA | Under | |
PTCL_ANS_LOAD_PASSIVE_SKILL_DATA | Upper | |
PTCL_EVENT_PVP_USER_INFO | Upper | |
PTCL_REQ_CHANGE_PASSIVE_SKILL_DATA | Under | |
PTCL_ANS_CHANGE_PASSIVE_SKILL_DATA | Upper | |
PTCL_REQ_INVENTORY_SORT | Under | |
PTCL_ANS_INVENTORY_SORT | Upper | |
PTCL_REQ_MOVE_PLACE | Under | |
PTCL_ANS_MOVE_PLACE | Upper | |
PTCL_REQ_SECTOR_USER_INFO | Under | |
PTCL_ANS_SECTOR_USER_INFO | Upper | |
PTCL_REQ_USER_JOIN_SECTOR | Under | |
PTCL_ANS_USER_JOIN_SECTOR | Upper | |
PTCL_EVENT_USER_JOIN_SECTOR | Upper | |
PTCL_REQ_USER_INFO_DETAIL | Under | |
PTCL_ANS_USER_INFO_DETAIL | Upper | |
PTCL_EVENT_USER_LEAVE_SECTOR | Upper | |
PTCL_REQ_USER_MOVE_STATE_SECTOR | Under | |
PTCL_ANS_USER_MOVE_STATE_SECTOR | Upper | |
PTCL_EVENT_USER_MOVE_STATE_SECTOR_FIX | Upper | |
PTCL_REQ_CHANGE_INVENTORY_DATA | Under | |
PTCL_ANS_CHANGE_INVENTORY_DATA | Upper | |
PTCL_EVENT_EXPIRE_ITEM | Upper | |
PTCL_REQ_CHANGE_QUICK_SLOT | Under | |
PTCL_ANS_CHANGE_QUICK_SLOT | Upper | |
PTCL_REQ_LOAD_WAREHOUSE_ITEM_DATA | Under | |
PTCL_ANS_LOAD_WAREHOUSE_ITEM_DATA | Upper | |
PTCL_REQ_CHANGE_ITEM_ENHANCE | Under | |
PTCL_ANS_CHANGE_ITEM_ENHANCE | Upper | |
PTCL_REQ_MAIL_PREVIEW_DATA | Under | |
PTCL_ANS_MAIL_PREVIEW_DATA | Upper | |
PTCL_REQ_MAIL_DETAIL_DATA | Under | |
PTCL_REQ_MAIL_KEEP_DATA | Under | |
PTCL_ANS_MAIL_KEEP_DATA | Upper | |
PTCL_REQ_CHANGE_MAIL_DATA | Under | |
PTCL_ANS_CHANGE_MAIL_DATA | Upper | |
PTCL_REQ_SEND_MAIL | Under | |
PTCL_ANS_SEND_MAIL | Upper | |
PTCL_EVENT_YOU_HAVE_NEW_MAIL | Upper | |
PTCL_REQ_SERVER_TIMECODE | Under | |
PTCL_ANS_SERVER_TIMECODE | Upper | |
PTCL_REQ_BUY_ITEM | Under | |
PTCL_ANS_BUY_ITEM | Upper | |
PTCL_REQ_REBUY_ITEM | Under | |
PTCL_ANS_REBUY_ITEM | Upper | |
PTCL_REQ_SALE_ITEM | Under | |
PTCL_ANS_SALE_ITEM | Upper | |
PTCL_REQ_USE_ITEM | Under | |
PTCL_ANS_USE_ITEM | Upper | |
PTCL_REQ_CHANGE_PARTY | Under | |
PTCL_ANS_CHANGE_PARTY | Upper | |
PTCL_NOTIFY_CHANGE_PARTY | Upper | |
PTCL_EVENT_INVITATION_PARTY | Upper | |
PTCL_EVENT_PARTY_MEMBER_STATE | Upper | |
PTCL_EVENT_PARTY_CHANGE_STATE | Upper | |
PTCL_EVENT_PVP_MEMBER_STATE | Upper | |
PTCL_REQ_NPC_SHOP_ITEM_DATA | Under | |
PTCL_ANS_NPC_SHOP_ITEM_DATA | Upper | |
PTCL_REQ_USING_EXP_POINT | Under | |
PTCL_ANS_USING_EXP_POINT | Upper | |
PTCL_REQ_IDENTIFY_ITEM | Under | |
PTCL_ANS_IDENTIFY_ITEM | Upper | |
PTCL_EVENT_CHANGE_USER_STATE | Upper | |
PTCL_EVENT_CHANGE_USER_ITEM | Upper | |
PTCL_EVENT_CHANGE_USER_ITEM_WITH_OPTION | Upper | |
PTCL_REQ_PVP_INVITE | Under | |
PTCL_ANS_PVP_INVITE | Upper | |
PTCL_ANS_PVP_INVITE_BY_USER | Upper | |
PTCL_REQ_PVP_INVITE_REPLY | Under | |
PTCL_ANS_PVP_RECORD | Upper | |
PTCL_REQ_PVP_RANKLIST | Under | |
PTCL_ANS_PVP_RANKLIST | Upper | |
PTCL_REQ_ITEM_REINFORCEMENT | Under | |
PTCL_ANS_ITEM_REINFORCEMENT | Upper | |
PTCL_REQ_CREATE_GAMEROOM | Under | |
PTCL_ANS_CREATE_GAMEROOM | Upper | |
PTCL_REQ_INSERT_GAMEROOM | Under | |
PTCL_ANS_INSERT_GAMEROOM | Upper | |
PTCL_REQ_LEAVE_GAMEROOM | Under | |
PTCL_ANS_LEAVE_GAMEROOM | Upper | |
PTCL_REQ_CHANGE_GAMEDATA | Under | |
PTCL_ANS_CHANGE_GAMEDATA | Upper | |
PTCL_REQ_GAMEROOMUSER_LIST | Under | |
PTCL_ANS_GAMEROOMUSER_LIST | Upper | |
PTCL_REQ_LOADING_REPORT | Under | |
PTCL_ANS_LOADING_REPORT | Upper | |
PTCL_REQ_START_GAME | Under | |
PTCL_ANS_START_GAME | Upper | |
PTCL_REQ_SECTOR_LOADING_REPORT | Under | |
PTCL_ANS_SECTOR_LOADING_REPORT | Upper | |
PTCL_REQ_SECTOR_MONSTER_DATA | Under | |
PTCL_ANS_SECTOR_MONSTER_DATA | Upper | |
PTCL_REQ_SECTOR_MONSTER_DATA_NEW | Under | |
PTCL_ANS_SECTOR_MONSTER_DATA_NEW | Upper | |
PTCL_REQ_START_SECTOR | Under | |
PTCL_ANS_START_SECTOR | Upper | |
PTCL_EVENT_CLEAR_SECTOR | Upper | |
PTCL_NTY_MAYBE_CLEAR_SECTOR | Upper | |
PTCL_NOTIFY_ATTACK_RECORDING | Upper | |
PTCL_ANS_ATTACK_RECORDING | Upper | |
PTCL_EVENT_ACTIVE_SKILL | Upper | |
PTCL_NOTIFY_BUFF_REMOVE | Upper | |
PTCL_NOTIFY_BUFF_APPLY | Upper | |
PTCL_EVENT_RECOVERY_RESULT | Upper | |
PTCL_EVENT_RECORDING_RESULT | Upper | |
PTCL_EVENT_BOSS_CLEAR_RESULT | Upper | |
PTCL_NOTIFY_USING_SKILL | Upper | |
PTCL_EVENT_LATENCY | Upper | |
PTCL_NOTIFY_CHARACTER_DEAD | Upper | |
PTCL_EVENT_END_BUFF_CHANNEL | Upper | |
PTCL_NOTIFY_MONSTER_DATA_INIT | Upper | |
PTCL_NOTIFY_OBTAIN_COORDINATE | Upper | |
PTCL_NOFITY_OBTAIN_ITEM | Under | |
PTCL_EVENT_GET_ITEM | Upper | |
PTCL_NOTIFY_TENDER_ITEM | Upper | |
PTCL_EVENT_TENDER_TABLE_INFO | Upper | |
PTCL_REQ_USE_REBIRTH_COUPON | Under | |
PTCL_ANS_USE_REBIRTH_COUPON | Upper | |
PTCL_REQ_SUMMON_OBJECT | Under | |
PTCL_ANS_SUMMON_OBJECT | Upper | |
PTCL_NOTIFY_DUNGEON_REWARD_SELECT | Upper | |
PTCL_DUNGEON_REWARD_SELECT | Under | |
PTCL_REQ_END_GAME | Under | |
PTCL_ANS_END_GAME | Upper | |
PTCL_EVENT_CHECK_ANTIBOT_DATA | Upper | |
PTCL_EVENT_CHECK_DP_DATA | Upper | |
PTCL_NOTIFY_CHECK_ANTIBOT | Upper | |
PTCL_NOTIFY_CHECK_DP | Upper | |
PTCL_REQ_LOAD_SKILL_DATA | Under | |
PTCL_ANS_LOAD_SKILL_DATA | Upper | |
PTCL_REQ_GET_SKILL | Under | |
PTCL_ANS_GET_SKILL | Upper | |
PTCL_EVENT_MY_SKILL_DATA | Upper | |
PTCL_REQ_SKILL_DECK_CHANGE | Under | |
PTCL_ANS_SKILL_DECK_CHANGE | Upper | |
PTCL_EVENT_AUTO_REFILL_CONTENTS | Upper | |
PTCL_NOTIFY_USER_PC_SPEC | Upper | |
PTCL_REQ_LOAD_USER_QUEST | Under | |
PTCL_ANS_LOAD_USER_QUEST | Upper | |
PTCL_REQ_USER_ACCEPT_QUEST | Under | |
PTCL_ANS_USER_ACCEPT_QUEST | Upper | |
PTCL_NTY_INFORM_USERQUEST | Upper | |
PTCL_NTY_MODIFY_USERQUEST_STATEVALUE | Upper | |
PTCL_NTY_USERQUEST_SUCC | Upper | |
PTCL_NTY_USERQUEST_FAILED | Upper | |
PTCL_NTY_USERQUEST_STATE | Upper | |
PTCL_NTY_USERQUEST_STATUS | Upper | |
PTCL_NTY_USERQUESTDIALOG_NEWQUEST | Upper | |
PTCL_NTY_USERQUESTDIALOG_DELETEQUEST | Upper | |
PTCL_REQ_USERQUEST_COMPLETE | Under | |
PTCL_ANS_USERQUEST_COMPLETE | Upper | |
PTCL_NTY_USERQUEST_ACCEPTRESULT | Upper | |
PTCL_NTY_USERQUEST_COMPLETERESULT | Upper | |
PTCL_REQ_USERQUEST_GIVEUP | Under | |
PTCL_ANS_USERQUEST_GIVEUP | Upper | |
PTCL_NTY_USERQUEST_TIMEOUT_INFO | Upper | |
PTCL_RELOAD_QUEST_DATA | Under | |
PTCL_RESET_USER_QUEST_INFO | Under | |
PTCL_REQ_LOAD_USERQUEST_SELECTEDLIST | Under | |
PTCL_ANS_LOAD_USERQUEST_SELECTEDLIST | Upper | |
PTCL_NTY_SAVE_USERQUEST_SELECTEDLIST | Upper | |
PTCL_NTY_USER_DAILY_QUEST | Upper | |
PTCL_NTY_USER_QUEST_HISTORY | Upper | |
PTCL_SYSNTY_DEVELOPER_LOG | Under | |
PTCL_QUEST_USER_ITEM_NTY | Under | |
PTCL_SYSNTY_GAMEROOM_OBJECT_ADD | Under | |
PTCL_SYSNTY_GAMEROOM_OBJECT_DEL | Under | |
PTCL_SYSNTY_GAMEROOM_OBJECT_MOD | Under | |
PTCL_NTY_ACQUIRE_QUEST_ITEM_MESSAGE | Upper | |
PTCL_NTY_USER_QUEST_DESTROY | Upper | |
PTCL_NOTIFY_UI_SKILL_CHANGE_STATE | Upper | |
PTCL_NOTIFY_ASSERT_ERROR | Upper | |
PTCL_NOTIFY_P2P_RECV_COUNT | Upper | |
PTCL_NOTIFY_SECTOR_CLEAR_REPORT | Upper | |
PTCL_REQ_CHANGE_TRADE_STATE | Under | |
PTCL_ANS_CHANGE_TRADE_STATE | Upper | |
PTCL_REQ_CHANGE_TRADE_ITEM | Under | |
PTCL_ANS_CHANGE_TRADE_ITEM | Upper | |
PTCL_EVENT_TRADE_RESULT | Upper | |
PTCL_NOTIFY_BUSY_NPC_TRADE | Upper | |
PTCL_NOTIFY_PARTY_CHARACTER_STATE | Upper | |
PTCL_AAS_USERDATA | Under | |
PTCL_NOTIFY_KEEP_GUARD_SKILL | Upper | |
PTCL_ANS_KEEP_GUARD_SKILL | Upper | |
PTCL_REQ_USER_UPDATE_QUEST | Under | |
PTCL_ANS_USER_QUEST_LIST | Upper | |
PTCL_REQ_USER_QUEST_FAIL | Under | |
PTCL_ANS_USER_QUEST_FAIL_IS_FAIL | Upper | |
PTCL_REQ_PARTY_ACCEPT_QUEST | Under | |
PTCL_REQ_LOAD_SAVE_BUFF | Under | |
PTCL_ANS_LOAD_SAVE_BUFF | Upper | |
PTCL_NOTIFY_BUFF_EFFECT | Upper | |
PTCL_EVENT_BUFF_EFFECT | Upper | |
PTCL_EVENT_BUFF_END | Upper | |
PTCL_ANS_BUFF_END | Upper | |
PTCL_NTY_READY_FOR_COMMUNITY_DATA_LOADING | Upper | |
PTCL_NTY_READY_FOR_GAME_DATA_LOADING | Upper | |
PTCL_REQ_USER_FRIEND_LOAD_FRIEND_LIST | Under | |
PTCL_ANS_USER_FRIEND_LOAD_FRIEND_LIST | Upper | |
PTCL_REQ_USER_FRIEND_LOAD_BLOCK_LIST | Under | |
PTCL_ANS_USER_FRIEND_LOAD_BLOCK_LIST | Upper | |
PTCL_REQ_USER_FRIEND_ADD_FRIEND | Under | |
PTCL_ANS_USER_FRIEND_ADD_FRIEND | Upper | |
PTCL_REQ_USER_FRIEND_DELETE_FRIEND | Under | |
PTCL_ANS_USER_FRIEND_DELETE_FRIEND | Upper | |
PTCL_REQ_USER_FRIEND_ADD_BLOCK_FRIEND | Under | |
PTCL_ANS_USER_FRIEND_ADD_BLOCK_FRIEND | Upper | |
PTCL_REQ_USER_FRIEND_DELETE_BLOCK_FRIEND | Under | |
PTCL_ANS_USER_FRIEND_DELETE_BLOCK_FRIEND | Upper | |
PTCL_REQ_USER_FRIEND_UPDATE_MEMO | Under | |
PTCL_ANS_USER_FRIEND_UPDATE_MEMO | Upper | |
PTCL_REQ_USER_FRIEND_UPDATE_BLOCK_MEMO | Under | |
PTCL_ANS_USER_FRIEND_UPDATE_BLOCK_MEMO | Upper | |
PTCL_NTY_USER_FRIEND_LOGIN | Upper | |
PTCL_NTY_USER_FRIEND_LOGOUT | Upper | |
PTCL_NTY_USER_FRIEND_UPDATE_STATEUS | Upper | |
PTCL_REQ_MAN_TO_MAN_CHAT | Under | |
PTCL_ANS_MAN_TO_MAN_CHAT | Upper | |
PTCL_NTY_MAN_TO_MAN_CHAT | Upper | |
PTCL_REQ_USER_DG_RECORD_LOAD | Under | |
PTCL_ANS_USER_DG_RECORD_LOAD | Upper | |
PTCL_NTY_USER_DG_RECORD_UPDATE | Upper | |
PTCL_REQ_USER_DG_OPEN_LOAD | Under | |
PTCL_ANS_USER_DG_OPEN_LOAD | Upper | |
PTCL_NTY_USER_DG_OPEN_INSERT | Upper | |
PTCL_REQ_TUTORIAL_START_GAME | Under | |
PTCL_ANS_TUTORIAL_START_GAME | Upper | |
PTCL_REQ_PARTYPR_REGISTER_PR_INFO | Under | |
PTCL_ANS_PARTYPR_REGISTER_PR_INFO | Upper | |
PTCL_NTY_PARTYPR_REGISTER_PR_INFO | Upper | |
PTCL_REQ_PARTYPR_MODIFY_PR_INFO | Under | |
PTCL_ANS_PARTYPR_MODIFY_PR_INFO | Upper | |
PTCL_NTY_PARTYPR_MODIFY_PR_INFO | Upper | |
PTCL_REQ_PARTYPR_UNREGISTER_PR_INFO | Under | |
PTCL_ANS_PARTYPR_UNREGISTER_PR_INFO | Upper | |
PTCL_NTY_PARTYPR_UNREGISTER_PR_INFO | Upper | |
PTCL_REQ_PARTYPR_QUERY_PRLIST | Under | |
PTCL_ANS_PARTYPR_QUERY_PRLIST | Upper | |
PTCL_REQ_PARTYPR_QUERY_PARTYPR_INFO | Under | |
PTCL_ANS_PARTYPR_QUERY_PARTYPR_INFO | Upper | |
PTCL_REQ_PARTYPR_JOIN_REQ | Under | |
PTCL_ANS_PARTYPR_JOIN_REQ | Upper | |
PTCL_NTY_PARTYPR_RECV_JOIN_REQ | Upper | |
PTCL_REQ_PARTYPR_ACCEPT_JOIN_REQ | Under | |
PTCL_ANS_PARTYPR_ACCEPT_JOIN_REQ | Upper | |
PTCL_REQ_PARTYPR_REFUSE_JOIN_REQ | Under | |
PTCL_ANS_PARTYPR_REFUSE_JOIN_REQ | Upper | |
PTCL_NTY_PARTYPR_JOIN_REQ_ACCEPTED | Upper | |
PTCL_NTY_PARTYPR_JOIN_REQ_REFUSED | Upper | |
PTCL_REQ_PARTYPR_JOIN_REQ_CANCEL | Under | |
PTCL_ANS_PARTYPR_JOIN_REQ_CANCEL | Upper | |
PTCL_NTY_PARTYPR_JOIN_REQ_CANCELED | Upper | |
PTCL_REQ_CHANNEL_LIST_STATUS | Under | |
PTCL_ANS_CHANNEL_LIST_STATUS | Upper | |
PTCL_REQ_CHANGE_CHANNEL_OFF | Under | |
PTCL_ANS_CHANGE_CHANNEL_OFF | Upper | |
PTCL_RPT_USER_SLEEP_FLAG | Under | |
PTCL_REQ_USER_IDENTIFY | Under | |
PTCL_ANS_USER_IDENTIFY | Upper | |
PTCL_REQ_SEND_CHAT | Under | |
PTCL_ANS_SEND_CHAT | Upper | |
PTCL_CONSOLE_NOTICE_MESSAGE | Under | |
PTCL_REQ_GM_CLIENT_CHEAT_KEY | Under | |
PTCL_ANS_GM_CLIENT_CHEAT_KEY | Upper | |
PTCL_NOTIFY_OTHER_USER_STATE_CHANGE | Upper | |
PTCL_NTY_PING | Upper | |
PTCL_NTY_PONG | Upper | |
PTCL_REQ_PING | Under | |
PTCL_REP_PING | Under | |
PTCL_NTY_PING_RECORD | Upper | |
PTCL_REQ_BETTING_SHOP_LIST | Under | |
PTCL_ANS_BETTING_SHOP_LIST | Upper | |
PTCL_REQ_BETTING_SHOP_AVERAGE_PRICE | Under | |
PTCL_ANS_BETTING_SHOP_AVERAGE_PRICE | Upper | |
PTCL_REQ_BETTING_SHOP_INSERT | Under | |
PTCL_ANS_BETTING_SHOP_INSERT | Upper | |
PTCL_REQ_BETTING_SHOP_DELETE | Under | |
PTCL_ANS_BETTING_SHOP_DELETE | Upper | |
PTCL_REQ_BETTING_MY_LIST | Under | |
PTCL_ANS_BETTING_MY_LIST | Upper | |
PTCL_REQ_BETTING_SHOP_BETTING | Under | |
PTCL_ANS_BETTING_SHOP_BETTING | Upper | |
PTCL_REQ_BETTING_SHOP_BUY | Under | |
PTCL_ANS_BETTING_SHOP_BUY | Upper | |
PTCL_RPT_DGRULE_MESSAGE | Under | |
PTCL_NTY_DGRULE_MESSAGE | Upper | |
PTCL_REQ_MONSTER_RESPAWN | Under | |
PTCL_ANS_MONSTER_RESPAWN | Upper | |
PTCL_NTY_ACHIEVEMENT_SUCCESS | Upper | |
PTCL_REQ_ACHIEVEMENT_SUCCESS_LIST | Under | |
PTCL_ANS_ACHIEVEMENT_SUCCESS_LIST | Upper | |
PTCL_REQ_ACHIEVEMENT_GET_REWARD | Under | |
PTCL_ANS_ACHIEVEMENT_GET_REWARD | Upper | |
PTCL_NTY_MY_MISSION_LIST | Upper | |
PTCL_REQ_CHANGE_ITEM_MELT | Under | |
PTCL_ANS_CHANGE_ITEM_MELT | Upper | |
PTCL_REQ_CHANGE_ITEM_COMPOSE | Under | |
PTCL_ANS_CHANGE_ITEM_COMPOSE | Upper | |
PTCL_REQ_CHANGE_ITEM_EXTRACT | Under | |
PTCL_ANS_CHANGE_ITEM_EXTRACT | Upper | |
PTCL_REQ_ITEM_EXTRACT | Under | |
PTCL_ANS_ITEM_EXTRACT | Upper | |
PTCL_REQ_ITEM_SOCKET_INSERT | Under | |
PTCL_ANS_ITEM_SOCKET_INSERT | Upper | |
PTCL_REQ_ITEM_SOCKET_DESTROY | Under | |
PTCL_ANS_ITEM_SOCKET_DESTROY | Upper | |
PTCL_REQ_WALL_BOUND_ADD_DAMAGE | Under | |
PTCL_ANS_WALL_BOUND_ADD_DAMAGE | Upper | |
PTCL_REQ_SYNCH_PLAY_START_REPORT | Under | |
PTCL_ANS_SYNCH_PLAY_START_REPORT | Upper | |
PTCL_REQ_PVP_ROOM_LIST | Under | |
PTCL_ANS_PVP_ROOM_LIST | Upper | |
PTCL_REQ_JUMP_DG_SECTOR | Under | |
PTCL_ANS_JUMP_DG_SECTOR | Upper | |
PTCL_NTY_LUASCRIPT_DEBUG_LOG | Upper | |
PTCL_REQ_CHANGE_SECOND_PASSWORD | Under | |
PTCL_ANS_CHANGE_SECOND_PASSWORD | Upper | |
PTCL_NOTIFY_CATCH_STATE_CANCEL | Upper | |
PTCL_EVENT_SAFE_MODE_STATE | Upper | |
PTCL_USER_SKILL_SOCKET_INFO | Under | |
PTCL_REQ_WANTED_QUEST_DATA | Under | |
PTCL_ANS_WANTED_QUEST_DATA | Upper | |
PTCL_REQ_CHECK_LOAD_CHARACTER_DATA | Under | |
PTCL_ANS_CHECK_LOAD_CHARACTER_DATA | Upper | |
PTCL_REQ_BATTLE_CHANNEL_LIST | Under | |
PTCL_ANS_BATTLE_CHANNEL_LIST | Upper | |
PTCL_REQ_LIST_ROOM | Under | |
PTCL_ANS_LIST_ROOM | Upper | |
PTCL_REQ_CREATE_ROOM | Under | |
PTCL_ANS_CREATE_ROOM | Upper | |
PTCL_REQ_JOIN_ROOM | Under | |
PTCL_ANS_JOIN_ROOM | Upper | |
PTCL_EVENT_JOIN_ROOM | Upper | |
PTCL_REQ_EXIT_ROOM | Under | |
PTCL_ANS_EXIT_ROOM | Upper | |
PTCL_EVENT_EXIT_ROOM | Upper | |
PTCL_REQ_CLOSE_SLOT_ROOM | Under | |
PTCL_ANS_CLOSE_SLOT_ROOM | Upper | |
PTCL_EVENT_CLOSE_SLOT_ROOM | Upper | |
PTCL_REQ_CHANGE_ROOM_TYPE | Under | |
PTCL_ANS_CHANGE_ROOM_TYPE | Upper | |
PTCL_EVENT_CHANGE_ROOM_TYPE | Upper | |
PTCL_NOTIFY_READY_INFO | Upper | |
PTCL_EVENT_READY_INFO | Upper | |
PTCL_NOTIFY_CHANGE_TEAM | Upper | |
PTCL_EVENT_CHANGE_TEAM | Upper | |
PTCL_REQ_INVITE_USER_LIST | Under | |
PTCL_ANS_INVITE_USER_LIST | Upper | |
PTCL_REQ_INVITE_USER | Under | |
PTCL_ANS_INVITE_USER | Upper | |
PTCL_EVENT_INVITE_USER | Upper | |
PTCL_NOTIFY_MOVE_BATTLE_ROOM | Upper | |
PTCL_EVENT_MOVE_BATTLE_ROOM | Upper | |
PTCL_NOTIFY_CHANGE_BATTLE_ROOM_TYPE | Upper | |
PTCL_EVENT_CHANGE_BATTLE_ROOM_TYPE | Upper | |
PTCL_NOTIFY_CHANGE_MAP | Upper | |
PTCL_EVENT_CHANGE_MAP | Upper | |
PTCL_REQ_START_BATTLE | Under | |
PTCL_ANS_START_BATTLE | Upper | |
PTCL_EVENT_START_BATTLE | Upper | |
PTCL_NOTIFY_BATTLE_SYNC | Upper | |
PTCL_EVENT_BATTLE_SYNC | Upper | |
PTCL_NOTIFY_BATTLE_TRUN | Upper | |
PTCL_EVENT_BATTLE_TRUN | Upper | |
PTCL_EVENT_BATTLE_DEAD | Upper | |
PTCL_EVENT_BATTLE_END | Upper | |
PTCL_REQ_BATTLE_RANK | Under | |
PTCL_ANS_BATTLE_RANK | Upper | |
PTCL_REQ_UNBIND_ITEM | Under | |
PTCL_ANS_UNBIND_ITEM | Upper | |
PTCL_REQ_SHOW_USER_INFO | Under | |
PTCL_ANS_SHOW_USER_INFO | Upper | |
PTCL_EVENT_SHOW_USER_INFO | Upper | |
PTCL_NOTIFY_SHOW_USER_INFO | Upper | |
PTCL_CTG_EVENT_GET_SHOW_USER_INFO | Upper | |
PTCL_CTG_NOTIFY_GET_SHOW_USER_INFO | Upper | |
PTCL_REQ_SET_AUTOCOMBO | Under | |
PTCL_ANS_SET_AUTOCOMBO | Upper | |
PTCL_NTY_SET_SECTOR_MANUAL_FINISH | Upper | |
PTCL_NTY_SECTOR_MANUAL_CLEAR | Upper | |
PTCL_NTY_SECTOR_MANUAL_FAIL | Upper | |
END_GAME_DEFINITION | Nothing |
3.9. Web Launcher와 Normal Launcher를 고려 한 인증 서버 구현
3.10. 게임 로그와 운영 도구 개발
enum LOG_EVENTS_TYPE {
LE_SERVER_ERR = 0,
LE_SERVER_START,
LE_SERVER_STOP,
// 서버버그이다. 이메시지가 발생하면, 해당 기능을 재점검할 필요가 있다. LF_AID,LF_ID,LF_STR
LE_BUG,
// 매크로(혹은 자체개발한 클라이언트 사용자) LF_AID,LF_ID,LF_STR
LE_HACK,
// GameGuard 핵 사용자 LF_AID,LF_ID,LF_DEBUG,LF_STR
LE_SECURITY,
// 경험치 정보. LF_AID,LF_ID,LF_EXP,LF_GRADE,LF_POINTS,LF_NEW_EXP,
// LF_BONUS_EXP,LF_NEW_POINTS,LF_BONUS_POINTS,LF_CONTRIBUTION,
LE_EXP,
// 아이템 구매. LF_AID,LF_ID,LF_NEWITEM,LF_TIME,LF_CASH,LF_POINTS,LF_EVENT_CASH,LF_EVENT_POINTS
LE_ITEM_BUY,
…
};
Log Event 예제
enum LOG_FIELDS_TYPE {
LF_NONE = 0, // (NONE)
LF_DEBUG, // Number
LF_FAIL, // (NONE)
LF_SUCCESS, // (NONE)
LF_TIME, // 초
LF_STR, // 문자열 -> 변환없음.
LF_IP, // IPv4
LF_PORT, // port 번호
LF_EXP, // 정수형 -> 문자열로 저장한다.
LF_CASH, // 정수형 -> 문자열로 저장한다.
LF_POINTS, // Point
LF_EVENT_CASH,
LF_EVENT_POINTS,
…
};
Log Field 예제
LOG(
LE_ITEM_BUY<<
LF_AID<<GetAid()<<
LF_NEWITEM<<GetId()<<GetSerial()<<GetStocks()<<
LF_TIME<<GetTime()<<
LF_CASH<<GetCash()<<
LF_POINTS<<GetTotalPoint()<<
LF_EVENT_CASH<<GetEventCash()<<
LF_EVENT_POINTS<<GetEventPoint()
);
Game Log 적용 예제
댓글
댓글 쓰기