From e5066d4f8b5e19021d1243d38da20a188c12e255 Mon Sep 17 00:00:00 2001 From: Andrew Gutekanst Date: Tue, 24 Dec 2019 00:20:35 +0900 Subject: [PATCH] Hackily get the client to a channel server --- README.md | 12 +- channel_server.go | 46 +++ config/config.go | 25 ++ entrance_server.go | 2 +- go.mod | 2 + go.sum | 4 + main.go | 1 + migrations/000001_initial_db.down.sql | 10 + migrations/000001_initial_db.up.sql | 36 ++ network/packetid.go | 442 +++++++++++++++++++++++++ network/packetid_string.go | 454 ++++++++++++++++++++++++++ sign_server.go | 86 ++++- test.py | 182 ++++++++++- 13 files changed, 1275 insertions(+), 27 deletions(-) create mode 100644 channel_server.go create mode 100644 config/config.go create mode 100644 migrations/000001_initial_db.down.sql create mode 100644 migrations/000001_initial_db.up.sql create mode 100644 network/packetid.go create mode 100644 network/packetid_string.go diff --git a/README.md b/README.md index bdd0880ae..2c498eef4 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,14 @@ Nothing here yet :) -Based on the TW version. Requires a local mirror of the original launcher site to be placed in `./www/g6_launcher` until I can RE the launcher and figure out which JS callbacks it requires. \ No newline at end of file +Based on the TW version. Requires a local mirror of the original launcher site to be placed in `./www/g6_launcher` until I can RE the launcher and figure out which JS callbacks it requires. + + +## Installation +Clone the repo +Install PostgreSQL, launch psql shell, `CREATE DATABASE erupe;`. + +Setup db with golang-migrate: +`go get -tags 'postgres' -u github.com/golang-migrate/migrate/cmd/migrate` +`set POSTGRESQL_URL=postgres://postgres:password@localhost:5432/erupe?sslmode=disable` +`migrate -database %POSTGRESQL_URL% -path migrations up` diff --git a/channel_server.go b/channel_server.go new file mode 100644 index 000000000..a72c0d0bc --- /dev/null +++ b/channel_server.go @@ -0,0 +1,46 @@ +package main + +import ( + "encoding/hex" + "fmt" + "net" + + "github.com/Andoryuuta/Erupe/network" + "github.com/Andoryuuta/byteframe" +) + +func handleChannelServerConnection(conn net.Conn) { + fmt.Println("Channel server got connection!") + // Unlike the sign and entrance server, + // the client DOES NOT initalize the channel connection with 8 NULL bytes. + + cc := network.NewCryptConn(conn) + for { + pkt, err := cc.ReadPacket() + if err != nil { + return + } + + bf := byteframe.NewByteFrameFromBytes(pkt) + opcode := network.PacketID(bf.ReadUint16()) + fmt.Printf("Opcode: %s\n", opcode) + fmt.Printf("Data:\n%s\n", hex.Dump(pkt)) + + } +} + +func doChannelServer(listenAddr string) { + l, err := net.Listen("tcp", listenAddr) + if err != nil { + panic(err) + } + defer l.Close() + + for { + conn, err := l.Accept() + if err != nil { + panic(err) + } + go handleChannelServerConnection(conn) + } +} diff --git a/config/config.go b/config/config.go new file mode 100644 index 000000000..1cb7cd0fc --- /dev/null +++ b/config/config.go @@ -0,0 +1,25 @@ +package config + +import "github.com/BurntSushi/toml" + +// Config holds the configuration settings from the toml file. +type Config struct { + DB Database `toml:"database"` +} + +// Database holds the postgres database config. +type Database struct { + Server string + Port int +} + +// LoadConfig loads the given config toml file. +func LoadConfig(filepath string) (*Config, error) { + c := &Config{} + _, err := toml.DecodeFile(filepath, c) + if err != nil { + return nil, err + } + + return c, nil +} diff --git a/entrance_server.go b/entrance_server.go index 93d98007d..39b7e5d0b 100644 --- a/entrance_server.go +++ b/entrance_server.go @@ -31,7 +31,7 @@ func handleEntranceServerConnection(conn net.Conn) { fmt.Printf("Got entrance server command:\n%s\n", hex.Dump(pkt)) - data, err := ioutil.ReadFile("tw_server_list_resp.bin") + data, err := ioutil.ReadFile("custom_entrance_server_resp.bin")//("tw_server_list_resp.bin") if err != nil { print(err) return diff --git a/go.mod b/go.mod index 56909f5e9..7db1bbc26 100644 --- a/go.mod +++ b/go.mod @@ -5,5 +5,7 @@ go 1.13 require ( github.com/Andoryuuta/binio v0.0.0-20160731013325-2c89946fb8c3 github.com/Andoryuuta/byteframe v0.0.0-20191219124302-41f4085eb4c0 + github.com/BurntSushi/toml v0.3.1 + github.com/golang-migrate/migrate v3.5.4+incompatible // indirect github.com/julienschmidt/httprouter v1.3.0 ) diff --git a/go.sum b/go.sum index 24a4f62e2..e7dcd6eee 100644 --- a/go.sum +++ b/go.sum @@ -2,5 +2,9 @@ github.com/Andoryuuta/binio v0.0.0-20160731013325-2c89946fb8c3 h1:N8pCiqpJAHyOO8 github.com/Andoryuuta/binio v0.0.0-20160731013325-2c89946fb8c3/go.mod h1:4WK1jUpH8NFdDiv7IJcBfyCIOMqKjZ15kcw5eBKALvc= github.com/Andoryuuta/byteframe v0.0.0-20191219124302-41f4085eb4c0 h1:2pVgen9rh18IxSWxOa80bObcpyfrS6d5bJtZeCUN7rY= github.com/Andoryuuta/byteframe v0.0.0-20191219124302-41f4085eb4c0/go.mod h1:koVyx+gN3TfE70rpOidywETVODk87304YpwW69Y27J4= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/golang-migrate/migrate v3.5.4+incompatible h1:R7OzwvCJTCgwapPCiX6DyBiu2czIUMDCB118gFTKTUA= +github.com/golang-migrate/migrate v3.5.4+incompatible/go.mod h1:IsVUlFN5puWOmXrqjgGUfIRIbU7mr8oNBE2tyERd9Wk= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= diff --git a/main.go b/main.go index 38feb380f..cbbc8ce92 100644 --- a/main.go +++ b/main.go @@ -11,6 +11,7 @@ func main() { go serveLauncherHTML(":80") go doEntranceServer(":53310") go doSignServer(":53312") + go doChannelServer(":54001") for { time.Sleep(1 * time.Second) diff --git a/migrations/000001_initial_db.down.sql b/migrations/000001_initial_db.down.sql new file mode 100644 index 000000000..04f7e46f8 --- /dev/null +++ b/migrations/000001_initial_db.down.sql @@ -0,0 +1,10 @@ +BEGIN; + +DROP TABLE IF EXISTS sign_sessions; +DROP TABLE IF EXISTS characters; +DROP TABLE IF EXISTS users; + +DROP DOMAIN IF EXISTS uint8; +DROP DOMAIN IF EXISTS uint16; + +END; \ No newline at end of file diff --git a/migrations/000001_initial_db.up.sql b/migrations/000001_initial_db.up.sql new file mode 100644 index 000000000..ef8cbc950 --- /dev/null +++ b/migrations/000001_initial_db.up.sql @@ -0,0 +1,36 @@ +BEGIN; + +CREATE DOMAIN uint8 AS smallint + CHECK(VALUE >= 0 AND VALUE <= 255); + +CREATE DOMAIN uint16 AS integer + CHECK(VALUE >= 0 AND VALUE <= 65536); + +CREATE TABLE users ( + id serial NOT NULL PRIMARY KEY, + username text UNIQUE NOT NULL, + password text NOT NULL +); + +CREATE TABLE characters ( + id serial NOT NULL PRIMARY KEY, + user_id bigint REFERENCES users(id), + is_female boolean, + is_new_character boolean, + small_gr_level uint8, + gr_override_mode boolean, + name varchar(15), + unk_desc_string varchar(31), + gr_override_level uint16, + gr_override_unk0 uint8, + gr_override_unk1 uint8 +); + +CREATE TABLE sign_sessions ( + id serial NOT NULL PRIMARY KEY, + user_id bigint REFERENCES users(id), + auth_token_num bigint, + auth_token_str text +); + +END; \ No newline at end of file diff --git a/network/packetid.go b/network/packetid.go new file mode 100644 index 000000000..7f9ee4d6c --- /dev/null +++ b/network/packetid.go @@ -0,0 +1,442 @@ +package network + +//revive:disable +type PacketID uint16 + +//go:generate stringer -type=PacketID +const ( + MSG_HEAD PacketID = iota + MSG_SYS_reserve01 + MSG_SYS_reserve02 + MSG_SYS_reserve03 + MSG_SYS_reserve04 + MSG_SYS_reserve05 + MSG_SYS_reserve06 + MSG_SYS_reserve07 + MSG_SYS_ADD_OBJECT + MSG_SYS_DEL_OBJECT + MSG_SYS_DISP_OBJECT + MSG_SYS_HIDE_OBJECT + MSG_SYS_reserve0C + MSG_SYS_reserve0D + MSG_SYS_reserve0E + MSG_SYS_EXTEND_THRESHOLD + MSG_SYS_END + MSG_SYS_NOP + MSG_SYS_ACK + MSG_SYS_TERMINAL_LOG + MSG_SYS_LOGIN + MSG_SYS_LOGOUT + MSG_SYS_SET_STATUS + MSG_SYS_PING + MSG_SYS_CAST_BINARY + MSG_SYS_HIDE_CLIENT + MSG_SYS_TIME + MSG_SYS_CASTED_BINARY + MSG_SYS_GET_FILE + MSG_SYS_ISSUE_LOGKEY + MSG_SYS_RECORD_LOG + MSG_SYS_ECHO + MSG_SYS_CREATE_STAGE + MSG_SYS_STAGE_DESTRUCT + MSG_SYS_ENTER_STAGE + MSG_SYS_BACK_STAGE + MSG_SYS_MOVE_STAGE + MSG_SYS_LEAVE_STAGE + MSG_SYS_LOCK_STAGE + MSG_SYS_UNLOCK_STAGE + MSG_SYS_RESERVE_STAGE + MSG_SYS_UNRESERVE_STAGE + MSG_SYS_SET_STAGE_PASS + MSG_SYS_WAIT_STAGE_BINARY + MSG_SYS_SET_STAGE_BINARY + MSG_SYS_GET_STAGE_BINARY + MSG_SYS_ENUMERATE_CLIENT + MSG_SYS_ENUMERATE_STAGE + MSG_SYS_CREATE_MUTEX + MSG_SYS_CREATE_OPEN_MUTEX + MSG_SYS_DELETE_MUTEX + MSG_SYS_OPEN_MUTEX + MSG_SYS_CLOSE_MUTEX + MSG_SYS_CREATE_SEMAPHORE + MSG_SYS_CREATE_ACQUIRE_SEMAPHORE + MSG_SYS_DELETE_SEMAPHORE + MSG_SYS_ACQUIRE_SEMAPHORE + MSG_SYS_RELEASE_SEMAPHORE + MSG_SYS_LOCK_GLOBAL_SEMA + MSG_SYS_UNLOCK_GLOBAL_SEMA + MSG_SYS_CHECK_SEMAPHORE + MSG_SYS_OPERATE_REGISTER + MSG_SYS_LOAD_REGISTER + MSG_SYS_NOTIFY_REGISTER + MSG_SYS_CREATE_OBJECT + MSG_SYS_DELETE_OBJECT + MSG_SYS_POSITION_OBJECT + MSG_SYS_ROTATE_OBJECT + MSG_SYS_DUPLICATE_OBJECT + MSG_SYS_SET_OBJECT_BINARY + MSG_SYS_GET_OBJECT_BINARY + MSG_SYS_GET_OBJECT_OWNER + MSG_SYS_UPDATE_OBJECT_BINARY + MSG_SYS_CLEANUP_OBJECT + MSG_SYS_reserve4A + MSG_SYS_reserve4B + MSG_SYS_reserve4C + MSG_SYS_reserve4D + MSG_SYS_reserve4E + MSG_SYS_reserve4F + MSG_SYS_INSERT_USER + MSG_SYS_DELETE_USER + MSG_SYS_SET_USER_BINARY + MSG_SYS_GET_USER_BINARY + MSG_SYS_NOTIFY_USER_BINARY + MSG_SYS_reserve55 + MSG_SYS_reserve56 + MSG_SYS_reserve57 + MSG_SYS_UPDATE_RIGHT + MSG_SYS_AUTH_QUERY + MSG_SYS_AUTH_DATA + MSG_SYS_AUTH_TERMINAL + MSG_SYS_reserve5C + MSG_SYS_RIGHTS_RELOAD + MSG_SYS_reserve5E + MSG_SYS_reserve5F + MSG_MHF_SAVEDATA + MSG_MHF_LOADDATA + MSG_MHF_LIST_MEMBER + MSG_MHF_OPR_MEMBER + MSG_MHF_ENUMERATE_DIST_ITEM + MSG_MHF_APPLY_DIST_ITEM + MSG_MHF_ACQUIRE_DIST_ITEM + MSG_MHF_GET_DIST_DESCRIPTION + MSG_MHF_SEND_MAIL + MSG_MHF_READ_MAIL + MSG_MHF_LIST_MAIL + MSG_MHF_OPRT_MAIL + MSG_MHF_LOAD_FAVORITE_QUEST + MSG_MHF_SAVE_FAVORITE_QUEST + MSG_MHF_REGISTER_EVENT + MSG_MHF_RELEASE_EVENT + MSG_MHF_TRANSIT_MESSAGE + MSG_SYS_reserve71 + MSG_SYS_reserve72 + MSG_SYS_reserve73 + MSG_SYS_reserve74 + MSG_SYS_reserve75 + MSG_SYS_reserve76 + MSG_SYS_reserve77 + MSG_SYS_reserve78 + MSG_SYS_reserve79 + MSG_SYS_reserve7A + MSG_SYS_reserve7B + MSG_SYS_reserve7C + MSG_CA_EXCHANGE_ITEM + MSG_SYS_reserve7E + MSG_MHF_PRESENT_BOX + MSG_MHF_SERVER_COMMAND + MSG_MHF_SHUT_CLIENT + MSG_MHF_ANNOUNCE + MSG_MHF_SET_LOGINWINDOW + MSG_SYS_TRANS_BINARY + MSG_SYS_COLLECT_BINARY + MSG_SYS_GET_STATE + MSG_SYS_SERIALIZE + MSG_SYS_ENUMLOBBY + MSG_SYS_ENUMUSER + MSG_SYS_INFOKYSERVER + MSG_MHF_GET_CA_UNIQUE_ID + MSG_MHF_SET_CA_ACHIEVEMENT + MSG_MHF_CARAVAN_MY_SCORE + MSG_MHF_CARAVAN_RANKING + MSG_MHF_CARAVAN_MY_RANK + MSG_MHF_CREATE_GUILD + MSG_MHF_OPERATE_GUILD + MSG_MHF_OPERATE_GUILD_MEMBER + MSG_MHF_INFO_GUILD + MSG_MHF_ENUMERATE_GUILD + MSG_MHF_UPDATE_GUILD + MSG_MHF_ARRANGE_GUILD_MEMBER + MSG_MHF_ENUMERATE_GUILD_MEMBER + MSG_MHF_ENUMERATE_CAMPAIGN + MSG_MHF_STATE_CAMPAIGN + MSG_MHF_APPLY_CAMPAIGN + MSG_MHF_ENUMERATE_ITEM + MSG_MHF_ACQUIRE_ITEM + MSG_MHF_TRANSFER_ITEM + MSG_MHF_MERCENARY_HUNTDATA + MSG_MHF_ENTRY_ROOKIE_GUILD + MSG_MHF_ENUMERATE_QUEST + MSG_MHF_ENUMERATE_EVENT + MSG_MHF_ENUMERATE_PRICE + MSG_MHF_ENUMERATE_RANKING + MSG_MHF_ENUMERATE_ORDER + MSG_MHF_ENUMERATE_SHOP + MSG_MHF_GET_EXTRA_INFO + MSG_MHF_UPDATE_INTERIOR + MSG_MHF_ENUMERATE_HOUSE + MSG_MHF_UPDATE_HOUSE + MSG_MHF_LOAD_HOUSE + MSG_MHF_OPERATE_WAREHOUSE + MSG_MHF_ENUMERATE_WAREHOUSE + MSG_MHF_UPDATE_WAREHOUSE + MSG_MHF_ACQUIRE_TITLE + MSG_MHF_ENUMERATE_TITLE + MSG_MHF_ENUMERATE_GUILD_ITEM + MSG_MHF_UPDATE_GUILD_ITEM + MSG_MHF_ENUMERATE_UNION_ITEM + MSG_MHF_UPDATE_UNION_ITEM + MSG_MHF_CREATE_JOINT + MSG_MHF_OPERATE_JOINT + MSG_MHF_INFO_JOINT + MSG_MHF_UPDATE_GUILD_ICON + MSG_MHF_INFO_FESTA + MSG_MHF_ENTRY_FESTA + MSG_MHF_CHARGE_FESTA + MSG_MHF_ACQUIRE_FESTA + MSG_MHF_STATE_FESTA_U + MSG_MHF_STATE_FESTA_G + MSG_MHF_ENUMERATE_FESTA_MEMBER + MSG_MHF_VOTE_FESTA + MSG_MHF_ACQUIRE_CAFE_ITEM + MSG_MHF_UPDATE_CAFEPOINT + MSG_MHF_CHECK_DAILY_CAFEPOINT + MSG_MHF_GET_COG_INFO + MSG_MHF_CHECK_MONTHLY_ITEM + MSG_MHF_ACQUIRE_MONTHLY_ITEM + MSG_MHF_CHECK_WEEKLY_STAMP + MSG_MHF_EXCHANGE_WEEKLY_STAMP + MSG_MHF_CREATE_MERCENARY + MSG_MHF_SAVE_MERCENARY + MSG_MHF_READ_MERCENARY_W + MSG_MHF_READ_MERCENARY_M + MSG_MHF_CONTRACT_MERCENARY + MSG_MHF_ENUMERATE_MERCENARY_LOG + MSG_MHF_ENUMERATE_GUACOT + MSG_MHF_UPDATE_GUACOT + MSG_MHF_INFO_TOURNAMENT + MSG_MHF_ENTRY_TOURNAMENT + MSG_MHF_ENTER_TOURNAMENT_QUEST + MSG_MHF_ACQUIRE_TOURNAMENT + MSG_MHF_GET_ACHIEVEMENT + MSG_MHF_RESET_ACHIEVEMENT + MSG_MHF_ADD_ACHIEVEMENT + MSG_MHF_PAYMENT_ACHIEVEMENT + MSG_MHF_DISPLAYED_ACHIEVEMENT + MSG_MHF_INFO_SCENARIO_COUNTER + MSG_MHF_SAVE_SCENARIO_DATA + MSG_MHF_LOAD_SCENARIO_DATA + MSG_MHF_GET_BBS_SNS_STATUS + MSG_MHF_APPLY_BBS_ARTICLE + MSG_MHF_GET_ETC_POINTS + MSG_MHF_UPDATE_ETC_POINT + MSG_MHF_GET_MYHOUSE_INFO + MSG_MHF_UPDATE_MYHOUSE_INFO + MSG_MHF_GET_WEEKLY_SCHEDULE + MSG_MHF_ENUMERATE_INV_GUILD + MSG_MHF_OPERATION_INV_GUILD + MSG_MHF_STAMPCARD_STAMP + MSG_MHF_STAMPCARD_PRIZE + MSG_MHF_UNRESERVE_SRG + MSG_MHF_LOAD_PLATE_DATA + MSG_MHF_SAVE_PLATE_DATA + MSG_MHF_LOAD_PLATE_BOX + MSG_MHF_SAVE_PLATE_BOX + MSG_MHF_READ_GUILDCARD + MSG_MHF_UPDATE_GUILDCARD + MSG_MHF_READ_BEAT_LEVEL + MSG_MHF_UPDATE_BEAT_LEVEL + MSG_MHF_READ_BEAT_LEVEL_ALL_RANKING + MSG_MHF_READ_BEAT_LEVEL_MY_RANKING + MSG_MHF_READ_LAST_WEEK_BEAT_RANKING + MSG_MHF_ACCEPT_READ_REWARD + MSG_MHF_GET_ADDITIONAL_BEAT_REWARD + MSG_MHF_GET_FIXED_SEIBATU_RANKING_TABLE + MSG_MHF_GET_BBS_USER_STATUS + MSG_MHF_KICK_EXPORT_FORCE + MSG_MHF_GET_BREAK_SEIBATU_LEVEL_REWARD + MSG_MHF_GET_WEEKLY_SEIBATU_RANKING_REWARD + MSG_MHF_GET_EARTH_STATUS + MSG_MHF_LOAD_PARTNER + MSG_MHF_SAVE_PARTNER + MSG_MHF_GET_GUILD_MISSION_LIST + MSG_MHF_GET_GUILD_MISSION_RECORD + MSG_MHF_ADD_GUILD_MISSION_COUNT + MSG_MHF_SET_GUILD_MISSION_TARGET + MSG_MHF_CANCEL_GUILD_MISSION_TARGET + MSG_MHF_LOAD_OTOMO_AIROU + MSG_MHF_SAVE_OTOMO_AIROU + MSG_MHF_ENUMERATE_GUILD_TRESURE + MSG_MHF_ENUMERATE_AIROULIST + MSG_MHF_REGIST_GUILD_TRESURE + MSG_MHF_ACQUIRE_GUILD_TRESURE + MSG_MHF_OPERATE_GUILD_TRESURE_REPORT + MSG_MHF_GET_GUILD_TRESURE_SOUVENIR + MSG_MHF_ACQUIRE_GUILD_TRESURE_SOUVENIR + MSG_MHF_ENUMERATE_FESTA_INTERMEDIATE_PRIZE + MSG_MHF_ACQUIRE_FESTA_INTERMEDIATE_PRIZE + MSG_MHF_LOAD_DECO_MYSET + MSG_MHF_SAVE_DECO_MYSET + MSG_MHF_reserve010F + MSG_MHF_LOAD_GUILD_COOKING + MSG_MHF_REGIST_GUILD_COOKING + MSG_MHF_LOAD_GUILD_ADVENTURE + MSG_MHF_REGIST_GUILD_ADVENTURE + MSG_MHF_ACQUIRE_GUILD_ADVENTURE + MSG_MHF_CHARGE_GUILD_ADVENTURE + MSG_MHF_LOAD_LEGEND_DISPATCH + MSG_MHF_LOAD_HUNTER_NAVI + MSG_MHF_SAVE_HUNTER_NAVI + MSG_MHF_REGIST_SPABI_TIME + MSG_MHF_GET_GUILD_WEEKLY_BONUS_MASTER + MSG_MHF_GET_GUILD_WEEKLY_BONUS_ACTIVE_COUNT + MSG_MHF_ADD_GUILD_WEEKLY_BONUS_EXCEPTIONAL_USER + MSG_MHF_GET_TOWER_INFO + MSG_MHF_POST_TOWER_INFO + MSG_MHF_GET_GEM_INFO + MSG_MHF_POST_GEM_INFO + MSG_MHF_GET_EARTH_VALUE + MSG_MHF_DEBUG_POST_VALUE + MSG_MHF_GET_PAPER_DATA + MSG_MHF_GET_NOTICE + MSG_MHF_POST_NOTICE + MSG_MHF_GET_BOOST_TIME + MSG_MHF_POST_BOOST_TIME + MSG_MHF_GET_BOOST_TIME_LIMIT + MSG_MHF_POST_BOOST_TIME_LIMIT + MSG_MHF_ENUMERATE_FESTA_PERSONAL_PRIZE + MSG_MHF_ACQUIRE_FESTA_PERSONAL_PRIZE + MSG_MHF_GET_RAND_FROM_TABLE + MSG_MHF_GET_CAFE_DURATION + MSG_MHF_GET_CAFE_DURATION_BONUS_INFO + MSG_MHF_RECEIVE_CAFE_DURATION_BONUS + MSG_MHF_POST_CAFE_DURATION_BONUS_RECEIVED + MSG_MHF_GET_GACHA_POINT + MSG_MHF_USE_GACHA_POINT + MSG_MHF_EXCHANGE_FPOINT_2_ITEM + MSG_MHF_EXCHANGE_ITEM_2_FPOINT + MSG_MHF_GET_FPOINT_EXCHANGE_LIST + MSG_MHF_PLAY_STEPUP_GACHA + MSG_MHF_RECEIVE_GACHA_ITEM + MSG_MHF_GET_STEPUP_STATUS + MSG_MHF_PLAY_FREE_GACHA + MSG_MHF_GET_TINY_BIN + MSG_MHF_POST_TINY_BIN + MSG_MHF_GET_SENYU_DAILY_COUNT + MSG_MHF_GET_GUILD_TARGET_MEMBER_NUM + MSG_MHF_GET_BOOST_RIGHT + MSG_MHF_START_BOOST_TIME + MSG_MHF_POST_BOOST_TIME_QUEST_RETURN + MSG_MHF_GET_BOX_GACHA_INFO + MSG_MHF_PLAY_BOX_GACHA + MSG_MHF_RESET_BOX_GACHA_INFO + MSG_MHF_GET_SEIBATTLE + MSG_MHF_POST_SEIBATTLE + MSG_MHF_GET_RYOUDAMA + MSG_MHF_POST_RYOUDAMA + MSG_MHF_GET_TENROUIRAI + MSG_MHF_POST_TENROUIRAI + MSG_MHF_POST_GUILD_SCOUT + MSG_MHF_CANCEL_GUILD_SCOUT + MSG_MHF_ANSWER_GUILD_SCOUT + MSG_MHF_GET_GUILD_SCOUT_LIST + MSG_MHF_GET_GUILD_MANAGE_RIGHT + MSG_MHF_SET_GUILD_MANAGE_RIGHT + MSG_MHF_PLAY_NORMAL_GACHA + MSG_MHF_GET_DAILY_MISSION_MASTER + MSG_MHF_GET_DAILY_MISSION_PERSONAL + MSG_MHF_SET_DAILY_MISSION_PERSONAL + MSG_MHF_GET_GACHA_PLAY_HISTORY + MSG_MHF_GET_REJECT_GUILD_SCOUT + MSG_MHF_SET_REJECT_GUILD_SCOUT + MSG_MHF_GET_CA_ACHIEVEMENT_HIST + MSG_MHF_SET_CA_ACHIEVEMENT_HIST + MSG_MHF_GET_KEEP_LOGIN_BOOST_STATUS + MSG_MHF_USE_KEEP_LOGIN_BOOST + MSG_MHF_GET_UD_SCHEDULE + MSG_MHF_GET_UD_INFO + MSG_MHF_GET_KIJU_INFO + MSG_MHF_SET_KIJU + MSG_MHF_ADD_UD_POINT + MSG_MHF_GET_UD_MY_POINT + MSG_MHF_GET_UD_TOTAL_POINT_INFO + MSG_MHF_GET_UD_BONUS_QUEST_INFO + MSG_MHF_GET_UD_SELECTED_COLOR_INFO + MSG_MHF_GET_UD_MONSTER_POINT + MSG_MHF_GET_UD_DAILY_PRESENT_LIST + MSG_MHF_GET_UD_NORMA_PRESENT_LIST + MSG_MHF_GET_UD_RANKING_REWARD_LIST + MSG_MHF_ACQUIRE_UD_ITEM + MSG_MHF_GET_REWARD_SONG + MSG_MHF_USE_REWARD_SONG + MSG_MHF_ADD_REWARD_SONG_COUNT + MSG_MHF_GET_UD_RANKING + MSG_MHF_GET_UD_MY_RANKING + MSG_MHF_ACQUIRE_MONTHLY_REWARD + MSG_MHF_GET_UD_GUILD_MAP_INFO + MSG_MHF_GENERATE_UD_GUILD_MAP + MSG_MHF_GET_UD_TACTICS_POINT + MSG_MHF_ADD_UD_TACTICS_POINT + MSG_MHF_GET_UD_TACTICS_RANKING + MSG_MHF_GET_UD_TACTICS_REWARD_LIST + MSG_MHF_GET_UD_TACTICS_LOG + MSG_MHF_GET_EQUIP_SKIN_HIST + MSG_MHF_UPDATE_EQUIP_SKIN_HIST + MSG_MHF_GET_UD_TACTICS_FOLLOWER + MSG_MHF_SET_UD_TACTICS_FOLLOWER + MSG_MHF_GET_UD_SHOP_COIN + MSG_MHF_USE_UD_SHOP_COIN + MSG_MHF_GET_ENHANCED_MINIDATA + MSG_MHF_SET_ENHANCED_MINIDATA + MSG_MHF_SEX_CHANGER + MSG_MHF_GET_LOBBY_CROWD + MSG_SYS_reserve180 + MSG_MHF_GUILD_HUNTDATA + MSG_MHF_ADD_KOURYOU_POINT + MSG_MHF_GET_KOURYOU_POINT + MSG_MHF_EXCHANGE_KOURYOU_POINT + MSG_MHF_GET_UD_TACTICS_BONUS_QUEST + MSG_MHF_GET_UD_TACTICS_FIRST_QUEST_BONUS + MSG_MHF_GET_UD_TACTICS_REMAINING_POINT + MSG_SYS_reserve188 + MSG_MHF_LOAD_PLATE_MYSET + MSG_MHF_SAVE_PLATE_MYSET + MSG_SYS_reserve18B + MSG_MHF_GET_RESTRICTION_EVENT + MSG_MHF_SET_RESTRICTION_EVENT + MSG_SYS_reserve18E + MSG_SYS_reserve18F + MSG_MHF_GET_TREND_WEAPON + MSG_MHF_UPDATE_USE_TREND_WEAPON_LOG + MSG_SYS_reserve192 + MSG_SYS_reserve193 + MSG_SYS_reserve194 + MSG_MHF_SAVE_RENGOKU_DATA + MSG_MHF_LOAD_RENGOKU_DATA + MSG_MHF_GET_RENGOKU_BINARY + MSG_MHF_ENUMERATE_RENGOKU_RANKING + MSG_MHF_GET_RENGOKU_RANKING_RANK + MSG_MHF_ACQUIRE_EXCHANGE_SHOP + MSG_SYS_reserve19B + MSG_MHF_SAVE_MEZFES_DATA + MSG_MHF_LOAD_MEZFES_DATA + MSG_SYS_reserve19E + MSG_SYS_reserve19F + MSG_MHF_UPDATE_FORCE_GUILD_RANK + MSG_MHF_RESET_TITLE + MSG_SYS_reserve202 + MSG_SYS_reserve203 + MSG_SYS_reserve204 + MSG_SYS_reserve205 + MSG_SYS_reserve206 + MSG_SYS_reserve207 + MSG_SYS_reserve208 + MSG_SYS_reserve209 + MSG_SYS_reserve20A + MSG_SYS_reserve20B + MSG_SYS_reserve20C + MSG_SYS_reserve20D + MSG_SYS_reserve20E + MSG_SYS_reserve20F +) + +//revive:enable diff --git a/network/packetid_string.go b/network/packetid_string.go new file mode 100644 index 000000000..def56d278 --- /dev/null +++ b/network/packetid_string.go @@ -0,0 +1,454 @@ +// Code generated by "stringer -type=PacketID"; DO NOT EDIT. + +package network + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[MSG_HEAD-0] + _ = x[MSG_SYS_reserve01-1] + _ = x[MSG_SYS_reserve02-2] + _ = x[MSG_SYS_reserve03-3] + _ = x[MSG_SYS_reserve04-4] + _ = x[MSG_SYS_reserve05-5] + _ = x[MSG_SYS_reserve06-6] + _ = x[MSG_SYS_reserve07-7] + _ = x[MSG_SYS_ADD_OBJECT-8] + _ = x[MSG_SYS_DEL_OBJECT-9] + _ = x[MSG_SYS_DISP_OBJECT-10] + _ = x[MSG_SYS_HIDE_OBJECT-11] + _ = x[MSG_SYS_reserve0C-12] + _ = x[MSG_SYS_reserve0D-13] + _ = x[MSG_SYS_reserve0E-14] + _ = x[MSG_SYS_EXTEND_THRESHOLD-15] + _ = x[MSG_SYS_END-16] + _ = x[MSG_SYS_NOP-17] + _ = x[MSG_SYS_ACK-18] + _ = x[MSG_SYS_TERMINAL_LOG-19] + _ = x[MSG_SYS_LOGIN-20] + _ = x[MSG_SYS_LOGOUT-21] + _ = x[MSG_SYS_SET_STATUS-22] + _ = x[MSG_SYS_PING-23] + _ = x[MSG_SYS_CAST_BINARY-24] + _ = x[MSG_SYS_HIDE_CLIENT-25] + _ = x[MSG_SYS_TIME-26] + _ = x[MSG_SYS_CASTED_BINARY-27] + _ = x[MSG_SYS_GET_FILE-28] + _ = x[MSG_SYS_ISSUE_LOGKEY-29] + _ = x[MSG_SYS_RECORD_LOG-30] + _ = x[MSG_SYS_ECHO-31] + _ = x[MSG_SYS_CREATE_STAGE-32] + _ = x[MSG_SYS_STAGE_DESTRUCT-33] + _ = x[MSG_SYS_ENTER_STAGE-34] + _ = x[MSG_SYS_BACK_STAGE-35] + _ = x[MSG_SYS_MOVE_STAGE-36] + _ = x[MSG_SYS_LEAVE_STAGE-37] + _ = x[MSG_SYS_LOCK_STAGE-38] + _ = x[MSG_SYS_UNLOCK_STAGE-39] + _ = x[MSG_SYS_RESERVE_STAGE-40] + _ = x[MSG_SYS_UNRESERVE_STAGE-41] + _ = x[MSG_SYS_SET_STAGE_PASS-42] + _ = x[MSG_SYS_WAIT_STAGE_BINARY-43] + _ = x[MSG_SYS_SET_STAGE_BINARY-44] + _ = x[MSG_SYS_GET_STAGE_BINARY-45] + _ = x[MSG_SYS_ENUMERATE_CLIENT-46] + _ = x[MSG_SYS_ENUMERATE_STAGE-47] + _ = x[MSG_SYS_CREATE_MUTEX-48] + _ = x[MSG_SYS_CREATE_OPEN_MUTEX-49] + _ = x[MSG_SYS_DELETE_MUTEX-50] + _ = x[MSG_SYS_OPEN_MUTEX-51] + _ = x[MSG_SYS_CLOSE_MUTEX-52] + _ = x[MSG_SYS_CREATE_SEMAPHORE-53] + _ = x[MSG_SYS_CREATE_ACQUIRE_SEMAPHORE-54] + _ = x[MSG_SYS_DELETE_SEMAPHORE-55] + _ = x[MSG_SYS_ACQUIRE_SEMAPHORE-56] + _ = x[MSG_SYS_RELEASE_SEMAPHORE-57] + _ = x[MSG_SYS_LOCK_GLOBAL_SEMA-58] + _ = x[MSG_SYS_UNLOCK_GLOBAL_SEMA-59] + _ = x[MSG_SYS_CHECK_SEMAPHORE-60] + _ = x[MSG_SYS_OPERATE_REGISTER-61] + _ = x[MSG_SYS_LOAD_REGISTER-62] + _ = x[MSG_SYS_NOTIFY_REGISTER-63] + _ = x[MSG_SYS_CREATE_OBJECT-64] + _ = x[MSG_SYS_DELETE_OBJECT-65] + _ = x[MSG_SYS_POSITION_OBJECT-66] + _ = x[MSG_SYS_ROTATE_OBJECT-67] + _ = x[MSG_SYS_DUPLICATE_OBJECT-68] + _ = x[MSG_SYS_SET_OBJECT_BINARY-69] + _ = x[MSG_SYS_GET_OBJECT_BINARY-70] + _ = x[MSG_SYS_GET_OBJECT_OWNER-71] + _ = x[MSG_SYS_UPDATE_OBJECT_BINARY-72] + _ = x[MSG_SYS_CLEANUP_OBJECT-73] + _ = x[MSG_SYS_reserve4A-74] + _ = x[MSG_SYS_reserve4B-75] + _ = x[MSG_SYS_reserve4C-76] + _ = x[MSG_SYS_reserve4D-77] + _ = x[MSG_SYS_reserve4E-78] + _ = x[MSG_SYS_reserve4F-79] + _ = x[MSG_SYS_INSERT_USER-80] + _ = x[MSG_SYS_DELETE_USER-81] + _ = x[MSG_SYS_SET_USER_BINARY-82] + _ = x[MSG_SYS_GET_USER_BINARY-83] + _ = x[MSG_SYS_NOTIFY_USER_BINARY-84] + _ = x[MSG_SYS_reserve55-85] + _ = x[MSG_SYS_reserve56-86] + _ = x[MSG_SYS_reserve57-87] + _ = x[MSG_SYS_UPDATE_RIGHT-88] + _ = x[MSG_SYS_AUTH_QUERY-89] + _ = x[MSG_SYS_AUTH_DATA-90] + _ = x[MSG_SYS_AUTH_TERMINAL-91] + _ = x[MSG_SYS_reserve5C-92] + _ = x[MSG_SYS_RIGHTS_RELOAD-93] + _ = x[MSG_SYS_reserve5E-94] + _ = x[MSG_SYS_reserve5F-95] + _ = x[MSG_MHF_SAVEDATA-96] + _ = x[MSG_MHF_LOADDATA-97] + _ = x[MSG_MHF_LIST_MEMBER-98] + _ = x[MSG_MHF_OPR_MEMBER-99] + _ = x[MSG_MHF_ENUMERATE_DIST_ITEM-100] + _ = x[MSG_MHF_APPLY_DIST_ITEM-101] + _ = x[MSG_MHF_ACQUIRE_DIST_ITEM-102] + _ = x[MSG_MHF_GET_DIST_DESCRIPTION-103] + _ = x[MSG_MHF_SEND_MAIL-104] + _ = x[MSG_MHF_READ_MAIL-105] + _ = x[MSG_MHF_LIST_MAIL-106] + _ = x[MSG_MHF_OPRT_MAIL-107] + _ = x[MSG_MHF_LOAD_FAVORITE_QUEST-108] + _ = x[MSG_MHF_SAVE_FAVORITE_QUEST-109] + _ = x[MSG_MHF_REGISTER_EVENT-110] + _ = x[MSG_MHF_RELEASE_EVENT-111] + _ = x[MSG_MHF_TRANSIT_MESSAGE-112] + _ = x[MSG_SYS_reserve71-113] + _ = x[MSG_SYS_reserve72-114] + _ = x[MSG_SYS_reserve73-115] + _ = x[MSG_SYS_reserve74-116] + _ = x[MSG_SYS_reserve75-117] + _ = x[MSG_SYS_reserve76-118] + _ = x[MSG_SYS_reserve77-119] + _ = x[MSG_SYS_reserve78-120] + _ = x[MSG_SYS_reserve79-121] + _ = x[MSG_SYS_reserve7A-122] + _ = x[MSG_SYS_reserve7B-123] + _ = x[MSG_SYS_reserve7C-124] + _ = x[MSG_CA_EXCHANGE_ITEM-125] + _ = x[MSG_SYS_reserve7E-126] + _ = x[MSG_MHF_PRESENT_BOX-127] + _ = x[MSG_MHF_SERVER_COMMAND-128] + _ = x[MSG_MHF_SHUT_CLIENT-129] + _ = x[MSG_MHF_ANNOUNCE-130] + _ = x[MSG_MHF_SET_LOGINWINDOW-131] + _ = x[MSG_SYS_TRANS_BINARY-132] + _ = x[MSG_SYS_COLLECT_BINARY-133] + _ = x[MSG_SYS_GET_STATE-134] + _ = x[MSG_SYS_SERIALIZE-135] + _ = x[MSG_SYS_ENUMLOBBY-136] + _ = x[MSG_SYS_ENUMUSER-137] + _ = x[MSG_SYS_INFOKYSERVER-138] + _ = x[MSG_MHF_GET_CA_UNIQUE_ID-139] + _ = x[MSG_MHF_SET_CA_ACHIEVEMENT-140] + _ = x[MSG_MHF_CARAVAN_MY_SCORE-141] + _ = x[MSG_MHF_CARAVAN_RANKING-142] + _ = x[MSG_MHF_CARAVAN_MY_RANK-143] + _ = x[MSG_MHF_CREATE_GUILD-144] + _ = x[MSG_MHF_OPERATE_GUILD-145] + _ = x[MSG_MHF_OPERATE_GUILD_MEMBER-146] + _ = x[MSG_MHF_INFO_GUILD-147] + _ = x[MSG_MHF_ENUMERATE_GUILD-148] + _ = x[MSG_MHF_UPDATE_GUILD-149] + _ = x[MSG_MHF_ARRANGE_GUILD_MEMBER-150] + _ = x[MSG_MHF_ENUMERATE_GUILD_MEMBER-151] + _ = x[MSG_MHF_ENUMERATE_CAMPAIGN-152] + _ = x[MSG_MHF_STATE_CAMPAIGN-153] + _ = x[MSG_MHF_APPLY_CAMPAIGN-154] + _ = x[MSG_MHF_ENUMERATE_ITEM-155] + _ = x[MSG_MHF_ACQUIRE_ITEM-156] + _ = x[MSG_MHF_TRANSFER_ITEM-157] + _ = x[MSG_MHF_MERCENARY_HUNTDATA-158] + _ = x[MSG_MHF_ENTRY_ROOKIE_GUILD-159] + _ = x[MSG_MHF_ENUMERATE_QUEST-160] + _ = x[MSG_MHF_ENUMERATE_EVENT-161] + _ = x[MSG_MHF_ENUMERATE_PRICE-162] + _ = x[MSG_MHF_ENUMERATE_RANKING-163] + _ = x[MSG_MHF_ENUMERATE_ORDER-164] + _ = x[MSG_MHF_ENUMERATE_SHOP-165] + _ = x[MSG_MHF_GET_EXTRA_INFO-166] + _ = x[MSG_MHF_UPDATE_INTERIOR-167] + _ = x[MSG_MHF_ENUMERATE_HOUSE-168] + _ = x[MSG_MHF_UPDATE_HOUSE-169] + _ = x[MSG_MHF_LOAD_HOUSE-170] + _ = x[MSG_MHF_OPERATE_WAREHOUSE-171] + _ = x[MSG_MHF_ENUMERATE_WAREHOUSE-172] + _ = x[MSG_MHF_UPDATE_WAREHOUSE-173] + _ = x[MSG_MHF_ACQUIRE_TITLE-174] + _ = x[MSG_MHF_ENUMERATE_TITLE-175] + _ = x[MSG_MHF_ENUMERATE_GUILD_ITEM-176] + _ = x[MSG_MHF_UPDATE_GUILD_ITEM-177] + _ = x[MSG_MHF_ENUMERATE_UNION_ITEM-178] + _ = x[MSG_MHF_UPDATE_UNION_ITEM-179] + _ = x[MSG_MHF_CREATE_JOINT-180] + _ = x[MSG_MHF_OPERATE_JOINT-181] + _ = x[MSG_MHF_INFO_JOINT-182] + _ = x[MSG_MHF_UPDATE_GUILD_ICON-183] + _ = x[MSG_MHF_INFO_FESTA-184] + _ = x[MSG_MHF_ENTRY_FESTA-185] + _ = x[MSG_MHF_CHARGE_FESTA-186] + _ = x[MSG_MHF_ACQUIRE_FESTA-187] + _ = x[MSG_MHF_STATE_FESTA_U-188] + _ = x[MSG_MHF_STATE_FESTA_G-189] + _ = x[MSG_MHF_ENUMERATE_FESTA_MEMBER-190] + _ = x[MSG_MHF_VOTE_FESTA-191] + _ = x[MSG_MHF_ACQUIRE_CAFE_ITEM-192] + _ = x[MSG_MHF_UPDATE_CAFEPOINT-193] + _ = x[MSG_MHF_CHECK_DAILY_CAFEPOINT-194] + _ = x[MSG_MHF_GET_COG_INFO-195] + _ = x[MSG_MHF_CHECK_MONTHLY_ITEM-196] + _ = x[MSG_MHF_ACQUIRE_MONTHLY_ITEM-197] + _ = x[MSG_MHF_CHECK_WEEKLY_STAMP-198] + _ = x[MSG_MHF_EXCHANGE_WEEKLY_STAMP-199] + _ = x[MSG_MHF_CREATE_MERCENARY-200] + _ = x[MSG_MHF_SAVE_MERCENARY-201] + _ = x[MSG_MHF_READ_MERCENARY_W-202] + _ = x[MSG_MHF_READ_MERCENARY_M-203] + _ = x[MSG_MHF_CONTRACT_MERCENARY-204] + _ = x[MSG_MHF_ENUMERATE_MERCENARY_LOG-205] + _ = x[MSG_MHF_ENUMERATE_GUACOT-206] + _ = x[MSG_MHF_UPDATE_GUACOT-207] + _ = x[MSG_MHF_INFO_TOURNAMENT-208] + _ = x[MSG_MHF_ENTRY_TOURNAMENT-209] + _ = x[MSG_MHF_ENTER_TOURNAMENT_QUEST-210] + _ = x[MSG_MHF_ACQUIRE_TOURNAMENT-211] + _ = x[MSG_MHF_GET_ACHIEVEMENT-212] + _ = x[MSG_MHF_RESET_ACHIEVEMENT-213] + _ = x[MSG_MHF_ADD_ACHIEVEMENT-214] + _ = x[MSG_MHF_PAYMENT_ACHIEVEMENT-215] + _ = x[MSG_MHF_DISPLAYED_ACHIEVEMENT-216] + _ = x[MSG_MHF_INFO_SCENARIO_COUNTER-217] + _ = x[MSG_MHF_SAVE_SCENARIO_DATA-218] + _ = x[MSG_MHF_LOAD_SCENARIO_DATA-219] + _ = x[MSG_MHF_GET_BBS_SNS_STATUS-220] + _ = x[MSG_MHF_APPLY_BBS_ARTICLE-221] + _ = x[MSG_MHF_GET_ETC_POINTS-222] + _ = x[MSG_MHF_UPDATE_ETC_POINT-223] + _ = x[MSG_MHF_GET_MYHOUSE_INFO-224] + _ = x[MSG_MHF_UPDATE_MYHOUSE_INFO-225] + _ = x[MSG_MHF_GET_WEEKLY_SCHEDULE-226] + _ = x[MSG_MHF_ENUMERATE_INV_GUILD-227] + _ = x[MSG_MHF_OPERATION_INV_GUILD-228] + _ = x[MSG_MHF_STAMPCARD_STAMP-229] + _ = x[MSG_MHF_STAMPCARD_PRIZE-230] + _ = x[MSG_MHF_UNRESERVE_SRG-231] + _ = x[MSG_MHF_LOAD_PLATE_DATA-232] + _ = x[MSG_MHF_SAVE_PLATE_DATA-233] + _ = x[MSG_MHF_LOAD_PLATE_BOX-234] + _ = x[MSG_MHF_SAVE_PLATE_BOX-235] + _ = x[MSG_MHF_READ_GUILDCARD-236] + _ = x[MSG_MHF_UPDATE_GUILDCARD-237] + _ = x[MSG_MHF_READ_BEAT_LEVEL-238] + _ = x[MSG_MHF_UPDATE_BEAT_LEVEL-239] + _ = x[MSG_MHF_READ_BEAT_LEVEL_ALL_RANKING-240] + _ = x[MSG_MHF_READ_BEAT_LEVEL_MY_RANKING-241] + _ = x[MSG_MHF_READ_LAST_WEEK_BEAT_RANKING-242] + _ = x[MSG_MHF_ACCEPT_READ_REWARD-243] + _ = x[MSG_MHF_GET_ADDITIONAL_BEAT_REWARD-244] + _ = x[MSG_MHF_GET_FIXED_SEIBATU_RANKING_TABLE-245] + _ = x[MSG_MHF_GET_BBS_USER_STATUS-246] + _ = x[MSG_MHF_KICK_EXPORT_FORCE-247] + _ = x[MSG_MHF_GET_BREAK_SEIBATU_LEVEL_REWARD-248] + _ = x[MSG_MHF_GET_WEEKLY_SEIBATU_RANKING_REWARD-249] + _ = x[MSG_MHF_GET_EARTH_STATUS-250] + _ = x[MSG_MHF_LOAD_PARTNER-251] + _ = x[MSG_MHF_SAVE_PARTNER-252] + _ = x[MSG_MHF_GET_GUILD_MISSION_LIST-253] + _ = x[MSG_MHF_GET_GUILD_MISSION_RECORD-254] + _ = x[MSG_MHF_ADD_GUILD_MISSION_COUNT-255] + _ = x[MSG_MHF_SET_GUILD_MISSION_TARGET-256] + _ = x[MSG_MHF_CANCEL_GUILD_MISSION_TARGET-257] + _ = x[MSG_MHF_LOAD_OTOMO_AIROU-258] + _ = x[MSG_MHF_SAVE_OTOMO_AIROU-259] + _ = x[MSG_MHF_ENUMERATE_GUILD_TRESURE-260] + _ = x[MSG_MHF_ENUMERATE_AIROULIST-261] + _ = x[MSG_MHF_REGIST_GUILD_TRESURE-262] + _ = x[MSG_MHF_ACQUIRE_GUILD_TRESURE-263] + _ = x[MSG_MHF_OPERATE_GUILD_TRESURE_REPORT-264] + _ = x[MSG_MHF_GET_GUILD_TRESURE_SOUVENIR-265] + _ = x[MSG_MHF_ACQUIRE_GUILD_TRESURE_SOUVENIR-266] + _ = x[MSG_MHF_ENUMERATE_FESTA_INTERMEDIATE_PRIZE-267] + _ = x[MSG_MHF_ACQUIRE_FESTA_INTERMEDIATE_PRIZE-268] + _ = x[MSG_MHF_LOAD_DECO_MYSET-269] + _ = x[MSG_MHF_SAVE_DECO_MYSET-270] + _ = x[MSG_MHF_reserve010F-271] + _ = x[MSG_MHF_LOAD_GUILD_COOKING-272] + _ = x[MSG_MHF_REGIST_GUILD_COOKING-273] + _ = x[MSG_MHF_LOAD_GUILD_ADVENTURE-274] + _ = x[MSG_MHF_REGIST_GUILD_ADVENTURE-275] + _ = x[MSG_MHF_ACQUIRE_GUILD_ADVENTURE-276] + _ = x[MSG_MHF_CHARGE_GUILD_ADVENTURE-277] + _ = x[MSG_MHF_LOAD_LEGEND_DISPATCH-278] + _ = x[MSG_MHF_LOAD_HUNTER_NAVI-279] + _ = x[MSG_MHF_SAVE_HUNTER_NAVI-280] + _ = x[MSG_MHF_REGIST_SPABI_TIME-281] + _ = x[MSG_MHF_GET_GUILD_WEEKLY_BONUS_MASTER-282] + _ = x[MSG_MHF_GET_GUILD_WEEKLY_BONUS_ACTIVE_COUNT-283] + _ = x[MSG_MHF_ADD_GUILD_WEEKLY_BONUS_EXCEPTIONAL_USER-284] + _ = x[MSG_MHF_GET_TOWER_INFO-285] + _ = x[MSG_MHF_POST_TOWER_INFO-286] + _ = x[MSG_MHF_GET_GEM_INFO-287] + _ = x[MSG_MHF_POST_GEM_INFO-288] + _ = x[MSG_MHF_GET_EARTH_VALUE-289] + _ = x[MSG_MHF_DEBUG_POST_VALUE-290] + _ = x[MSG_MHF_GET_PAPER_DATA-291] + _ = x[MSG_MHF_GET_NOTICE-292] + _ = x[MSG_MHF_POST_NOTICE-293] + _ = x[MSG_MHF_GET_BOOST_TIME-294] + _ = x[MSG_MHF_POST_BOOST_TIME-295] + _ = x[MSG_MHF_GET_BOOST_TIME_LIMIT-296] + _ = x[MSG_MHF_POST_BOOST_TIME_LIMIT-297] + _ = x[MSG_MHF_ENUMERATE_FESTA_PERSONAL_PRIZE-298] + _ = x[MSG_MHF_ACQUIRE_FESTA_PERSONAL_PRIZE-299] + _ = x[MSG_MHF_GET_RAND_FROM_TABLE-300] + _ = x[MSG_MHF_GET_CAFE_DURATION-301] + _ = x[MSG_MHF_GET_CAFE_DURATION_BONUS_INFO-302] + _ = x[MSG_MHF_RECEIVE_CAFE_DURATION_BONUS-303] + _ = x[MSG_MHF_POST_CAFE_DURATION_BONUS_RECEIVED-304] + _ = x[MSG_MHF_GET_GACHA_POINT-305] + _ = x[MSG_MHF_USE_GACHA_POINT-306] + _ = x[MSG_MHF_EXCHANGE_FPOINT_2_ITEM-307] + _ = x[MSG_MHF_EXCHANGE_ITEM_2_FPOINT-308] + _ = x[MSG_MHF_GET_FPOINT_EXCHANGE_LIST-309] + _ = x[MSG_MHF_PLAY_STEPUP_GACHA-310] + _ = x[MSG_MHF_RECEIVE_GACHA_ITEM-311] + _ = x[MSG_MHF_GET_STEPUP_STATUS-312] + _ = x[MSG_MHF_PLAY_FREE_GACHA-313] + _ = x[MSG_MHF_GET_TINY_BIN-314] + _ = x[MSG_MHF_POST_TINY_BIN-315] + _ = x[MSG_MHF_GET_SENYU_DAILY_COUNT-316] + _ = x[MSG_MHF_GET_GUILD_TARGET_MEMBER_NUM-317] + _ = x[MSG_MHF_GET_BOOST_RIGHT-318] + _ = x[MSG_MHF_START_BOOST_TIME-319] + _ = x[MSG_MHF_POST_BOOST_TIME_QUEST_RETURN-320] + _ = x[MSG_MHF_GET_BOX_GACHA_INFO-321] + _ = x[MSG_MHF_PLAY_BOX_GACHA-322] + _ = x[MSG_MHF_RESET_BOX_GACHA_INFO-323] + _ = x[MSG_MHF_GET_SEIBATTLE-324] + _ = x[MSG_MHF_POST_SEIBATTLE-325] + _ = x[MSG_MHF_GET_RYOUDAMA-326] + _ = x[MSG_MHF_POST_RYOUDAMA-327] + _ = x[MSG_MHF_GET_TENROUIRAI-328] + _ = x[MSG_MHF_POST_TENROUIRAI-329] + _ = x[MSG_MHF_POST_GUILD_SCOUT-330] + _ = x[MSG_MHF_CANCEL_GUILD_SCOUT-331] + _ = x[MSG_MHF_ANSWER_GUILD_SCOUT-332] + _ = x[MSG_MHF_GET_GUILD_SCOUT_LIST-333] + _ = x[MSG_MHF_GET_GUILD_MANAGE_RIGHT-334] + _ = x[MSG_MHF_SET_GUILD_MANAGE_RIGHT-335] + _ = x[MSG_MHF_PLAY_NORMAL_GACHA-336] + _ = x[MSG_MHF_GET_DAILY_MISSION_MASTER-337] + _ = x[MSG_MHF_GET_DAILY_MISSION_PERSONAL-338] + _ = x[MSG_MHF_SET_DAILY_MISSION_PERSONAL-339] + _ = x[MSG_MHF_GET_GACHA_PLAY_HISTORY-340] + _ = x[MSG_MHF_GET_REJECT_GUILD_SCOUT-341] + _ = x[MSG_MHF_SET_REJECT_GUILD_SCOUT-342] + _ = x[MSG_MHF_GET_CA_ACHIEVEMENT_HIST-343] + _ = x[MSG_MHF_SET_CA_ACHIEVEMENT_HIST-344] + _ = x[MSG_MHF_GET_KEEP_LOGIN_BOOST_STATUS-345] + _ = x[MSG_MHF_USE_KEEP_LOGIN_BOOST-346] + _ = x[MSG_MHF_GET_UD_SCHEDULE-347] + _ = x[MSG_MHF_GET_UD_INFO-348] + _ = x[MSG_MHF_GET_KIJU_INFO-349] + _ = x[MSG_MHF_SET_KIJU-350] + _ = x[MSG_MHF_ADD_UD_POINT-351] + _ = x[MSG_MHF_GET_UD_MY_POINT-352] + _ = x[MSG_MHF_GET_UD_TOTAL_POINT_INFO-353] + _ = x[MSG_MHF_GET_UD_BONUS_QUEST_INFO-354] + _ = x[MSG_MHF_GET_UD_SELECTED_COLOR_INFO-355] + _ = x[MSG_MHF_GET_UD_MONSTER_POINT-356] + _ = x[MSG_MHF_GET_UD_DAILY_PRESENT_LIST-357] + _ = x[MSG_MHF_GET_UD_NORMA_PRESENT_LIST-358] + _ = x[MSG_MHF_GET_UD_RANKING_REWARD_LIST-359] + _ = x[MSG_MHF_ACQUIRE_UD_ITEM-360] + _ = x[MSG_MHF_GET_REWARD_SONG-361] + _ = x[MSG_MHF_USE_REWARD_SONG-362] + _ = x[MSG_MHF_ADD_REWARD_SONG_COUNT-363] + _ = x[MSG_MHF_GET_UD_RANKING-364] + _ = x[MSG_MHF_GET_UD_MY_RANKING-365] + _ = x[MSG_MHF_ACQUIRE_MONTHLY_REWARD-366] + _ = x[MSG_MHF_GET_UD_GUILD_MAP_INFO-367] + _ = x[MSG_MHF_GENERATE_UD_GUILD_MAP-368] + _ = x[MSG_MHF_GET_UD_TACTICS_POINT-369] + _ = x[MSG_MHF_ADD_UD_TACTICS_POINT-370] + _ = x[MSG_MHF_GET_UD_TACTICS_RANKING-371] + _ = x[MSG_MHF_GET_UD_TACTICS_REWARD_LIST-372] + _ = x[MSG_MHF_GET_UD_TACTICS_LOG-373] + _ = x[MSG_MHF_GET_EQUIP_SKIN_HIST-374] + _ = x[MSG_MHF_UPDATE_EQUIP_SKIN_HIST-375] + _ = x[MSG_MHF_GET_UD_TACTICS_FOLLOWER-376] + _ = x[MSG_MHF_SET_UD_TACTICS_FOLLOWER-377] + _ = x[MSG_MHF_GET_UD_SHOP_COIN-378] + _ = x[MSG_MHF_USE_UD_SHOP_COIN-379] + _ = x[MSG_MHF_GET_ENHANCED_MINIDATA-380] + _ = x[MSG_MHF_SET_ENHANCED_MINIDATA-381] + _ = x[MSG_MHF_SEX_CHANGER-382] + _ = x[MSG_MHF_GET_LOBBY_CROWD-383] + _ = x[MSG_SYS_reserve180-384] + _ = x[MSG_MHF_GUILD_HUNTDATA-385] + _ = x[MSG_MHF_ADD_KOURYOU_POINT-386] + _ = x[MSG_MHF_GET_KOURYOU_POINT-387] + _ = x[MSG_MHF_EXCHANGE_KOURYOU_POINT-388] + _ = x[MSG_MHF_GET_UD_TACTICS_BONUS_QUEST-389] + _ = x[MSG_MHF_GET_UD_TACTICS_FIRST_QUEST_BONUS-390] + _ = x[MSG_MHF_GET_UD_TACTICS_REMAINING_POINT-391] + _ = x[MSG_SYS_reserve188-392] + _ = x[MSG_MHF_LOAD_PLATE_MYSET-393] + _ = x[MSG_MHF_SAVE_PLATE_MYSET-394] + _ = x[MSG_SYS_reserve18B-395] + _ = x[MSG_MHF_GET_RESTRICTION_EVENT-396] + _ = x[MSG_MHF_SET_RESTRICTION_EVENT-397] + _ = x[MSG_SYS_reserve18E-398] + _ = x[MSG_SYS_reserve18F-399] + _ = x[MSG_MHF_GET_TREND_WEAPON-400] + _ = x[MSG_MHF_UPDATE_USE_TREND_WEAPON_LOG-401] + _ = x[MSG_SYS_reserve192-402] + _ = x[MSG_SYS_reserve193-403] + _ = x[MSG_SYS_reserve194-404] + _ = x[MSG_MHF_SAVE_RENGOKU_DATA-405] + _ = x[MSG_MHF_LOAD_RENGOKU_DATA-406] + _ = x[MSG_MHF_GET_RENGOKU_BINARY-407] + _ = x[MSG_MHF_ENUMERATE_RENGOKU_RANKING-408] + _ = x[MSG_MHF_GET_RENGOKU_RANKING_RANK-409] + _ = x[MSG_MHF_ACQUIRE_EXCHANGE_SHOP-410] + _ = x[MSG_SYS_reserve19B-411] + _ = x[MSG_MHF_SAVE_MEZFES_DATA-412] + _ = x[MSG_MHF_LOAD_MEZFES_DATA-413] + _ = x[MSG_SYS_reserve19E-414] + _ = x[MSG_SYS_reserve19F-415] + _ = x[MSG_MHF_UPDATE_FORCE_GUILD_RANK-416] + _ = x[MSG_MHF_RESET_TITLE-417] + _ = x[MSG_SYS_reserve202-418] + _ = x[MSG_SYS_reserve203-419] + _ = x[MSG_SYS_reserve204-420] + _ = x[MSG_SYS_reserve205-421] + _ = x[MSG_SYS_reserve206-422] + _ = x[MSG_SYS_reserve207-423] + _ = x[MSG_SYS_reserve208-424] + _ = x[MSG_SYS_reserve209-425] + _ = x[MSG_SYS_reserve20A-426] + _ = x[MSG_SYS_reserve20B-427] + _ = x[MSG_SYS_reserve20C-428] + _ = x[MSG_SYS_reserve20D-429] + _ = x[MSG_SYS_reserve20E-430] + _ = x[MSG_SYS_reserve20F-431] +} + +const _PacketID_name = "MSG_HEADMSG_SYS_reserve01MSG_SYS_reserve02MSG_SYS_reserve03MSG_SYS_reserve04MSG_SYS_reserve05MSG_SYS_reserve06MSG_SYS_reserve07MSG_SYS_ADD_OBJECTMSG_SYS_DEL_OBJECTMSG_SYS_DISP_OBJECTMSG_SYS_HIDE_OBJECTMSG_SYS_reserve0CMSG_SYS_reserve0DMSG_SYS_reserve0EMSG_SYS_EXTEND_THRESHOLDMSG_SYS_ENDMSG_SYS_NOPMSG_SYS_ACKMSG_SYS_TERMINAL_LOGMSG_SYS_LOGINMSG_SYS_LOGOUTMSG_SYS_SET_STATUSMSG_SYS_PINGMSG_SYS_CAST_BINARYMSG_SYS_HIDE_CLIENTMSG_SYS_TIMEMSG_SYS_CASTED_BINARYMSG_SYS_GET_FILEMSG_SYS_ISSUE_LOGKEYMSG_SYS_RECORD_LOGMSG_SYS_ECHOMSG_SYS_CREATE_STAGEMSG_SYS_STAGE_DESTRUCTMSG_SYS_ENTER_STAGEMSG_SYS_BACK_STAGEMSG_SYS_MOVE_STAGEMSG_SYS_LEAVE_STAGEMSG_SYS_LOCK_STAGEMSG_SYS_UNLOCK_STAGEMSG_SYS_RESERVE_STAGEMSG_SYS_UNRESERVE_STAGEMSG_SYS_SET_STAGE_PASSMSG_SYS_WAIT_STAGE_BINARYMSG_SYS_SET_STAGE_BINARYMSG_SYS_GET_STAGE_BINARYMSG_SYS_ENUMERATE_CLIENTMSG_SYS_ENUMERATE_STAGEMSG_SYS_CREATE_MUTEXMSG_SYS_CREATE_OPEN_MUTEXMSG_SYS_DELETE_MUTEXMSG_SYS_OPEN_MUTEXMSG_SYS_CLOSE_MUTEXMSG_SYS_CREATE_SEMAPHOREMSG_SYS_CREATE_ACQUIRE_SEMAPHOREMSG_SYS_DELETE_SEMAPHOREMSG_SYS_ACQUIRE_SEMAPHOREMSG_SYS_RELEASE_SEMAPHOREMSG_SYS_LOCK_GLOBAL_SEMAMSG_SYS_UNLOCK_GLOBAL_SEMAMSG_SYS_CHECK_SEMAPHOREMSG_SYS_OPERATE_REGISTERMSG_SYS_LOAD_REGISTERMSG_SYS_NOTIFY_REGISTERMSG_SYS_CREATE_OBJECTMSG_SYS_DELETE_OBJECTMSG_SYS_POSITION_OBJECTMSG_SYS_ROTATE_OBJECTMSG_SYS_DUPLICATE_OBJECTMSG_SYS_SET_OBJECT_BINARYMSG_SYS_GET_OBJECT_BINARYMSG_SYS_GET_OBJECT_OWNERMSG_SYS_UPDATE_OBJECT_BINARYMSG_SYS_CLEANUP_OBJECTMSG_SYS_reserve4AMSG_SYS_reserve4BMSG_SYS_reserve4CMSG_SYS_reserve4DMSG_SYS_reserve4EMSG_SYS_reserve4FMSG_SYS_INSERT_USERMSG_SYS_DELETE_USERMSG_SYS_SET_USER_BINARYMSG_SYS_GET_USER_BINARYMSG_SYS_NOTIFY_USER_BINARYMSG_SYS_reserve55MSG_SYS_reserve56MSG_SYS_reserve57MSG_SYS_UPDATE_RIGHTMSG_SYS_AUTH_QUERYMSG_SYS_AUTH_DATAMSG_SYS_AUTH_TERMINALMSG_SYS_reserve5CMSG_SYS_RIGHTS_RELOADMSG_SYS_reserve5EMSG_SYS_reserve5FMSG_MHF_SAVEDATAMSG_MHF_LOADDATAMSG_MHF_LIST_MEMBERMSG_MHF_OPR_MEMBERMSG_MHF_ENUMERATE_DIST_ITEMMSG_MHF_APPLY_DIST_ITEMMSG_MHF_ACQUIRE_DIST_ITEMMSG_MHF_GET_DIST_DESCRIPTIONMSG_MHF_SEND_MAILMSG_MHF_READ_MAILMSG_MHF_LIST_MAILMSG_MHF_OPRT_MAILMSG_MHF_LOAD_FAVORITE_QUESTMSG_MHF_SAVE_FAVORITE_QUESTMSG_MHF_REGISTER_EVENTMSG_MHF_RELEASE_EVENTMSG_MHF_TRANSIT_MESSAGEMSG_SYS_reserve71MSG_SYS_reserve72MSG_SYS_reserve73MSG_SYS_reserve74MSG_SYS_reserve75MSG_SYS_reserve76MSG_SYS_reserve77MSG_SYS_reserve78MSG_SYS_reserve79MSG_SYS_reserve7AMSG_SYS_reserve7BMSG_SYS_reserve7CMSG_CA_EXCHANGE_ITEMMSG_SYS_reserve7EMSG_MHF_PRESENT_BOXMSG_MHF_SERVER_COMMANDMSG_MHF_SHUT_CLIENTMSG_MHF_ANNOUNCEMSG_MHF_SET_LOGINWINDOWMSG_SYS_TRANS_BINARYMSG_SYS_COLLECT_BINARYMSG_SYS_GET_STATEMSG_SYS_SERIALIZEMSG_SYS_ENUMLOBBYMSG_SYS_ENUMUSERMSG_SYS_INFOKYSERVERMSG_MHF_GET_CA_UNIQUE_IDMSG_MHF_SET_CA_ACHIEVEMENTMSG_MHF_CARAVAN_MY_SCOREMSG_MHF_CARAVAN_RANKINGMSG_MHF_CARAVAN_MY_RANKMSG_MHF_CREATE_GUILDMSG_MHF_OPERATE_GUILDMSG_MHF_OPERATE_GUILD_MEMBERMSG_MHF_INFO_GUILDMSG_MHF_ENUMERATE_GUILDMSG_MHF_UPDATE_GUILDMSG_MHF_ARRANGE_GUILD_MEMBERMSG_MHF_ENUMERATE_GUILD_MEMBERMSG_MHF_ENUMERATE_CAMPAIGNMSG_MHF_STATE_CAMPAIGNMSG_MHF_APPLY_CAMPAIGNMSG_MHF_ENUMERATE_ITEMMSG_MHF_ACQUIRE_ITEMMSG_MHF_TRANSFER_ITEMMSG_MHF_MERCENARY_HUNTDATAMSG_MHF_ENTRY_ROOKIE_GUILDMSG_MHF_ENUMERATE_QUESTMSG_MHF_ENUMERATE_EVENTMSG_MHF_ENUMERATE_PRICEMSG_MHF_ENUMERATE_RANKINGMSG_MHF_ENUMERATE_ORDERMSG_MHF_ENUMERATE_SHOPMSG_MHF_GET_EXTRA_INFOMSG_MHF_UPDATE_INTERIORMSG_MHF_ENUMERATE_HOUSEMSG_MHF_UPDATE_HOUSEMSG_MHF_LOAD_HOUSEMSG_MHF_OPERATE_WAREHOUSEMSG_MHF_ENUMERATE_WAREHOUSEMSG_MHF_UPDATE_WAREHOUSEMSG_MHF_ACQUIRE_TITLEMSG_MHF_ENUMERATE_TITLEMSG_MHF_ENUMERATE_GUILD_ITEMMSG_MHF_UPDATE_GUILD_ITEMMSG_MHF_ENUMERATE_UNION_ITEMMSG_MHF_UPDATE_UNION_ITEMMSG_MHF_CREATE_JOINTMSG_MHF_OPERATE_JOINTMSG_MHF_INFO_JOINTMSG_MHF_UPDATE_GUILD_ICONMSG_MHF_INFO_FESTAMSG_MHF_ENTRY_FESTAMSG_MHF_CHARGE_FESTAMSG_MHF_ACQUIRE_FESTAMSG_MHF_STATE_FESTA_UMSG_MHF_STATE_FESTA_GMSG_MHF_ENUMERATE_FESTA_MEMBERMSG_MHF_VOTE_FESTAMSG_MHF_ACQUIRE_CAFE_ITEMMSG_MHF_UPDATE_CAFEPOINTMSG_MHF_CHECK_DAILY_CAFEPOINTMSG_MHF_GET_COG_INFOMSG_MHF_CHECK_MONTHLY_ITEMMSG_MHF_ACQUIRE_MONTHLY_ITEMMSG_MHF_CHECK_WEEKLY_STAMPMSG_MHF_EXCHANGE_WEEKLY_STAMPMSG_MHF_CREATE_MERCENARYMSG_MHF_SAVE_MERCENARYMSG_MHF_READ_MERCENARY_WMSG_MHF_READ_MERCENARY_MMSG_MHF_CONTRACT_MERCENARYMSG_MHF_ENUMERATE_MERCENARY_LOGMSG_MHF_ENUMERATE_GUACOTMSG_MHF_UPDATE_GUACOTMSG_MHF_INFO_TOURNAMENTMSG_MHF_ENTRY_TOURNAMENTMSG_MHF_ENTER_TOURNAMENT_QUESTMSG_MHF_ACQUIRE_TOURNAMENTMSG_MHF_GET_ACHIEVEMENTMSG_MHF_RESET_ACHIEVEMENTMSG_MHF_ADD_ACHIEVEMENTMSG_MHF_PAYMENT_ACHIEVEMENTMSG_MHF_DISPLAYED_ACHIEVEMENTMSG_MHF_INFO_SCENARIO_COUNTERMSG_MHF_SAVE_SCENARIO_DATAMSG_MHF_LOAD_SCENARIO_DATAMSG_MHF_GET_BBS_SNS_STATUSMSG_MHF_APPLY_BBS_ARTICLEMSG_MHF_GET_ETC_POINTSMSG_MHF_UPDATE_ETC_POINTMSG_MHF_GET_MYHOUSE_INFOMSG_MHF_UPDATE_MYHOUSE_INFOMSG_MHF_GET_WEEKLY_SCHEDULEMSG_MHF_ENUMERATE_INV_GUILDMSG_MHF_OPERATION_INV_GUILDMSG_MHF_STAMPCARD_STAMPMSG_MHF_STAMPCARD_PRIZEMSG_MHF_UNRESERVE_SRGMSG_MHF_LOAD_PLATE_DATAMSG_MHF_SAVE_PLATE_DATAMSG_MHF_LOAD_PLATE_BOXMSG_MHF_SAVE_PLATE_BOXMSG_MHF_READ_GUILDCARDMSG_MHF_UPDATE_GUILDCARDMSG_MHF_READ_BEAT_LEVELMSG_MHF_UPDATE_BEAT_LEVELMSG_MHF_READ_BEAT_LEVEL_ALL_RANKINGMSG_MHF_READ_BEAT_LEVEL_MY_RANKINGMSG_MHF_READ_LAST_WEEK_BEAT_RANKINGMSG_MHF_ACCEPT_READ_REWARDMSG_MHF_GET_ADDITIONAL_BEAT_REWARDMSG_MHF_GET_FIXED_SEIBATU_RANKING_TABLEMSG_MHF_GET_BBS_USER_STATUSMSG_MHF_KICK_EXPORT_FORCEMSG_MHF_GET_BREAK_SEIBATU_LEVEL_REWARDMSG_MHF_GET_WEEKLY_SEIBATU_RANKING_REWARDMSG_MHF_GET_EARTH_STATUSMSG_MHF_LOAD_PARTNERMSG_MHF_SAVE_PARTNERMSG_MHF_GET_GUILD_MISSION_LISTMSG_MHF_GET_GUILD_MISSION_RECORDMSG_MHF_ADD_GUILD_MISSION_COUNTMSG_MHF_SET_GUILD_MISSION_TARGETMSG_MHF_CANCEL_GUILD_MISSION_TARGETMSG_MHF_LOAD_OTOMO_AIROUMSG_MHF_SAVE_OTOMO_AIROUMSG_MHF_ENUMERATE_GUILD_TRESUREMSG_MHF_ENUMERATE_AIROULISTMSG_MHF_REGIST_GUILD_TRESUREMSG_MHF_ACQUIRE_GUILD_TRESUREMSG_MHF_OPERATE_GUILD_TRESURE_REPORTMSG_MHF_GET_GUILD_TRESURE_SOUVENIRMSG_MHF_ACQUIRE_GUILD_TRESURE_SOUVENIRMSG_MHF_ENUMERATE_FESTA_INTERMEDIATE_PRIZEMSG_MHF_ACQUIRE_FESTA_INTERMEDIATE_PRIZEMSG_MHF_LOAD_DECO_MYSETMSG_MHF_SAVE_DECO_MYSETMSG_MHF_reserve010FMSG_MHF_LOAD_GUILD_COOKINGMSG_MHF_REGIST_GUILD_COOKINGMSG_MHF_LOAD_GUILD_ADVENTUREMSG_MHF_REGIST_GUILD_ADVENTUREMSG_MHF_ACQUIRE_GUILD_ADVENTUREMSG_MHF_CHARGE_GUILD_ADVENTUREMSG_MHF_LOAD_LEGEND_DISPATCHMSG_MHF_LOAD_HUNTER_NAVIMSG_MHF_SAVE_HUNTER_NAVIMSG_MHF_REGIST_SPABI_TIMEMSG_MHF_GET_GUILD_WEEKLY_BONUS_MASTERMSG_MHF_GET_GUILD_WEEKLY_BONUS_ACTIVE_COUNTMSG_MHF_ADD_GUILD_WEEKLY_BONUS_EXCEPTIONAL_USERMSG_MHF_GET_TOWER_INFOMSG_MHF_POST_TOWER_INFOMSG_MHF_GET_GEM_INFOMSG_MHF_POST_GEM_INFOMSG_MHF_GET_EARTH_VALUEMSG_MHF_DEBUG_POST_VALUEMSG_MHF_GET_PAPER_DATAMSG_MHF_GET_NOTICEMSG_MHF_POST_NOTICEMSG_MHF_GET_BOOST_TIMEMSG_MHF_POST_BOOST_TIMEMSG_MHF_GET_BOOST_TIME_LIMITMSG_MHF_POST_BOOST_TIME_LIMITMSG_MHF_ENUMERATE_FESTA_PERSONAL_PRIZEMSG_MHF_ACQUIRE_FESTA_PERSONAL_PRIZEMSG_MHF_GET_RAND_FROM_TABLEMSG_MHF_GET_CAFE_DURATIONMSG_MHF_GET_CAFE_DURATION_BONUS_INFOMSG_MHF_RECEIVE_CAFE_DURATION_BONUSMSG_MHF_POST_CAFE_DURATION_BONUS_RECEIVEDMSG_MHF_GET_GACHA_POINTMSG_MHF_USE_GACHA_POINTMSG_MHF_EXCHANGE_FPOINT_2_ITEMMSG_MHF_EXCHANGE_ITEM_2_FPOINTMSG_MHF_GET_FPOINT_EXCHANGE_LISTMSG_MHF_PLAY_STEPUP_GACHAMSG_MHF_RECEIVE_GACHA_ITEMMSG_MHF_GET_STEPUP_STATUSMSG_MHF_PLAY_FREE_GACHAMSG_MHF_GET_TINY_BINMSG_MHF_POST_TINY_BINMSG_MHF_GET_SENYU_DAILY_COUNTMSG_MHF_GET_GUILD_TARGET_MEMBER_NUMMSG_MHF_GET_BOOST_RIGHTMSG_MHF_START_BOOST_TIMEMSG_MHF_POST_BOOST_TIME_QUEST_RETURNMSG_MHF_GET_BOX_GACHA_INFOMSG_MHF_PLAY_BOX_GACHAMSG_MHF_RESET_BOX_GACHA_INFOMSG_MHF_GET_SEIBATTLEMSG_MHF_POST_SEIBATTLEMSG_MHF_GET_RYOUDAMAMSG_MHF_POST_RYOUDAMAMSG_MHF_GET_TENROUIRAIMSG_MHF_POST_TENROUIRAIMSG_MHF_POST_GUILD_SCOUTMSG_MHF_CANCEL_GUILD_SCOUTMSG_MHF_ANSWER_GUILD_SCOUTMSG_MHF_GET_GUILD_SCOUT_LISTMSG_MHF_GET_GUILD_MANAGE_RIGHTMSG_MHF_SET_GUILD_MANAGE_RIGHTMSG_MHF_PLAY_NORMAL_GACHAMSG_MHF_GET_DAILY_MISSION_MASTERMSG_MHF_GET_DAILY_MISSION_PERSONALMSG_MHF_SET_DAILY_MISSION_PERSONALMSG_MHF_GET_GACHA_PLAY_HISTORYMSG_MHF_GET_REJECT_GUILD_SCOUTMSG_MHF_SET_REJECT_GUILD_SCOUTMSG_MHF_GET_CA_ACHIEVEMENT_HISTMSG_MHF_SET_CA_ACHIEVEMENT_HISTMSG_MHF_GET_KEEP_LOGIN_BOOST_STATUSMSG_MHF_USE_KEEP_LOGIN_BOOSTMSG_MHF_GET_UD_SCHEDULEMSG_MHF_GET_UD_INFOMSG_MHF_GET_KIJU_INFOMSG_MHF_SET_KIJUMSG_MHF_ADD_UD_POINTMSG_MHF_GET_UD_MY_POINTMSG_MHF_GET_UD_TOTAL_POINT_INFOMSG_MHF_GET_UD_BONUS_QUEST_INFOMSG_MHF_GET_UD_SELECTED_COLOR_INFOMSG_MHF_GET_UD_MONSTER_POINTMSG_MHF_GET_UD_DAILY_PRESENT_LISTMSG_MHF_GET_UD_NORMA_PRESENT_LISTMSG_MHF_GET_UD_RANKING_REWARD_LISTMSG_MHF_ACQUIRE_UD_ITEMMSG_MHF_GET_REWARD_SONGMSG_MHF_USE_REWARD_SONGMSG_MHF_ADD_REWARD_SONG_COUNTMSG_MHF_GET_UD_RANKINGMSG_MHF_GET_UD_MY_RANKINGMSG_MHF_ACQUIRE_MONTHLY_REWARDMSG_MHF_GET_UD_GUILD_MAP_INFOMSG_MHF_GENERATE_UD_GUILD_MAPMSG_MHF_GET_UD_TACTICS_POINTMSG_MHF_ADD_UD_TACTICS_POINTMSG_MHF_GET_UD_TACTICS_RANKINGMSG_MHF_GET_UD_TACTICS_REWARD_LISTMSG_MHF_GET_UD_TACTICS_LOGMSG_MHF_GET_EQUIP_SKIN_HISTMSG_MHF_UPDATE_EQUIP_SKIN_HISTMSG_MHF_GET_UD_TACTICS_FOLLOWERMSG_MHF_SET_UD_TACTICS_FOLLOWERMSG_MHF_GET_UD_SHOP_COINMSG_MHF_USE_UD_SHOP_COINMSG_MHF_GET_ENHANCED_MINIDATAMSG_MHF_SET_ENHANCED_MINIDATAMSG_MHF_SEX_CHANGERMSG_MHF_GET_LOBBY_CROWDMSG_SYS_reserve180MSG_MHF_GUILD_HUNTDATAMSG_MHF_ADD_KOURYOU_POINTMSG_MHF_GET_KOURYOU_POINTMSG_MHF_EXCHANGE_KOURYOU_POINTMSG_MHF_GET_UD_TACTICS_BONUS_QUESTMSG_MHF_GET_UD_TACTICS_FIRST_QUEST_BONUSMSG_MHF_GET_UD_TACTICS_REMAINING_POINTMSG_SYS_reserve188MSG_MHF_LOAD_PLATE_MYSETMSG_MHF_SAVE_PLATE_MYSETMSG_SYS_reserve18BMSG_MHF_GET_RESTRICTION_EVENTMSG_MHF_SET_RESTRICTION_EVENTMSG_SYS_reserve18EMSG_SYS_reserve18FMSG_MHF_GET_TREND_WEAPONMSG_MHF_UPDATE_USE_TREND_WEAPON_LOGMSG_SYS_reserve192MSG_SYS_reserve193MSG_SYS_reserve194MSG_MHF_SAVE_RENGOKU_DATAMSG_MHF_LOAD_RENGOKU_DATAMSG_MHF_GET_RENGOKU_BINARYMSG_MHF_ENUMERATE_RENGOKU_RANKINGMSG_MHF_GET_RENGOKU_RANKING_RANKMSG_MHF_ACQUIRE_EXCHANGE_SHOPMSG_SYS_reserve19BMSG_MHF_SAVE_MEZFES_DATAMSG_MHF_LOAD_MEZFES_DATAMSG_SYS_reserve19EMSG_SYS_reserve19FMSG_MHF_UPDATE_FORCE_GUILD_RANKMSG_MHF_RESET_TITLEMSG_SYS_reserve202MSG_SYS_reserve203MSG_SYS_reserve204MSG_SYS_reserve205MSG_SYS_reserve206MSG_SYS_reserve207MSG_SYS_reserve208MSG_SYS_reserve209MSG_SYS_reserve20AMSG_SYS_reserve20BMSG_SYS_reserve20CMSG_SYS_reserve20DMSG_SYS_reserve20EMSG_SYS_reserve20F" + +var _PacketID_index = [...]uint16{0, 8, 25, 42, 59, 76, 93, 110, 127, 145, 163, 182, 201, 218, 235, 252, 276, 287, 298, 309, 329, 342, 356, 374, 386, 405, 424, 436, 457, 473, 493, 511, 523, 543, 565, 584, 602, 620, 639, 657, 677, 698, 721, 743, 768, 792, 816, 840, 863, 883, 908, 928, 946, 965, 989, 1021, 1045, 1070, 1095, 1119, 1145, 1168, 1192, 1213, 1236, 1257, 1278, 1301, 1322, 1346, 1371, 1396, 1420, 1448, 1470, 1487, 1504, 1521, 1538, 1555, 1572, 1591, 1610, 1633, 1656, 1682, 1699, 1716, 1733, 1753, 1771, 1788, 1809, 1826, 1847, 1864, 1881, 1897, 1913, 1932, 1950, 1977, 2000, 2025, 2053, 2070, 2087, 2104, 2121, 2148, 2175, 2197, 2218, 2241, 2258, 2275, 2292, 2309, 2326, 2343, 2360, 2377, 2394, 2411, 2428, 2445, 2465, 2482, 2501, 2523, 2542, 2558, 2581, 2601, 2623, 2640, 2657, 2674, 2690, 2710, 2734, 2760, 2784, 2807, 2830, 2850, 2871, 2899, 2917, 2940, 2960, 2988, 3018, 3044, 3066, 3088, 3110, 3130, 3151, 3177, 3203, 3226, 3249, 3272, 3297, 3320, 3342, 3364, 3387, 3410, 3430, 3448, 3473, 3500, 3524, 3545, 3568, 3596, 3621, 3649, 3674, 3694, 3715, 3733, 3758, 3776, 3795, 3815, 3836, 3857, 3878, 3908, 3926, 3951, 3975, 4004, 4024, 4050, 4078, 4104, 4133, 4157, 4179, 4203, 4227, 4253, 4284, 4308, 4329, 4352, 4376, 4406, 4432, 4455, 4480, 4503, 4530, 4559, 4588, 4614, 4640, 4666, 4691, 4713, 4737, 4761, 4788, 4815, 4842, 4869, 4892, 4915, 4936, 4959, 4982, 5004, 5026, 5048, 5072, 5095, 5120, 5155, 5189, 5224, 5250, 5284, 5323, 5350, 5375, 5413, 5454, 5478, 5498, 5518, 5548, 5580, 5611, 5643, 5678, 5702, 5726, 5757, 5784, 5812, 5841, 5877, 5911, 5949, 5991, 6031, 6054, 6077, 6096, 6122, 6150, 6178, 6208, 6239, 6269, 6297, 6321, 6345, 6370, 6407, 6450, 6497, 6519, 6542, 6562, 6583, 6606, 6630, 6652, 6670, 6689, 6711, 6734, 6762, 6791, 6829, 6865, 6892, 6917, 6953, 6988, 7029, 7052, 7075, 7105, 7135, 7167, 7192, 7218, 7243, 7266, 7286, 7307, 7336, 7371, 7394, 7418, 7454, 7480, 7502, 7530, 7551, 7573, 7593, 7614, 7636, 7659, 7683, 7709, 7735, 7763, 7793, 7823, 7848, 7880, 7914, 7948, 7978, 8008, 8038, 8069, 8100, 8135, 8163, 8186, 8205, 8226, 8242, 8262, 8285, 8316, 8347, 8381, 8409, 8442, 8475, 8509, 8532, 8555, 8578, 8607, 8629, 8654, 8684, 8713, 8742, 8770, 8798, 8828, 8862, 8888, 8915, 8945, 8976, 9007, 9031, 9055, 9084, 9113, 9132, 9155, 9173, 9195, 9220, 9245, 9275, 9309, 9349, 9387, 9405, 9429, 9453, 9471, 9500, 9529, 9547, 9565, 9589, 9624, 9642, 9660, 9678, 9703, 9728, 9754, 9787, 9819, 9848, 9866, 9890, 9914, 9932, 9950, 9981, 10000, 10018, 10036, 10054, 10072, 10090, 10108, 10126, 10144, 10162, 10180, 10198, 10216, 10234, 10252} + +func (i PacketID) String() string { + if i >= PacketID(len(_PacketID_index)-1) { + return "PacketID(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _PacketID_name[_PacketID_index[i]:_PacketID_index[i+1]] +} diff --git a/sign_server.go b/sign_server.go index 0e267b1b8..aee31cc32 100644 --- a/sign_server.go +++ b/sign_server.go @@ -9,6 +9,20 @@ import ( "github.com/Andoryuuta/byteframe" ) +/* +var conf *config.Config + +func init() { + c, err := config.LoadConfig("config.toml") + if err != nil { + panic(err) + } + + conf = c + +} +*/ + func paddedString(x string, size uint) []byte { out := make([]byte, size) copy(out, x) @@ -31,6 +45,10 @@ func uint16PascalString(bf *byteframe.ByteFrame, x string) { func makeSignInResp(username string) []byte { bf := byteframe.NewByteFrame() + // delete me: + //bf.WriteUint8(8) + //return bf.Data() + bf.WriteUint8(1) // resp_code bf.WriteUint8(0) // file/patch server count bf.WriteUint8(1) // entrance server count @@ -44,17 +62,65 @@ func makeSignInResp(username string) []byte { // Array(this.entrance_server_count, PascalString(Byte, "utf8")), uint8PascalString(bf, "localhost:53310") + /////////////////////////// // Characters: - bf.WriteUint32(1039336769) // character ID - bf.WriteUint16(30) - bf.WriteUint16(7) - bf.WriteUint32(1576761172) - bf.WriteUint8(0) - bf.WriteUint8(0) - bf.WriteUint8(0) - bf.WriteUint8(0) - bf.WriteBytes(paddedString("username", 16)) - bf.WriteBytes(paddedString("", 32)) + + /* + tab = '123456789ABCDEFGHJKLMNPQRTUVWXYZ' + def make_uid_str(cid): + out = '' + for i in range(6): + v = (cid>>5*i) + out += tab[v&0x1f] + return out + + def make_cid_int(uid): + v = 0 + for c in uid[::-1]: + idx = tab.find(c) + if idx == -1: + raise Exception("not in tab") + v |= idx + v = v<<5 + return v>>5 + */ + bf.WriteUint32(469153291) // character ID 469153291 + bf.WriteUint16(30) // Exp, HR[x] is split by 0, 1, 30, 50, 99, 299, 998, 999 + + /* + 0=大劍/Big sword + 1=重弩/Heavy crossbow + 2=大錘/Sledgehammer + 3=長槍/Spear + 4=單手劍/One-handed sword + 5=輕弩/Light crossbow + 6=雙劍/Double sword + 7=太刀/Tadao + 8=狩獵笛/Hunting flute + 9=銃槍/Shotgun + 10=弓/bow + 11=穿龍棍/Wear a dragon stick + 12=斬擊斧F/Chopping Axe F + 13=--- + default=不明/unknown + */ + bf.WriteUint16(7) // Weapon, 0-13. + + bf.WriteUint32(1576761172) // Last login date, unix timestamp in seconds. + bf.WriteUint8(1) // Sex, 0=male, 1=female. + bf.WriteUint8(0) // Is new character, 1 replaces character name with ?????. + grMode := uint8(0) + bf.WriteUint8(1) // GR level if grMode == 0 + bf.WriteUint8(grMode) // GR mode. + bf.WriteBytes(paddedString(username, 16)) // Character name + bf.WriteBytes(paddedString("0", 32)) // unk str + if grMode == 1 { + bf.WriteUint16(55) // GR level override. + bf.WriteUint8(0) // unk + bf.WriteUint8(0) // unk + } + + ////////////////////////// bf.WriteUint8(0) // friends_list_count bf.WriteUint8(0) // guild_members_count diff --git a/test.py b/test.py index 5e6e70e4d..4ee2f479a 100644 --- a/test.py +++ b/test.py @@ -1,4 +1,5 @@ from hexdump import hexdump +import io import sys ENCRYPT_KEY = b'\x90\x51\x26\x25\x04\xBF\xCF\x4C\x92\x02\x52\x7A\x70\x1A\x41\x88\x8C\xC2\xCE\xB8\xF6\x57\x7E\xBA\x83\x63\x2C\x24\x9A\x67\x86\x0C\xBE\x72\xFD\xB6\x7B\x79\xB0\x22\x5A\x60\x5C\x4F\x49\xE2\x0E\xF5\x3A\x81\xAE\x11\x6B\xF0\xA1\x01\xE8\x65\x8D\x5B\xDC\xCC\x93\x18\xB3\xAB\x77\xF7\x8E\xEC\xEF\x05\x00\xCA\x4E\xA7\xBC\xB5\x10\xC6\x6C\xC0\xC4\xE5\x87\x3F\xC1\x82\x29\x96\x45\x73\x07\xCB\x43\xF9\xF3\x08\x89\xD0\x99\x6A\x3B\x37\x19\xD4\x40\xEA\xD7\x85\x16\x66\x1E\x9C\x39\xBB\xEE\x4A\x03\x8A\x36\x2D\x13\x1D\x56\x48\xC7\x0D\x59\xB2\x44\xA3\xFE\x8B\x32\x1B\x84\xA0\x2E\x62\x17\x42\xB9\x9B\x2B\x75\xD8\x1C\x3C\x4D\x76\x27\x6E\x28\xD3\x33\xC3\x21\xAF\x34\x23\xDD\x68\x9F\xF1\xAD\xE1\xB4\xE7\xA6\x74\x15\x4B\xFA\x3D\x5F\x7C\xDA\x2F\x0A\xE3\x7D\xC8\xB7\x12\x6F\x9E\xA9\x14\x53\x97\x8F\x64\xF4\xF8\xA2\xA4\x2A\xD2\x47\x9D\x71\xC5\xE9\x06\x98\x20\x54\x80\xAA\xF2\xAC\x50\xD6\x7F\xD9\xC9\xCD\x69\x46\x6D\x30\xB1\x58\x0B\x55\xD1\x5D\xD5\xBD\x31\xDE\xA5\xE4\x91\x0F\x61\x38\xDF\xA8\xE6\x3E\x1F\x35\xED\xDB\x94\xEB\x09\x5E\x95\xFB\xFC\xE0\x78\xFF' @@ -109,6 +110,42 @@ Binary8Header = Struct( "checksum" / Int32ub, ) +EntranceListComplete = Struct( + Embedded(Binary8Header), + "servers" / Array(this.entry_count, + Struct( + "host_ip_4byte" / Int32ub, + "unk_1" / Int16ub, # Server ID maybe? + "unk_2" / Int16ub, + "channel_count" / Int16ub, + "unk_4" / Byte, + "unk_5" / Byte, + "unk_6" / Byte, + "name" / Bytes(66), # Shift-JIS. + "unk_trailer" / Int32ub, # THIS ONLY EXISTS IF Binary8Header.type == "SV2", NOT "SVR"! + "channels" / Array(this.channel_count, + Struct( + "port" / Int16ub, + "unk_1" / Int16ub, # Channel ID maybe? + "max_players" / Int16ub, + "current_players" / Int16ub, + "unk_4" / Int16ub, + "unk_5" / Int16ub, + "unk_6" / Int16ub, + "unk_7" / Int16ub, + "unk_8" / Int16ub, + "unk_9" / Int16ub, + "unk_10" / Int16ub, + "unk_11" / Int16ub, + "unk_12" / Int16ub, + "unk_13" / Int16ub, + ) + ), + ) + ), +) + + BINARY8_KEY = bytes([0x01, 0x23, 0x34, 0x45, 0x56, 0xAB, 0xCD, 0xEF]) def decode_binary8(data, unk_key_byte): cur_key = ((54323 * unk_key_byte) + 1) & 0xFFFFFFFF @@ -134,7 +171,24 @@ def encode_binary8(data, unk_key_byte): SUM32_TABLE_0 = bytes([0x35, 0x7A, 0xAA, 0x97, 0x53, 0x66, 0x12]) SUM32_TABLE_1 = bytes([0x7A, 0xAA, 0x97, 0x53, 0x66, 0x12, 0xDE, 0xDE, 0x35]) -# BROKEN!!!: +def calc_sum32(data): + length = len(data) + + t0_i = length & 0xFF + t1_i = data[length >> 1] + + out = bytearray(4) + for i in range(len(data)): + t0_i += 1 + t1_i += 1 + + tmp = (SUM32_TABLE_1[t1_i % 9] ^ SUM32_TABLE_0[t0_i % 7]) ^ data[i] + out[i & 3] = (out[i & 3] + tmp) & 0xFF + + return Int32ub.parse(out) + +""" +# WARNING: Possibly broken?: def calc_sum32(data): t0_i = len(data) t1_i = data[(len(data) >> 1)+1] @@ -147,7 +201,8 @@ def calc_sum32(data): t1_i += 1 - return Int32ul.parse(out) + return Int32ub.parse(out) +""" def read_binary8_part(stream): # Read the header and decrypt the header first to get the size. @@ -160,24 +215,121 @@ def read_binary8_part(stream): enc_bytes.extend(body_bytes) dec_bytes = decode_binary8(enc_bytes[1:], enc_bytes[0]) - reenc_bytes = encode_binary8(dec_bytes, enc_bytes[0]) - - import zlib - print("Good: {}".format(zlib.crc32(enc_bytes[1:]) == zlib.crc32(reenc_bytes))) - print("calc_sum32: {:X}".format(calc_sum32(dec_bytes[11:]))) - print("header checksum: {:X}".format(header.checksum)) - # Then return the parsed header and just the raw body data. - return (header, dec_bytes[11:]) + return (enc_bytes[0], header, dec_bytes[11:], dec_bytes) + +def write_binary8_part(key, server_type, entry_count, payload): + body = Binary8Header.build(dict( + server_type=server_type, + entry_count=entry_count, + body_size=len(payload), + checksum=calc_sum32(payload), + )) + + temp = bytearray() + temp.extend(body) + temp.extend(payload) + + out = bytearray() + out.append(key) + out.extend(encode_binary8(temp, key)) + + return out + + +def pad_bytes_to_len(b, length): + out = bytearray(b) + diff = length-len(out) + out.extend(bytearray(diff)) + return bytes(out) + + + +def make_custom_entrance_server_resp(): + # Get the userinfo_data + with open('tw_server_list_resp.bin', 'rb') as f: + (key, header, data, raw_dec_bytes) = read_binary8_part(f) + userinfo_data = f.read() + + + data = EntranceListComplete.build(dict( + server_type = b'SV2', + entry_count = 1, + body_size = 0xFFFF, + checksum = 0xFFFFFFFF, + servers = [dict( + host_ip_4byte = 0x0100007F, #0x7F000001,#3377555739, + unk_1 = 16, + unk_2 = 0, + channel_count = 1, + unk_4 = 3, + unk_5 = 0, + unk_6 = 2, + name = pad_bytes_to_len("AErupe Server @localhost".encode('shift-jis'), 66), + unk_trailer = 0, + channels = [dict( + port = 54001, + unk_1 = 16, + max_players = 100, + current_players = 0, + unk_4 = 0, + unk_5 = 0, + unk_6 = 0, + unk_7 = 0, + unk_8 = 0, + unk_9 = 0, + unk_10 = 319, + unk_11 = 248,#254, + unk_12 = 159,#255, + unk_13 = 12345 + )], + )] + )) + + print(data) + + reencoded = write_binary8_part(0, b'SV2', 1, data[11:]) + with open('custom_entrance_server_resp.bin', 'wb') as f: + f.write(reencoded) + f.write(userinfo_data) + + + with open('custom_entrance_server_resp.bin', 'rb') as f: + (key, header, data, raw_dec_bytes) = read_binary8_part(f) + print(EntranceListComplete.parse(raw_dec_bytes[0:])) + + + + +make_custom_entrance_server_resp() + """ with open('tw_server_list_resp.bin', 'rb') as f: - (header, data) = read_binary8_part(f) - from hexdump import hexdump - hexdump(data[:16]) - print(len(data)) + (key, header, data, raw_dec_bytes) = read_binary8_part(f) + print(EntranceListComplete.parse(raw_dec_bytes[0:])) +""" + +""" +with open('tw_server_list_resp.bin', 'rb') as f: + filedata = f.read() + + rdr = io.BytesIO(filedata) + + (key, header, data, raw_dec_bytes) = read_binary8_part(rdr) + userinfo_data = rdr.read() + + reencoded = write_binary8_part(key, header.server_type, header.entry_count, data) + + + hexdump(reencoded[:16]) + hexdump(filedata[:16]) + +""" + """ with open('dec_bin8_data_dump.bin', 'rb') as f: print("calc_sum32: {:X}".format(calc_sum32(f.read()))) - print("want: 74EF4928") \ No newline at end of file + print("want: 74EF4928") +""" \ No newline at end of file