inital commit: we can read login packets!

This commit is contained in:
CPunch 2023-03-04 21:57:27 -06:00
commit 24359e9398
7 changed files with 1174 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
notes
bin

825
api/protocol/consts.go Normal file
View File

@ -0,0 +1,825 @@
package protocol
const (
SUCC = 1
FAIL = 0
SIZEOF_BYTE = 1
SIZEOF_DWORD = 4
SIZEOF_INT = 4
SIZEOF_FLOAT = 4
SIZEOF_SHORT = 2
SIZEOF_ULONG = 4
SIZEOF_UINT64 = 8
SIZEOF_IP_STRING = 16
SIZEOF_CN_UID_STRING = 50
SIZEOF_ACCOUNT_STRING = 33
SIZEOF_PASSWORD_STRING = 33
SIZEOF_AUTH_ID_STRING = 255
CN_MAX_COUNT_GROUP_MEMBER = 5
CN_MAX_COUNT_PC_GROUP_MEMBER = 4
CN_MAX_COUNT_NPC_GROUP_MEMBER = 5
CHAT_MAX_STRING = 128
PC_START_LOCATION_RANDOM_RANGE = 10000
SIZEOF_ANNOUNCE_STRING = 512
SERVER_COUNT_SHARD_CLIENT = 25
EXIT_CODE_DISCONNECT = 0
EXIT_CODE_REQ_BY_PC = 1
EXIT_CODE_REQ_BY_SVR = 2
EXIT_CODE_REQ_BY_GM = 3
EXIT_CODE_HACK = 4
EXIT_CODE_ERROR = 5
EXIT_CODE_LIVE_CHECK = 6
EXIT_CODE_REQ_BY_PC_DUPE_LOGIN = 7
EXIT_CODE_SERVER_ERROR = 99
SIZEOF_USER_ID = 32
SIZEOF_USER_PW = 32
SIZEOF_PC_SLOT = 4
SIZEOF_PC_NAME = 16
SIZEOF_PC_FIRST_NAME = 9
SIZEOF_PC_LAST_NAME = 17
SIZEOF_PC_NAME_FLAG = 8
GENDER_NONE = 0
GENDER_MALE = 1
GENDER_FEMALE = 2
MENTOR_CHANGE_BASE_COST = 100
REPEAT_MISSION_RESET_TIME = 9
SIZEOF_REPEAT_QUESTFLAG_NUMBER = 8
FATIGUE_RESET_TIME = 0
PC_FATIGUE_KILL_UNIT = 7
PC_FATIGUE_1_LEVEL = 11420
PC_FATIGUE_2_LEVEL = 6480
PC_FATIGUE_MAX_LEVEL = 2
PC_FUSIONMATTER_MAX = 999999999
PC_CANDY_MAX = 999999999
PC_BATTERY_MAX = 9999
PC_LEVEL_MAX = 36
SIZEOF_PC_BULLET_SLOT = 3
PC_TICK_TIME = 5000
SIZEOF_EQUIP_SLOT = 9
EQUIP_SLOT_HAND = 0
EQUIP_SLOT_UPPERBODY = 1
EQUIP_SLOT_LOWERBODY = 2
EQUIP_SLOT_FOOT = 3
EQUIP_SLOT_HEAD = 4
EQUIP_SLOT_FACE = 5
EQUIP_SLOT_BACK = 6
EQUIP_SLOT_END = 6
EQUIP_SLOT_HAND_EX = 7
EQUIP_SLOT_VEHICLE = 8
WPN_EQUIP_TYPE_NONE = 0
WPN_EQUIP_TYPE_OH_BLADE = 1
WPN_EQUIP_TYPE_OH_CLUB = 2
WPN_EQUIP_TYPE_OH_PISTOL = 3
WPN_EQUIP_TYPE_OH_RIPLE = 4
WPN_EQUIP_TYPE_OH_THROW = 5
WPN_EQUIP_TYPE_DH_BLADE = 6
WPN_EQUIP_TYPE_DH_CLUB = 7
WPN_EQUIP_TYPE_DH_DPISTOL = 8
WPN_EQUIP_TYPE_DH_RIPLE = 9
WPN_EQUIP_TYPE_DH_THROW = 10
WPN_EQUIP_TYPE_DH_ROCKET = 11
SIZEOF_INVEN_SLOT = 50
SIZEOF_QINVEN_SLOT = 50
SIZEOF_BANK_SLOT = 119
SIZEOF_RESTORE_SLOT = 5
SIZEOF_NANO_BANK_SLOT = 37
SIZEOF_QUEST_SLOT = 1024
NANO_QUEST_INDEX = 0
SIZEOF_RQUEST_SLOT = 9
SIZEOF_QUESTFLAG_NUMBER = 32
SIZEOF_EP_RECORD_SLOT = 51
SIZEOF_TRADE_SLOT = 12
SIZEOF_VENDOR_TABLE_SLOT = 20
SIZEOF_VENDOR_RESTORE_SLOT = 5
SIZEOF_QUEST_NPC_SLOT = 3
SIZEOF_QUEST_ITEM_SLOT = 3
SIZEOF_MAX_ITEM_STACK = 100
SIZEOF_PC_SKILL_SLOT = 33
SIZEOF_QUICK_SLOT = 8
ENCHANT_WEAPON_MATERIAL_ID = 101
ENCHANT_DEFENCE_MATERIAL_ID = 102
SIZEOF_NANO_CARRY_SLOT = 3
COUNTOF_NANO_PER_SET = 3
SIZEOF_NANO_SET = 13
SIZEOF_NANO_STYLE = 3
NANO_STYLE_NONE = 1
NANO_STYLE_CRYSTAL = 0
NANO_STYLE_ENERGY = 1
NANO_STYLE_FLUID = 2
SIZEOF_NANO_TYPE = 4
NANO_TYPE_POWER = 0
NANO_TYPE_ACCURACY = 1
NANO_TYPE_PROTECT = 2
NANO_TYPE_DODGE = 3
SIZEOF_NANO_TUNE_NEED_ITEM_SLOT = 10
VALUE_ATTACK_MISS = 1
MSG_ONLINE = 1
MSG_BUSY = 2
MSG_OFFLINE = 0
SIZEOF_FREE_CHAT_STRING = 128
SIZEOF_MENU_CHAT_STRING = 128
SIZEOF_BUDDYLIST_SLOT = 50
SIZEOF_EMAIL_SUBJECT_STRING = 32
SIZEOF_EMAIL_CONTENT_STRING = 512
SIZEOF_EMAIL_PAGE_SIZE = 5
SIZEOF_EMAIL_ITEM_CNT = 4
EMAIL_AND_MONEY_COST = 50
EMAIL_ITEM_COST = 20
BUDDYWARP_INTERVAL = 60
EMAILSEND_TIME_DELAY = 60
DB_ERROR_INVALID_DATA = 1
DB_ERROR_HACK_ATTEMPT = 2
DB_ERROR_ACCESS_FAIL = 3
DB_ERROR_PC_INSERT_FAIL = 4
CALL_NPC_MAX_CNT = 2048
CN_EP_RING_MAX_CNT = 999
HF_BIT_NONE = 0
HF_BIT_NORMAL = 1
HF_BIT_CRITICAL = 2
HF_BIT_STYLE_WIN = 4
HF_BIT_STYLE_TIE = 8
HF_BIT_STYLE_LOSE = 16
SKIN_COLOR_MAX = 12
HAIR_COLOR_MAX = 18
EYE_COLOR_MAX = 5
BODY_TYPE_MAX = 3
HEIGHT_TYPE_MAX = 5
CLASS_TYPE_MAX = 4
CN_EP_RACE_MODE_PRACTICE = 0
CN_EP_RACE_MODE_RECORD = 1
CN_EP_SECOM_NPC_TYPE_NUM = 13
CN_EP_EECOM_NPC_TYPE_NUM = 14
CN_EP_SIZE_SMALL = 0
CN_EP_SIZE_MIDDLE = 1
CN_EP_SIZE_BIG = 2
CN_EP_TICKET_ITEM_ID_SMALL = 115
CN_EP_TICKET_ITEM_ID_MIDDLE = 116
CN_EP_TICKET_ITEM_ID_BIG = 117
CN_EP_TICKET_ITEM_ID_FREE = 118
CN_EP_DISTANCE_ERROR_SAFE_RANGE = 1200
CN_ACCOUNT_LEVEL__MASTER = 1
CN_ACCOUNT_LEVEL__POWER_DEVELOPER = 10
CN_ACCOUNT_LEVEL__QA = 20
CN_ACCOUNT_LEVEL__GM = 30
CN_ACCOUNT_LEVEL__CS = 40
CN_ACCOUNT_LEVEL__FREE_USER = 48
CN_ACCOUNT_LEVEL__PAY_USER = 49
CN_ACCOUNT_LEVEL__DEVELOPER = 50
CN_ACCOUNT_LEVEL__CLOSEBETA_USER = 80
CN_ACCOUNT_LEVEL__OPENBETA_USER = 85
CN_ACCOUNT_LEVEL__USER = 99
CN_SPECIAL_STATE_FLAG__PRINT_GM = 1
CN_SPECIAL_STATE_FLAG__INVISIBLE = 2
CN_SPECIAL_STATE_FLAG__INVULNERABLE = 4
CN_SPECIAL_STATE_FLAG__FULL_UI = 16
CN_SPECIAL_STATE_FLAG__COMBAT = 32
CN_SPECIAL_STATE_FLAG__MUTE_FREECHAT = 64
CN_GM_SET_VALUE_TYPE__HP = 1
CN_GM_SET_VALUE_TYPE__WEAPON_BATTERY = 2
CN_GM_SET_VALUE_TYPE__NANO_BATTERY = 3
CN_GM_SET_VALUE_TYPE__FUSION_MATTER = 4
CN_GM_SET_VALUE_TYPE__CANDY = 5
CN_GM_SET_VALUE_TYPE__SPEED = 6
CN_GM_SET_VALUE_TYPE__JUMP = 7
CN_GM_SET_VALUE_TYPE__END = 8
HEIGHT_CLIMBABLE = 150
CN_GROUP_WARP_CHECK_RANGE = 1000
WYVERN_LOCATION_FLAG_SIZE = 2
CN_PC_EVENT_ID_GET_NANO_QUEST = 1
CN_PC_EVENT_ID_DEFEAT_FUSE_AND_GET_NANO = 2
_dCN_STREETSTALL__ITEMLIST_COUNT_MAX = 5
CSB_BIT_NONE = 0 // 0
CSB_BIT_UP_MOVE_SPEED = 0x1 // 1
CSB_BIT_UP_SWIM_SPEED = 0x2 // 2
CSB_BIT_UP_JUMP_HEIGHT = 0x4 // 4
CSB_BIT_UP_STEALTH = 0x8 // 8
CSB_BIT_PHOENIX = 0x10 // 16
CSB_BIT_PROTECT_BATTERY = 0x20 // 32
CSB_BIT_PROTECT_INFECTION = 0x40 // 64
CSB_BIT_DN_MOVE_SPEED = 0x80 // 128
CSB_BIT_DN_ATTACK_SPEED = 0x100 // 256
CSB_BIT_STUN = 0x200 // 512
CSB_BIT_MEZ = 0x400 // 1024
CSB_BIT_KNOCKDOWN = 0x800 // 2048
CSB_BIT_MINIMAP_ENEMY = 0x1000 // 4096
CSB_BIT_MINIMAP_TRESURE = 0x2000 // 8192
CSB_BIT_REWARD_BLOB = 0x4000 // 16384
CSB_BIT_REWARD_CASH = 0x8000 // 32768
CSB_BIT_INFECTION = 0x10000 // 65536
CSB_BIT_FREEDOM = 0x20000 // 131072
CSB_BIT_BOUNDINGBALL = 0x40000 // 262144
CSB_BIT_INVULNERABLE = 0x80000 // 524288
CSB_BIT_STIMPAKSLOT1 = 0x100000 // 1048576
CSB_BIT_STIMPAKSLOT2 = 0x200000 // 2097152
CSB_BIT_STIMPAKSLOT3 = 0x400000 // 4194304
CSB_BIT_HEAL = 0x800000 // 8388608
CSB_BIT_EXTRABANK = 0x1000000 // 16777216
TIME_BUFF_CONFIRM_KEY_MAX = 2000000000
READPACKET_SUCC = 0
READPACKET_FAIL = 1
READPACKET_RETURN = 2
BITMASK_FROM2TO = 0x7fffffff // 2147483647
BITMASK_FROM = 0x7fffffff // 2147483647
BITMASK_TO = 0xf000000 // 251658240
BITMASK_SENDBLOCK = 0x800000 // 8388608
BITMASK_AUTHED = 0x400000 // 4194304
BITMASK_U_ID = 0xfff // 4095
CL2LS = 0x12000000
CL2FE = 0x13000000
LS2CL = 0x21000000
LS2LS = 0x22000000
LS2DBA = 0x27000000
FE2CL = 0x31000000
FE2FE = 0x33000000
FE2GS = 0x34000000
FE2EP = 0x36000000
FE2MSG = 0x38000000
GS2FE = 0x43000000
GS2GS = 0x44000000
GS2AI = 0x45000000
GS2EP = 0x46000000
GS2DBA = 0x47000000
GS2MSG = 0x48000000
GS2MGR = 0x4a000000
AI2GS = 0x54000000
EP2FE = 0x63000000
EP2GS = 0x64000000
DBA2GS = 0x74000000
DBA2EP = 0x75000000
MSG2FE = 0x7fffffff
MSG2GS = 0x7fffffff
MSG2CMSG = 0x7fffffff
CMSG2MSG = 0x7fffffff
MGR2SPY = 0x7fffffff
SPY2MGR = 0x7fffffff
MGR2SA = 0x7fffffff
SA2MGR = 0x7fffffff
SA2SPY = 0x7fffffff
SPY2SA = 0x7fffffff
SPY2SVR = 0x7fffffff
SVR2SPY = 0x7fffffff
SCH2SVR = 0x7fffffff
SCH2LS = 0x7fffffff
SCH2FE = 0x7fffffff
SCH2GS = 0x7fffffff
SCH2AI = 0x7fffffff
SCH2EP = 0x7fffffff
SCH2DBA = 0x7fffffff
SCH2MSG = 0x7fffffff
SCH2CMSG = 0x7fffffff
CL2CDR = 0x1f000000
SENDBLOCK = 0x800000 // 8388608
AUTHED_X = 0 // 0
AUTHED_O = 0x400000 // 4194304
SEND_SVR_FE = 1
SEND_SVR_FE_ANY = 2
SEND_SVR_FE_ALL = 3
SEND_SVR_AI = 4
SEND_SVR_AI_ANY = 5
SEND_SVR_AI_ALL = 6
SEND_SVR_FE_AI_ALL = 7
SEND_SVR_DBA = 8
SEND_SVR_GS = 9
SEND_SVR_MSG = 10
SEND_SVR_MSG_ANY = 11
SEND_SVR_MSG_ALL = 12
SEND_UNICAST = 1
SEND_ANYCAST = 2
SEND_ANYCAST_NEW = 3
SEND_BROADCAST = 4
CN_PACKET_BUFFER_SIZE = 4096
P_CL2LS_REQ_LOGIN = 0x12000001 // 301989889
P_CL2LS_REQ_CHECK_CHAR_NAME = 0x12000002 // 301989890
P_CL2LS_REQ_SAVE_CHAR_NAME = 0x12000003 // 301989891
P_CL2LS_REQ_CHAR_CREATE = 0x12000004 // 301989892
P_CL2LS_REQ_CHAR_SELECT = 0x12000005 // 301989893
P_CL2LS_REQ_CHAR_DELETE = 0x12000006 // 301989894
P_CL2LS_REQ_SHARD_SELECT = 0x12000007 // 301989895
P_CL2LS_REQ_SHARD_LIST_INFO = 0x12000008 // 301989896
P_CL2LS_CHECK_NAME_LIST = 0x12000009 // 301989897
P_CL2LS_REQ_SAVE_CHAR_TUTOR = 0x1200000a // 301989898
P_CL2LS_REQ_PC_EXIT_DUPLICATE = 0x1200000b // 301989899
P_CL2LS_REP_LIVE_CHECK = 0x1200000c // 301989900
P_CL2LS_REQ_CHANGE_CHAR_NAME = 0x1200000d // 301989901
P_CL2LS_REQ_SERVER_SELECT = 0x1200000e // 301989902
P_CL2FE_REQ_PC_ENTER = 0x13000001 // 318767105
P_CL2FE_REQ_PC_EXIT = 0x13000002 // 318767106
P_CL2FE_REQ_PC_MOVE = 0x13000003 // 318767107
P_CL2FE_REQ_PC_STOP = 0x13000004 // 318767108
P_CL2FE_REQ_PC_JUMP = 0x13000005 // 318767109
P_CL2FE_REQ_PC_ATTACK_NPCs = 0x13000006 // 318767110
P_CL2FE_REQ_SEND_FREECHAT_MESSAGE = 0x13000007 // 318767111
P_CL2FE_REQ_SEND_MENUCHAT_MESSAGE = 0x13000008 // 318767112
P_CL2FE_REQ_PC_REGEN = 0x13000009 // 318767113
P_CL2FE_REQ_ITEM_MOVE = 0x1300000a // 318767114
P_CL2FE_REQ_PC_TASK_START = 0x1300000b // 318767115
P_CL2FE_REQ_PC_TASK_END = 0x1300000c // 318767116
P_CL2FE_REQ_NANO_EQUIP = 0x1300000d // 318767117
P_CL2FE_REQ_NANO_UNEQUIP = 0x1300000e // 318767118
P_CL2FE_REQ_NANO_ACTIVE = 0x1300000f // 318767119
P_CL2FE_REQ_NANO_TUNE = 0x13000010 // 318767120
P_CL2FE_REQ_NANO_SKILL_USE = 0x13000011 // 318767121
P_CL2FE_REQ_PC_TASK_STOP = 0x13000012 // 318767122
P_CL2FE_REQ_PC_TASK_CONTINUE = 0x13000013 // 318767123
P_CL2FE_REQ_PC_GOTO = 0x13000014 // 318767124
P_CL2FE_REQ_CHARGE_NANO_STAMINA = 0x13000015 // 318767125
P_CL2FE_REQ_PC_KILL_QUEST_NPCs = 0x13000016 // 318767126
P_CL2FE_REQ_PC_VENDOR_ITEM_BUY = 0x13000017 // 318767127
P_CL2FE_REQ_PC_VENDOR_ITEM_SELL = 0x13000018 // 318767128
P_CL2FE_REQ_PC_ITEM_DELETE = 0x13000019 // 318767129
P_CL2FE_REQ_PC_GIVE_ITEM = 0x1300001a // 318767130
P_CL2FE_REQ_PC_ROCKET_STYLE_READY = 0x1300001b // 318767131
P_CL2FE_REQ_PC_ROCKET_STYLE_FIRE = 0x1300001c // 318767132
P_CL2FE_REQ_PC_ROCKET_STYLE_HIT = 0x1300001d // 318767133
P_CL2FE_REQ_PC_GRENADE_STYLE_READY = 0x1300001e // 318767134
P_CL2FE_REQ_PC_GRENADE_STYLE_FIRE = 0x1300001f // 318767135
P_CL2FE_REQ_PC_GRENADE_STYLE_HIT = 0x13000020 // 318767136
P_CL2FE_REQ_PC_NANO_CREATE = 0x13000021 // 318767137
P_CL2FE_REQ_PC_TRADE_OFFER = 0x13000022 // 318767138
P_CL2FE_REQ_PC_TRADE_OFFER_CANCEL = 0x13000023 // 318767139
P_CL2FE_REQ_PC_TRADE_OFFER_ACCEPT = 0x13000024 // 318767140
P_CL2FE_REQ_PC_TRADE_OFFER_REFUSAL = 0x13000025 // 318767141
P_CL2FE_REQ_PC_TRADE_OFFER_ABORT = 0x13000026 // 318767142
P_CL2FE_REQ_PC_TRADE_CONFIRM = 0x13000027 // 318767143
P_CL2FE_REQ_PC_TRADE_CONFIRM_CANCEL = 0x13000028 // 318767144
P_CL2FE_REQ_PC_TRADE_CONFIRM_ABORT = 0x13000029 // 318767145
P_CL2FE_REQ_PC_TRADE_ITEM_REGISTER = 0x1300002a // 318767146
P_CL2FE_REQ_PC_TRADE_ITEM_UNREGISTER = 0x1300002b // 318767147
P_CL2FE_REQ_PC_TRADE_CASH_REGISTER = 0x1300002c // 318767148
P_CL2FE_REQ_PC_TRADE_EMOTES_CHAT = 0x1300002d // 318767149
P_CL2FE_REQ_PC_BANK_OPEN = 0x1300002e // 318767150
P_CL2FE_REQ_PC_BANK_CLOSE = 0x1300002f // 318767151
P_CL2FE_REQ_PC_VENDOR_START = 0x13000030 // 318767152
P_CL2FE_REQ_PC_VENDOR_TABLE_UPDATE = 0x13000031 // 318767153
P_CL2FE_REQ_PC_VENDOR_ITEM_RESTORE_BUY = 0x13000032 // 318767154
P_CL2FE_REQ_PC_COMBAT_BEGIN = 0x13000033 // 318767155
P_CL2FE_REQ_PC_COMBAT_END = 0x13000034 // 318767156
P_CL2FE_REQ_REQUEST_MAKE_BUDDY = 0x13000035 // 318767157
P_CL2FE_REQ_ACCEPT_MAKE_BUDDY = 0x13000036 // 318767158
P_CL2FE_REQ_SEND_BUDDY_FREECHAT_MESSAGE = 0x13000037 // 318767159
P_CL2FE_REQ_SEND_BUDDY_MENUCHAT_MESSAGE = 0x13000038 // 318767160
P_CL2FE_REQ_GET_BUDDY_STYLE = 0x13000039 // 318767161
P_CL2FE_REQ_SET_BUDDY_BLOCK = 0x1300003a // 318767162
P_CL2FE_REQ_REMOVE_BUDDY = 0x1300003b // 318767163
P_CL2FE_REQ_GET_BUDDY_STATE = 0x1300003c // 318767164
P_CL2FE_REQ_PC_JUMPPAD = 0x1300003d // 318767165
P_CL2FE_REQ_PC_LAUNCHER = 0x1300003e // 318767166
P_CL2FE_REQ_PC_ZIPLINE = 0x1300003f // 318767167
P_CL2FE_REQ_PC_MOVEPLATFORM = 0x13000040 // 318767168
P_CL2FE_REQ_PC_SLOPE = 0x13000041 // 318767169
P_CL2FE_REQ_PC_STATE_CHANGE = 0x13000042 // 318767170
P_CL2FE_REQ_PC_MAP_WARP = 0x13000043 // 318767171
P_CL2FE_REQ_PC_GIVE_NANO = 0x13000044 // 318767172
P_CL2FE_REQ_NPC_SUMMON = 0x13000045 // 318767173
P_CL2FE_REQ_NPC_UNSUMMON = 0x13000046 // 318767174
P_CL2FE_REQ_ITEM_CHEST_OPEN = 0x13000047 // 318767175
P_CL2FE_REQ_PC_GIVE_NANO_SKILL = 0x13000048 // 318767176
P_CL2FE_DOT_DAMAGE_ONOFF = 0x13000049 // 318767177
P_CL2FE_REQ_PC_VENDOR_BATTERY_BUY = 0x1300004a // 318767178
P_CL2FE_REQ_PC_WARP_USE_NPC = 0x1300004b // 318767179
P_CL2FE_REQ_PC_GROUP_INVITE = 0x1300004c // 318767180
P_CL2FE_REQ_PC_GROUP_INVITE_REFUSE = 0x1300004d // 318767181
P_CL2FE_REQ_PC_GROUP_JOIN = 0x1300004e // 318767182
P_CL2FE_REQ_PC_GROUP_LEAVE = 0x1300004f // 318767183
P_CL2FE_REQ_PC_AVATAR_EMOTES_CHAT = 0x13000050 // 318767184
P_CL2FE_REQ_PC_BUDDY_WARP = 0x13000051 // 318767185
P_CL2FE_REQ_GET_MEMBER_STYLE = 0x13000052 // 318767186
P_CL2FE_REQ_GET_GROUP_STYLE = 0x13000053 // 318767187
P_CL2FE_REQ_PC_CHANGE_MENTOR = 0x13000054 // 318767188
P_CL2FE_REQ_GET_BUDDY_LOCATION = 0x13000055 // 318767189
P_CL2FE_REQ_NPC_GROUP_SUMMON = 0x13000056 // 318767190
P_CL2FE_REQ_PC_WARP_TO_PC = 0x13000057 // 318767191
P_CL2FE_REQ_EP_RANK_GET_LIST = 0x13000058 // 318767192
P_CL2FE_REQ_EP_RANK_GET_DETAIL = 0x13000059 // 318767193
P_CL2FE_REQ_EP_RANK_GET_PC_INFO = 0x1300005a // 318767194
P_CL2FE_REQ_EP_RACE_START = 0x1300005b // 318767195
P_CL2FE_REQ_EP_RACE_END = 0x1300005c // 318767196
P_CL2FE_REQ_EP_RACE_CANCEL = 0x1300005d // 318767197
P_CL2FE_REQ_EP_GET_RING = 0x1300005e // 318767198
P_CL2FE_REQ_IM_CHANGE_SWITCH_STATUS = 0x1300005f // 318767199
P_CL2FE_REQ_SHINY_PICKUP = 0x13000060 // 318767200
P_CL2FE_REQ_SHINY_SUMMON = 0x13000061 // 318767201
P_CL2FE_REQ_PC_MOVETRANSPORTATION = 0x13000062 // 318767202
P_CL2FE_REQ_SEND_ALL_GROUP_FREECHAT_MESSAGE = 0x13000063 // 318767203
P_CL2FE_REQ_SEND_ANY_GROUP_FREECHAT_MESSAGE = 0x13000064 // 318767204
P_CL2FE_REQ_BARKER = 0x13000065 // 318767205
P_CL2FE_REQ_SEND_ALL_GROUP_MENUCHAT_MESSAGE = 0x13000066 // 318767206
P_CL2FE_REQ_SEND_ANY_GROUP_MENUCHAT_MESSAGE = 0x13000067 // 318767207
P_CL2FE_REQ_REGIST_TRANSPORTATION_LOCATION = 0x13000068 // 318767208
P_CL2FE_REQ_PC_WARP_USE_TRANSPORTATION = 0x13000069 // 318767209
P_CL2FE_GM_REQ_PC_SPECIAL_STATE_SWITCH = 0x1300006a // 318767210
P_CL2FE_GM_REQ_PC_SET_VALUE = 0x1300006b // 318767211
P_CL2FE_GM_REQ_KICK_PLAYER = 0x1300006c // 318767212
P_CL2FE_GM_REQ_TARGET_PC_TELEPORT = 0x1300006d // 318767213
P_CL2FE_GM_REQ_PC_LOCATION = 0x1300006e // 318767214
P_CL2FE_GM_REQ_PC_ANNOUNCE = 0x1300006f // 318767215
P_CL2FE_REQ_SET_PC_BLOCK = 0x13000070 // 318767216
P_CL2FE_REQ_REGIST_RXCOM = 0x13000071 // 318767217
P_CL2FE_GM_REQ_PC_MOTD_REGISTER = 0x13000072 // 318767218
P_CL2FE_REQ_ITEM_USE = 0x13000073 // 318767219
P_CL2FE_REQ_WARP_USE_RECALL = 0x13000074 // 318767220
P_CL2FE_REP_LIVE_CHECK = 0x13000075 // 318767221
P_CL2FE_REQ_PC_MISSION_COMPLETE = 0x13000076 // 318767222
P_CL2FE_REQ_PC_TASK_COMPLETE = 0x13000077 // 318767223
P_CL2FE_REQ_NPC_INTERACTION = 0x13000078 // 318767224
P_CL2FE_DOT_HEAL_ONOFF = 0x13000079 // 318767225
P_CL2FE_REQ_PC_SPECIAL_STATE_SWITCH = 0x1300007a // 318767226
P_CL2FE_REQ_PC_EMAIL_UPDATE_CHECK = 0x1300007b // 318767227
P_CL2FE_REQ_PC_READ_EMAIL = 0x1300007c // 318767228
P_CL2FE_REQ_PC_RECV_EMAIL_PAGE_LIST = 0x1300007d // 318767229
P_CL2FE_REQ_PC_DELETE_EMAIL = 0x1300007e // 318767230
P_CL2FE_REQ_PC_SEND_EMAIL = 0x1300007f // 318767231
P_CL2FE_REQ_PC_RECV_EMAIL_ITEM = 0x13000080 // 318767232
P_CL2FE_REQ_PC_RECV_EMAIL_CANDY = 0x13000081 // 318767233
P_CL2FE_GM_REQ_TARGET_PC_SPECIAL_STATE_ONOFF = 0x13000082 // 318767234
P_CL2FE_REQ_PC_SET_CURRENT_MISSION_ID = 0x13000083 // 318767235
P_CL2FE_REQ_NPC_GROUP_INVITE = 0x13000084 // 318767236
P_CL2FE_REQ_NPC_GROUP_KICK = 0x13000085 // 318767237
P_CL2FE_REQ_PC_FIRST_USE_FLAG_SET = 0x13000086 // 318767238
P_CL2FE_REQ_PC_TRANSPORT_WARP = 0x13000087 // 318767239
P_CL2FE_REQ_PC_TIME_TO_GO_WARP = 0x13000088 // 318767240
P_CL2FE_REQ_PC_RECV_EMAIL_ITEM_ALL = 0x13000089 // 318767241
P_CL2FE_REQ_CHANNEL_INFO = 0x1300008a // 318767242
P_CL2FE_REQ_PC_CHANNEL_NUM = 0x1300008b // 318767243
P_CL2FE_REQ_PC_WARP_CHANNEL = 0x1300008c // 318767244
P_CL2FE_REQ_PC_LOADING_COMPLETE = 0x1300008d // 318767245
P_CL2FE_REQ_PC_FIND_NAME_MAKE_BUDDY = 0x1300008e // 318767246
P_CL2FE_REQ_PC_FIND_NAME_ACCEPT_BUDDY = 0x1300008f // 318767247
P_CL2FE_REQ_PC_ATTACK_CHARs = 0x13000090 // 318767248
P_CL2FE_PC_STREETSTALL_REQ_READY = 0x13000091 // 318767249
P_CL2FE_PC_STREETSTALL_REQ_CANCEL = 0x13000092 // 318767250
P_CL2FE_PC_STREETSTALL_REQ_REGIST_ITEM = 0x13000093 // 318767251
P_CL2FE_PC_STREETSTALL_REQ_UNREGIST_ITEM = 0x13000094 // 318767252
P_CL2FE_PC_STREETSTALL_REQ_SALE_START = 0x13000095 // 318767253
P_CL2FE_PC_STREETSTALL_REQ_ITEM_LIST = 0x13000096 // 318767254
P_CL2FE_PC_STREETSTALL_REQ_ITEM_BUY = 0x13000097 // 318767255
P_CL2FE_REQ_PC_ITEM_COMBINATION = 0x13000098 // 318767256
P_CL2FE_GM_REQ_SET_PC_SKILL = 0x13000099 // 318767257
P_CL2FE_REQ_PC_SKILL_ADD = 0x1300009a // 318767258
P_CL2FE_REQ_PC_SKILL_DEL = 0x1300009b // 318767259
P_CL2FE_REQ_PC_SKILL_USE = 0x1300009c // 318767260
P_CL2FE_REQ_PC_ROPE = 0x1300009d // 318767261
P_CL2FE_REQ_PC_BELT = 0x1300009e // 318767262
P_CL2FE_REQ_PC_VEHICLE_ON = 0x1300009f // 318767263
P_CL2FE_REQ_PC_VEHICLE_OFF = 0x130000a0 // 318767264
P_CL2FE_REQ_PC_REGIST_QUICK_SLOT = 0x130000a1 // 318767265
P_CL2FE_REQ_PC_DISASSEMBLE_ITEM = 0x130000a2 // 318767266
P_CL2FE_GM_REQ_REWARD_RATE = 0x130000a3 // 318767267
P_CL2FE_REQ_PC_ITEM_ENCHANT = 0x130000a4 // 318767268
P_FE2CL_ERROR = 0x31000000 // 822083584
P_FE2CL_REP_PC_ENTER_FAIL = 0x31000001 // 822083585
P_FE2CL_REP_PC_ENTER_SUCC = 0x31000002 // 822083586
P_FE2CL_PC_NEW = 0x31000003 // 822083587
P_FE2CL_REP_PC_EXIT_FAIL = 0x31000004 // 822083588
P_FE2CL_REP_PC_EXIT_SUCC = 0x31000005 // 822083589
P_FE2CL_PC_EXIT = 0x31000006 // 822083590
P_FE2CL_PC_AROUND = 0x31000007 // 822083591
P_FE2CL_PC_MOVE = 0x31000008 // 822083592
P_FE2CL_PC_STOP = 0x31000009 // 822083593
P_FE2CL_PC_JUMP = 0x3100000a // 822083594
P_FE2CL_NPC_ENTER = 0x3100000b // 822083595
P_FE2CL_NPC_EXIT = 0x3100000c // 822083596
P_FE2CL_NPC_MOVE = 0x3100000d // 822083597
P_FE2CL_NPC_NEW = 0x3100000e // 822083598
P_FE2CL_NPC_AROUND = 0x3100000f // 822083599
P_FE2CL_AROUND_DEL_PC = 0x31000010 // 822083600
P_FE2CL_AROUND_DEL_NPC = 0x31000011 // 822083601
P_FE2CL_REP_SEND_FREECHAT_MESSAGE_SUCC = 0x31000012 // 822083602
P_FE2CL_REP_SEND_FREECHAT_MESSAGE_FAIL = 0x31000013 // 822083603
P_FE2CL_PC_ATTACK_NPCs_SUCC = 0x31000014 // 822083604
P_FE2CL_PC_ATTACK_NPCs = 0x31000015 // 822083605
P_FE2CL_NPC_ATTACK_PCs = 0x31000016 // 822083606
P_FE2CL_REP_PC_REGEN_SUCC = 0x31000017 // 822083607
P_FE2CL_REP_SEND_MENUCHAT_MESSAGE_SUCC = 0x31000018 // 822083608
P_FE2CL_REP_SEND_MENUCHAT_MESSAGE_FAIL = 0x31000019 // 822083609
P_FE2CL_PC_ITEM_MOVE_SUCC = 0x3100001a // 822083610
P_FE2CL_PC_EQUIP_CHANGE = 0x3100001b // 822083611
P_FE2CL_REP_PC_TASK_START_SUCC = 0x3100001c // 822083612
P_FE2CL_REP_PC_TASK_START_FAIL = 0x3100001d // 822083613
P_FE2CL_REP_PC_TASK_END_SUCC = 0x3100001e // 822083614
P_FE2CL_REP_PC_TASK_END_FAIL = 0x3100001f // 822083615
P_FE2CL_NPC_SKILL_READY = 0x31000020 // 822083616
P_FE2CL_NPC_SKILL_FIRE = 0x31000021 // 822083617
P_FE2CL_NPC_SKILL_HIT = 0x31000022 // 822083618
P_FE2CL_NPC_SKILL_CORRUPTION_READY = 0x31000023 // 822083619
P_FE2CL_NPC_SKILL_CORRUPTION_HIT = 0x31000024 // 822083620
P_FE2CL_NPC_SKILL_CANCEL = 0x31000025 // 822083621
P_FE2CL_REP_NANO_EQUIP_SUCC = 0x31000026 // 822083622
P_FE2CL_REP_NANO_UNEQUIP_SUCC = 0x31000027 // 822083623
P_FE2CL_REP_NANO_ACTIVE_SUCC = 0x31000028 // 822083624
P_FE2CL_REP_NANO_TUNE_SUCC = 0x31000029 // 822083625
P_FE2CL_NANO_ACTIVE = 0x3100002a // 822083626
P_FE2CL_NANO_SKILL_USE_SUCC = 0x3100002b // 822083627
P_FE2CL_NANO_SKILL_USE = 0x3100002c // 822083628
P_FE2CL_REP_PC_TASK_STOP_SUCC = 0x3100002d // 822083629
P_FE2CL_REP_PC_TASK_STOP_FAIL = 0x3100002e // 822083630
P_FE2CL_REP_PC_TASK_CONTINUE_SUCC = 0x3100002f // 822083631
P_FE2CL_REP_PC_TASK_CONTINUE_FAIL = 0x31000030 // 822083632
P_FE2CL_REP_PC_GOTO_SUCC = 0x31000031 // 822083633
P_FE2CL_REP_CHARGE_NANO_STAMINA = 0x31000032 // 822083634
P_FE2CL_REP_PC_TICK = 0x31000033 // 822083635
P_FE2CL_REP_PC_KILL_QUEST_NPCs_SUCC = 0x31000034 // 822083636
P_FE2CL_REP_PC_VENDOR_ITEM_BUY_SUCC = 0x31000035 // 822083637
P_FE2CL_REP_PC_VENDOR_ITEM_BUY_FAIL = 0x31000036 // 822083638
P_FE2CL_REP_PC_VENDOR_ITEM_SELL_SUCC = 0x31000037 // 822083639
P_FE2CL_REP_PC_VENDOR_ITEM_SELL_FAIL = 0x31000038 // 822083640
P_FE2CL_REP_PC_ITEM_DELETE_SUCC = 0x31000039 // 822083641
P_FE2CL_PC_ROCKET_STYLE_READY = 0x3100003a // 822083642
P_FE2CL_REP_PC_ROCKET_STYLE_FIRE_SUCC = 0x3100003b // 822083643
P_FE2CL_PC_ROCKET_STYLE_FIRE = 0x3100003c // 822083644
P_FE2CL_PC_ROCKET_STYLE_HIT = 0x3100003d // 822083645
P_FE2CL_PC_GRENADE_STYLE_READY = 0x3100003e // 822083646
P_FE2CL_REP_PC_GRENADE_STYLE_FIRE_SUCC = 0x3100003f // 822083647
P_FE2CL_PC_GRENADE_STYLE_FIRE = 0x31000040 // 822083648
P_FE2CL_PC_GRENADE_STYLE_HIT = 0x31000041 // 822083649
P_FE2CL_REP_PC_TRADE_OFFER = 0x31000042 // 822083650
P_FE2CL_REP_PC_TRADE_OFFER_CANCEL = 0x31000043 // 822083651
P_FE2CL_REP_PC_TRADE_OFFER_SUCC = 0x31000044 // 822083652
P_FE2CL_REP_PC_TRADE_OFFER_REFUSAL = 0x31000045 // 822083653
P_FE2CL_REP_PC_TRADE_OFFER_ABORT = 0x31000046 // 822083654
P_FE2CL_REP_PC_TRADE_CONFIRM = 0x31000047 // 822083655
P_FE2CL_REP_PC_TRADE_CONFIRM_CANCEL = 0x31000048 // 822083656
P_FE2CL_REP_PC_TRADE_CONFIRM_ABORT = 0x31000049 // 822083657
P_FE2CL_REP_PC_TRADE_CONFIRM_SUCC = 0x3100004a // 822083658
P_FE2CL_REP_PC_TRADE_CONFIRM_FAIL = 0x3100004b // 822083659
P_FE2CL_REP_PC_TRADE_ITEM_REGISTER_SUCC = 0x3100004c // 822083660
P_FE2CL_REP_PC_TRADE_ITEM_REGISTER_FAIL = 0x3100004d // 822083661
P_FE2CL_REP_PC_TRADE_ITEM_UNREGISTER_SUCC = 0x3100004e // 822083662
P_FE2CL_REP_PC_TRADE_ITEM_UNREGISTER_FAIL = 0x3100004f // 822083663
P_FE2CL_REP_PC_TRADE_CASH_REGISTER_SUCC = 0x31000050 // 822083664
P_FE2CL_REP_PC_TRADE_CASH_REGISTER_FAIL = 0x31000051 // 822083665
P_FE2CL_REP_PC_TRADE_EMOTES_CHAT = 0x31000052 // 822083666
P_FE2CL_REP_PC_NANO_CREATE_SUCC = 0x31000053 // 822083667
P_FE2CL_REP_PC_NANO_CREATE_FAIL = 0x31000054 // 822083668
P_FE2CL_REP_NANO_TUNE_FAIL = 0x31000055 // 822083669
P_FE2CL_REP_PC_BANK_OPEN_SUCC = 0x31000056 // 822083670
P_FE2CL_REP_PC_BANK_OPEN_FAIL = 0x31000057 // 822083671
P_FE2CL_REP_PC_BANK_CLOSE_SUCC = 0x31000058 // 822083672
P_FE2CL_REP_PC_BANK_CLOSE_FAIL = 0x31000059 // 822083673
P_FE2CL_REP_PC_VENDOR_START_SUCC = 0x3100005a // 822083674
P_FE2CL_REP_PC_VENDOR_START_FAIL = 0x3100005b // 822083675
P_FE2CL_REP_PC_VENDOR_TABLE_UPDATE_SUCC = 0x3100005c // 822083676
P_FE2CL_REP_PC_VENDOR_TABLE_UPDATE_FAIL = 0x3100005d // 822083677
P_FE2CL_REP_PC_VENDOR_ITEM_RESTORE_BUY_SUCC = 0x3100005e // 822083678
P_FE2CL_REP_PC_VENDOR_ITEM_RESTORE_BUY_FAIL = 0x3100005f // 822083679
P_FE2CL_CHAR_TIME_BUFF_TIME_OUT = 0x31000060 // 822083680
P_FE2CL_REP_PC_GIVE_ITEM_SUCC = 0x31000061 // 822083681
P_FE2CL_REP_PC_GIVE_ITEM_FAIL = 0x31000062 // 822083682
P_FE2CL_REP_PC_BUDDYLIST_INFO_SUCC = 0x31000063 // 822083683
P_FE2CL_REP_PC_BUDDYLIST_INFO_FAIL = 0x31000064 // 822083684
P_FE2CL_REP_REQUEST_MAKE_BUDDY_SUCC = 0x7fffffff // 2147483647
P_FE2CL_REP_REQUEST_MAKE_BUDDY_FAIL = 0x31000066 // 822083686
P_FE2CL_REP_ACCEPT_MAKE_BUDDY_SUCC = 0x31000067 // 822083687
P_FE2CL_REP_ACCEPT_MAKE_BUDDY_FAIL = 0x31000068 // 822083688
P_FE2CL_REP_SEND_BUDDY_FREECHAT_MESSAGE_SUCC = 0x31000069 // 822083689
P_FE2CL_REP_SEND_BUDDY_FREECHAT_MESSAGE_FAIL = 0x3100006a // 822083690
P_FE2CL_REP_SEND_BUDDY_MENUCHAT_MESSAGE_SUCC = 0x3100006b // 822083691
P_FE2CL_REP_SEND_BUDDY_MENUCHAT_MESSAGE_FAIL = 0x3100006c // 822083692
P_FE2CL_REP_GET_BUDDY_STYLE_SUCC = 0x3100006d // 822083693
P_FE2CL_REP_GET_BUDDY_STYLE_FAIL = 0x3100006e // 822083694
P_FE2CL_REP_GET_BUDDY_STATE_SUCC = 0x3100006f // 822083695
P_FE2CL_REP_GET_BUDDY_STATE_FAIL = 0x31000070 // 822083696
P_FE2CL_REP_SET_BUDDY_BLOCK_SUCC = 0x31000071 // 822083697
P_FE2CL_REP_SET_BUDDY_BLOCK_FAIL = 0x31000072 // 822083698
P_FE2CL_REP_REMOVE_BUDDY_SUCC = 0x31000073 // 822083699
P_FE2CL_REP_REMOVE_BUDDY_FAIL = 0x31000074 // 822083700
P_FE2CL_PC_JUMPPAD = 0x31000075 // 822083701
P_FE2CL_PC_LAUNCHER = 0x31000076 // 822083702
P_FE2CL_PC_ZIPLINE = 0x31000077 // 822083703
P_FE2CL_PC_MOVEPLATFORM = 0x31000078 // 822083704
P_FE2CL_PC_SLOPE = 0x31000079 // 822083705
P_FE2CL_PC_STATE_CHANGE = 0x3100007a // 822083706
P_FE2CL_REP_REQUEST_MAKE_BUDDY_SUCC_TO_ACCEPTER = 0x3100007b // 822083707
P_FE2CL_REP_REWARD_ITEM = 0x3100007c // 822083708
P_FE2CL_REP_ITEM_CHEST_OPEN_SUCC = 0x3100007d // 822083709
P_FE2CL_REP_ITEM_CHEST_OPEN_FAIL = 0x3100007e // 822083710
P_FE2CL_CHAR_TIME_BUFF_TIME_TICK = 0x3100007f // 822083711
P_FE2CL_REP_PC_VENDOR_BATTERY_BUY_SUCC = 0x31000080 // 822083712
P_FE2CL_REP_PC_VENDOR_BATTERY_BUY_FAIL = 0x31000081 // 822083713
P_FE2CL_NPC_ROCKET_STYLE_FIRE = 0x31000082 // 822083714
P_FE2CL_NPC_GRENADE_STYLE_FIRE = 0x31000083 // 822083715
P_FE2CL_NPC_BULLET_STYLE_HIT = 0x31000084 // 822083716
P_FE2CL_CHARACTER_ATTACK_CHARACTERs = 0x31000085 // 822083717
P_FE2CL_PC_GROUP_INVITE = 0x31000086 // 822083718
P_FE2CL_PC_GROUP_INVITE_FAIL = 0x31000087 // 822083719
P_FE2CL_PC_GROUP_INVITE_REFUSE = 0x31000088 // 822083720
P_FE2CL_PC_GROUP_JOIN = 0x31000089 // 822083721
P_FE2CL_PC_GROUP_JOIN_FAIL = 0x3100008a // 822083722
P_FE2CL_PC_GROUP_JOIN_SUCC = 0x3100008b // 822083723
P_FE2CL_PC_GROUP_LEAVE = 0x3100008c // 822083724
P_FE2CL_PC_GROUP_LEAVE_FAIL = 0x3100008d // 822083725
P_FE2CL_PC_GROUP_LEAVE_SUCC = 0x3100008e // 822083726
P_FE2CL_PC_GROUP_MEMBER_INFO = 0x3100008f // 822083727
P_FE2CL_REP_PC_WARP_USE_NPC_SUCC = 0x31000090 // 822083728
P_FE2CL_REP_PC_WARP_USE_NPC_FAIL = 0x31000091 // 822083729
P_FE2CL_REP_PC_AVATAR_EMOTES_CHAT = 0x31000092 // 822083730
P_FE2CL_REP_PC_CHANGE_MENTOR_SUCC = 0x31000093 // 822083731
P_FE2CL_REP_PC_CHANGE_MENTOR_FAIL = 0x31000094 // 822083732
P_FE2CL_REP_GET_MEMBER_STYLE_FAIL = 0x31000095 // 822083733
P_FE2CL_REP_GET_MEMBER_STYLE_SUCC = 0x31000096 // 822083734
P_FE2CL_REP_GET_GROUP_STYLE_FAIL = 0x31000097 // 822083735
P_FE2CL_REP_GET_GROUP_STYLE_SUCC = 0x31000098 // 822083736
P_FE2CL_PC_REGEN = 0x31000099 // 822083737
P_FE2CL_INSTANCE_MAP_INFO = 0x3100009a // 822083738
P_FE2CL_TRANSPORTATION_ENTER = 0x3100009b // 822083739
P_FE2CL_TRANSPORTATION_EXIT = 0x3100009c // 822083740
P_FE2CL_TRANSPORTATION_MOVE = 0x3100009d // 822083741
P_FE2CL_TRANSPORTATION_NEW = 0x3100009e // 822083742
P_FE2CL_TRANSPORTATION_AROUND = 0x3100009f // 822083743
P_FE2CL_AROUND_DEL_TRANSPORTATION = 0x310000a0 // 822083744
P_FE2CL_REP_EP_RANK_LIST = 0x310000a1 // 822083745
P_FE2CL_REP_EP_RANK_DETAIL = 0x310000a2 // 822083746
P_FE2CL_REP_EP_RANK_PC_INFO = 0x310000a3 // 822083747
P_FE2CL_REP_EP_RACE_START_SUCC = 0x310000a4 // 822083748
P_FE2CL_REP_EP_RACE_START_FAIL = 0x310000a5 // 822083749
P_FE2CL_REP_EP_RACE_END_SUCC = 0x310000a6 // 822083750
P_FE2CL_REP_EP_RACE_END_FAIL = 0x310000a7 // 822083751
P_FE2CL_REP_EP_RACE_CANCEL_SUCC = 0x310000a8 // 822083752
P_FE2CL_REP_EP_RACE_CANCEL_FAIL = 0x310000a9 // 822083753
P_FE2CL_REP_EP_GET_RING_SUCC = 0x310000aa // 822083754
P_FE2CL_REP_EP_GET_RING_FAIL = 0x310000ab // 822083755
P_FE2CL_REP_IM_CHANGE_SWITCH_STATUS = 0x310000ac // 822083756
P_FE2CL_SHINY_ENTER = 0x310000ad // 822083757
P_FE2CL_SHINY_EXIT = 0x310000ae // 822083758
P_FE2CL_SHINY_NEW = 0x310000af // 822083759
P_FE2CL_SHINY_AROUND = 0x310000b0 // 822083760
P_FE2CL_AROUND_DEL_SHINY = 0x310000b1 // 822083761
P_FE2CL_REP_SHINY_PICKUP_FAIL = 0x310000b2 // 822083762
P_FE2CL_REP_SHINY_PICKUP_SUCC = 0x310000b3 // 822083763
P_FE2CL_PC_MOVETRANSPORTATION = 0x310000b4 // 822083764
P_FE2CL_REP_SEND_ALL_GROUP_FREECHAT_MESSAGE_SUCC = 0x310000b5 // 822083765
P_FE2CL_REP_SEND_ALL_GROUP_FREECHAT_MESSAGE_FAIL = 0x310000b6 // 822083766
P_FE2CL_REP_SEND_ANY_GROUP_FREECHAT_MESSAGE_SUCC = 0x310000b7 // 822083767
P_FE2CL_REP_SEND_ANY_GROUP_FREECHAT_MESSAGE_FAIL = 0x310000b8 // 822083768
P_FE2CL_REP_BARKER = 0x310000b9 // 822083769
P_FE2CL_REP_SEND_ALL_GROUP_MENUCHAT_MESSAGE_SUCC = 0x310000ba // 822083770
P_FE2CL_REP_SEND_ALL_GROUP_MENUCHAT_MESSAGE_FAIL = 0x310000bb // 822083771
P_FE2CL_REP_SEND_ANY_GROUP_MENUCHAT_MESSAGE_SUCC = 0x310000bc // 822083772
P_FE2CL_REP_SEND_ANY_GROUP_MENUCHAT_MESSAGE_FAIL = 0x310000bd // 822083773
P_FE2CL_REP_PC_REGIST_TRANSPORTATION_LOCATION_FAIL = 0x310000be // 822083774
P_FE2CL_REP_PC_REGIST_TRANSPORTATION_LOCATION_SUCC = 0x310000bf // 822083775
P_FE2CL_REP_PC_WARP_USE_TRANSPORTATION_FAIL = 0x310000c0 // 822083776
P_FE2CL_REP_PC_WARP_USE_TRANSPORTATION_SUCC = 0x310000c1 // 822083777
P_FE2CL_ANNOUNCE_MSG = 0x310000c2 // 822083778
P_FE2CL_REP_PC_SPECIAL_STATE_SWITCH_SUCC = 0x310000c3 // 822083779
P_FE2CL_PC_SPECIAL_STATE_CHANGE = 0x310000c4 // 822083780
P_FE2CL_GM_REP_PC_SET_VALUE = 0x310000c5 // 822083781
P_FE2CL_GM_PC_CHANGE_VALUE = 0x310000c6 // 822083782
P_FE2CL_GM_REP_PC_LOCATION = 0x310000c7 // 822083783
P_FE2CL_GM_REP_PC_ANNOUNCE = 0x310000c8 // 822083784
P_FE2CL_REP_PC_BUDDY_WARP_FAIL = 0x310000c9 // 822083785
P_FE2CL_REP_PC_CHANGE_LEVEL = 0x310000ca // 822083786
P_FE2CL_REP_SET_PC_BLOCK_SUCC = 0x310000cb // 822083787
P_FE2CL_REP_SET_PC_BLOCK_FAIL = 0x310000cc // 822083788
P_FE2CL_REP_REGIST_RXCOM = 0x310000cd // 822083789
P_FE2CL_REP_REGIST_RXCOM_FAIL = 0x310000ce // 822083790
P_FE2CL_PC_INVEN_FULL_MSG = 0x310000cf // 822083791
P_FE2CL_REQ_LIVE_CHECK = 0x310000d0 // 822083792
P_FE2CL_PC_MOTD_LOGIN = 0x310000d1 // 822083793
P_FE2CL_REP_PC_ITEM_USE_FAIL = 0x310000d2 // 822083794
P_FE2CL_REP_PC_ITEM_USE_SUCC = 0x310000d3 // 822083795
P_FE2CL_PC_ITEM_USE = 0x310000d4 // 822083796
P_FE2CL_REP_GET_BUDDY_LOCATION_SUCC = 0x310000d5 // 822083797
P_FE2CL_REP_GET_BUDDY_LOCATION_FAIL = 0x310000d6 // 822083798
P_FE2CL_REP_PC_RIDING_FAIL = 0x310000d7 // 822083799
P_FE2CL_REP_PC_RIDING_SUCC = 0x310000d8 // 822083800
P_FE2CL_PC_RIDING = 0x310000d9 // 822083801
P_FE2CL_PC_BROOMSTICK_MOVE = 0x310000da // 822083802
P_FE2CL_REP_PC_BUDDY_WARP_OTHER_SHARD_SUCC = 0x310000db // 822083803
P_FE2CL_REP_WARP_USE_RECALL_FAIL = 0x310000dc // 822083804
P_FE2CL_REP_PC_EXIT_DUPLICATE = 0x310000dd // 822083805
P_FE2CL_REP_PC_MISSION_COMPLETE_SUCC = 0x310000de // 822083806
P_FE2CL_PC_BUFF_UPDATE = 0x310000df // 822083807
P_FE2CL_REP_PC_NEW_EMAIL = 0x310000e0 // 822083808
P_FE2CL_REP_PC_READ_EMAIL_SUCC = 0x310000e1 // 822083809
P_FE2CL_REP_PC_READ_EMAIL_FAIL = 0x310000e2 // 822083810
P_FE2CL_REP_PC_RECV_EMAIL_PAGE_LIST_SUCC = 0x310000e3 // 822083811
P_FE2CL_REP_PC_RECV_EMAIL_PAGE_LIST_FAIL = 0x310000e4 // 822083812
P_FE2CL_REP_PC_DELETE_EMAIL_SUCC = 0x310000e5 // 822083813
P_FE2CL_REP_PC_DELETE_EMAIL_FAIL = 0x310000e6 // 822083814
P_FE2CL_REP_PC_SEND_EMAIL_SUCC = 0x310000e7 // 822083815
P_FE2CL_REP_PC_SEND_EMAIL_FAIL = 0x310000e8 // 822083816
P_FE2CL_REP_PC_RECV_EMAIL_ITEM_SUCC = 0x310000e9 // 822083817
P_FE2CL_REP_PC_RECV_EMAIL_ITEM_FAIL = 0x310000ea // 822083818
P_FE2CL_REP_PC_RECV_EMAIL_CANDY_SUCC = 0x310000eb // 822083819
P_FE2CL_REP_PC_RECV_EMAIL_CANDY_FAIL = 0x310000ec // 822083820
P_FE2CL_PC_SUDDEN_DEAD = 0x310000ed // 822083821
P_FE2CL_REP_GM_REQ_TARGET_PC_SPECIAL_STATE_ONOFF_SUCC = 0x310000ee // 822083822
P_FE2CL_REP_PC_SET_CURRENT_MISSION_ID = 0x310000ef // 822083823
P_FE2CL_REP_NPC_GROUP_INVITE_FAIL = 0x310000f0 // 822083824
P_FE2CL_REP_NPC_GROUP_INVITE_SUCC = 0x310000f1 // 822083825
P_FE2CL_REP_NPC_GROUP_KICK_FAIL = 0x310000f2 // 822083826
P_FE2CL_REP_NPC_GROUP_KICK_SUCC = 0x310000f3 // 822083827
P_FE2CL_PC_EVENT = 0x310000f4 // 822083828
P_FE2CL_REP_PC_TRANSPORT_WARP_SUCC = 0x310000f5 // 822083829
P_FE2CL_REP_PC_TRADE_EMOTES_CHAT_FAIL = 0x310000f6 // 822083830
P_FE2CL_REP_PC_RECV_EMAIL_ITEM_ALL_SUCC = 0x310000f7 // 822083831
P_FE2CL_REP_PC_RECV_EMAIL_ITEM_ALL_FAIL = 0x310000f8 // 822083832
P_FE2CL_REP_PC_LOADING_COMPLETE_SUCC = 0x310000f9 // 822083833
P_FE2CL_REP_CHANNEL_INFO = 0x310000fa // 822083834
P_FE2CL_REP_PC_CHANNEL_NUM = 0x310000fb // 822083835
P_FE2CL_REP_PC_WARP_CHANNEL_FAIL = 0x310000fc // 822083836
P_FE2CL_REP_PC_WARP_CHANNEL_SUCC = 0x310000fd // 822083837
P_FE2CL_REP_PC_FIND_NAME_MAKE_BUDDY_SUCC = 0x310000fe // 822083838
P_FE2CL_REP_PC_FIND_NAME_MAKE_BUDDY_FAIL = 0x310000ff // 822083839
P_FE2CL_REP_PC_FIND_NAME_ACCEPT_BUDDY_FAIL = 0x31000100 // 822083840
P_FE2CL_REP_PC_BUDDY_WARP_SAME_SHARD_SUCC = 0x31000101 // 822083841
P_FE2CL_PC_ATTACK_CHARs_SUCC = 0x31000102 // 822083842
P_FE2CL_PC_ATTACK_CHARs = 0x31000103 // 822083843
P_FE2CL_NPC_ATTACK_CHARs = 0x31000104 // 822083844
P_FE2CL_REP_PC_CHANGE_LEVEL_SUCC = 0x31000105 // 822083845
P_FE2CL_REP_PC_NANO_CREATE = 0x31000106 // 822083846
P_FE2CL_PC_STREETSTALL_REP_READY_SUCC = 0x31000107 // 822083847
P_FE2CL_PC_STREETSTALL_REP_READY_FAIL = 0x31000108 // 822083848
P_FE2CL_PC_STREETSTALL_REP_CANCEL_SUCC = 0x31000109 // 822083849
P_FE2CL_PC_STREETSTALL_REP_CANCEL_FAIL = 0x3100010a // 822083850
P_FE2CL_PC_STREETSTALL_REP_REGIST_ITEM_SUCC = 0x3100010b // 822083851
P_FE2CL_PC_STREETSTALL_REP_REGIST_ITEM_FAIL = 0x3100010c // 822083852
P_FE2CL_PC_STREETSTALL_REP_UNREGIST_ITEM_SUCC = 0x3100010d // 822083853
P_FE2CL_PC_STREETSTALL_REP_UNREGIST_ITEM_FAIL = 0x3100010e // 822083854
P_FE2CL_PC_STREETSTALL_REP_SALE_START_SUCC = 0x3100010f // 822083855
P_FE2CL_PC_STREETSTALL_REP_SALE_START_FAIL = 0x31000110 // 822083856
P_FE2CL_PC_STREETSTALL_REP_ITEM_LIST = 0x31000111 // 822083857
P_FE2CL_PC_STREETSTALL_REP_ITEM_LIST_FAIL = 0x31000112 // 822083858
P_FE2CL_PC_STREETSTALL_REP_ITEM_BUY_SUCC_BUYER = 0x31000113 // 822083859
P_FE2CL_PC_STREETSTALL_REP_ITEM_BUY_SUCC_SELLER = 0x31000114 // 822083860
P_FE2CL_PC_STREETSTALL_REP_ITEM_BUY_FAIL = 0x31000115 // 822083861
P_FE2CL_REP_PC_ITEM_COMBINATION_SUCC = 0x31000116 // 822083862
P_FE2CL_REP_PC_ITEM_COMBINATION_FAIL = 0x31000117 // 822083863
P_FE2CL_PC_CASH_BUFF_UPDATE = 0x31000118 // 822083864
P_FE2CL_REP_PC_SKILL_ADD_SUCC = 0x31000119 // 822083865
P_FE2CL_REP_PC_SKILL_ADD_FAIL = 0x3100011a // 822083866
P_FE2CL_REP_PC_SKILL_DEL_SUCC = 0x3100011b // 822083867
P_FE2CL_REP_PC_SKILL_DEL_FAIL = 0x3100011c // 822083868
P_FE2CL_REP_PC_SKILL_USE_SUCC = 0x3100011d // 822083869
P_FE2CL_REP_PC_SKILL_USE_FAIL = 0x3100011e // 822083870
P_FE2CL_PC_SKILL_USE = 0x3100011f // 822083871
P_FE2CL_PC_ROPE = 0x31000120 // 822083872
P_FE2CL_PC_BELT = 0x31000121 // 822083873
P_FE2CL_PC_VEHICLE_ON_SUCC = 0x31000122 // 822083874
P_FE2CL_PC_VEHICLE_ON_FAIL = 0x31000123 // 822083875
P_FE2CL_PC_VEHICLE_OFF_SUCC = 0x31000124 // 822083876
P_FE2CL_PC_VEHICLE_OFF_FAIL = 0x31000125 // 822083877
P_FE2CL_PC_QUICK_SLOT_INFO = 0x31000126 // 822083878
P_FE2CL_REP_PC_REGIST_QUICK_SLOT_FAIL = 0x31000127 // 822083879
P_FE2CL_REP_PC_REGIST_QUICK_SLOT_SUCC = 0x31000128 // 822083880
P_FE2CL_PC_DELETE_TIME_LIMIT_ITEM = 0x31000129 // 822083881
P_FE2CL_REP_PC_DISASSEMBLE_ITEM_SUCC = 0x3100012a // 822083882
P_FE2CL_REP_PC_DISASSEMBLE_ITEM_FAIL = 0x3100012b // 822083883
P_FE2CL_GM_REP_REWARD_RATE_SUCC = 0x3100012c // 822083884
P_FE2CL_REP_PC_ITEM_ENCHANT_SUCC = 0x3100012d // 822083885
P_FE2CL_REP_PC_ITEM_ENCHANT_FAIL = 0x3100012e // 822083886
P_LS2CL_REP_LOGIN_SUCC = 0x21000001 // 553648129
P_LS2CL_REP_LOGIN_FAIL = 0x21000002 // 553648130
P_LS2CL_REP_CHAR_INFO = 0x21000003 // 553648131
P_LS2CL_REP_CHECK_CHAR_NAME_SUCC = 0x21000005 // 553648133
P_LS2CL_REP_CHECK_CHAR_NAME_FAIL = 0x21000006 // 553648134
P_LS2CL_REP_SAVE_CHAR_NAME_SUCC = 0x21000007 // 553648135
P_LS2CL_REP_SAVE_CHAR_NAME_FAIL = 0x21000008 // 553648136
P_LS2CL_REP_CHAR_CREATE_SUCC = 0x21000009 // 553648137
P_LS2CL_REP_CHAR_CREATE_FAIL = 0x2100000a // 553648138
P_LS2CL_REP_CHAR_SELECT_SUCC = 0x2100000b // 553648139
P_LS2CL_REP_CHAR_SELECT_FAIL = 0x2100000c // 553648140
P_LS2CL_REP_CHAR_DELETE_SUCC = 0x2100000d // 553648141
P_LS2CL_REP_CHAR_DELETE_FAIL = 0x2100000e // 553648142
P_LS2CL_REP_SHARD_SELECT_SUCC = 0x2100000f // 553648143
P_LS2CL_REP_SHARD_SELECT_FAIL = 0x21000010 // 553648144
P_LS2CL_REP_VERSION_CHECK_SUCC = 0x21000011 // 553648145
P_LS2CL_REP_VERSION_CHECK_FAIL = 0x21000012 // 553648146
P_LS2CL_REP_CHECK_NAME_LIST_SUCC = 0x21000013 // 553648147
P_LS2CL_REP_CHECK_NAME_LIST_FAIL = 0x21000014 // 553648148
P_LS2CL_REP_PC_EXIT_DUPLICATE = 0x21000015 // 553648149
P_LS2CL_REQ_LIVE_CHECK = 0x21000016 // 553648150
P_LS2CL_REP_CHANGE_CHAR_NAME_SUCC = 0x21000017 // 553648151
P_LS2CL_REP_CHANGE_CHAR_NAME_FAIL = 0x21000018 // 553648152
P_LS2CL_REP_SHARD_LIST_INFO_SUCC = 0x21000019 // 553648153
)

4
api/protocol/handler.go Normal file
View File

@ -0,0 +1,4 @@
package protocol
type PacketHandler interface {
}

227
api/protocol/packet.go Normal file
View File

@ -0,0 +1,227 @@
package protocol
import (
"encoding/binary"
"fmt"
"log"
"reflect"
"strconv"
"unicode/utf16"
"unsafe"
)
/*
this file handles serializing (and deserializing) structs to alignment-strict c structures
*/
type Packet struct {
ByteOrder binary.ByteOrder
Buf []byte
cursor int // to keep track of things like member alignment
}
const PACK_ALIGN = 4
func NewPacket(sz int) *Packet {
newBuf := make([]byte, sz)
return &Packet{ByteOrder: binary.LittleEndian, Buf: newBuf}
}
func (pkt *Packet) ResetCursor() {
pkt.cursor = 0
}
func (pkt *Packet) CompletePacket(typeID uint32) {
tmp := make([]byte, 4)
pkt.ByteOrder.PutUint32(tmp, typeID)
pkt.Buf = append(tmp, pkt.Buf...)
}
func (pkt *Packet) writeRaw(data []byte) {
pkt.Buf = append(pkt.Buf, data...)
pkt.cursor += len(data)
}
func (pkt *Packet) Write(data []byte) {
pkt.writeRaw(data)
}
func (pkt *Packet) writeByte(data byte) {
pkt.Write([]byte{data})
}
func (pkt *Packet) readRaw(sz int) []byte {
data := pkt.Buf[:sz]
pkt.Buf = pkt.Buf[sz:]
pkt.cursor += sz
return data
}
func (pkt *Packet) Read(sz int) []byte {
if sz > len(pkt.Buf) {
panic("Failed to read from packet, invalid size!")
}
return pkt.readRaw(sz)
}
func (pkt *Packet) readByte() byte {
return pkt.Read(1)[0]
}
func (pkt *Packet) encodeStructField(field reflect.StructField, value reflect.Value) {
switch field.Type.Kind() {
case reflect.String: // all strings in fusionfall packets are encoded as utf16, we'll need to encode it
sz, err := strconv.Atoi(field.Tag.Get("size"))
if err != nil {
panic(fmt.Errorf("Failed to grab string 'size' tag!!"))
}
buf16 := utf16.Encode([]rune(value.String()))
// len(buf16) needs to be the same size as sz
if len(buf16) > sz {
// truncate
buf16 = buf16[:sz]
} else {
// grow
for len(buf16) < sz {
buf16 = append(buf16, 0)
}
}
buf := *(*[]byte)(unsafe.Pointer(&buf16))
pkt.Write(buf)
default:
pkt.Encode(value.Addr().Interface())
}
}
func (pkt *Packet) Encode(data interface{}) {
rv := reflect.Indirect(reflect.ValueOf(data))
switch rv.Kind() {
case reflect.Struct:
// walk through each struct fields
sz := rv.NumField()
for i := 0; i < sz; i++ {
pkt.encodeStructField(rv.Type().Field(i), rv.Field(i))
}
case reflect.Slice: // (untested)
sz := rv.Len()
// encode data
for i := 0; i < sz; i++ {
elem := rv.Index(i).Addr()
pkt.Encode(elem.Addr().Interface())
}
case reflect.Uint8:
pkt.writeByte(byte(rv.Uint()))
case reflect.Uint16:
tmp := make([]byte, 2)
pkt.ByteOrder.PutUint16(tmp, uint16(rv.Uint()))
pkt.Write(tmp)
case reflect.Uint32:
tmp := make([]byte, 4)
pkt.ByteOrder.PutUint32(tmp, uint32(rv.Uint()))
pkt.Write(tmp)
case reflect.Uint64:
tmp := make([]byte, 8)
pkt.ByteOrder.PutUint64(tmp, uint64(rv.Uint()))
pkt.Write(tmp)
// im using the PutUintX() api here because it's functionally the same and apparently PutIntX doesn't exist?
case reflect.Int8:
pkt.writeByte(byte(rv.Int()))
case reflect.Int16:
tmp := make([]byte, 2)
pkt.ByteOrder.PutUint16(tmp, uint16(rv.Int()))
pkt.Write(tmp)
case reflect.Int32:
tmp := make([]byte, 4)
pkt.ByteOrder.PutUint32(tmp, uint32(rv.Int()))
pkt.Write(tmp)
case reflect.Int64:
tmp := make([]byte, 8)
pkt.ByteOrder.PutUint64(tmp, uint64(rv.Int()))
pkt.Write(tmp)
}
}
func (pkt *Packet) decodeStructField(field reflect.StructField, value reflect.Value) {
log.Printf("Decoding '%s', current cursor: %d", field.Name, pkt.cursor)
// read padding bytes
offset, err := strconv.Atoi(field.Tag.Get("offset"))
if err == nil {
for pkt.cursor < offset {
pkt.readByte()
}
}
switch field.Type.Kind() {
case reflect.String: // all strings in fusionfall packets are encoded as utf16, we'll need to decode it
sz, err := strconv.Atoi(field.Tag.Get("size"))
if err != nil {
panic(fmt.Errorf("Failed to grab string 'size' tag!!"))
}
// sz * sizeof(char16_t)
sz *= 2
buf := make([]byte, 0, sz)
buf = append(buf, pkt.Read(sz)...)
buf16 := *(*[]uint16)(unsafe.Pointer(&buf))
// find null terminator
var realSize int
for ; realSize < len(buf16); realSize++ {
if buf16[realSize] == 0 {
break
}
}
str := string(utf16.Decode(buf16[:realSize]))
log.Printf(" got: %#.v or '%s'", buf16, str)
value.SetString(str)
default:
pkt.Decode(value.Addr().Interface())
}
}
func (pkt *Packet) Decode(data interface{}) {
rv := reflect.Indirect(reflect.ValueOf(data))
switch rv.Kind() {
case reflect.Struct:
// walk through each struct fields
sz := rv.NumField()
for i := 0; i < sz; i++ {
pkt.decodeStructField(rv.Type().Field(i), rv.Field(i))
}
case reflect.Array: // (untested)
sz := rv.Len()
// decode data
log.Print("reading array length ", sz, " cursor: ", pkt.cursor)
for i := 0; i < sz; i++ {
elem := rv.Index(i)
pkt.Decode(elem.Addr().Interface())
}
case reflect.Uint8:
rv.SetUint(uint64(pkt.readByte()))
case reflect.Uint16:
rv.SetUint(uint64(pkt.ByteOrder.Uint16(pkt.Read(2))))
case reflect.Uint32:
rv.SetUint(uint64(pkt.ByteOrder.Uint32(pkt.Read(4))))
case reflect.Uint64:
rv.SetUint(pkt.ByteOrder.Uint64(pkt.Read(8)))
case reflect.Int8:
rv.SetInt(int64(pkt.readByte()))
case reflect.Int16:
rv.SetInt(int64(pkt.ByteOrder.Uint16(pkt.Read(2))))
case reflect.Int32:
rv.SetInt(int64(pkt.ByteOrder.Uint32(pkt.Read(4))))
case reflect.Int64:
rv.SetInt(int64(pkt.ByteOrder.Uint64(pkt.Read(8))))
}
}

12
api/protocol/structs.go Normal file
View File

@ -0,0 +1,12 @@
package protocol
type SP_CL2LS_REQ_LOGIN struct {
ID string `size:"33"`
Password string `size:"33"`
ClientVerA int32
ClientVerB int32
ClientVerC int32
LoginType int32
Cookie_TEGid [64]uint8
Cookie_authid [255]uint8
}

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module github.com/CPunch/GoFusion
go 1.19

101
server/server.go Normal file
View File

@ -0,0 +1,101 @@
package main
import (
"encoding/binary"
"fmt"
"log"
"net"
"github.com/CPunch/GoFusion/api/protocol"
)
const (
E_KEY = "m@rQn~W#"
KEY_LENGTH = 8
)
func encrypt_byte_change_A(ERSize int, data []byte) int {
var num, num2, num3 int
for num+ERSize <= len(data) {
num4 := num + num3
num5 := num + (ERSize - 1 - num3)
b := data[num4]
data[num4] = data[num5]
data[num5] = b
num += ERSize
num3++
if num3 > ERSize/2 {
num3 = 0
}
}
num2 = ERSize - (num + ERSize - len(data))
return num + num2
}
func xorData(buff, key []byte, size int) {
for i := 0; i < size; i++ {
buff[i] ^= key[i%KEY_LENGTH]
}
}
func decryptData(buff, key []byte) {
ERSize := len(buff)%(KEY_LENGTH/2+1)*2 + KEY_LENGTH
size := encrypt_byte_change_A(ERSize, buff)
xorData(buff, key, size)
}
func handle(conn net.Conn) {
defer func() {
conn.Close()
}()
tmp := make([]byte, 4)
for {
// grab packet size
if _, err := conn.Read(tmp); err != nil {
panic(fmt.Errorf("[FATAL] failed to read packet size! %v", err))
}
sz := int(binary.LittleEndian.Uint32(tmp))
pkt := protocol.NewPacket(sz)
if _, err := conn.Read(pkt.Buf); err != nil {
panic(fmt.Errorf("[FATAL] failed to read packet body! %v", err))
}
decryptData(pkt.Buf, []byte(E_KEY))
typeID := int(binary.LittleEndian.Uint32(pkt.Read(4)))
sizeof := len(pkt.Buf)
log.Printf("Got packet ID: %x\n", typeID)
pkt.ResetCursor()
switch typeID {
case protocol.P_CL2LS_REQ_LOGIN:
var loginPkt protocol.SP_CL2LS_REQ_LOGIN
pkt.Decode(&loginPkt)
log.Printf("Got packet: %#v, with a sizeof: %d", loginPkt, sizeof)
default:
log.Printf("[WARN] unsupported packet ID: %x\n", typeID)
}
}
}
func main() {
server, err := net.Listen("tcp", ":23000")
if err != nil {
log.Fatal(err)
}
log.Print("Server hosted on 127.0.0.1:23000")
for {
conn, err := server.Accept()
if err != nil {
log.Println("Connection error: ", err)
return
}
go handle(conn)
}
}