From 56e1ac61feafccd7c9b7ab05facd85c1b3d30e6a Mon Sep 17 00:00:00 2001 From: wishu Date: Wed, 6 Jul 2022 00:19:15 +1000 Subject: [PATCH] mezfes patch --- Erupe/config.json | 255 +++++++++-------------- Erupe/config/config.go | 25 +-- Erupe/main.go | 94 +++------ Erupe/server/entranceserver/make_resp.go | 21 +- Erupe/server/signserver/dsgn_resp.go | 76 ++++--- 5 files changed, 193 insertions(+), 278 deletions(-) diff --git a/Erupe/config.json b/Erupe/config.json index 0c78d7bf5..5439d20f9 100644 --- a/Erupe/config.json +++ b/Erupe/config.json @@ -1,156 +1,105 @@ { - "host_ip": "", - "bin_path": "bin", - "devmode": true, - "devmodeoptions": { - "serverName" : "", - "cleandb": false, - "maxlauncherhr": true, - "LogOutboundMessages": false, - "Event": 0, - "OpcodeMessages": false, - "SaveDumps": { - "Enabled": true, - "OutputDir": "savedata" - } - - }, - "discord": { - "enabled": false, - "bottoken": "", - "realtimeChannelID": "", - "serverId": "", - "devRoles": [], - "devMode": false - }, - "database": { - "host": "localhost", - "port": 5432, - "user": "postgres", - "password": "", - "database": "erupe" - }, - "launcher": { - "port": 80, - "UseOriginalLauncherFiles": false - }, - "sign": { - "port": 53312 - }, - "channel": { - "port1": 54001, - "port2": 54002, - "port3": 54003, - "port4": 54004 - }, - "entrance": { - "port": 53310, - "entries": [ - { - "name": " Server #1", - "ip": "", - "unk2": 0, - "type": 3, - "season": 3, - "unk6": 0, - "allowedclientflags": "4096", - "channels": [ - { - "port": 54001, - "MaxPlayers": 100, - "CurrentPlayers": 0, - "Unk4": 0, - "Unk5": 0, - "Unk6": 0, - "Unk7": 0, - "Unk8": 0, - "Unk9": 0, - "Unk10": 319, - "Unk11": 248, - "Unk12": 159, - "Unk13": 12345 - } - ] - }, - { - "name": " Server #2", - "ip": "", - "unk2": 0, - "type": 1, - "season": 3, - "unk6": 0, - "allowedclientflags": 0, - "channels": [ - { - "port": 54002, - "MaxPlayers": 50, - "CurrentPlayers": 0, - "Unk4": 0, - "Unk5": 0, - "Unk6": 0, - "Unk7": 0, - "Unk8": 0, - "Unk9": 0, - "Unk10": 318, - "Unk11": 251, - "Unk12": 155, - "Unk13": 12345 - } - ] - }, - { - "name": " Server #3", - "ip": "", - "unk2": 0, - "type": 2, - "season": 1, - "unk6": 0, - "allowedclientflags": 0, - "channels": [ - { - "port": 54003, - "MaxPlayers": 50, - "CurrentPlayers": 0, - "Unk4": 0, - "Unk5": 0, - "Unk6": 0, - "Unk7": 0, - "Unk8": 0, - "Unk9": 0, - "Unk10": 318, - "Unk11": 251, - "Unk12": 155, - "Unk13": 12345 - } - ] - }, - { - "name": " Server #4", - "ip": "", - "unk2": 0, - "type": 4, - "season": 0, - "unk6": 0, - "allowedclientflags": 0, - "channels": [ - { - "port": 54004, - "MaxPlayers": 50, - "CurrentPlayers": 0, - "Unk4": 0, - "Unk5": 0, - "Unk6": 0, - "Unk7": 0, - "Unk8": 0, - "Unk9": 0, - "Unk10": 318, - "Unk11": 251, - "Unk12": 155, - "Unk13": 12345 - } - ] - - } - ] + "host_ip": "", + "bin_path": "bin", + "devmode": true, + "devmodeoptions": { + "serverName" : "", + "cleandb": false, + "maxlauncherhr": true, + "LogOutboundMessages": false, + "Event": 0, + "OpcodeMessages": false, + "SaveDumps": { + "Enabled": true, + "OutputDir": "savedata" } + }, + "discord": { + "enabled": false, + "bottoken": "", + "realtimeChannelID": "", + "serverId": "", + "devRoles": [], + "devMode": false + }, + "database": { + "host": "localhost", + "port": 5432, + "user": "postgres", + "password": "", + "database": "erupe" + }, + "launcher": { + "port": 80, + "UseOriginalLauncherFiles": false + }, + "sign": { + "port": 53312 + }, + "entrance": { + "port": 53310, + "entries": [ + { + "name": "ANewbie", + "ip": "", + "type": 3, + "recommended": 1, + "season": 3, + "allowedclientflags": 4096, + "channels": [ + { "port": 54001, "MaxPlayers": 50, "Unk0": 319, "Unk1": 252, "Unk2": 248 } + ] + }, { + "name": "ANormal", + "ip": "", + "type": 1, + "recommended": 0, + "season": 3, + "allowedclientflags": 0, + "channels": [ + { "port": 54002, "MaxPlayers": 50, "Unk0": 319, "Unk1": 252, "Unk2": 248 } + ] + }, { + "name": "ACities", + "ip": "", + "type": 2, + "recommended": 1, + "season": 3, + "allowedclientflags": 0, + "channels": [ + { "port": 54003, "MaxPlayers": 50, "Unk0": 319, "Unk1": 252, "Unk2": 248 } + ] + }, { + "name": "ATavern", + "ip": "", + "type": 4, + "recommended": 1, + "season": 3, + "allowedclientflags": 0, + "channels": [ + { "port": 54004, "MaxPlayers": 50, "Unk0": 319, "Unk1": 252, "Unk2": 248 } + ] + }, { + "name": "AReturn", + "ip": "", + "type": 5, + "recommended": 1, + "season": 3, + "allowedclientflags": 0, + "channels": [ + { "port": 54005, "MaxPlayers": 50, "Unk0": 319, "Unk1": 252, "Unk2": 248 } + ] + }, { + "name": "AMezFes", + "ip": "", + "type": 6, + "recommended": 1, + "season": 3, + "allowedclientflags": 0, + "channels": [ + { "port": 54006, "MaxPlayers": 50, "Unk0": 319, "Unk1": 252, "Unk2": 248 } + ] + } + ] + } } \ No newline at end of file diff --git a/Erupe/config/config.go b/Erupe/config/config.go index bfb09134e..8dae16b4f 100644 --- a/Erupe/config/config.go +++ b/Erupe/config/config.go @@ -18,7 +18,6 @@ type Config struct { Database Database Launcher Launcher Sign Sign - Channel Channel Entrance Entrance } @@ -69,14 +68,6 @@ type Sign struct { Port int } -// Channel holds the channel server config. -type Channel struct { - Port1 int - Port2 int - Port3 int - Port4 int -} - // Entrance holds the entrance server config. type Entrance struct { Port uint16 @@ -86,10 +77,9 @@ type Entrance struct { // EntranceServerInfo represents an entry in the serverlist. type EntranceServerInfo struct { IP string - Unk2 uint16 Type uint8 // Server type. 0=?, 1=open, 2=cities, 3=newbie, 4=bar Season uint8 // Server activity. 0 = green, 1 = orange, 2 = blue - Unk6 uint8 // Something to do with server recommendation on 0, 3, and 5. + Recommended uint8 // Something to do with server recommendation on 0, 3, and 5. Name string // Server name, 66 byte null terminated Shift-JIS(JP) or Big5(TW). // 4096(PC, PS3/PS4)?, 8258(PC, PS3/PS4)?, 8192 == nothing? @@ -104,16 +94,9 @@ type EntranceChannelInfo struct { Port uint16 MaxPlayers uint16 CurrentPlayers uint16 - Unk4 uint16 - Unk5 uint16 - Unk6 uint16 - Unk7 uint16 - Unk8 uint16 - Unk9 uint16 - Unk10 uint16 - Unk11 uint16 - Unk12 uint16 - Unk13 uint16 + Unk0 uint16 + Unk1 uint16 + Unk2 uint16 } // getOutboundIP4 gets the preferred outbound ip4 of this machine diff --git a/Erupe/main.go b/Erupe/main.go index 9dd78e76c..738387a7d 100644 --- a/Erupe/main.go +++ b/Erupe/main.go @@ -108,7 +108,7 @@ func main() { if err != nil { logger.Fatal("Failed to start launcher server", zap.Error(err)) } - logger.Info("Started launcher server.") + logger.Info("Started launcher server") // Entrance server. entranceServer := entranceserver.NewServer( @@ -121,7 +121,7 @@ func main() { if err != nil { logger.Fatal("Failed to start entrance server", zap.Error(err)) } - logger.Info("Started entrance server.") + logger.Info("Started entrance server") // Sign server. signServer := signserver.NewServer( @@ -134,79 +134,39 @@ func main() { if err != nil { logger.Fatal("Failed to start sign server", zap.Error(err)) } - logger.Info("Started sign server.") + logger.Info("Started sign server") - // Channel Server - channelServer1 := channelserver.NewServer( - &channelserver.Config{ - Logger: logger.Named("channel"), - ErupeConfig: erupeConfig, - DB: db, - Name: erupeConfig.Entrance.Entries[0].Name, - Enable: erupeConfig.Entrance.Entries[0].Channels[0].MaxPlayers > 0, - //DiscordBot: discordBot, - }) - - err = channelServer1.Start(erupeConfig.Channel.Port1) - if err != nil { - logger.Fatal("Failed to start channel server1", zap.Error(err)) + var channels []channelserver.Server + count := 1 + for _, ee := range erupeConfig.Entrance.Entries { + for _, ce := range ee.Channels { + c := *channelserver.NewServer(&channelserver.Config{ + Logger: logger.Named("channel-"+fmt.Sprint(count)), + ErupeConfig: erupeConfig, + DB: db, + DiscordBot: discordBot, + }) + err = c.Start(int(ce.Port)) + if err != nil { + logger.Fatal("Failed to start channel", zap.Error(err)) + } else { + logger.Info(fmt.Sprintf("Started channel server %d on port %d", count, ce.Port)) + } + channels = append(channels, c) + count++ + } } - logger.Info("Started channel server.") - // Channel Server - channelServer2 := channelserver.NewServer( - &channelserver.Config{ - Logger: logger.Named("channel"), - ErupeConfig: erupeConfig, - DB: db, - Name: erupeConfig.Entrance.Entries[1].Name, - Enable: erupeConfig.Entrance.Entries[1].Channels[0].MaxPlayers > 0, - DiscordBot: discordBot, - }) - err = channelServer2.Start(erupeConfig.Channel.Port2) - if err != nil { - logger.Fatal("Failed to start channel server2", zap.Error(err)) - } - // Channel Server - channelServer3 := channelserver.NewServer( - &channelserver.Config{ - Logger: logger.Named("channel"), - ErupeConfig: erupeConfig, - DB: db, - Name: erupeConfig.Entrance.Entries[2].Name, - Enable: erupeConfig.Entrance.Entries[2].Channels[0].MaxPlayers > 0, - //DiscordBot: discordBot, - }) - - err = channelServer3.Start(erupeConfig.Channel.Port3) - if err != nil { - logger.Fatal("Failed to start channel server3", zap.Error(err)) - } - // Channel Server - channelServer4 := channelserver.NewServer( - &channelserver.Config{ - Logger: logger.Named("channel"), - ErupeConfig: erupeConfig, - DB: db, - Name: erupeConfig.Entrance.Entries[3].Name, - Enable: erupeConfig.Entrance.Entries[3].Channels[0].MaxPlayers > 0, - //DiscordBot: discordBot, - }) - - err = channelServer4.Start(erupeConfig.Channel.Port4) - if err != nil { - logger.Fatal("Failed to start channel server4", zap.Error(err)) - } // Wait for exit or interrupt with ctrl+C. c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) <-c - logger.Info("Trying to shutdown gracefully.") - channelServer4.Shutdown() - channelServer3.Shutdown() - channelServer2.Shutdown() - channelServer1.Shutdown() + logger.Info("Trying to shutdown gracefully") + + for _, c := range channels { + c.Shutdown() + } signServer.Shutdown() entranceServer.Shutdown() launcherServer.Shutdown() diff --git a/Erupe/server/entranceserver/make_resp.go b/Erupe/server/entranceserver/make_resp.go index f677fe9d5..9c16416dc 100644 --- a/Erupe/server/entranceserver/make_resp.go +++ b/Erupe/server/entranceserver/make_resp.go @@ -45,11 +45,11 @@ func encodeServerInfo(serverInfos []config.EntranceServerInfo, s *Server) []byte } bf.WriteUint32(binary.LittleEndian.Uint32(net.ParseIP(si.IP).To4())) bf.WriteUint16(16 + uint16(serverIdx)) - bf.WriteUint16(si.Unk2) + bf.WriteUint16(0x0000) bf.WriteUint16(uint16(len(si.Channels))) bf.WriteUint8(si.Type) bf.WriteUint8(season) - bf.WriteUint8(si.Unk6) + bf.WriteUint8(si.Recommended) shiftjisName, err := stringsupport.ConvertUTF8ToShiftJIS(si.Name) if err != nil { panic(err) @@ -66,16 +66,13 @@ func encodeServerInfo(serverInfos []config.EntranceServerInfo, s *Server) []byte panic(err) } bf.WriteUint16(currentplayers) - bf.WriteUint16(ci.Unk4) - bf.WriteUint16(ci.Unk5) - bf.WriteUint16(ci.Unk6) - bf.WriteUint16(ci.Unk7) - bf.WriteUint16(ci.Unk8) - bf.WriteUint16(ci.Unk9) - bf.WriteUint16(ci.Unk10) - bf.WriteUint16(ci.Unk11) - bf.WriteUint16(ci.Unk12) - bf.WriteUint16(ci.Unk13) + bf.WriteUint32(0) + bf.WriteUint32(0) + bf.WriteUint32(0) + bf.WriteUint16(ci.Unk0) + bf.WriteUint16(ci.Unk1) + bf.WriteUint16(ci.Unk2) + bf.WriteUint16(0x3039) } } bf.WriteUint32(uint32(channelserver.Time_Current_Adjusted().Unix())) diff --git a/Erupe/server/signserver/dsgn_resp.go b/Erupe/server/signserver/dsgn_resp.go index 958f6db6e..a67af3267 100644 --- a/Erupe/server/signserver/dsgn_resp.go +++ b/Erupe/server/signserver/dsgn_resp.go @@ -4,6 +4,10 @@ import ( "fmt" "math/rand" "time" + "encoding/hex" + "io/ioutil" + "path/filepath" + "erupe-ce/server/channelserver" "github.com/Andoryuuta/byteframe" "go.uber.org/zap" @@ -56,22 +60,20 @@ func (s *Session) makeSignInResp(uid int) []byte { token := randSeq(16) // TODO: register token to db, users table + t := japanese.ShiftJIS.NewEncoder() bf := byteframe.NewByteFrame() - bf.WriteUint8(1) // resp_code - bf.WriteUint8(0) // file/patch server count - bf.WriteUint8(4) // entrance server count - bf.WriteUint8(uint8(len(chars))) // character count - bf.WriteUint32(0xFFFFFFFF) // login_token_number - bf.WriteBytes(paddedString(token, 16)) // login_token (16 byte padded string) - bf.WriteUint32(1576761190) + bf.WriteUint8(1) // resp_code + bf.WriteUint8(0) // file/patch server count + bf.WriteUint8(1) // entrance server count + bf.WriteUint8(uint8(len(chars))) // character count + bf.WriteUint32(0xFFFFFFFF) // login_token_number + bf.WriteBytes(paddedString(token, 16)) // login_token (16 byte padded string) + bf.WriteUint32(uint32(time.Now().Unix())) // unk timestamp uint8PascalString(bf, fmt.Sprintf("%s:%d", s.server.erupeConfig.HostIP, s.server.erupeConfig.Entrance.Port)) - uint8PascalString(bf, "") - uint8PascalString(bf, "") - uint8PascalString(bf, "mhf-n.capcom.com.tw") for _, char := range chars { - bf.WriteUint32(char.ID) // character ID 469153291 + bf.WriteUint32(char.ID) // Exp, HR[x] is split by 0, 1, 30, 50, 99, 299, 998, 999 if s.server.erupeConfig.DevMode && s.server.erupeConfig.DevModeOptions.MaxLauncherHR { @@ -80,12 +82,11 @@ func (s *Session) makeSignInResp(uid int) []byte { bf.WriteUint16(char.HRP) } - t := japanese.ShiftJIS.NewEncoder() str_name, _, err := transform.String(t, char.Name) if err != nil { str_name = char.Name } - + bf.WriteUint16(char.WeaponType) // Weapon, 0-13. bf.WriteUint32(char.LastLogin) // Last login date, unix timestamp in seconds. bf.WriteBool(char.IsFemale) // Sex, 0=male, 1=female. @@ -101,23 +102,48 @@ func (s *Session) makeSignInResp(uid int) []byte { bf.WriteUint8(0) // friends_list_count bf.WriteUint8(0) // guild_members_count bf.WriteUint8(0) // notice_count - bf.WriteUint32(0xDEADBEEF) // some_last_played_character_id + + // noticeText := "
Welcome to Erupe SU9!
Erupe is experimental software, we are not liable for any
issues caused by installing the software!

■Report bugs on Discord!

■Test everything!

■Don't talk to softlocking NPCs!

■Fork the code on GitHub!

Thank you to all of the contributors,

this wouldn't exist without you." + // notice_transformed, _, err := transform.String(t, noticeText) + // if err != nil { + // panic(err) + // } + // bf.WriteUint32(uint32(len(notice_transformed)+1)) + // bf.WriteNullTerminatedBytes([]byte(notice_transformed)) + + bf.WriteUint32(0) // some_last_played_character_id bf.WriteUint32(14) // unk_flags - uint8PascalString(bf, "") // unk_data_blob PascalString - bf.WriteUint16(51728) - bf.WriteUint16(20000) - uint16PascalString(bf, "1000672925") + filters, err := ioutil.ReadFile(filepath.Join(s.server.erupeConfig.BinPath, "filters.bin")) //dsmc name and msg obj + if err != nil { + panic(err) + } + bf.WriteBytes(filters) - bf.WriteUint8(0) + bf.WriteUint32(0xCA104E20) + uint16PascalString(bf, "") + bf.WriteUint8(0x00) + bf.WriteUint32(0xCA110001) + bf.WriteUint32(0x4E200000) - bf.WriteUint16(51729) - bf.WriteUint16(1) - bf.WriteUint16(20000) - uint16PascalString(bf, "203.191.249.36:8080") + returning := false + // return course end time + if returning { + bf.WriteUint32(uint32(channelserver.Time_Current_Adjusted().Add(30 * 24 * time.Hour).Unix())) + } else { + bf.WriteUint32(0) + } - bf.WriteUint32(1578905116) - bf.WriteUint32(0) + bf.WriteUint32(0x00000000) + bf.WriteBool(true) // mezfes active + bf.WriteUint16(0x0000) + bf.WriteUint8(0x00) + + bf.WriteUint32(uint32(channelserver.Time_Current_Adjusted().Add(-5 * time.Minute).Unix())) // mezfes start time + bf.WriteUint32(uint32(channelserver.Time_Current_Adjusted().Add(24 * time.Hour * 7).Unix())) // mezfes end time + + endBytes, _ := hex.DecodeString("020000002700000027080A03060904080507") + bf.WriteBytes(endBytes) return bf.Data() }